Supporten för Windows Vista Service Pack 1 (SP1) upphör 12 juli 2011. Om du vill fortsätta att få säkerhetsuppdateringar för Windows kontrollerar du att du kör Windows Vista med Service Pack 2 (SP2). Mer information finns på den här Microsoft-webbsidan: Supporten upphör för vissa versioner av Windows.

Källa: Microsoft Support

RAPID PUBLISHING

SNABBPUBLICERINGSARTIKLAR INNEHÅLLER INFORMATION DIREKT FRÅN MICROSOFTS SUPPORTORGANISATION. INFORMATIONEN SOM FINNS HÄRI SKAPAS SOM SVAR PÅ FRAMVÄXANDE ELLER UNIKA ÄMNEN, ELLER ÄR AVSEDD ATT KOMPLETTERA ANNAN KUNSKAPSBASINFORMATION.

Symptom

När du inaktiverar en USB-enhet som för närvarande är inaktiv kan du få felmeddelandet "Stoppa 0x44" på en blå skärm. Det här felmeddelandet liknar följande: STOP 0x00000044 ( parameter1 , parameter2 , parameter3 , parameter4 ) MULTIPLE_IRP_COMPLETE_REQUESTS

Orsak

Det här problemet kan uppstå om USB-enheten använder en drivrutin som skrivs med KMDF-version 1.7 eller tidigare i kernellägesdrivrutinen.Problemet uppstår när USB-enheten är i inaktivt tillstånd (SELEKTIV UPPhängning av USB) och enheten sedan inaktiveras (till exempel genom att högerklicka på enheten i Enhetshanteraren och klicka på Inaktivera).Under dessa förhållanden väntar KMDF framework version 1.7 (eller tidigare) inte på att USB Selective Suspend Irps slutförs, vilket gör att enhetsstacken kan tas bort innan USB Selective Suspend Irp har slutförts (t.ex. av Usbhub-drivrutinen).

Lösning

Det här problemet åtgärdas i KMDF-version 1.9 (kernelläge) och senare.  KMDF-version 1.9 (Kernel Mode Driver Framework) är tillgänglig i Windows 7-versionen av Windows Driver Kit (WDK).En KMDF-baserad utvecklare av USB-drivrutiner kan kringgå det här problemet genom att utföra följande åtgärder:

  1. Registrera en EvtDeviceReleaseHardware callback rutin i förarens EvtDriverDeviceAdd återuppringning rutin.

  2. Allokera ett WDFWORKITEM-objekt i drivrutinens EvtDriverDeviceAdd-återuppringningsrutin.

  3. Allokera och initiera ett KEVENT-objekt, köa arbetsobjektet i drivrutinens EvtDeviceReleaseHardware-återuppringningsrutin, skicka händelsen som parametern Sammanhang och vänta tills händelsen signaleras.

  4. I återanropsrutinen för arbetsobjektet fördröjer du tråden med ungefär 2 sekunder och anger sedan händelsen.  Det exakta fördröjningsvärdet som krävs kan skilja sig mellan systemen och bör testas innan den slutliga implementeringen.

Den beskrivna lösningen har två huvudeffekter:

  • Den köar en arbetsuppgift som hjälper till att fördröja att riva ner enhetsstacken tills arbetsobjektkön är tömd upp till det här arbetsobjektet (eftersom USB-kärnstacken kan slutföra USB Selective Suspend Irp genom ett arbetsobjekt).

  • Det introducerar en fördröjning om USB-kärnstackens arbetsobjekt och drivrutinens arbetsuppgift körs samtidigt på system med flera processorer/multikärniga enheter.

Obs! Det här är inte en fullständig lösning.  Det hjälper bara till att minimera problemet.

Mer information

Exempelkodavsnitten nedan visar hur du implementerar den här lösningen:EvtDriverDeviceAdd( IN WDFDRIVER Driver, IN PWDFDEVICE_INIT DeviceInit ) { PWORKER_ITEM_CONTEXT kontext;    WDF_OBJECT_ATTRIBUTES attribut.    WDF_WORKITEM_CONFIG workitemConfig;    WDFWORKITEM workItem;    ...    // Set EvtDeviceReleaseHardware callback // ...    pnpPowerCallbacks.EvtDeviceReleaseHardware = EvtDeviceReleaseHardware;    WdfDeviceInitSetPnpPowerEventCallbacks(DeviceInit, &pnpPowerCallbacks);    ...    // Allokera WDFWORKITEM // WDF_OBJECT_ATTRIBUTES_INIT(&attribut);    WDF_OBJECT_ATTRIBUTES_SET_CONTEXT_TYPE(&attribut,WORKER_ITEM_CONTEXT);    Attribut. ParentObject = enhet;    WDF_WORKITEM_CONFIG_INIT(&workitemConfig, EvtWorkItem);    status = WdfWorkItemCreate(&workitemConfig, &attribut, &workItem);    om (! NT_SUCCESS(status)) { returstatus;    } devContext->WorkItem = workItem;    ...}NTSTATUSEvtDeviceReleaseHardware( IN WDFDEVICE Device, IN WDFCMRESLIST ResourcesTranslated ){ KEVENT event;    PWORKER_ITEM_CONTEXT sammanhang    WDFWORKITEM workItem;     UNREFERENCED_PARAMETER(ResourcesTranslated);    workItem = GetDeviceContext(Device)->WorkItem;    context = GetWorkItemContext(workItem);        KeInitializeEvent(&händelse, NotificationEvent, FALSE);    context->Event = &händelse;    // Köa workitem // WdfWorkItemEnqueue(workItem);      // Vänta på workitem för att signalera händelsen // KeWaitForSingleObject(&event, Executive, KernelMode, FALSE, NULL);    returnera STATUS_SUCCESS;}VOIDEvtWorkItem( IN WDFWORKITEM WorkItem ){ PWORKER_ITEM_CONTEXT kontext;    LARGE_INTEGER intervall;    context = GetWorkItemContext(WorkItem);    // Fördröj tråden i 2 sekunder // intervall. QuadPart = -2 * 10 * 1000 * 1000;    KeDelayExecutionThread(KernelMode, FALSE, &intervall);    // signal den väntande tråden // KeSetEvent(context->Event, IO_NO_INCREMENT, FALSE);    context->Event = 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 EvtWorkItem;     

ANSVARSFRISKRIVNING

MICROSOFT OCH/ELLER DESS LEVERANTÖRER LÄMNAR INGA UTFÄSTELSER ELLER GARANTIER OM LÄMPLIGHETEN, TILLFÖRLITLIGHETEN ELLER NOGGRANNHETEN I INFORMATIONEN I DE DOKUMENT OCH RELATERAD GRAFIK SOM PUBLICERAS PÅ DENNA WEBBPLATS ("MATERIALET") FÖR NÅGOT ÄNDAMÅL. MATERIALET KAN INNEHÅLLA TEKNISKA FELAKTIGHETER ELLER TYPOGRAFISKA FEL OCH KAN KOMMA ATT REVIDERAS NÄR SOM HELST UTAN FÖREGÅENDE MEDDELANDE.I DEN UTSTRÄCKNING SOM TILLÅTS ENLIGT TILLÄMPLIG LAG FRISKRIVER SIG MICROSOFT OCH/ELLER DESS LEVERANTÖRER FRÅN OCH UTESLUTER ALLA REPRESENTATIONER, GARANTIER OCH VILLKOR OAVSETT UTTRYCKLIG, UNDERFÖRSTÅDD ELLER LAGSTADGAD, INKLUSIVE MEN INTE BEGRÄNSAT TILL UTFÄSTELSER, GARANTIER ELLER VILLKOR FÖR ÄGANDERÄTT, ICKE-INTRÅNG, TILLFREDSSTÄLLANDE VILLKOR ELLER KVALITET, SÄLJBARHET OCH LÄMPLIGHET FÖR ETT VISST ÄNDAMÅL, MED AVSEENDE PÅ MATERIALET.

Behöver du mer hjälp?

Vill du ha fler alternativ?

Utforska prenumerationsförmåner, bläddra bland utbildningskurser, lär dig hur du skyddar din enhet med mera.