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 管理器:

  1. 创建受此设备弹出影响的其他设备的列表。

    PnP 管理器查询设备的删除关系、弹出关系和总线关系(子设备)。

  2. 确定设备及其相关设备是否可以删除软件。

    PnP 管理器将 IRP_MN_QUERY_REMOVE_DEVICE IRP 发送到设备的驱动程序及其相关设备。 PnP 管理器还会向任何用户模式和内核模式组件发送通知,这些组件在设备上注册了设备更改通知或其任何相关设备。 如果任何驱动程序或用户模式组件都无法删除查询,PnP 管理器会弹出一个对话框,通知用户弹出失败。

  3. 软件删除设备及其相关设备。

    如果前面的步骤成功,PnP 管理器会通知已注册的驱动程序和应用程序设备及其相关设备正在软件删除。 然后,PnP 管理器会将 IRP_MN_REMOVE_DEVICE IRP 发送到设备的驱动程序及其相关设备。 函数和筛选器驱动程序与设备堆栈分离,并删除设备的设备对象。 总线驱动程序会保留设备的 PDO(s),除非设备在物理上消失,并且总线驱动程序在最近对设备的父总线 IRP_MN_QUERY_DEVICE_RELATIONS/BusRelations 的响应中省略了设备。

  4. 指示总线驱动程序弹出设备(如果可能)。

    PnP 管理器执行不同的步骤,具体取决于设备的弹出功能:

    • 支持热弹出。

      如果为设备设置了 弹出 功能,则当系统运行时(处于 PowerSystemWorking 状态),可以弹出设备。 PnP 管理器向设备的总线驱动程序发送 IRP_MN_EJECT 请求。 为了响应删除 IRP,以前从堆栈分离的任何函数和筛选器驱动程序,因此总线驱动程序处理弹出 IRP。 当总线驱动程序完成 IRP 时,PnP 管理器希望设备在系统中实际缺席。

    • 不支持 热弹出

      在这种情况下,设备 可移动 但不支持弹出。 PnP 管理器将设备标记为“不存在/无法正常工作”。 在用户物理删除设备并重新插入设备之前,PnP 管理器不会重启设备。 在这种情况下,PnP 管理器不会发送 IRP_MN_EJECT

    设备的父总线驱动程序设置设备的功能,包括其弹出功能,以响应 IRP_MN_QUERY_CAPABILITIES 请求。 函数或筛选器驱动程序可以选择指定功能。
当设备被弹出时,其子设备会随其一起从系统物理删除。

用户模式应用程序可以启动设备弹出。 在这种情况下,没有驱动程序调用此例程,但作系统调用 PnP 管理器来启动上面列出的步骤。

IoRequestDeviceEject 的调用方必须在 IRQL <= DISPATCH_LEVEL 上运行。 PnP 管理器执行上面列出的大多数设备弹出任务 = PASSIVE_LEVEL。

要求

要求 价值
最低支持的客户端 从 Windows 2000 开始可用。
目标平台 普遍
标头 wdm.h (包括 Wdm.h、Ntddk.h、Ntifs.h)
NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <= DISPATCH_LEVEL (请参阅“备注”部分)

另请参阅

IRP_MN_EJECT

IRP_MN_QUERY_DEVICE_RELATIONS

IRP_MN_QUERY_REMOVE_DEVICE

IRP_MN_REMOVE_DEVICE