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(仅磁盘 PDO、控制 PDO 或所有接收器 PDO)分别根据提供的PDO_TYPE输入值枚举。
输入缓冲区长度
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 - 提供的输出缓冲区长度不足以包含整个枚举结果集输出。
要求
要求 | 价值 |
---|---|
标头 | ehstorioctl.h (include EhStorIoctl.h) |