Windows Vista Service Pack 1 (SP1) のサポートは、2011 年 7 月 12 日に終了します。 Windows のセキュリティ更新プログラムを引き続き受け取る場合は、Service Pack 2 (SP2) で Windows Vista を実行していることを確認してください。 詳細については、「Microsoft Web ページ: 一部のバージョンの Windows でサポートが終了する」を参照してください。
ソース: Microsoft サポート
迅速な発行
迅速な発行に関する記事では、MICROSOFT サポート組織内から直接情報が提供されます。 ここに含まれる情報は、新しいトピックまたは一意のトピックに応答して作成されるか、または他のナレッジ ベース情報を補完することを意図しています。
現象
現在アイドル状態の USB デバイスを無効にすると、ブルー スクリーンに "stop 0x44" というエラー メッセージが表示されることがあります。 このエラー メッセージは次のようになります。 STOP 0x00000044 ( parameter1 , parameter2 , parameter3 , parameter4 ) MULTIPLE_IRP_COMPLETE_REQUESTS
原因
この問題は、USB デバイスがカーネル モード ドライバー フレームワーク (KMDF) バージョン 1.7 以前を使用して記述されたドライバーを使用している場合に発生する可能性があります。この問題は、USB デバイスがアイドル状態 (USB 選択的一時停止) 状態で、デバイスが無効になっている場合に発生します (たとえば、デバイス マネージャーでデバイスを右クリックし、[無効] をクリックするなど)。これらの条件下では、KMDF フレームワーク バージョン 1.7 (またはそれ以前) は、USB 選択的な中断 Irp が完了するまで待たないため、USB セレクティブ Suspend Irp が完了する前にデバイス スタックを削除できます (Usbhub ドライバーなど)。
解決方法
この問題は、カーネル モード ドライバー フレームワーク (KMDF) バージョン 1.9 以降で解決されます。 カーネル モード ドライバー フレームワーク (KMDF) バージョン 1.9 は、Windows ドライバー キット (WDK) の Windows 7 バージョンで使用できます。KMDF ベースの USB デバイス ドライバー開発者は、次の操作を実行することで、この問題を回避できます。
-
ドライバーの EvtDriverDeviceAdd コールバック ルーチンに EvtDeviceReleaseHardware コールバック ルーチンを登録します。
-
ドライバーの EvtDriverDeviceAdd コールバック ルーチンで WDFWORKITEM オブジェクトを割り当てます。
-
KEVENT オブジェクトを割り当てて初期化し、ドライバーの EvtDeviceReleaseHardware コールバック ルーチンで作業項目をキューに入れ、このイベントを Context パラメーターとして渡し、イベントが通知されるのを待ちます。
-
作業項目コールバック ルーチンで、スレッドを約 2 秒遅らせ、イベントを設定します。 必要な正確な遅延値はシステムによって異なる場合があり、最終的な実装の前にテストする必要があります。
説明されている回避策には、次の 2 つの主な効果があります。
-
これは、作業項目キューがこの作業項目までドレインされるまでデバイス スタックの破棄を遅延するのに役立つ作業項目をキューに入れます (USB コア スタックが作業項目を介して USB 選択的 Suspend Irp を完了する可能性があるため)。
-
これにより、USB コア スタックの作業項目とドライバーの作業項目がマルチプロセッサ/マルチコア システムで同時に実行される場合に遅延が発生します。
注: これは包括的なソリューションではありません。 これは、問題の軽減にのみ役立ちます。
詳細情報
次のサンプル コード スニペットは、この回避策を実装する方法を示しています:EvtDriverDeviceAdd( IN WDFDRIVER Driver, IN PWDFDEVICE_INIT DeviceInit ) { PWORKER_ITEM_CONTEXT context; WDF_OBJECT_ATTRIBUTES属性; workitemConfig;WDF_WORKITEM_CONFIG WDFWORKITEM workItem; ... // EvtDeviceReleaseHardware コールバックの設定 // ... の pnpPowerCallbacks.EvtDeviceReleaseHardware = EvtDeviceReleaseHardware; WdfDeviceInitSetPnpPowerEventCallbacks(DeviceInit, &pnpPowerCallbacks); ... // WDFWORKITEM の割り当て // WDF_OBJECT_ATTRIBUTES_INIT(&属性); WDF_OBJECT_ATTRIBUTES_SET_CONTEXT_TYPE(&属性,WORKER_ITEM_CONTEXT); 属性。ParentObject = device; WDF_WORKITEM_CONFIG_INIT(&workitemConfig, EvtWorkItem); status = WdfWorkItemCreate(&workitemConfig, &属性, &workItem); if (!NT_SUCCESS(status)) { return status; } devContext->WorkItem = workItem; ...}NTSTATUSEvtDeviceReleaseHardware( IN WDFDEVICE Device, IN WDFCMRESLIST ResourcesTranslated ){ KEVENT イベント; コンテキストのPWORKER_ITEM_CONTEXT; WDFWORKITEM workItem; UNREFERENCED_PARAMETER(ResourcesTranslated); workItem = GetDeviceContext(Device)->WorkItem; context = GetWorkItemContext(workItem); KeInitializeEvent(&イベント, NotificationEvent, FALSE); context->イベント = &イベント; // ワークアイテムをキューに入れます // WdfWorkItemEnqueue(workItem); // イベントが通知されるまで待機します // KeWaitForSingleObject(&イベント, エグゼクティブ, KernelMode, FALSE, NULL); return STATUS_SUCCESS;}VOIDEvtWorkItem( IN WDFWORKITEM WorkItem ){ PWORKER_ITEM_CONTEXT context; LARGE_INTEGER間隔; context = GetWorkItemContext(WorkItem); // スレッドを 2 秒間遅延 //間隔。QuadPart = -2 * 10 * 1000 * 1000; KeDelayExecutionThread(KernelMode, FALSE, &interval); // 待機中のスレッド // KeSetEvent(context->Event, IO_NO_INCREMENT, FALSE); context->イベント = NULL;}ヘッダー ファイルtypedef 構造体_WORKER_ITEM_CONTEXT { PKEVENT イベント;}WORKER_ITEM_CONTEXT、* PWORKER_ITEM_CONTEXT;WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(WORKER_ITEM_CONTEXT、GetWorkItemContext)EVT_WDF_DEVICE_RELEASE_HARDWARE EvtDeviceReleaseHardware;EvtWorkItem をEVT_WDF_WORKITEMします。
DISCLAIMER
MICROSOFT AND/OR ITS SUPPLIERS MAKE NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY, RELIABILITY OR ACCURACY OF THE INFORMATION CONTAINED IN THE DOCUMENTS AND RELATED GRAPHICS PUBLISHED ON THIS WEBSITE (THE "MATERIALS") FOR ANY PURPOSE. THE MATERIALS MAY INCLUDE TECHNICAL INACCURACIES OR TYPOGRAPHICAL ERRORS AND MAY BE REVISED AT ANY TIME WITHOUT NOTICE.適用法によって許容される最大限の範囲において、MICROSOFT および/またはそのサプライヤーは、明示、黙示、または法律に基づくすべての表明、保証、および条件 (タイトルの表明、保証、または条件、非侵害、満足のいく条件または品質、商品性および特定の目的への適合性を含むがこれに限定されない) を、素材に関して否認し、除外します。