Windows Vista Service Pack 1 :n (SP1) tuki päättyy 12. heinäkuuta 2011. Jos haluat jatkaa Windowsin suojauspäivitysten vastaanottamista, varmista, että käytössäsi on Windows Vista ja Service Pack 2 (SP2). Lisätietoja on tällä Microsoftin verkkosivulla: Joidenkin Windows-versioiden tuki on päättymässä.
Lähde: Microsoft-tuki
NOPEA JULKAISEMINEN
NOPEAT JULKAISUARTIKKELIT TARJOAVAT TIETOJA SUORAAN MICROSOFTIN TUKIORGANISAATIOSTA. TÄSSÄ OLEVAT TIEDOT LUODAAN VASTAUKSENA UUSIIN TAI YKSILÖLLISIÄ AIHEITA VARTEN, TAI NE ON TARKOITETTU TÄYDENTÄMÄÄN MUITA KNOWLEDGE BASE -TIETOJA.
Oire
Kun poistat käytöstä USB-laitteen, joka on tällä hetkellä käyttämättömänä, näyttöön voi tulla "Pysäytä 0x44" -virhesanoma sinisellä näytöllä. Tämä virhesanoma muistuttaa seuraavaa: STOP 0x00000044 ( parametri1 , parametri2 , parametri3 , parametri4 ) MULTIPLE_IRP_COMPLETE_REQUESTS
Syy
Tämä ongelma voi ilmetä, jos USB-laite käyttää ohjainta, joka on kirjoitettu käyttämällä KMDF (Kernel Mode Driver Framework) -versiota 1.7 tai aiempaa versiota.Ongelma ilmenee, kun USB-laite on käyttämättömänä (USB Selective Suspend) -tilassa ja laite on sitten poissa käytöstä (esimerkiksi napsauttamalla laitetta hiiren kakkospainikkeella Laitehallinta ja valitsemalla Poista käytöstä).Näissä olosuhteissa KMDF-kehyksen versio 1.7 (tai aiempi) ei odota USB Selective Suspend Irps -ohjaimen valmistumista, jolloin laitepino voidaan poistaa ennen USB Selective Suspend Irp -ohjaimen valmistumista (esimerkiksi Usbhub-ohjain).
Ratkaisu
Tämä ongelma on korjattu ydintilan ohjainkehyksen (KMDF) versiossa 1.9 ja uudemmissa versioissa. Ydintilan ohjainkehyksen (KMDF) versio 1.9 on saatavilla Windows Driver Kitin (WDK) Windows 7 -versiossa.KMDF-pohjainen USB-laiteohjaimen kehittäjä voi kiertää tämän ongelman suorittamalla seuraavat toiminnot:
-
Rekisteröi EvtDeviceReleaseHardwaren takaisinsoittorutiini ohjaimen EvtDriverDeviceAdd-takaisinsoittorutiinissa.
-
Varaa WDFWORKITEM-objekti ohjaimen EvtDriverDeviceAdd-takaisinsoittorutiinissa.
-
Varaa ja alusta KEVENT-objekti, aseta työkohde jonoon ohjaimen EvtDeviceReleaseHardware-takaisinsoittorutiinissa, ohita tämä tapahtuma Konteksti-parametrina ja odota, että tapahtuma ilmoitetaan.
-
Viivytä työkohteen takaisinsoittorutiinissa ketjua noin 2 sekuntia ja määritä sitten tapahtuma. Vaadittu tarkka viivearvo voi vaihdella eri järjestelmissä, ja se on testattava ennen lopullista käyttöönottoa.
Kuvatulla vaihtoehtoisella menetelmällä on kaksi päävaikutusta:
-
Se asettaa työkohteen jonoon, mikä auttaa viivyttämään laitepinon purkamista, kunnes työkohteen jono tyhjenee tähän työkohteeseen asti (koska USB-ydinpino saattaa viimeistellä USB Selective Suspend Irp -toiminnon työkohteen läpi).
-
Se aiheuttaa viiveen, jos USB-ydinpinon työkohde ja ohjaimen työkohde suoritetaan samanaikaisesti monisuoritin- tai moniydinjärjestelmissä.
HUOMAUTUS: Tämä ei ole kattava ratkaisu. Se vain auttaa lieventämään ongelmaa.
Lisätietoja
Alla olevat esimerkkikoodikatkelmat kuvaavat, miten tämä vaihtoehtoinen menetelmä:EvtDriverDeviceAdd( IN WDFDRIVER Driver, IN PWDFDEVICE_INIT DeviceInit ) { PWORKER_ITEM_CONTEXT context; WDF_OBJECT_ATTRIBUTES määritteet; WDF_WORKITEM_CONFIG workitemConfig; WDFWORKITEM workItem; ... // Set EvtDeviceReleaseHardware callback // ... pnpPowerCallbacks.EvtDeviceReleaseHardware = EvtDeviceReleaseHardware; WdfDeviceInitSetPnpPowerEventCallbacks(DeviceInit, &pnpPowerCallbacks); ... // Varaa WDFWORKITEM // WDF_OBJECT_ATTRIBUTES_INIT(&määritteet); WDF_OBJECT_ATTRIBUTES_SET_CONTEXT_TYPE(&määritteet,WORKER_ITEM_CONTEXT); Määritteet. ParentObject = laite; WDF_WORKITEM_CONFIG_INIT(&workitemConfig, EvtWorkItem); status = WdfWorkItemCreate(&workitemConfig, &attributes, &workItem); jos (! NT_SUCCESS(tila)) { palautustila; } devContext->WorkItem = workItem; ...}NTSTATUSEvtDeviceReleaseHardware( IN WDFDEVICE Device, IN WDFCMRESLIST ResourcesTranslated ){ KEVENT event; PWORKER_ITEM_CONTEXT konteksti; WDFWORKITEM workItem; UNREFERENCED_PARAMETER(ResourcesTranslated); workItem = GetDeviceContext(Device)->WorkItem; konteksti = GetWorkItemContext(workItem); KeInitializeEvent(&tapahtuma, NotificationEvent, FALSE); context->Event = &tapahtuma; // Aseta työsivusto jonoon // WdfWorkItemEnqueue(workItem); // Odota, että työsivusto ilmoittaa tapahtumasta // KeWaitForSingleObject(&tapahtuma, Executive, KernelMode, FALSE, NULL); palauta STATUS_SUCCESS;}VOIDEvtWorkItem( IN WDFWORKITEM WorkItem ){ PWORKER_ITEM_CONTEXT konteksti; LARGE_INTEGER aikaväli; konteksti = GetWorkItemContext(WorkItem); // Viivästä säiettä 2 sekuntia //väli. QuadPart = -2 * 10 * 1000 * 1000; KeDelayExecutionThread(KernelMode, FALSE, &interval); //signal the waiting thread // KeSetEvent(context->Event, IO_NO_INCREMENT, FALSE); context->Event = NULL;}otsikkotiedostontypedef 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;
VASTUUVAPAUSLAUSEKE
MICROSOFT JA/TAI SEN TOIMITTAJAT EIVÄT ESITÄ TAI TAKAA TÄLLÄ SIVUSTOLLA JULKAISTUJEN ASIAKIRJOJEN JA NIIHIN LIITTYVIEN GRAFIIKOIDEN ("MATERIAALIT") SISÄLTÄMIEN TIETOJEN SOVELTUVUUTTA, LUOTETTAVUUTTA TAI TARKKUUTTA MIHINKÄÄN TARKOITUKSEEN. MATERIAALIT VOIVAT SISÄLTÄÄ TEKNISIÄ EPÄTARKKUUKSIA TAI TYPOGRAFISIA VIRHEITÄ, JA NIITÄ VOIDAAN MUUTTAA MILLOIN TAHANSA ILMAN ENNAKKOILMOITUSTA.SOVELLETTAVAN LAIN SALLIMISSA MÄÄRIN MICROSOFT JA/TAI SEN TOIMITTAJAT KIISTÄVÄT JA SULKEVAT POIS KAIKKI ESITYKSET, TAKUUT JA EHDOT RIIPPUMATTA SIITÄ, OVATKO NE NIMENOMAISIA, EPÄSUORIA TAI LAKISÄÄTEISIÄ, MUKAAN LUKIEN, MUTTA EI RAJOITTUEN, KUVAUKSET, TAKUUT TAI OMISTUSOIKEUDEN EHDOT, RIKKOMATTA JÄTTÄMINEN, TYYDYTTÄVÄ EHTO TAI LAATU, SOVELTUVUUS KAUPANKÄYNNIN KOHTEEKSI JA SOVELTUVUUS TIETTYYN TARKOITUKSEEN MATERIAALIEN OSALTA.