Pomoc techniczna dla systemu Windows Vista z dodatkiem Service Pack 1 (SP1) kończy się 12 lipca 2011 r. Aby w dalszym ciągu otrzymywać aktualizacje zabezpieczeń dla systemu Windows, należy korzystać z systemu Windows Vista z dodatkiem Service Pack 2 (SP2). Aby uzyskać więcej informacji, zobacz tę stronę internetową firmy Microsoft: Pomoc techniczna dla niektórych wersji systemu Windows kończy się.

Źródło: pomoc techniczna firmy Microsoft

RAPID PUBLISHING

ARTYKUŁY DOTYCZĄCE SZYBKIEGO PUBLIKOWANIA UDOSTĘPNIAJĄ INFORMACJE BEZPOŚREDNIO Z POZIOMU ORGANIZACJI POMOCY TECHNICZNEJ FIRMY MICROSOFT. INFORMACJE ZAWARTE W NINIEJSZYM ARTYKULE SĄ TWORZONE W ODPOWIEDZI NA POJAWIAJĄCE SIĘ LUB UNIKATOWE TEMATY LUB MAJĄ NA CELU UZUPEŁNIENIE INNYCH INFORMACJI Z BAZY WIEDZY.

Symptom

Po wyłączeniu urządzenia USB, które jest obecnie bezczynne, może zostać wyświetlony komunikat o błędzie "Zatrzymaj 0x44" na niebieskim ekranie. Ten komunikat o błędzie przypomina następujący komunikat: STOP 0x00000044 ( parametr1 , parametr2 , parametr3 , parametr4 ) MULTIPLE_IRP_COMPLETE_REQUESTS

Przyczyna

Ten problem może wystąpić, jeśli urządzenie USB używa sterownika napisanego przy użyciu struktury sterowników trybu jądra (KMDF) w wersji 1.7 lub wcześniejszej.Ten problem występuje, gdy urządzenie USB znajduje się w stanie bezczynności (selektywne zawieszanie USB), a następnie jest wyłączone (na przykład przez kliknięcie prawym przyciskiem myszy urządzenia w Menedżer urządzeń i kliknięcie pozycji Wyłącz).W tych warunkach struktura KMDF w wersji 1.7 (lub wcześniejszej) nie czeka na ukończenie selektywnego zawieszaniarpów USB, co pozwala na usunięcie stosu urządzeń przed ukończeniem selektywnego zawieszenia Irp USB (np. przez sterownik Usbhub).

Rozwiązanie

Ten problem został rozwiązany w programie Kernel Mode Driver Framework (KMDF) w wersji 1.9 lub nowszej.  Program Kernel Mode Driver Framework (KMDF) w wersji 1.9 jest dostępny w wersji Windows 7 zestawu sterowników systemu Windows (WDK).Deweloper sterownika urządzenia USB oparty na kmdf może obejść ten problem, wykonując następujące czynności:

  1. Zarejestruj procedurę oddzwonienia EvtDeviceReleaseHardware w procedurze oddzwonienia EvtDriverDeviceAdd sterownika.

  2. Przydziel obiekt WDFWORKITEM w procedurze wywołania zwrotnego EvtDriverDeviceAdd sterownika.

  3. Przydzielanie i inicjowanie obiektu KEVENT, kolejkowanie elementu roboczego w procedurze wywołania zwrotnego EvtDeviceReleaseHardware sterownika, przekazywanie tego zdarzenia jako parametru kontekstowego i oczekiwanie na zasygnalizowanie zdarzenia.

  4. W procedurze wywołania zwrotnego elementu roboczego opóźnij wątek o około 2 sekundy, a następnie ustaw zdarzenie.  Dokładna wymagana wartość opóźnienia może się różnić w różnych systemach i powinna być testowana przed ostatecznym wdrożeniem.

Opisane obejście ma dwa główne efekty:

  • Umieszcza w kolejce element roboczy, co pomaga opóźnić zrywanie stosu urządzenia, aż kolejka elementów roboczych zostanie wyczerpana do tego elementu roboczego (ponieważ stos rdzenia USB może zakończyć selektywne zawieszanie Irp USB za pośrednictwem elementu roboczego).

  • Wprowadza opóźnienie w przypadku, gdy element roboczy stosu rdzenia USB i element roboczy sterownika są wykonywane jednocześnie w systemach z wieloma procesorami/wieloma rdzeniami.

UWAGA: Nie jest to kompleksowe rozwiązanie.  To tylko pomaga złagodzić problem.

Więcej informacji

W poniższych przykładowych fragmentach kodu pokazano, jak zaimplementować to obejście:EvtDriverDeviceAdd( IN WDFDRIVER Driver, IN PWDFDEVICE_INIT DeviceInit) { PWORKER_ITEM_CONTEXT kontekstu;    WDF_OBJECT_ATTRIBUTES atrybutów;    WDF_WORKITEM_CONFIG workitemConfig;    WDFWORKITEM workItem;    ...    // Ustaw wywołanie EvtDeviceReleaseHardware // ...    pnpPowerCallbacks.EvtDeviceReleaseHardware = EvtDeviceReleaseHardware;    WdfDeviceInitSetPnpPowerEventCallbacks(DeviceInit, &pnpPowerCallbacks);    ...    // Allocate WDFWORKITEM // WDF_OBJECT_ATTRIBUTES_INIT(atrybuty &);    WDF_OBJECT_ATTRIBUTES_SET_CONTEXT_TYPE(atrybuty &;WORKER_ITEM_CONTEXT);    Atrybuty. ParentObject = urządzenie;    WDF_WORKITEM_CONFIG_INIT(&workitemConfig, EvtWorkItem);    stan = WdfWorkItemCreate(&workitemConfig, atrybuty &, &element roboczy);    jeżeli (! NT_SUCCESS(stan)) { stan zwrotu;    } devContext->WorkItem = workItem;    ...}NTSTATUSEvtDeviceReleaseHardware( IN WDFDEVICE Device, IN WDFCMRESLIST ResourcesTranslated ){ KEVENT event;    PWORKER_ITEM_CONTEXT kontekstu;    WDFWORKITEM workItem;     UNREFERENCED_PARAMETER(ResourcesTranslated);    workItem = GetDeviceContext(Device)->WorkItem;    kontekst = GetWorkItemContext(workItem);        KeInitializeEvent(zdarzenie &, NotificationEvent, FALSE);    zdarzenie kontekstowe >= zdarzenie &;    // Kolejkowanie elementu roboczego // WdfWorkItemEnqueue(workItem);      // Poczekaj, aż element roboczy zasygnalizuje zdarzenie // KeWaitForSingleObject(zdarzenie &, Executive, KernelMode, FALSE, NULL);    STATUS_SUCCESS zwrotu;}VOIDEvtWorkItem( IN WDFWORKITEM WorkItem ){ PWORKER_ITEM_CONTEXT kontekst;    interwał LARGE_INTEGER;    kontekst = GetWorkItemContext(Element Roboczy);    // Opóźnianie wątku o 2 sekundy // interwał. QuadPart = -2 * 10 * 1000 * 1000;    KeDelayExecutionThread(KernelMode, FALSE, &interwał);    // sygnał wątku oczekiwania // KeSetEvent(context->Event, IO_NO_INCREMENT, FALSE);    context->Event = NULL;}w plikunagłówka typedef 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;     

ZASTRZEŻENIE

FIRMA MICROSOFT I/LUB JEJ DOSTAWCY NIE SKŁADAJĄ ŻADNYCH OŚWIADCZEŃ ANI GWARANCJI DOTYCZĄCYCH PRZYDATNOŚCI DO JAKIEGOKOLWIEK CELU, NIEZAWODNOŚCI ANI ŚCISŁOŚCI INFORMACJI I POKREWNYCH GRAFIK ZAWARTYCH W TEJ WITRYNIE SIECI WEB („MATERIAŁY”). MATERIAŁY MOGĄ ZAWIERAĆ NIEŚCISŁOŚCI TECHNICZNE LUB BŁĘDY TYPOGRAFICZNE I MOGĄ ZOSTAĆ ZMIENIONE W DOWOLNYM MOMENCIE BEZ POWIADOMIENIA.W MAKSYMALNYM ZAKRESIE DOZWOLONYM PRZEZ OBOWIĄZUJĄCE PRAWO FIRMA MICROSOFT I/LUB JEJ DOSTAWCY ZRZEKAJĄ SIĘ WSZELKICH OŚWIADCZEŃ, GWARANCJI I WARUNKÓW JAWNYCH, DOROZUMIANYCH LUB USTAWOWYCH, W TYM MIĘDZY INNYMI OŚWIADCZEŃ, GWARANCJI LUB WARUNKÓW TYTUŁU, NIENAGWAŁCENIA, ZADOWALAJĄCYCH WARUNKÓW LUB JAKOŚCI, PRZYDATNOŚCI HANDLOWEJ I PRZYDATNOŚCI DO OKREŚLONEGO CELU, W ODNIESIENIU DO MATERIAŁÓW.

Potrzebujesz dalszej pomocy?

Chcesz uzyskać więcej opcji?

Poznaj korzyści z subskrypcji, przeglądaj kursy szkoleniowe, dowiedz się, jak zabezpieczyć urządzenie i nie tylko.