La prise en charge de Windows Vista Service Pack 1 (SP1) prend fin le 12 juillet 2011. Pour continuer à recevoir des mises à jour de sécurité pour Windows, assurez-vous que vous exécutez Windows Vista avec Service Pack 2 (SP2). Pour plus d’informations, reportez-vous à cette page web Microsoft : Le support prend fin pour certaines versions de Windows.
Source : Support Microsoft
PUBLICATION RAPIDE
LES ARTICLES DE PUBLICATION RAPIDE FOURNISSENT DES INFORMATIONS DIRECTEMENT AU SEIN DE L’ORGANISATION DE SUPPORT MICROSOFT. LES INFORMATIONS CONTENUES DANS LES PRÉSENTES SONT CRÉÉES EN RÉPONSE À DES SUJETS ÉMERGENTS OU UNIQUES, OU SONT DESTINÉES À COMPLÉTER D’AUTRES INFORMATIONS DE LA BASE DE CONNAISSANCES.
Symptôme
Lorsque vous désactivez un périphérique USB actuellement inactif, vous pouvez recevoir un message d’erreur « Arrêter 0x44 » sur un écran bleu. Ce message d’erreur ressemble au suivant : STOP 0x00000044 ( parameter1 , parameter2 , parameter3 , parameter4 ) MULTIPLE_IRP_COMPLETE_REQUESTS
Cause
Ce problème peut se produire si le périphérique USB utilise un pilote écrit à l’aide de KMDF (Kernel Mode Driver Framework) version 1.7 ou antérieure.Le problème se produit lorsque le périphérique USB est inactif (interruption sélective USB) et que l’appareil est alors désactivé (par exemple, en cliquant avec le bouton droit sur l’appareil dans Gestionnaire de périphériques et en cliquant sur Désactiver).Dans ces conditions, le framework KMDF version 1.7 (ou antérieure) n’attend pas que les irps de suspension sélective USB soient terminés, ce qui permet de supprimer la pile de l’appareil avant que l’IRP de suspension sélective USB soit terminée (par exemple, par le pilote Usbhub).
Résolution
Ce problème est résolu dans l’infrastructure kmDF (Kernel Mode Driver Framework) version 1.9 et ultérieure. La version 1.9 de KMDF (Kernel Mode Driver Framework) est disponible dans la version Windows 7 du Kit de pilotes Windows (WDK).Un développeur de pilote de périphérique USB basé sur KMDF peut contourner ce problème en effectuant les actions suivantes :
-
Inscrivez une routine de rappel EvtDeviceReleaseHardware dans la routine de rappel EvtDriverDeviceAdd du pilote.
-
Allouez un objet WDFWORKITEM dans la routine de rappel EvtDriverDeviceAdd du pilote.
-
Allouez et initialisez un objet KEVENT, mettez en file d’attente l’élément de travail dans la routine de rappel EvtDeviceReleaseHardware du pilote, transmettez cet événement comme paramètre Context et attendez que l’événement soit signalé.
-
Dans la routine de rappel d’élément de travail, retardez le thread d’environ 2 secondes, puis définissez l’événement. La valeur de délai exacte requise peut différer d’un système à l’autre et doit être testée avant l’implémentation finale.
La solution de contournement décrite a deux effets principaux :
-
Il met en file d’attente un élément de travail qui permet de retarder la suppression de la pile de l’appareil jusqu’à ce que la file d’attente d’éléments de travail soit vidée jusqu’à cet élément de travail (car la pile de cœurs USB peut terminer la suspension sélective USB via un élément de travail).
-
Il introduit un délai au cas où l’élément de travail de la pile de cœurs USB et l’élément de travail du pilote sont exécutés simultanément sur des systèmes multiprocesseurs/multicœurs.
REMARQUE : Il ne s’agit pas d’une solution complète. Cela permet uniquement d’atténuer le problème.
Informations supplémentaires
Les exemples d’extraits de code ci-dessous illustrent comment implémenter cette solution de contournement :EvtDriverDeviceAdd( IN WDFDRIVER Driver, IN PWDFDEVICE_INIT DeviceInit ) { PWORKER_ITEM_CONTEXT context ; WDF_OBJECT_ATTRIBUTES attributs ; WDF_WORKITEM_CONFIG workitemConfig ; WDFWORKITEM workItem ; ... // Set EvtDeviceReleaseConseil de logiciel de récupération // ... pnpPowerCallbacks.EvtDeviceReleaseHardware = EvtDeviceReleaseHardware ; WdfDeviceInitSetPnpPowerEventCallbacks(DeviceInit, &pnpPowerCallbacks) ; ... // Allouer WDFWORKITEM // WDF_OBJECT_ATTRIBUTES_INIT(attributs &) ; WDF_OBJECT_ATTRIBUTES_SET_CONTEXT_TYPE(attributs &,WORKER_ITEM_CONTEXT) ; Attributs. ParentObject = appareil ; WDF_WORKITEM_CONFIG_INIT(&workitemConfig, EvtWorkItem) ;status = WdfWorkItemCreate(&workitemConfig, attributs &, &workItem) ; si ( ! NT_SUCCESS(status)) { return status ; } devContext->WorkItem = workItem ; ...}NTSTATUSEvtDeviceReleaseHardware( IN WDFDEVICE Device, IN WDFCMRESLIST ResourcesTranslated ){ KEVENT event ; PWORKER_ITEM_CONTEXT contexte ; WDFWORKITEM workItem ; UNREFERENCED_PARAMETER(ResourcesTranslated) ; workItem = GetDeviceContext(Device)->WorkItem ; context = GetWorkItemContext(workItem) ; KeInitializeEvent(&event, NotificationEvent, FALSE) ; context->Event = &événement ; // Mettre en file d’attente l’élément de travail // WdfWorkItemEnqueue(workItem) ; // Attendez que workitem signale l’événement // KeWaitForSingleObject(&event, Executive, KernelMode, FALSE, NULL) ; retour STATUS_SUCCESS ;}VOIDEvtWorkItem( IN WDFWORKITEM WorkItem ){ PWORKER_ITEM_CONTEXT context ; LARGE_INTEGER intervalle ; context = GetWorkItemContext(WorkItem) ; // Retardez le thread pendant 2 secondes // intervalle. QuadPart = -2 * 10 * 1000 * 1000 ; KeDelayExecutionThread(KernelMode, FALSE, &interval) ; // signalez le thread en attente // 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 ;
DÉDIT DE RESPONSABILITÉ
MICROSOFT ET/OU SES FOURNISSEURS NE FOURNISSENT AUCUNE REPRÉSENTATION NI GARANTIE CONCERNANT L’ADAPTABILITÉ, LA FIABILITÉ OU L’EXACTITUDE DES INFORMATIONS CONTENUES DANS LES DOCUMENTS ET LES GRAPHIQUES ASSOCIÉS PUBLIÉS SUR CE SITE WEB (LES « DOCUMENTS ») À QUELQUE FIN QUE CE SOIT. LES DOCUMENTS PEUVENT INCLURE DES IMPRÉCISIONS TECHNIQUES OU DES ERREURS TYPOGRAPHIQUES ET PEUVENT ÊTRE MODIFIÉS À TOUT MOMENT SANS PRÉAVIS.DANS LA MESURE MAXIMALE AUTORISÉE PAR LA LOI APPLICABLE, MICROSOFT ET/OU SES FOURNISSEURS REJETTENT ET EXCLUENT TOUTES LES REPRÉSENTATIONS, GARANTIES ET CONDITIONS EXPRESSES, IMPLICITES OU LÉGALES, Y COMPRIS, MAIS SANS S’Y LIMITER, LES REPRÉSENTATIONS, LES GARANTIES OU CONDITIONS DE TITRE, L’ABSENCE DE CONTREFAÇON, LA CONDITION SATISFAISANTE OU LA QUALITÉ, LA QUALITÉ MARCHANDE ET L’ADÉQUATION À UN USAGE PARTICULIER, EN CE QUI CONCERNE LE MATÉRIEL.