使用者卸載裝置
當系統執行時,使用者可以透過下列兩種方式之一移除裝置: 依序移除,這表示使用者會通知系統裝置即將移除 (,例如,使用 [卸載] 或 [退出硬體] 程式) ;或意外 移除,這表示使用者不會通知系統,即可將裝置卸載。 例如,如果匯流排支援意外移除 (USB) ,則裝置的驅動程式必須能夠處理裝置突然的充電。
依序移除
使用者要求使用系統的 [卸載] 或 [退出硬體] 程式、使用裝置管理員停用裝置,或按下可退出裝置的退出按鈕來要求移除。 除非驅動程式具有下列專案,否則架構可讓裝置移除或停用:
稱為 WdfDeviceSetSpecialFileSupport ,並在裝置上開啟特殊檔案。
提供 EvtDeviceQueryRemove 回呼函式,而回呼函式已撤銷移除。
針對支援裝置的每個函式和篩選驅動程式,架構會依序執行下列動作,一次一個驅動程式,從驅動程式堆疊中最高的驅動程式開始:
如果驅動程式使用自我管理 I/O,架構會呼叫驅動程式的 EvtDeviceSelfManagedIoSuspend 回 呼函式。
架構會停止所有驅動程式的電源管理 I/O 佇列。
如果硬體和驅動程式支援 DMA,架構會針對所建立的每個 DMA 通道) 呼叫驅動程式的EvtDmaEnablerSelfManagedIoStop、EvtDmaEnablerFlush 和 EvtDmaEnablerDisable回呼函式 (。
如果驅動程式存在) ,架構會呼叫驅動程式的 EvtDeviceD0ExitPreInterruptsDisabled 回呼函式 (,然後呼叫驅動程式的 EvtInterruptDisable 回呼函式, (如果每個中斷存在) ,驅動程式就可以停用裝置中斷。
如果驅動程式存在) ,架構會呼叫驅動程式的 EvtDeviceD0Exit 回 呼函式 (。
架構會呼叫驅動程式的 EvtDeviceReleaseHardware 回呼函式 (,如果) 存在,則會將 PnP 管理員指派給裝置的硬體資源清單傳遞給它。
如果驅動程式使用自我管理 I/O,架構會呼叫驅動程式的 EvtDeviceSelfManagedIoFlush 回呼函式。
如果驅動程式使用自我管理 I/O,架構會呼叫驅動程式的 EvtDeviceSelfManagedIoCleanup 回呼 函式。
匯流排驅動程式是堆疊中最後呼叫的驅動程式。 當架構呼叫匯流排驅動程式的 EvtDeviceD0Exit 回 呼函式時,回呼函式會將裝置的電源狀態設定為 (匯流排的子裝置) 為 D3。 匯流排驅動程式可以藉由呼叫WdfDeviceInitSetReleaseHardwareOrderOnFailure來控制架構何時呼叫其EvtDeviceReleaseHardware回呼函式。
意外移除
使用者意外卸載裝置。 裝置匯流排的匯流排驅動程式發現裝置遺失,並呼叫 WdfChildListUpdateChildDescriptionAsMissing。
針對支援裝置的每個函式和篩選驅動程式,架構會依序執行下列動作,一次一個驅動程式,從驅動程式堆疊中最高的驅動程式開始:
- 如果驅動程式存在) ,架構會呼叫驅動程式的 EvtDeviceSurpriseRemoval 回呼函式 (。
- 如果裝置處於其運作 (D0) 狀態,則裝置已解除叢集:
- 架構會停止所有驅動程式的電源管理 I/O 佇列。
- 如果驅動程式使用自我管理 I/O,架構會呼叫驅動程式的 EvtDeviceSelfManagedIoSuspend 回 呼函式。
- 如果硬體和驅動程式支援 DMA,架構會針對所建立的每個 DMA 通道) 呼叫驅動程式的EvtDmaEnablerSelfManagedIoStop、EvtDmaEnablerFlush 和 EvtDmaEnablerDisable回呼函式 (。
- 如果驅動程式存在) ,架構會呼叫驅動程式的 EvtDeviceD0ExitPreInterruptsDisabled 和 EvtInterruptDisable 回呼函式 (,讓驅動程式可以停用裝置中斷。
- 如果驅動程式存在) ,架構會呼叫驅動程式的 EvtDeviceD0Exit 回 呼函式 (。
- 架構會呼叫驅動程式的 EvtDeviceReleaseHardware 回呼函式, (是否存在) ,並傳遞 PnP 管理員指派給裝置的硬體資源清單。
- 如果驅動程式使用自我管理 I/O,架構會呼叫驅動程式的 EvtDeviceSelfManagedIoFlush 回呼函式。
- 如果驅動程式使用自我管理 I/O,架構會呼叫驅動程式的 EvtDeviceSelfManagedIoCleanup 回呼 函式。
請注意,裝置可以隨時意外移除。 因此,架構可能會一次呼叫驅動程式的 EvtDeviceSurpriseRemoval 回呼函式,而不是先前步驟所示。 例如,如果使用者在 進入低電源狀態時意外取消卸載裝置,架構可能會在呼叫 EvtDeviceSurpriseRemoval 回呼函式之後呼叫 EvtDeviceReleaseHardware 回呼函式。 您不得以假設它和其他回呼函式在特定序列中呼叫的方式撰寫 EvtDeviceSurpriseRemoval 回呼函式的程式碼。
此外,架構不會將裝置的 EvtDeviceSurpriseRemoval 回呼函式與該裝置先前步驟中列出的任何回呼函式同步處理。 因此, EvtDeviceSurpriseRemoval 回呼函 式可能會在另一個先前列出的回呼函式同時執行時執行。