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