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 更新汇总;Windowsxp |
目标平台 | 通用 |
标头 | ntifs.h (包括 Ntifs.h) |
Library | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | <= DISPATCH_LEVEL |