使用者卸載裝置

當系統執行時,使用者可以透過下列兩種方式之一移除裝置: 依序移除,這表示使用者會通知系統裝置即將移除 (,例如,使用 [卸載] 或 [退出硬體] 程式) ;或意外 移除,這表示使用者不會通知系統,即可將裝置卸載。 例如,如果匯流排支援意外移除 (USB) ,則裝置的驅動程式必須能夠處理裝置突然的充電。

依序移除

使用者要求使用系統的 [卸載] 或 [退出硬體] 程式、使用裝置管理員停用裝置,或按下可退出裝置的退出按鈕來要求移除。 除非驅動程式具有下列專案,否則架構可讓裝置移除或停用:

針對支援裝置的每個函式和篩選驅動程式,架構會依序執行下列動作,一次一個驅動程式,從驅動程式堆疊中最高的驅動程式開始:

  1. 如果驅動程式使用自我管理 I/O,架構會呼叫驅動程式的 EvtDeviceSelfManagedIoSuspend 回 呼函式。

  2. 架構會停止所有驅動程式的電源管理 I/O 佇列。

  3. 如果硬體和驅動程式支援 DMA,架構會針對所建立的每個 DMA 通道) 呼叫驅動程式的EvtDmaEnablerSelfManagedIoStopEvtDmaEnablerFlush 和 EvtDmaEnablerDisable回呼函式 (。

  4. 如果驅動程式存在) ,架構會呼叫驅動程式的 EvtDeviceD0ExitPreInterruptsDisabled 回呼函式 (,然後呼叫驅動程式的 EvtInterruptDisable 回呼函式, (如果每個中斷存在) ,驅動程式就可以停用裝置中斷。

  5. 如果驅動程式存在) ,架構會呼叫驅動程式的 EvtDeviceD0Exit 回 呼函式 (。

  6. 架構會呼叫驅動程式的 EvtDeviceReleaseHardware 回呼函式 (,如果) 存在,則會將 PnP 管理員指派給裝置的硬體資源清單傳遞給它。

  7. 如果驅動程式使用自我管理 I/O,架構會呼叫驅動程式的 EvtDeviceSelfManagedIoFlush 回呼函式。

  8. 如果驅動程式使用自我管理 I/O,架構會呼叫驅動程式的 EvtDeviceSelfManagedIoCleanup 回呼 函式。

匯流排驅動程式是堆疊中最後呼叫的驅動程式。 當架構呼叫匯流排驅動程式的 EvtDeviceD0Exit 回 呼函式時,回呼函式會將裝置的電源狀態設定為 (匯流排的子裝置) 為 D3。 匯流排驅動程式可以藉由呼叫WdfDeviceInitSetReleaseHardwareOrderOnFailure來控制架構何時呼叫其EvtDeviceReleaseHardware回呼函式。

意外移除

使用者意外卸載裝置。 裝置匯流排的匯流排驅動程式發現裝置遺失,並呼叫 WdfChildListUpdateChildDescriptionAsMissing

針對支援裝置的每個函式和篩選驅動程式,架構會依序執行下列動作,一次一個驅動程式,從驅動程式堆疊中最高的驅動程式開始:

  1. 如果驅動程式存在) ,架構會呼叫驅動程式的 EvtDeviceSurpriseRemoval 回呼函式 (。
  2. 如果裝置處於其運作 (D0) 狀態,則裝置已解除叢集:
    1. 架構會停止所有驅動程式的電源管理 I/O 佇列。
    2. 如果驅動程式使用自我管理 I/O,架構會呼叫驅動程式的 EvtDeviceSelfManagedIoSuspend 回 呼函式。
    3. 如果硬體和驅動程式支援 DMA,架構會針對所建立的每個 DMA 通道) 呼叫驅動程式的EvtDmaEnablerSelfManagedIoStopEvtDmaEnablerFlush 和 EvtDmaEnablerDisable回呼函式 (。
    4. 如果驅動程式存在) ,架構會呼叫驅動程式的 EvtDeviceD0ExitPreInterruptsDisabledEvtInterruptDisable 回呼函式 (,讓驅動程式可以停用裝置中斷。
    5. 如果驅動程式存在) ,架構會呼叫驅動程式的 EvtDeviceD0Exit 回 呼函式 (。
  3. 架構會呼叫驅動程式的 EvtDeviceReleaseHardware 回呼函式, (是否存在) ,並傳遞 PnP 管理員指派給裝置的硬體資源清單。
  4. 如果驅動程式使用自我管理 I/O,架構會呼叫驅動程式的 EvtDeviceSelfManagedIoFlush 回呼函式。
  5. 如果驅動程式使用自我管理 I/O,架構會呼叫驅動程式的 EvtDeviceSelfManagedIoCleanup 回呼 函式。

請注意,裝置可以隨時意外移除。 因此,架構可能會一次呼叫驅動程式的 EvtDeviceSurpriseRemoval 回呼函式,而不是先前步驟所示。 例如,如果使用者在 進入低電源狀態時意外取消卸載裝置,架構可能會在呼叫 EvtDeviceSurpriseRemoval 回呼函式之後呼叫 EvtDeviceReleaseHardware 回呼函式。 您不得以假設它和其他回呼函式在特定序列中呼叫的方式撰寫 EvtDeviceSurpriseRemoval 回呼函式的程式碼。

此外,架構不會將裝置的 EvtDeviceSurpriseRemoval 回呼函式與該裝置先前步驟中列出的任何回呼函式同步處理。 因此, EvtDeviceSurpriseRemoval 回呼函 式可能會在另一個先前列出的回呼函式同時執行時執行。