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
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) |