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(仅磁盘 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)