Como mapear a memória do chamador em um driver de dispositivo Windows CE após o final de uma chamada para xxx_IOControl?
-
05-07-2019 - |
Pergunta
Estou implementando um ioctl em um driver de dispositivo Windows CE que leva um ponteiro para um grande pedaço de memória de aplicativo para executar E / S assíncrona iniciada através de uma chamada de aplicativo para DeviceIoControl.
Ao usar MapCallerPtr (), o ponteiro fica não mapeada quando a função xxx_IOControl retornos; quando o ponteiro é usado no IST já não é mapeado levando a um acidente.
O que é a melhor maneira de mapear o ponteiro além do fim da chamada para xxx_IOControl? As garantias de aplicação que a memória permanecerá válida até que tenha recebido uma indicação do driver que o condutor tenha terminado com ele.
Este é o Windows CE 5.0.
Solução
Respondendo a minha própria pergunta:
Em xxx_IOControl, mapear o ponteiro usando MapPtrToProcess () e salvar as permissões do fio usando GetCurrentPermissions (). No segmento que vai usar o ponteiro mapeado, SetProcPermissions call () com o valor de retorno salvo de GetCurrentPermissions (), ponteiros dereference, e em seguida, restaurar as permissões de rosca quando terminar.
DWORD saved_perms = SetProcPermissions(caller_perms);
... Do stuff ...
SetProcPermissions(saved_perms);