IOCTL_EHSTOR_DEVICE_ENUMERATE_PDOS IOCTL (ehstorioctl.h)

此 IOCTL 返回一个结果集,其中包含与给定的可寻址命令目标 (ACT) ) 关联的所有活动存储物理设备对象的枚举 (PDO。 客户端可以通过以下方式发出此 IOCTL,首先探测所需的缓冲区大小:

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

如果输出缓冲区参数设置为 NULL,I/O 管理器将清除 IRP 标志中的IRP_INPUT_OPERATION位。 检测到这种情况后,存储接收器驱动程序可以安全地将 IoStatus.Information 设置为所需的缓冲区大小,从而将其指示给客户端。

这之所以有效,是因为 STATUS_BUFFER_OVERFLOW (0x80000005) 是一个NT_WARNING () 值,I/O 管理器将 IoStatus.Information 复制到 lpBytesReturned 参数,并将该值返回给客户端。

此处需要小心,因为IOCTL_EHSTOR_DEVICE_ENUMERATE_PDOS是使用 METHOD_BUFFERED 定义的,因此 I/O 管理器将尝试将此数量的字节复制到输出缓冲区中。

主要代码

IRP_MJ_DEVICE_CONTROL

输入缓冲区

Irp-AssociatedIrp.SystemBuffer> 中的输入缓冲区必须包含 PDO_TYPE 中定义的 ULONG 值,

其中,根据 PDO_TYPE提供的输入值分别枚举所有 PDO、仅磁盘 PDO、仅控制 PDO 或所有 silo PDO。

输入缓冲区长度

ULONG 的长度。

输出缓冲区

Irp-AssociatedIrp.SystemBuffer> 指向将接收 PDO 枚举结果的缓冲区。 如果客户端提供了具有颁发的 IOCTL 的非 NULL 缓冲区,则驱动程序仅在 Parameters.DeviceIoControl 时使用结果集填充该缓冲区。如果缓冲区大小足够且结果已复制到缓冲区,则返回值STATUS_SUCCESS。 否则,返回STATUS_INVALID_BUFFER_SIZE并且输出缓冲区未修改。

返回的枚举缓冲区包含根据以下规则构建的结果集。 缓冲区中的前导结构 ENUM_PDO_RESULTS,由结构计数和 ENUM_PDO_ENTRY 结构数组组成。

输出缓冲区长度

OutputBufferLength 指示缓冲区大小长度足以包含整个结果集。

状态块

可以在“状态”字段中返回以下值之一:

STATUS_SUCCESS - 输出缓冲区包含所请求 PDO 的枚举。
STATUS_BUFFER_OVERFLOW - “信息”字段设置为包含整个枚举结果集输出所需的缓冲区大小。
STATUS_INVALID_BUFFER_SIZE - 提供的输出缓冲区长度不足以包含整个枚举结果集输出。

要求

要求
Header ehstorioctl.h (包括 EhStorIoctl.h)