Partilhar via


Manipuladores de objetos

Drivers e componentes de modo utilizador acessam a maioria dos objetos definidos pelo sistema através de handles. As alças são representadas pelo tipo de dados opaco HANDLE. (Observe que os handles não são usados para acessar objetos de dispositivo ou objetos de driver.)

Para a maioria dos tipos de objeto, a rotina de modo kernel que cria ou abre o objeto fornece um identificador para o chamador. Em seguida, o chamador usa esse identificador em operações subsequentes no objeto.

Aqui está uma lista de tipos de objetos que os drivers normalmente usam e as rotinas que fornecem manipuladores para objetos desse tipo.

Tipo de objeto Rotina de criação/abertura correspondente

Ficheiro

IoCreateFile, ZwCreateFile, ZwOpenFile

Chaves de registo

IoOpenDeviceInterfaceRegistryKey, IoOpenDeviceRegistryKey, ZwCreateKey, ZwOpenKey

Tópicos

PsCreateSystemThread

Eventos

IoCreateSynchronizationEvent, IoCreateNotificationEvent

Ligações simbólicas

ZwOpenSymbolicLinkObject

Objetos de diretório

ZwCreateDirectoryObject

Objetos de seção

ZwOpenSection

Quando o driver não precisa mais de acesso ao objeto, ele chama a rotina ZwClose para fechar a alça. Isso funciona para todos os tipos de objeto listados na tabela acima.

A maioria das rotinas que fornecem manipuladores tem uma estrutura OBJECT_ATTRIBUTES como parâmetro. Essa estrutura pode ser usada para especificar atributos para o identificador.

Os drivers podem especificar os seguintes atributos de identificador:

  • OBJ_KERNEL_HANDLE

    O identificador só pode ser acessado a partir do modo kernel.

  • OBJ_INHERIT

    Todos os filhos do processo atual recebem uma cópia do identificador quando são criados.

  • OBJ_FORCE_ACCESS_CHECK

    Este atributo especifica que o sistema executa todas as verificações de acesso no identificador. Por padrão, o sistema ignora todas as verificações de acesso em identificadores criados no modo kernel.

Use a rotina InitializeObjectAttributes para definir esses atributos em uma estrutura OBJECT_ATTRIBUTES .

Para obter informações sobre como validar identificadores de objeto, consulte Falha ao validar identificadores de objeto.

Manipuladores de Objetos Privados

Sempre que um driver cria um identificador de objeto para seu uso privado, o driver deve especificar o atributo OBJ_KERNEL_HANDLE. Isso garante que o identificador esteja inacessível para aplicativos de modo de usuário.

Identificadores de objeto partilhado

Um driver que compartilha identificadores de objeto entre o modo núcleo e o modo de utilizador deve ser cuidadosamente escrito para evitar a criação acidental de falhas de segurança. Aqui estão algumas diretrizes:

  1. Crie identificadores no modo kernel e passe-os para o modo de usuário, em vez do contrário. As alças criadas por um componente de modo de utilizador e passadas para o controlador não devem ser fidedignas.

  2. Se o driver precisar manipular alças em nome de aplicações em modo de utilizador, utilize o atributo OBJ_FORCE_ACCESS_CHECK para verificar se a aplicação possui o acesso necessário.

  3. Use ObReferenceObjectByPointer para manter uma referência de modo kernel num identificador partilhado. Caso contrário, se um componente de modo de usuário fechar a alça, a contagem de referência será zerada e, se o driver tentar usar ou fechar a alça, o sistema falhará.

Se um aplicativo de modo de usuário criar um objeto de evento, um driver poderá aguardar com segurança que esse evento seja sinalizado, mas somente se o aplicativo passar um identificador para o objeto de evento para o driver por meio de um IOCTL. O driver deve manipular o IOCTL no contexto do processo que criou o evento e deve validar que o identificador é um identificador de evento chamando ObReferenceObjectByHandle.