Compartir a través de


IOCTL_EHSTOR_DEVICE_ENUMERATE_PDOS IOCTL (ehstorioctl.h)

Este IOCTL devuelve un conjunto de resultados que contiene la enumeración de todos los objetos de dispositivo físico (PDO) de almacenamiento activo asociados con el destino de comando direccionable (ACT) especificado. El cliente puede sondear primero el tamaño de búfer necesario mediante la emisión de este IOCTL de la siguiente manera:

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

Con el parámetro de búfer de salida establecido en NULL, el administrador de E/S borra el bit de IRP_INPUT_OPERATION en las marcas IRP. Después de detectar esto, el controlador de silo de almacenamiento puede establecer de forma segura IoStatus.Information en el tamaño de búfer necesario, lo que lo indica al cliente.

Esto solo funciona porque STATUS_BUFFER_OVERFLOW (0x80000005) es un valor NT_WARNING() para el que el administrador de E/S copia IoStatus.Information en el parámetro lpBytesReturned, devolviendo ese valor al cliente.

Se requiere precaución aquí porque IOCTL_EHSTOR_DEVICE_ENUMERATE_PDOS se define con METHOD_BUFFERED, por lo que el administrador de E/S intentará copiar este número de bytes en el búfer de salida.

Código principal

IRP_MJ_DEVICE_CONTROL

Búfer de entrada

El búfer de entrada en Irp-AssociatedIrp.SystemBuffer> debe contener un valor ULONG tal y como se define en PDO_TYPE,

donde todos los PDO de disco, solo el PDO de disco, solo el PDO de control o todos los PDO de silo se enumeran respectivamente según el valor de entrada de PDO_TYPE proporcionado.

Longitud del búfer de entrada

Longitud de un ULONG.

Búfer de salida

Irp-AssociatedIrp.SystemBuffer> apunta al búfer que recibirá los resultados de la enumeración de PDO. Si el cliente proporcionó un búfer que no es NULL con el IOCTL emitido, el controlador lo rellena con el conjunto de resultados solo si parameters.DeviceIoControl.El valor devuelto es STATUS_SUCCESS si el tamaño del búfer es suficiente y los resultados se han copiado en el búfer. De lo contrario, se devuelve STATUS_INVALID_BUFFER_SIZE y el búfer de salida no está modificado.

El búfer de enumeración devuelto contiene un conjunto de resultados estructurado según las reglas siguientes. La estructura inicial del búfer, ENUM_PDO_RESULTS, consta de un recuento de estructuras y una matriz de estructuras de ENUM_PDO_ENTRY .

Longitud del búfer de salida

OutputBufferLength indica un tamaño de búfer de longitud suficiente para incluir todo el conjunto de resultados.

Bloque de estado

Se puede devolver uno de los siguientes valores en el campo Estado:

STATUS_SUCCESS: el búfer de salida contiene la enumeración de los PPO solicitados.
STATUS_BUFFER_OVERFLOW: el campo Información se establece en el tamaño de búfer necesario para contener la salida completa del conjunto de resultados de enumeración.
STATUS_INVALID_BUFFER_SIZE: la longitud del búfer de salida proporcionada no es suficiente para contener la salida completa del conjunto de resultados de enumeración.

Requisitos

Requisito Valor
Header ehstorioctl.h (include EhStorIoctl.h)