Поделиться через


IOCTL_EHSTOR_DEVICE_ENUMERATE_PDOS IOCTL (ehstorioctl.h)

Этот IOCTL возвращает результирующий набор, содержащий перечисление всех активных объектов физических устройств (PDO), связанных с заданным целевым объектом адресуемой команды (ACT). Клиент может сначала проследовать требуемый размер буфера, выдав этот IOCTL следующим образом:

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

Если для параметра буфера вывода задано значение NULL, диспетчер ввода-вывода очищает бит IRP_INPUT_OPERATION в флагах IRP. Обнаружив это, драйвер хранилища хранилища может безопасно задать для IoStatus.Information требуемый размер буфера, указывая таким образом, что он указан для клиента.

Это работает только потому, что STATUS_BUFFER_OVERFLOW (0x80000005) является значением NT_WARNING(), для которого диспетчер ввода-вывода копирует IoStatus.Information в параметр lpBytesReturned, возвращая это значение клиенту.

Здесь необходимо соблюдать осторожность, так как IOCTL_EHSTOR_DEVICE_ENUMERATE_PDOS определяется с помощью METHOD_BUFFERED, поэтому диспетчер ввода-вывода попытается скопировать это количество байтов в выходной буфер.

Основной код

IRP_MJ_DEVICE_CONTROL

Входной буфер

Входной буфер в Irp-AssociatedIrp.SystemBuffer> должен содержать значение ULONG, как определено в PDO_TYPE.

где все PDO, только PDO диска, только PDO элемента управления или все PDO-объекты уровня перечисляются соответственно в соответствии с указанным PDO_TYPE входным значением.

Длина входного буфера

Длина ULONG.

Выходной буфер

Irp-AssociatedIrp.SystemBuffer> указывает на буфер, который получит результаты перечисления PDO. Если клиент предоставил буфер, отличный от NULL , с выданным IOCTL, то драйвер заполняет его результирующим набором только в том случае, если значение Parameters.DeviceIoControl.Возвращаемое значение STATUS_SUCCESS, если размер буфера достаточно и результаты были скопированы в буфер. В противном случае возвращается STATUS_INVALID_BUFFER_SIZE, а выходной буфер не изменен.

Возвращаемый буфер перечисления содержит результирующий набор, структурированный в соответствии со следующими правилами. Ведущая структура в буфере, ENUM_PDO_RESULTS, состоит из числа структур и массива ENUM_PDO_ENTRY структур.

Длина выходного буфера

OutputBufferLength указывает размер буфера, достаточный для включения всего результирующий набор.

Блок состояния

В поле Состояние может быть возвращено одно из следующих значений:

STATUS_SUCCESS — выходной буфер содержит перечисление запрошенных PDO.
STATUS_BUFFER_OVERFLOW — для поля Information задан требуемый размер буфера, чтобы он содержал все выходные данные результирующий набор перечисления.
STATUS_INVALID_BUFFER_SIZE — указанная длина выходного буфера недостаточна для хранения всех выходных данных результирующих наборов перечисления.

Требования

Требование Значение
Заголовок ehstorioctl.h (включая EhStorIoctl.h)