Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Os drivers que criam seções e exibições que não devem ser compartilhadas com o modo de usuário devem usar o seguinte protocolo quando estiverem trabalhando com seções e exibições:
O driver deve usar um identificador de kernel quando estiver abrindo um identificador para o objeto de seção. Os drivers podem certificar-se de que um identificador é um identificador do kernel criando-o no processo do sistema ou especificando o atributo OBJ_KERNEL_HANDLE para o identificador. Para obter mais informações, consulte Identificadores de objeto.
A exibição deve ser mapeada somente a partir de um thread do sistema. (Caso contrário, a vista fica acessível a partir do processo em cujo contexto é criada.) Um driver pode assegurar que a vista seja mapeada a partir do processo do sistema usando um thread de trabalho do sistema para executar a operação de mapeamento. Para obter mais informações, consulte Threads de Trabalho do Sistema e Contexto de Thread de Driver.
Os drivers que compartilham uma exibição com um processo de modo de usuário devem usar o seguinte protocolo quando estiverem trabalhando com seções e exibições:
O driver, não o processo de modo de usuário, deve criar o objeto de seção e mapear as exibições.
Como mencionado anteriormente, o driver deve usar um handle do kernel quando estiver abrindo um handle para o objeto da seção. Os drivers podem certificar-se de que um identificador é um identificador do kernel criando-o no processo do sistema ou especificando o atributo OBJ_KERNEL_HANDLE para o identificador. Para obter mais informações, consulte Identificadores de objeto.
A vista é mapeada no contexto da thread do processo que compartilha a vista. Um driver de nível mais alto pode garantir que a exibição seja mapeada no contexto do processo atual executando a operação de mapeamento em uma rotina de despacho, como DispatchDeviceControl. As rotinas de despacho de drivers de nível inferior são executadas em um contexto de thread arbitrário e, portanto, não podem mapear com segurança uma exibição em uma rotina de despacho. Para obter mais informações, consulte Contexto do thread do driver.
Todos os acessos de memória à vista dentro do driver devem ser protegidos por blocos try-except. Um aplicativo de modo de usuário mal-intencionado pode desmapear a exibição ou alterar o estado de proteção da exibição. Qualquer um deles causaria uma falha no sistema, a menos que protegido por um bloco try-except. Para obter mais informações, consulte Manipulando exceções.
O motorista também deve validar o conteúdo da exibição, conforme necessário. O autor do driver não pode assumir que apenas um componente de modo de utilizador confiável tem acesso à vista.
Um driver que deve compartilhar um objeto de seção com um aplicativo de modo de usuário (que deve ser capaz de criar suas próprias exibições) deve usar o seguinte protocolo:
O driver, não o processo de modo de usuário, deve criar o objeto de seção. Os drivers nunca devem usar um identificador que foi passado do modo de usuário.
Antes de passar o identificador para o modo de usuário, o driver deve chamar ObReferenceObjectByHandle para obter uma referência ao objeto de seção. Isso impede que um aplicativo mal-intencionado exclua o objeto de seção fechando o identificador. As referências do objeto devem ser armazenadas na extensão do dispositivo do controlador.
Depois que o driver não estiver mais usando o objeto section, ele deve chamar ObDereferenceObject para liberar a referência do objeto.
Em sistemas que executam o Microsoft Windows Server 2003 com Service Pack 1 (SP1) e versões posteriores, somente drivers de modo kernel podem abrir \Device\PhysicalMemory. No entanto, os drivers podem decidir dar um identificador para um aplicativo de usuário. Para evitar problemas de segurança, apenas os aplicativos de usuário nos quais o driver confia devem ter acesso a \Device\PhysicalMemory.