處理停止裝置的要求
在兩種情況下,在要求裝置的驅動程式停止裝置之前,PnP 管理員會詢問驅動程式是否停止裝置是個不錯的主意:
使用者已插入新的裝置,而 PnP 管理員必須 重新發佈系統的硬體資源 ,以容納新的裝置。
使用者已指出他們想要 移除裝置。
有數種方式可讓驅動程式處理這些情況:
如果您的驅動程式已呼叫 WdfDeviceSetSpecialFileSupport ,因為裝置支援特殊檔案,而且如果裝置上已開啟特殊檔案,架構將不會允許停止裝置。
為了暫時防止所有停止的時間相對短,驅動程式可以呼叫 WdfDeviceSetStaticStopRemove。
若要個別評估並處理每個停止嘗試,驅動程式可以提供 EvtDeviceQueryStop 和 EvtDeviceQueryRemove 回呼 函式。
如果裝置不支援特殊檔案,而且如果停止或移除裝置永遠不會發生驅動程式或裝置的問題,則驅動程式不會提供 EvtDeviceQueryStop 和 EvtDeviceQueryRemove 回呼函式,且永遠不會呼叫 WdfDeviceSetStaticStopRemove。 在此情況下,PnP 管理員一律會停止裝置,而不需要先檢查驅動程式是否允許它。
轉散發資源
有時候 PnP 管理員必須重新發佈系統的硬體資源。 一般而言,因為匯流排驅動程式回報新裝置已插入,而新裝置需要已指派的資源,所以會發生此轉散發。 必須先停止裝置,才能重新指派資源。
如果您的驅動程式有時無法阻止 PnP 管理員停止忙碌的裝置,驅動程式可以提供 EvtDeviceQueryStop 回呼函式。 如果您的驅動程式的 EvtDeviceQueryStop 回呼函式傳回錯誤狀態值,PnP 管理員將不會停止裝置。
如果驅動程式判斷停止裝置是安全的,回呼函式會傳回STATUS_SUCCESS。 如果裝置的其他驅動程式都沒有防止停止,PnP 管理員會暫時停止裝置。
如需當 PnP 管理員停止裝置轉散發資源時,架構呼叫驅動程式事件回呼函式的順序相關資訊,請參閱 PnP 管理員重新發佈系統資源。
使用者移除或停用裝置
使用者可以移除或停用某些裝置。 例如:
如果您的驅動程式已將卸除式成員設定 (,而不是裝置WDF_DEVICE_PNP_CAPABILITIES結構的SurpriseRemovalOK成員) ,則使用者可以執行 Unplug 或退出硬體計畫,然後卸載或退出裝置。
如果您的驅動程式尚未設定裝置WDF_DEVICE_STATE結構的NotDisable成員,使用者可以使用裝置管理員來停用裝置。
在這種情況下,PnP 管理員會在使用者移除裝置之前嘗試停止裝置。
如果您的驅動程式有時無法移除忙碌的裝置,驅動程式可以提供 EvtDeviceQueryRemove 回呼 函式。 如果任何驅動程式的 EvtDeviceQueryRemove 回呼函式傳回錯誤狀態值,PnP 管理員將不會停止裝置。
如果驅動程式判斷使用者能夠安全地移除裝置,回呼函式會傳回STATUS_SUCCESS。 如果裝置的其他驅動程式都無法移除,PnP 管理員會停止裝置。
如需架構在停止裝置以移除裝置時呼叫驅動程式事件回呼函式的順序相關資訊,請參閱 使用者卸載裝置。