Windows Vista 服務包 1 (SP1) 的支援將於 2011 年 7 月 12 日結束。 要持續接收 Windows 的安全更新,請確保你使用的是 Windows Vista,並使用 Service Pack 2 (SP2) 。 欲了解更多資訊,請參閱這個 Microsoft 網頁: 部分 Windows 版本的支援即將結束。
來源:Microsoft 支援服務
快速出版
快速發佈文章直接提供來自 MICROSOFT 支援組織內部的資訊。 本文所含資訊是針對新興或獨特主題所創建,或旨在補充其他知識庫資訊。
徵狀
當你停用目前閒置的 USB 裝置時,可能會在藍屏上看到「停止0x44」錯誤訊息。 此錯誤訊息類似:STOP 0x00000044 ( parameter1 , parameter2, parameter3, parameter4 ) MULTIPLE_IRP_COMPLETE_REQUESTS
原因
若 USB 裝置使用使用 KMDF 1.7 或更早版本) 核心模式驅動框架 (驅動程式,可能會發生此問題。問題發生在 USB 裝置處於閒置 (USB 選擇性暫停) 狀態時,裝置會被停用 (,例如在 裝置管理員 中右鍵點擊該裝置並點擊停用) 。在此條件下,KMDF 框架 1.7 (或更早版本) 不會等待 USB 選擇性暫停 IRP 完成,因此裝置堆疊能在 USB 選擇性暫停 IRP 完成前被移除,例如由 Usbhub 驅動程式) (。
解決方案
此問題在 KMDF) 1.9 版及更新版本 (核心模式驅動框架中已解決。 核心模式驅動程式框架 (KMDF) 版本 1.9 可在 Windows 7 版本的 Windows 驅動程式包中取得 (WDK) 。基於 KMDF 的 USB 裝置驅動程式開發者可以透過執行以下操作來繞過此問題:
-
在驅動程式的 EvtDriverDeviceAdd 回調例程中註冊一個 EvtDeviceReleaseHardware 回調例程。
-
在驅動程式的 EvtDriverDeviceAdd 回調例程中配置一個 WDFWORKITEM 物件。
-
配置並初始化一個 KEVENT 物件,將工作項目排隊於驅動程式的 EvtDeviceReleaseHardware 回調例程中,將此事件作為上下文參數傳遞,並等待事件被發出訊號。
-
在工作項目回調例程中,將執行緒延遲約 2 秒,然後設定事件。 所需精確的延遲值可能因系統而異,應在最終實施前進行測試。
上述的解決方法有兩個主要效果:
-
它會排隊處理一個工作項目,有助於延遲拆除裝置堆疊,直到工作項目的排隊 (該工作項目被排空,因為 USB 核心堆疊可能會透過工作項目) 完成 USB 選擇性暫停 IRP。
-
它會在多處理器/多核心系統同時執行 USB 核心堆疊的工作項目與驅動程式的工作項目時,產生延遲。
注意:這並非全面的解決方案。 這只會幫助緩解問題。
其他相關資訊
以下範例程式碼片段說明如何實作此變通方法:EvtDriverDeviceAdd ( 在 WDFDRIVER 驅動程式中,IN PWDFDEVICE_INIT DeviceInit ) { PWORKER_ITEM_CONTEXT context; WDF_OBJECT_ATTRIBUTES屬性; WDF_WORKITEM_CONFIG workitemConfig; WDFWORKITEM workItem; ...... // 設定 EvtDeviceReleaseHardware 回調 // ... pnpPowerCallbacks.EvtDeviceReleaseHardware = EvtDeviceReleaseHardware; WdfDeviceInitSetPnpPowerEventCallbacks (DeviceInit, &pnpPowerCallbacks) ; ...... // 配置 WDFWORKITEM // WDF_OBJECT_ATTRIBUTES_INIT (&屬性) ; WDF_OBJECT_ATTRIBUTES_SET_CONTEXT_TYPE (&屬性,WORKER_ITEM_CONTEXT) ; 屬性。ParentObject = 裝置; WDF_WORKITEM_CONFIG_INIT (&workitemConfig, EvtWorkItem) ; status = WdfWorkItemCreate (&workitemConfig, &attributes, &workItem) ; 如果 (!NT_SUCCESS (狀態) ) { 回歸狀態; } devContext->WorkItem = workItem; ...}NTSTATUSEvtDeviceReleaseHardware ( 在 WDFDEVICE 裝置,IN WDFCMRESLIST 資源翻譯 ) { KEVENT event; PWORKER_ITEM_CONTEXT背景; WDFWORKITEM workItem; UNREFERENCED_PARAMETER (資源翻譯) ; workItem = GetDeviceContext (Device) ->WorkItem; context = GetWorkItemContext (workItem) ; KeInitializeEvent (&事件、通知事件、FALSE) ; 上下文 >事件 = &事件; // 排隊工作項目 // WdfWorkItemEnqueue (workItem) ; // 等待工作項目發出事件通知 // KeWaitForSingleObject (&事件、Executive、KernelMode、FALSE、NULL) ; 回傳 STATUS_SUCCESS;}VOIDEvtWorkItem ( 在 WDFWORKITEM WorkItem ) { PWORKER_ITEM_CONTEXT context; LARGE_INTEGER間歇; context = GetWorkItemContext (WorkItem) ; // 延遲執行緒 2 秒 // 間隔。四分部 = -2 * 10 * 1000 * 1000; KeDelayExecutionThread (KernelMode, FALSE, &interval) ; // 向等待執行緒發出訊號 // KeSetEvent (context->事件、IO_NO_INCREMENT、FALSE) ; context->事件 = NULL;}in header filetypedef struct _WORKER_ITEM_CONTEXT { PKEVENT Event;}WORKER_ITEM_CONTEXT,* PWORKER_ITEM_CONTEXT;WDF_DECLARE_CONTEXT_TYPE_WITH_NAME (WORKER_ITEM_CONTEXT,GetWorkItemContext) EVT_WDF_DEVICE_RELEASE_HARDWARE EvtDeviceReleaseHardware;EVT_WDF_WORKITEM 工作項目;
免責聲明
MICROSOFT及/或其供應商對本網站 (「資料」所載文件及相關圖表中資訊的適用性、可靠性或準確性 ) 不作任何保證或保證,無論用於任何目的。 資料可能包含技術性不準確或印刷錯誤,且可隨時修訂,恕不另行通知。在適用法律允許的最大範圍內,MICROSOFT 及/或其供應商對所有明示、默示或法定的陳述、保證及條件不包括但不限於所有權、非侵權、令人滿意的狀態或品質、適銷性及特定用途的適用性等陳述、保證或條件,與資料相關。