IoGetDeviceInterfaces 函数 (wdm.h)

IoGetDeviceInterfaces 例程返回特定设备接口类的设备接口实例列表(例如支持 HID 接口的系统上的所有设备)。

语法

NTSTATUS IoGetDeviceInterfaces(
  [in]           const GUID     *InterfaceClassGuid,
  [in, optional] PDEVICE_OBJECT PhysicalDeviceObject,
  [in]           ULONG          Flags,
  [out]          PZZWSTR        *SymbolicLinkList
);

参数

[in] InterfaceClassGuid

指向指定设备接口类的类 GUID 的指针。 类的 GUID 应位于特定于设备的头文件中。

[in, optional] PhysicalDeviceObject

指向可选 PDO 的指针,该 PDO 将搜索范围缩小到仅由 PDO 表示的设备的设备接口实例。

[in] Flags

指定修改设备接口搜索的标志。 目前仅定义一个标志,下表中介绍了这一标志。

意义
DEVICE_INTERFACE_INCLUDE_NONACTIVE 除了启用的接口实例外,还返回禁用的设备接口实例。
 

搜索支持特定接口类的设备时,调用方需要启用的接口实例,因此不设置DEVICE_INTERFACE_INCLUDE_NONACTIVE标志。

驱动程序通常将DEVICE_INTERFACE_INCLUDE_NONACTIVE标志设置为查找驱动程序必须启用的已禁用接口实例。 例如,设备的类安装程序可能已由 INF 文件定向,以注册设备的一个或多个接口实例。 接口实例将注册,但在驱动程序启用接口实例之前不可用(使用 IoSetDeviceInterfaceState)。 若要缩小仅返回给给定设备公开的接口实例列表的范围,驱动程序可以指定 PhysicalDeviceObject

[out] SymbolicLinkList

指向一个宽字符指针的指针,如果成功,该例程将写入包含 Unicode 字符串列表的缓冲区的基址。 这些字符串是符号链接名称,用于标识与搜索条件匹配的设备接口实例。 列表中的每个 Unicode 字符串都以 null 结尾;整个列表的末尾被附加的 null 字符标记。 例程从分页系统内存中为这些字符串分配缓冲区。 调用方负责释放缓冲区(在不再需要缓冲区时调用 ExFreePool 例程)。

如果没有设备接口实例与搜索条件匹配,则此例程返回STATUS_SUCCESS,字符串包含单个 NULL 字符。

返回值

IoGetDeviceInterfaces 如果调用成功,则返回STATUS_SUCCESS。 可能的错误返回值包括以下内容。

返回代码 描述
STATUS_INVALID_DEVICE_REQUEST
可能表示 PhysicalDeviceObject 不是有效的 PDO 指针。

言论

IoGetDeviceInterfaces 返回与搜索条件匹配的设备接口实例列表。 内核模式组件通常调用此例程来获取特定设备接口类的所有已启用设备接口实例的列表。 此类组件可以通过调用 IoGetDeviceObjectPointerZwCreateFile 例程获取指向文件对象和/或设备对象的指针。 IoGetDeviceObjectPointer 返回的设备对象指针 指向设备的设备堆栈顶部,可用于调用 IoCallDriver 例程。

如果请求的设备接口类有默认接口,则会首先在 SymbolicLinkList中列出该接口。 默认接口可以由用户模式设置,但不能由内核模式设置。

符号链接名称的格式不透明;调用方不应尝试分析符号链接名称。

设备接口实例的符号链接可用于系统启动。

若要在系统上启用特定类的其他设备接口实例时收到通知,请通过调用 IoRegisterPlugPlayNotification 例程注册设备类更改通知。

IoGetDeviceInterfaces 的调用方必须在系统线程的上下文中在 IRQL = PASSIVE_LEVEL 运行。

要求

要求 价值
最低支持的客户端 从 Windows 2000 开始可用。
目标平台 普遍
标头 wdm.h (包括 Wdm.h、Ntddk.h、Ntifs.h)
NtosKrnl.lib
DLL NtosKrnl.exe
IRQL PASSIVE_LEVEL(请参阅“备注”部分)
DDI 符合性规则 HwStorPortProhibitedDDIs(storport)MarkPower(wdm)MarkPowerDown(wdm)MarkQueryRelations(wdm)MarkStartDevice(wdm)PowerIrpDDis(wdm)

另请参阅

ExFreePool

IoCallDriver

IoGetDeviceObjectPointer

IoRegisterDeviceInterface

IoRegisterPlugPlayNotification

IoSetDeviceInterfaceState

ZwCreateFile