使用设备接口
设备接口可用于内核模式组件和用户模式应用程序。 用户模式代码可以使用 CfgMgr32 函数 (例如, CM_Get_Device_Interface_List) 或 SetupDiXxx 函数 (请参阅 SetupDi 设备接口函数) 以了解已注册的已启用的设备接口。 然后,用户模式应用程序可以使用 I/O API(如 CreateFile )获取设备的句柄,以便向其发送 I/O。 若要获取有关启用和禁用设备接口以及如何响应这些操作的通知,请参阅 注册设备接口到达和设备删除通知。
内核模式组件必须先执行以下操作,然后内核模式组件才能使用特定的设备或文件对象:
确定是否注册并启用了所需的设备接口类。
驱动程序可以向 PnP 管理器注册,以便在启用或禁用设备接口实例时收到通知。 若要注册,组件将调用 IoRegisterPlugPlayNotification。 此例程存储驱动程序提供的回调的地址,每当为指定设备类启用或禁用设备接口实例实例时调用该回调。 回调例程接收 DEVICE_INTERFACE_CHANGE_NOTIFICATION 结构,该结构包含表示接口实例的符号链接的 Unicode 字符串。 有关详细信息,请参阅 使用 PnP 设备接口更改通知 。
驱动程序或其他内核模式组件还可以调用 IoGetDeviceInterfaces ,以获取特定设备接口类的所有已注册且已启用的设备接口实例的列表。 返回的列表包含指向标识设备接口实例的 Unicode 符号链接字符串的指针。
获取指向对应于 接口实例的设备或文件对象的指针。
若要访问特定设备对象,驱动程序必须调用 IoGetDeviceObjectPointer,并在 ObjectName 参数中传递所需接口的 Unicode 字符串。 若要访问文件对象,驱动程序必须调用 InitializeObjectAttributes,在 ObjectName 参数中传递 Unicode 字符串,然后在对 ZwCreateFile 的调用中传递成功初始化的属性结构。