Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Pour configurer un fichier INF personnalisé pour le CFU, suivez les instructions de cette rubrique afin de fournir les valeurs et paramètres appropriés pour vos fichiers image de microprogramme et périphérique matériel.
Remarque
CFU est disponible dans Windows 10, version 2004 (Mise à jour de mai 2020 de Windows 10) et versions ultérieures.
L’exemple de fichier INF CFU inclus ci-dessous fournit un point de départ pour le fichier INF personnalisé de votre appareil. L’exemple d’INF configure le pilote de boîte de réception CFU (hidcfu.dll) pour activer le scénario de mise à jour du microprogramme pour un appareil CFU Hid virtuel. Consultez le sujet CFU simulation de mise à jour du microprogramme de l’appareil HID virtuel pour des détails sur l'exemple de code de l'appareil virtuel et la procédure qui simule la mise à jour du microprogramme sur un appareil HID virtuel. Les sections ci-dessous référencent l’exemple de fichier INF inclus pour illustrer les concepts de configuration abordés dans cette rubrique.
Votre fichier INF réel doit être personnalisé et configuré spécifiquement pour le microprogramme et le matériel de votre appareil.
Avant de commencer
Les ressources suivantes vous aideront à découvrir le protocole CFU (Component Firmware Update).
Présentation de la mise à jour du microprogramme du composant
Vidéo WinHEC 2018 sur la mise à jour du microprogramme du composant
La spécification du protocole CFU (Component Firmware Update) décrit un protocole HID générique pour mettre à jour le microprogramme des composants présents sur un PC ou des accessoires. La spécification permet à un composant d’accepter le microprogramme sans interrompre l’opération de l’appareil pendant un téléchargement.
L’exemple de mise à jour du microprogramme CFU contient un exemple de code source du microprogramme pour l’implémentation du protocole CFU.
Le CFU standalone tool peut être utilisé pour tester votre mise à jour du microprogramme sur votre appareil pendant le développement et avant de le charger dans Windows Update.
Aperçu
Pour mettre à jour l’image du firmware de votre appareil à l’aide du modèle CFU, vous devez satisfaire aux exigences suivantes :
Fournissez un fichier INF personnalisé pour votre appareil. Ce fichier fournit des informations au pilote de boîte de réception CFU qui envoie la mise à jour du microprogramme à l’appareil. Nous vous recommandons de personnaliser l’exemple de fichier INF CFU fourni ci-dessous dans cette rubrique pour prendre en charge vos scénarios de mise à jour du microprogramme.
Votre appareil doit être fourni avec une image de microprogramme conforme au protocole CFU afin qu’il puisse accepter une mise à jour à partir du pilote CFU.
Votre appareil doit s’exposer en tant qu’appareil HID au système d’exploitation (exécutant le pilote de boîte de réception CFU) et exposer une collection hid Top-Level (TLC). Le pilote CFU inbox se charge sur le TLC et envoie la mise à jour du microprogramme à l’appareil.
Cela vous permet de mettre à jour vos appareils en utilisation via Windows Update. Pour mettre à jour le microprogramme d’un composant, vous déployez l’image de mise à jour du microprogramme via Windows Update. Lorsque le pilote de boîte de réception CFU détecte la présence d’un composant, il effectue les actions nécessaires sur l’hôte et transmet l’image du microprogramme au composant principal de l’appareil.
Configurer votre fichier INF CFU personnalisé
Dans votre fichier INF personnalisé, insérez les ID matériels de vos appareils, comme indiqué dans cet exemple.
[Standard.NTamd64] %CfuVirtualHidDeviceFwUpdate.DeviceDesc%=CfuVirtualHidDeviceFwUpdate, HID\VID_045E&UP:FA00_U:00F5 ; HardwareID for VirtualHidDevice MCUParamètres d’ID matériel INF
Pour que le pilote de boîte de réception CFU communique avec le microprogramme, l’ID matériel spécifié dans l’inf doit correspondre à ce qui est spécifié dans la configuration du descripteur Hid dans le microprogramme.
Comme indiqué ci-dessous, les valeurs CfuVirtualHidDeviceFwUpdate.inf correspondent aux valeurs spécifiées dans le descripteur Hid du pilote de simulation de microprogramme virtuel.
[Standard.NTamd64] %CfuVirtualHidDeviceFwUpdate.DeviceDesc%=CfuVirtualHidDeviceFwUpdate, HID\VID_045E&UP:FA00_U:00F5Pour plus d’informations, reportez-vous au code suivant dans g_CfuVirtualHid_HidReportDescriptor (descripteur de rapport Hid) dans DmfInterface.c.
0x06, CFU_DEVICE_USAGE_PAGE, // USAGE_PAGE(0xFA00) 0x09, CFU_DEVICE_USAGE, // USAGE(0xF5)Dans votre fichier INF personnalisé, mettez à jour les entrées suivantes indiquées ici (y compris les sections SourceDisksFiles et CopyFiles ) pour qu’elles correspondent aux fichiers de votre mise à jour du microprogramme.
Par exemple, l’exemple d’appareil CFU Hid virtuel prend en charge deux composants (MCU et Audio). L’exemple de section ci-dessous spécifie les fichiers d’offre et de charge utile pour ces composants.
; Specify the location of the firmware offer ; and payload file in the registry. ; The files are kept in driver store. ; When deployed, %13% would be expanded to ; the actual path in driver store. ; ; You can change subkey name under CFU ; (for example, "CfuVirtualHidDevice_MCU"), ; and specify your own offer ; (for example, "CfuVirtualHidDevice_MCU.offer.bin") ; and payload (for example, "CfuVirtualHidDevice_MCU.payload.bin") ; file name. ; HKR,A410A898-8132-4246-AC1A-30F1E98BB0A4\CfuVirtualHidDevice_MCU,Offer, 0x00000000, %13%\CfuVirtualHidDevice_MCU.offer.bin HKR,A410A898-8132-4246-AC1A-30F1E98BB0A4\CfuVirtualHidDevice_MCU,Payload, 0x00000000, %13%\CfuVirtualHidDevice_MCU.payload.bin HKR,A410A898-8132-4246-AC1A-30F1E98BB0A4\CfuVirtualHidDevice_Audio,Offer, 0x00000000, %13%\CfuVirtualHidDevice_Audio.offer.bin HKR,A410A898-8132-4246-AC1A-30F1E98BB0A4\CfuVirtualHidDevice_Audio,Payload, 0x00000000, %13%\CfuVirtualHidDevice_Audio.payload.bin [SourceDisksFiles] CfuVirtualHidDevice_MCU.offer.bin=1 CfuVirtualHidDevice_MCU.payload.bin=1 CfuVirtualHidDevice_Audio.offer.bin=1 CfuVirtualHidDevice_Audio.payload.bin=1 [CfuVirtualHidDeviceFwUpdate.CopyFiles] CfuVirtualHidDevice_MCU.offer.bin CfuVirtualHidDevice_MCU.payload.bin CfuVirtualHidDevice_Audio.offer.bin CfuVirtualHidDevice_Audio.payload.binConsultez l’exemple de fichier INF CFU ci-dessous pour le fichier INF CFU complet.
Remarque
Lorsque les packages sont installés, le système d’exploitation remplace le
%13%chemin d’accès complet aux fichiers avant de créer les valeurs de Registre. Par conséquent, le pilote capable d’énumérer le Registre et d’identifier toutes les images du microprogramme et d’offrir des fichiers.Remarque
Dans l’exemple ci-dessus, « A410A898-8132-4246-AC1A-30F1E98BB0A4 », « Offer », « Payload » ne doit pas être modifié, car le pilote de boîte de réception CFU recherche ces valeurs au moment de l’exécution.
Dans votre fichier INF personnalisé, spécifiez les fonctionnalités de votre appareil avec les paramètres de valeur de capacité du registre décrits dans le tableau et la section INF d'exemple ci-dessous.
Le pilote de boîte de réception CFU permet de personnaliser le comportement du pilote pour optimiser certains scénarios. Ces paramètres sont contrôlés via les paramètres du registre, décrits dans le tableau des valeurs de registre CFU ci-dessous.
Par exemple, le pilote de boîte de réception CFU nécessite des informations sur les détails d’utilisation des capacités de valeur en fonction de l’implémentation du microprogramme. Pour plus d’informations et un exemple sur la façon de procéder, consultez la section paramètres de la fonctionnalité INF ci-dessous.
Vous pouvez configurer chacune de ces valeurs de Registre en fonction de vos besoins d’implémentation de microprogramme.
Valeurs du Registre CFU
Valeur de Registre Descriptif Alignement Attribut de protocole : Quel est l’alignement des enregistrements bin requis pour cette configuration ? Pendant la phase d’envoi de la charge utile du protocole, le pilote remplit de nombreux tampons Hid avec la charge utile, puis les envoie au microprogramme, un par un.
Cette option régit la nécessité d'alignement lors de l'empaquetage de la charge utile.
Par défaut, l’alignement de 8 octets est utilisé. Si aucun alignement n’est requis, configurez-le comme 1.
Utiliser UseHidSetOutputReport 0 : le pilote utilise la demande d’écriture lors de l’envoi d’un rapport de sortie. 1 - Le pilote utilisera IOCTL_HID_SET_OUTPUT_REPORT pour envoyer un rapport de sortie.
La valeur par défaut est 0. Définissez cette valeur sur 1 si votre transport sous-jacent n’est pas USB (par exemple, HID over BTH).
OffrePlageUtilisationCapacitéValeurEntréeMinimum Utilisation minimale de la capacité de valeur pour la gestion des rapports d'entrée d'offre. PlageMinimumD'utilisationDeCapacitéDeValeurDeSortieOfferte Utilisation minimale des capacités de valeur pour la gestion des rapports de sortie de l’offre. PlageMinimumDUtilisationDeCapacitéDeValeurDEntréeDeChargeUtile Utilisation minimale de la capacité de valeur pour la gestion des rapports d'entrée de charge utile. CapacitéDeValeurDeSortieDuChargeUtileIntervalleD'UtilisationMinimum Utilisation minimale des capacités de valeur pour la gestion des rapports de sortie de charge utile. VersionsFonctionnalitéValeurCapacitéUtilisationPlageMinimum Utilisation minimale des capacités de valeur pour la gestion des rapports des fonctionnalités de version. Paramètres de capacité de valeur INF
Pour que le pilote de boîte de réception CFU communique avec le microprogramme, les usages des capacités de valeur spécifiés dans l'INF doivent être conformes à ceux de la configuration du descripteur Hid dans le microprogramme.
Dans cet exemple, les valeurs INF correspondent aux valeurs spécifiées dans le descripteur Hid du pilote de simulation de microprogramme virtuel.
[CfuVirtualHidDeviceFwUpdate_HWAddReg] ... ... HKR,,OfferInputValueCapabilityUsageRangeMinimum,0x00010001,0x1A HKR,,OfferOutputValueCapabilityUsageRangeMinimum,0x00010001, 0x1E HKR,,PayloadInputValueCapabilityUsageRangeMinimum,0x00010001,0x26 HKR,,PayloadOutputValueCapabilityUsageRangeMinimum,0x00010001,0x31 HKR,,VersionsFeatureValueCapabilityUsageRangeMinimum,0x00010001, 0x42Pour plus d’informations, reportez-vous au code suivant dans g_CfuVirtualHid_HidReportDescriptor (descripteur de rapport Hid) dans DmfInterface.c.
0x85, REPORT_ID_PAYLOAD_INPUT, // REPORT_ID(34) 0x75, INPUT_REPORT_LENGTH, // REPORT SIZE(32) 0x95, 0x04, // REPORT COUNT(4) 0x19, PAYLOAD_INPUT_USAGE_MIN, // USAGE MIN (0x26) 0x29, PAYLOAD_INPUT_USAGE_MAX, // USAGE MAX (0x29) 0x81, 0x02, // INPUT(0x02) 0x85, REPORT_ID_OFFER_INPUT, // REPORT_ID(37) 0x75, INPUT_REPORT_LENGTH, // REPORT SIZE(32) 0x95, 0x04, // REPORT COUNT(4) 0x19, OFFER_INPUT_USAGE_MIN, // USAGE MIN (0x1A) 0x29, OFFER_INPUT_USAGE_MAX, // USAGE MAX (0x1D) 0x81, 0x02, // INPUT(0x02) 0x85, REPORT_ID_PAYLOAD_OUTPUT, // REPORT_ID(32) 0x75, 0x08, // REPORT SIZE(8) 0x95, OUTPUT_REPORT_LENGTH, // REPORT COUNT(60) 0x09, PAYLOAD_OUTPUT_USAGE, // USAGE(0x31) 0x92, 0x02, 0x01, // OUTPUT(0x02) 0x85, REPORT_ID_OFFER_OUTPUT, // REPORT_ID(37) 0x75, INPUT_REPORT_LENGTH, // REPORT SIZE(32) 0x95, 0x04, // REPORT COUNT(4) 0x19, OFFER_OUTPUT_USAGE_MIN, // USAGE MIN (0x1E) 0x29, OFFER_OUTPUT_USAGE_MAX, // USAGE MAX (0x21) 0x91, 0x02, // OUTPUT(0x02) 0x85, REPORT_ID_VERSIONS_FEATURE, // REPORT_ID(32) 0x75, 0x08, // REPORT SIZE(8) 0x95, FEATURE_REPORT_LENGTH, // REPORT COUNT(60) 0x09, VERSIONS_FEATURE_USAGE, // USAGE(0x42) 0xB2, 0x02, 0x01, // FEATURE(0x02)
Déployer le package de microprogramme via Windows Update
Ensuite, déployez le package via Windows Update.
Pour plus d’informations sur le déploiement, consultez le flux de travail de publication du pilote Windows 10 (téléchargement DOCX).
Format du fichier image de mise à jour du microprogramme
L’image de mise à jour du microprogramme comporte deux parties : un fichier d’offre et un fichier de charge utile. L’offre contient des informations nécessaires sur la charge utile pour permettre au composant principal de l’appareil qui reçoit la mise à jour de décider si la charge utile est acceptable. La charge utile est une plage d’adresses et d’octets que le composant principal peut consommer.
Format de l’offre
Le fichier d’offre est une donnée binaire de 16 octets dont la structure doit correspondre au format spécifié dans la section 5.5.1 de la spécification du protocole CFU.
Format de charge utile
Le fichier de charge utile est un fichier binaire qui contient une collection d’enregistrements stockés contiguëment. Chaque enregistrement est au format suivant.
| Offset | Taille | Valeur | Descriptif |
|---|---|---|---|
| Octet 0 | DWORD | Adresse du microprogramme | Little Endian (LSB First) Adresse d'écriture des données. L'adresse est indexée à partir de 0. Le microprogramme peut l’utiliser comme décalage pour déterminer l’adresse en fonction des besoins lors du placement de l’image en mémoire. |
| Octet 4 | Byte | Longueur | Longueur des données de charge utile. |
| Octet 5-N | Octets | Données | Tableau d’octets de données de charge utile. |
État de la mise à jour du microprogramme
Pendant la transaction de protocole, le pilote de boîte de réception CFU écrit les entrées de Registre pour indiquer l’état. Ce tableau décrit le nom, le format des valeurs et la signification des valeurs que le pilote touche pendant différentes étapes du protocole.
_ID_ dans la table représente l’ID de composant, qui est récupéré à partir du fichier d’offre. Comme décrit dans la spécification, l’ID de composant identifie de façon unique chaque composant.
Pour plus d’informations sur la valeur DWORD, reportez-vous à la spécification.
| Étape | Emplacement | Nom de la valeur Reg | Valeur (DWORD) |
|---|---|---|---|
| Commencer; Pré-offre. | {Clé matérielle de l’appareil}\ComponentFirmwareUpdate | «IDde composant CurrentFwVersion » | Version de l’appareil |
| {Clé matérielle de l’appareil}\ComponentFirmwareUpdate | Statut de mise à jour du firmwarede l'ID de composant | STATUT_MISE_À_JOUR_FIRMWARE_NON_COMMENCÉ | |
| Offre; Prêt à envoyer une offre. | {Clé matérielle de l’appareil}\ComponentFirmwareUpdate | « ID de composant OfferFwVersion » | Version envoyée (ou sur le point d’être envoyée) à l’appareil. |
| Réponse à l'offre (rejetée) | {Clé matérielle de l’appareil}\ComponentFirmwareUpdate | « ComposantIDRaisonDeRejetDuStatutDeMiseÀJourDuFirmware » | Motif du rejet retourné par l’appareil. |
| Réponse de l'offre (Appareil occupé) | {Clé matérielle de l’appareil}\ComponentFirmwareUpdate | Statut de mise à jour du firmwarede l'ID de composant | STATUT_MISE_À_JOUR_MICROLOGICIEL_OCCUPÉ_TRAITEMENT_MISE_À_JOUR |
| Réponse de l'offre (acceptée) ; Envoi du payload. | {Clé matérielle de l’appareil}\ComponentFirmwareUpdate | Statut de mise à jour du firmwarede l'ID de composant | STATUT_MISE_A_JOUR_MICROLOGICIEL_TÉLÉCHARGEMENT_EN_COURS |
| Charge utile acceptée. | {Clé matérielle de l’appareil}\ComponentFirmwareUpdate | Statut de mise à jour du firmwarede l'ID de composant | STATUT_MISE_À_JOUR_FIRMWARE_EN_ATTENTE_DE_RÉINITIALISATION |
| Erreur à n'importe quel stade. | {Clé matérielle de l’appareil}\ComponentFirmwareUpdate | Statut de mise à jour du firmwarede l'ID de composant | ERREUR_STATUT_MISE_À_JOUR_FIRMWARE |
Exemple d'un fichier INF CFU
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Copyright (c) Microsoft Corporation. All rights reserved.
;
; THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
; KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
; IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR
; PURPOSE.
;
; File:
;
: CfuVirtualHidDeviceFwUpdate.inx
;
; Description:
;
; Sample INF file for Cfu virtual Hid device firmware update.
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
[Version]
Signature="$Windows NT$"
Class=Firmware
ClassGuid={f2e7dd72-6468-4e36-b6f1-6488f42c1b52}
Provider=%ManufacturerName%
CatalogFile=CfuVirtualHidDeviceFwUpdate.cat
DriverVer = 12/16/2019,11.42.16.703
PnPLockDown=1
[SourceDisksNames]
1= %DiskName%
[DestinationDirs]
CfuVirtualHidDeviceFwUpdate.CopyFiles=13
[Manufacturer]
%ManufacturerName%=Standard,NTamd64
[Standard.NTamd64]
%CfuVirtualHidDeviceFwUpdate.DeviceDesc%=CfuVirtualHidDeviceFwUpdate, HID\VID_045E&UP:FA00_U:00F5 ; HardwareID for VirtualHidDevice MCU
[CfuVirtualHidDeviceFwUpdate.NT]
Include = HidCfu.inf
Needs = HidCfu.NT
CopyFiles = CfuVirtualHidDeviceFwUpdate.CopyFiles
[CfuVirtualHidDeviceFwUpdate.NT.Wdf]
Include = HidCfu.inf
Needs = HidCfu.NT.Wdf
[CfuVirtualHidDeviceFwUpdate.NT.HW]
AddReg = CfuVirtualHidDeviceFwUpdate_HWAddReg
[CfuVirtualHidDeviceFwUpdate_HWAddReg]
HKR,,FriendlyName,,%FwUpdateFriendlyName%
HKR,,Alignment,0x00010001, 1 ; (No Alignment)
HKR,,OfferInputValueCapabilityUsageRangeMinimum,0x00010001,0x1A
HKR,,OfferOutputValueCapabilityUsageRangeMinimum,0x00010001, 0x1E
HKR,,PayloadInputValueCapabilityUsageRangeMinimum,0x00010001,0x26
HKR,,PayloadOutputValueCapabilityUsageRangeMinimum,0x00010001,0x31
HKR,,VersionsFeatureValueCapabilityUsageRangeMinimum,0x00010001, 0x42
; Specify the location of the firmware offer and payload file in the registry.
; The files are kept in the driver store.
; When deployed, %13% would be expanded to the actual path
; in driver store.
;
; You can change subkey name under CFU (e.g. "CfuVirtualHidDevice_MCU"), and specify your own offer
; (e.g. "CfuVirtualHidDevice_MCU.offer.bin") and payload (e.g "CfuVirtualHidDevice_MCU.payload.bin") file name.
;
HKR,A410A898-8132-4246-AC1A-30F1E98BB0A4\CfuVirtualHidDevice_MCU,Offer, 0x00000000, %13%\CfuVirtualHidDevice_MCU.offer.bin
HKR,A410A898-8132-4246-AC1A-30F1E98BB0A4\CfuVirtualHidDevice_MCU,Payload, 0x00000000, %13%\CfuVirtualHidDevice_MCU.payload.bin
HKR,A410A898-8132-4246-AC1A-30F1E98BB0A4\CfuVirtualHidDevice_Audio,Offer, 0x00000000, %13%\CfuVirtualHidDevice_Audio.offer.bin
HKR,A410A898-8132-4246-AC1A-30F1E98BB0A4\CfuVirtualHidDevice_Audio,Payload, 0x00000000, %13%\CfuVirtualHidDevice_Audio.payload.bin
[SourceDisksFiles]
CfuVirtualHidDevice_MCU.offer.bin=1
CfuVirtualHidDevice_MCU.payload.bin=1
CfuVirtualHidDevice_Audio.offer.bin=1
CfuVirtualHidDevice_Audio.payload.bin=1
[CfuVirtualHidDeviceFwUpdate.CopyFiles]
CfuVirtualHidDevice_MCU.offer.bin
CfuVirtualHidDevice_MCU.payload.bin
CfuVirtualHidDevice_Audio.offer.bin
CfuVirtualHidDevice_Audio.payload.bin
[CfuVirtualHidDeviceFwUpdate.NT.Services]
Include = HidCfu.inf
Needs = HidCfu.NT.Services
; =================== Generic ==================================
[Strings]
ManufacturerName="Surface"
CfuVirtualHidDeviceFwUpdate.DeviceDesc = "CfuVirtualHidDevice Firmware Update"
DiskName = "CfuVirtualHidDevice Firmware Update Installation Disk"
FwUpdateFriendlyName= "CfuVirtualHidDevice Firmware Update"
Résolution des problèmes
Vérifiez les journaux du préprocesseur de traces logicielles de Windows (WPP) pour voir l’interaction du côté du pilote par composant.
Vérifiez les journaux des événements pour toutes les erreurs critiques.
Vérifiez les entrées de Registre de comptabilité décrites dans l’état de mise à jour du microprogramme fournie par le pilote.
Questions fréquentes (FAQ)
J’ai un composant A qui a besoin d’une mise à jour, comment puis-je rendre le pilote CFU conscient du composant A ?
Vous devez configurer l’INF du pilote de boîte de réception CFU à l’aide de l’ID matériel du TLC créé par le composant A.
J’ai deux composants : le composant A et un sous-composant B. Comment dois-je rendre le pilote CFU conscient du composant B ?
Vous n’avez pas besoin de le faire. Le pilote n’a pas besoin de connaître la hiérarchie des composants. Il interagit avec le composant principal.
Comment puis-je rendre le pilote conscient de mes fichiers de microprogramme (offre, charge utile) que j’ai besoin d’envoyer à mon composant A ?
Les informations du fichier de microprogramme sont définies dans le fichier INF en tant que valeurs de Registre.
J’ai de nombreux fichiers de microprogramme, plusieurs offres, charge utile, pour le composant principal A et ses sous-composants. Comment dois-je rendre le pilote conscient de quel fichier de microprogramme est destiné à quel composant ?
Les informations du fichier de microprogramme sont définies dans le fichier INF en tant que valeurs de Registre.
J’utilise le pilote pour les mises à jour du microprogramme. Comment savoir qu’une mise à jour a réussi ?
L’état de la mise à jour du microprogramme est mis à jour par le pilote dans le registre dans le cadre de la gestion.
Ressources supplémentaires
Découvrez le développement de pilotes Windows à l’aide de Windows Driver Foundation (WDF) :
Développement de pilotes avec Windows Driver Foundation, écrit par Penny Orwick et Guy Smith