IoEnumerateDeviceObjectList 函数 (ntifs.h)
IoEnumerateDeviceObjectList 例程枚举驱动程序的设备对象列表。
语法
NTSTATUS IoEnumerateDeviceObjectList(
[in] PDRIVER_OBJECT DriverObject,
[out] PDEVICE_OBJECT *DeviceObjectList,
[in] ULONG DeviceObjectListSize,
[out] PULONG ActualNumberDeviceObjects
);
参数
[in] DriverObject
指向驱动程序的驱动程序对象的指针。
[out] DeviceObjectList
指向接收设备对象指针的调用方分配数组的指针。 必须从非分页池分配此数组。 此参数可以为 NULL。 请参阅“备注”。
[in] DeviceObjectListSize
DeviceObjectList 数组的大小(以字节为单位)。 此参数可以为零。 请参阅“备注”。
[out] ActualNumberDeviceObjects
驱动程序对象的设备对象列表中找到的实际设备对象数。 请注意,如果 DeviceObjectList 处的数组太小,则复制到数组的设备对象指针数将小于 actualNumberDeviceObjects 。
返回值
IoEnumerateDeviceObjectList 返回 NTSTATUS 代码,例如以下值之一:
返回代码 | 描述 |
---|---|
STATUS_SUCCESS | 调用 IoEnumerateDeviceObjectList 成功完成。 |
STATUS_BUFFER_TOO_SMALL | DeviceObjectList 处的数组太小,无法容纳整个设备对象列表。 在这种情况下,IoEnumerateDeviceObjectList 将尽可能多的设备对象指针复制到数组中。 |
言论
文件系统筛选器驱动程序调用 IoEnumerateDeviceObjectList 来枚举:
它创建的设备对象。 当驱动程序准备卸载时,通常会执行此作。 请注意,无法安全地从正在运行的系统卸载筛选器驱动程序。 有关详细信息,请参阅 ZwUnloadDriver。
基础文件系统创建的设备对象,因此筛选器知道它可以附加到的卷数。
IoEnumerateDeviceObjectList 返回筛选器驱动程序创建的所有设备对象。 这包括控制设备对象(CDO)以及卷设备对象(VDO)。 这两种类型的设备对象可以通过这样一个事实来区分:按约定命名的 CDO 和 VDO 不是。
在后一种情况下,筛选器驱动程序通常调用 IoEnumerateDeviceObjectList 两次:一次获取列表中的设备对象数,一次用于获取设备对象列表本身。 在第一次调用中,调用方应将 DeviceObjectList 参数设置为 NULL,并将 DeviceObjectListSize 设置为零。 第二次调用中,DeviceObjectList 应包含指向适当大小的指针数组的指针,DeviceObjectListSize 应包含该数组的大小(以字节为单位)。
IoEnumerateDeviceObjectList 递增 DeviceObjectList 所指向列表中每个设备对象的引用计数。 因此,对 IoEnumerateDeviceObjectList 的每个成功调用都必须匹配对列表中每个设备对象的 ObDereferenceObject 的后续调用。 否则,由于引用计数未完成,系统无法释放或删除这些设备对象。
要求
要求 | 价值 |
---|---|
最低支持的客户端 | Windows 2000 SP4 更新汇总;Windows XP |
目标平台 | 普遍 |
标头 | ntifs.h (include Ntifs.h) |
库 | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | <= DISPATCH_LEVEL |