IOCTL_EHSTOR_DEVICE_ENUMERATE_PDOS IOCTL (ehstorioctl.h)

Este IOCTL retorna um conjunto de resultados que contém a enumeração de todos os PDOs (Objetos de Dispositivo Físico) de armazenamento ativo associados ao ACT (Destino de Comando Endereçável) fornecido. O cliente pode primeiro investigar o tamanho do buffer necessário emitindo essa IOCTL da seguinte maneira:

DeviceIoControl(
    hDevice,
    IOCTL_EHSTOR_DEVICE_ENUMERATE_PDOS,
    &pdoType,
    sizeof(PDO_TYPE),
    NULL,
    0,
    &dwBytesRequired,
    NULL );

Com o parâmetro de buffer de saída definido como NULL, o gerenciador de E/S limpa o bit IRP_INPUT_OPERATION nos sinalizadores IRP. Ao detectar isso, o driver de silo de armazenamento pode definir com segurança IoStatus.Information para o tamanho do buffer necessário, indicando-o para o cliente.

Isso só funciona porque STATUS_BUFFER_OVERFLOW (0x80000005) é um valor NT_WARNING() para o qual o gerenciador de E/S copia IoStatus.Information para o parâmetro lpBytesReturned, retornando esse valor para o cliente.

É necessário cuidado aqui porque IOCTL_EHSTOR_DEVICE_ENUMERATE_PDOS é definido com METHOD_BUFFERED, portanto, o gerenciador de E/S tentará copiar esse número de bytes para o buffer de saída.

Código principal

IRP_MJ_DEVICE_CONTROL

Buffer de entrada

O buffer de entrada em Irp-AssociatedIrp.SystemBuffer> deve conter um valor ULONG, conforme definido em PDO_TYPE,

em que todos os PDOs, apenas o PDO de disco, apenas o PDO de controle ou todos os PDOs de silo são enumerados, respectivamente, de acordo com o valor de entrada PDO_TYPE fornecido.

Comprimento do buffer de entrada

O comprimento de um ULONG.

Buffer de saída

Irp-AssociatedIrp.SystemBuffer> aponta para o buffer que receberá os resultados da enumeração PDO. Se o cliente forneceu um buffer não NULL com o IOCTL emitido, o driver o preencherá com o conjunto de resultados somente se o Parameters.DeviceIoControl.O valor retornado for STATUS_SUCCESS se o tamanho do buffer for suficiente e os resultados tiverem sido copiados para o buffer. Caso contrário, STATUS_INVALID_BUFFER_SIZE será retornado e o buffer de saída não será modificado.

O buffer de enumeração retornado contém um conjunto de resultados estruturado de acordo com as regras a seguir. A estrutura à esquerda no buffer, ENUM_PDO_RESULTS, consiste em uma contagem de estruturas e uma matriz de estruturas ENUM_PDO_ENTRY .

Comprimento do buffer de saída

OutputBufferLength indica um tamanho de buffer de comprimento suficiente para incluir todo o conjunto de resultados.

Bloco de status

Um dos seguintes valores pode ser retornado no campo Status:

STATUS_SUCCESS – o buffer de saída contém a enumeração dos PDOs solicitados.
STATUS_BUFFER_OVERFLOW - O campo Informações é definido como o tamanho do buffer necessário para conter a saída inteira do conjunto de resultados de enumeração.
STATUS_INVALID_BUFFER_SIZE - O comprimento do buffer de saída fornecido é insuficiente para conter a saída inteira do conjunto de resultados de enumeração.

Requisitos

Requisito Valor
Cabeçalho ehstorioctl.h (inclua EhStorIoctl.h)