Função IoGetDeviceObjectPointer (wdm.h)

A rotina IoGetDeviceObjectPointer retorna um ponteiro para o objeto superior na pilha do objeto de dispositivo nomeado e um ponteiro para o objeto de arquivo correspondente, se o acesso solicitado aos objetos puder ser concedido.

Sintaxe

NTSTATUS IoGetDeviceObjectPointer(
  [in]  PUNICODE_STRING ObjectName,
  [in]  ACCESS_MASK     DesiredAccess,
  [out] PFILE_OBJECT    *FileObject,
  [out] PDEVICE_OBJECT  *DeviceObject
);

Parâmetros

[in] ObjectName

Ponteiro para um buffer que contém uma cadeia de caracteres Unicode que é o nome do objeto do dispositivo.

[in] DesiredAccess

Especifica o valor ACCESS_MASK que representa o acesso desejado. Normalmente , DesiredAccess é FILE_READ_DATA. Raramente, os direitos de acesso FILE_WRITE_DATA ou FILE_ALL_ACCESS são especificados.

[out] FileObject

Ponteiro para o objeto de arquivo que representa o objeto de dispositivo correspondente para o código de modo de usuário se a chamada for bem-sucedida.

[out] DeviceObject

Ponteiro para o objeto de dispositivo que representa o dispositivo lógico, virtual ou físico nomeado se a chamada for bem-sucedida.

Retornar valor

IoGetDeviceObjectPointer retornará STATUS_SUCCESS se for bem-sucedido. Os possíveis valores retornados por erro incluem os seguintes códigos de status:

STATUS_OBJECT_TYPE_MISMATCH

STATUS_INVALID_PARAMETER

STATUS_PRIVILEGE_NOT_HELD

STATUS_INSUFFICIENT_RESOURCES

STATUS_OBJECT_NAME_INVALID

Comentários

IoGetDeviceObjectPointer estabelece uma "conexão" entre o chamador e o driver de nível inferior seguinte. Um chamador bem-sucedido pode usar o ponteiro do objeto de dispositivo retornado para inicializar seus próprios objetos de dispositivo. Ele também pode ser usado como um argumento para IoAttachDeviceToDeviceStack, IoCallDriver e qualquer rotina que crie IRPs para drivers inferiores. O ponteiro retornado é um argumento necessário para IoCallDriver.

Essa rotina também retorna um ponteiro para o objeto de arquivo correspondente. Ao descarregar, um driver pode desreferenciar o objeto de arquivo como um meio de desreferenciar indiretamente o objeto do dispositivo. Para fazer isso, o driver chama ObDereferenceObject de sua rotina Unload, passando o ponteiro do objeto de arquivo retornado por IoGetDeviceObjectPointer. A falha ao desreferenciar o objeto de dispositivo na rotina Unload de um driver impede que o driver inferior seja descarregado. No entanto, os drivers que fecham o objeto de arquivo antes do processo de descarregamento devem fazer uma referência extra no objeto do dispositivo antes de desreferenciar o objeto de arquivo. Caso contrário, desreferenciar o objeto de arquivo pode levar a uma exclusão prematura do objeto do dispositivo.

Para obter um ponteiro para o driver de nível mais alto na pilha de driver do sistema de arquivos, um driver deve garantir que o sistema de arquivos esteja montado; se não estiver, essa rotina percorrerá a pilha do dispositivo de armazenamento. Para garantir que o sistema de arquivos esteja montado no dispositivo de armazenamento, o driver deve especificar uma máscara de acesso apropriada, como FILE_READ_DATA ou FILE_WRITE_ATTRIBUTES, no parâmetro DesiredAccess . Especificar FILE_READ_ATTRIBUTES não faz com que o sistema de arquivos seja montado.

Depois que qualquer driver de nível superior tiver se encadeado por outro driver chamando essa rotina com êxito, o driver de nível superior deve definir o campo StackSize em seu objeto de dispositivo como o do objeto de dispositivo do próximo driver de nível inferior mais um.

Os chamadores de IoGetDeviceObjectPointer devem estar em execução em IRQL = PASSIVE_LEVEL.

Requisitos

Requisito Valor
Cliente mínimo com suporte Disponível a partir do Windows 2000.
Plataforma de Destino Universal
Cabeçalho wdm.h (include Wdm.h, Ntddk.h, Ntifs.h)
Biblioteca NtosKrnl.lib
DLL NtosKrnl.exe
IRQL PASSIVE_LEVEL
Regras de conformidade da DDI HwStorPortProhibitedDIs(storport), IrqlIoPassive5(wdm), PowerIrpDDis(wdm)

Confira também

ACCESS_MASK

DEVICE_OBJECT

IoAllocateIrp

IoAttachDevice

IoAttachDeviceToDeviceStack

IoCallDriver

ObDereferenceObject

ObReferenceObjectByPointer