ioRequestDeviceEject 函数 (wdm.h)
IoRequestDeviceEject 例程通知 PnP 管理器设备弹出按钮已按下。
语法
void IoRequestDeviceEject(
[in] PDEVICE_OBJECT PhysicalDeviceObject
);
参数
[in] PhysicalDeviceObject
指向设备的 PDO 的指针。
返回值
无
备注
请注意,此例程报告设备弹出请求,而不是媒体弹出请求。
通常,PnP 总线驱动程序调用 IoRequestDeviceEject 来通知 PnP 管理器用户按下了其子设备上的设备弹出按钮。
驱动程序调用此例程,而不是发送 IRP_MN_EJECT 请求,因为此例程允许 PnP 管理器协调除发送 IRP 之外的其他弹出操作。 例如,PnP 管理器会通知注册的用户模式和内核模式组件,以通知设备上的更改。
PnP 管理器指示设备有序关闭。 PnP 管理员:
-
创建受此设备弹出影响的其他设备的列表。
PnP 管理器查询设备的删除关系、弹出关系和总线关系 (子设备) 。
-
确定是否可以删除设备及其相关设备。
PnP 管理器 将IRP_MN_QUERY_REMOVE_DEVICE IRP 发送到设备及其相关设备的驱动程序。 PnP 管理器还会向在设备或其任何相关设备上注册设备更改通知的任何用户模式和内核模式组件发送通知。 如果任何驱动程序或用户模式组件未能通过查询删除,PnP 管理器会弹出一个对话框,通知用户弹出失败。
-
软件删除设备及其相关设备。
如果前面的步骤成功,PnP 管理器会通知已注册的驱动程序和应用程序设备及其相关设备正在软件删除。 然后,PnP 管理器将 IRP_MN_REMOVE_DEVICE IRP 发送到设备及其相关设备的驱动程序。 函数和筛选器驱动程序从设备堆栈中分离,并删除设备 () 的设备对象。 除非设备物理已消失,并且总线驱动程序在最近对设备父总线的 IRP_MN_QUERY_DEVICE_RELATIONSBusRelations 的响应中省略了设备,否则总线驱动程序将保留设备的 PDO (/) () 。
-
指示总线驱动程序在可能的情况下将设备弹出 () 。
PnP 管理器会执行不同的步骤,具体取决于设备的弹出功能:
-
支持热弹出。
如果为设备设置了 弹出 支持功能,则可以在系统运行时弹出设备, (处于 PowerSystemWorking 状态) 。 PnP 管理器向设备的总线驱动程序发送 IRP_MN_EJECT 请求。 以前为了响应删除 IRP 而从堆栈分离的任何函数和筛选器驱动程序,因此总线驱动程序处理弹出 IRP。 当总线驱动程序完成 IRP 时,PnP 管理器预期设备在物理上不在系统中。
-
不支持热弹出。
在这种情况下,设备是 可移动 的,但不支持弹出。 PnP 管理器将设备标记为“不存在/未正常工作”。 在用户实际删除并重新插入设备之前,PnP 管理器不会重启设备。 在这种情况下,PnP 管理器不会发送 IRP_MN_EJECT。
-
支持热弹出。
用户模式应用程序可以启动设备弹出。 在这种情况下,没有驱动程序调用此例程,但操作系统会调用 PnP 管理器来启动上面列出的步骤。
IoRequestDeviceEject 的调用方必须在 IRQL <= DISPATCH_LEVEL 运行。 PnP 管理器执行上面列出的大部分设备弹出任务,其 IRQL = PASSIVE_LEVEL。
要求
要求 | 值 |
---|---|
最低受支持的客户端 | 从 Windows 2000 开始可用。 |
目标平台 | 通用 |
标头 | wdm.h(包括 Wdm.h、Ntddk.h、Ntifs.h) |
Library | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | <= DISPATCH_LEVEL (请参阅备注部分) |