>_ DevTrendsfr

Langue

Accueil

Langages

Sections

Frontend Backend Mobile DevOps AI / ML GameDev Blockchain Embarqué Sécurité
C

Comment ne plus avoir peur du Blue Screen et commencer à écrire des pilotes Windows

Il fut un temps où écrire des pilotes était considéré comme une forme de magie noire. Vous êtes assis dans une pièce sombre, entouré de spécifications de bus, en priant pour que le prochain lancement de WinDbg ne se termine pas par un blocage complet du système. Aujourd'hui, la barrière à l'entrée est plus basse, mais la peur du « Ring 0 » n'a pas disparu. Si vous vous êtes déjà demandé comment le système d'exploitation communique réellement avec le « matériel », ou si vous devez écrire un logiciel spécifique pour le filtrage du trafic ou la protection des données, alors le dépôt Windows-driver-samples de Microsoft est votre point d'entrée.

Ce n'est pas simplement une collection de code, mais une base de connaissances officielle que les ingénieurs Microsoft maintiennent à jour pour Windows 11. Il contient des centaines d'exemples : du simple « Hello World » en mode kernel aux implémentations complexes pour Bluetooth, NFC et les sous-systèmes graphiques.

Pourquoi un développeur ordinaire en a-t-il besoin

La plupart d'entre nous écrivent dans des langages de haut niveau et ne réfléchissent pas à ce qui se passe sous le capot. Mais il existe des tâches impossibles à résoudre en espace utilisateur (User Mode). Par exemple, si vous créez un antivirus, un système de surveillance d'activité disque ou un périphérique USB spécifique, vous devrez descendre au niveau pilote.

Au lieu de deviner comment allouer correctement la mémoire dans le kernel ou gérer une interruption, il vaut mieux voir comment les créateurs du système d'exploitation eux-mêmes le font. Ce dépôt contient des modèles prêts à l'emploi que vous pouvez utiliser comme base, sans réinventer la roue au risque de planter le système en BSOD.

Ce qu'il y a dans ce dépôt

Le dépôt est énorme. Il contient près de 180 000 fichiers couvrant pratiquement tous les aspects de l'interaction avec le matériel. Microsoft a divisé les exemples en catégories pour que vous puissiez au moins vous y retrouver.

Pilotes Windows universels

Actuellement, Microsoft promeut le concept de « un pilote pour tous les appareils ». Le code écrit avec ce modèle fonctionnera sur un ordinateur de bureau classique, une tablette et des systèmes embarqués. Le dépôt regorge d'exemples utilisant uniquement des API approuvées, ce qui garantit la compatibilité avec les futures mises à jour de Windows 11.

Frameworks WDF : KMDF et UMDF

Si vous vous souvenez de l'ancien WDM (Windows Driver Model), vous savez quel cauchemar c'était avec la gestion manuelle des paquets IRP. Le développement moderne de pilotes est construit sur WDF (Windows Driver Frameworks).

  • KMDF (Kernel-Mode Driver Framework) est nécessaire pour travailler directement avec la mémoire et les interruptions.
  • UMDF (User-Mode Driver Framework) vous permet d'écrire des pilotes qui s'exécutent dans un processus utilisateur ordinaire. Si un tel pilote plante, le système survivra. Le dépôt contient d'excellents exemples pour les deux cas.

Exemples pour des technologies spécifiques

Vous y trouverez des implémentations pour tout : des capteurs de lumière et accéléromètres aux filtres réseau complexes et moteurs audio. Les exemples pour travailler avec USB et Bluetooth sont particulièrement utiles, car ces protocoles sont loin d'être triviaux.

Comment travailler avec concrètement

Pour commencer, vous ne pouvez pas simplement télécharger le dépôt et appuyer sur « Build ». Vous aurez besoin de Visual Studio 2022 et du WDK (Windows Driver Kit) installés. Microsoft a intégré les outils de développement de pilotes directement dans l'IDE, donc le processus de build ne diffère plus beaucoup de la compilation d'une application console C++ ordinaire.

Voici un exemple de ce à quoi ressemble un pilote minimal basé sur KMDF. Dans le dépôt, vous trouverez une implémentation détaillée de DriverEntry — le point d'entrée où tout commence :

NTSTATUS
DriverEntry(
    _In_ PDRIVER_OBJECT  DriverObject,
    _In_ PUNICODE_STRING RegistryPath
    )
{
    WDF_DRIVER_CONFIG config;
    NTSTATUS status;

    // Инициализация структуры конфигурации
    WDF_DRIVER_CONFIG_INIT(&config, EvtDeviceAdd);

    // Создание объекта драйвера
    status = WdfDriverCreate(DriverObject,
                             RegistryPath,
                             WDF_NO_OBJECT_ATTRIBUTES,
                             &config,
                             WDF_NO_HANDLE);
    return status;
}

Curieusement, le dépôt inclut même des instructions pour utiliser GitHub Actions pour les builds automatisés de pilotes. C'est pratique si vous voulez configurer une CI/CD pour votre projet de bas niveau.

À quoi faire attention

Point important : vous ne pouvez pas simplement copier le code de ces exemples et le déployer en production. Microsoft le souligne spécifiquement dans la documentation « From Sample Code to Production Driver ». Vous devrez :

  1. Générer de nouveaux GUID pour vos appareils.
  2. Examiner attentivement la gestion des erreurs (dans les exemples, elle est souvent simplifiée pour plus de clarté).
  3. Configurer la signature numérique, sinon Windows refusera simplement de charger votre binaire.

D'ailleurs, si vous débutez, je vous recommande d'abord de regarder le dossier du pilote UMDF. C'est plus sûr. Vous pourrez déboguer le code comme une application ordinaire, sans craindre qu'une seule erreur de pointeur ne force votre ordinateur à redémarrer.

Qui devrait étudier ce dépôt

En premier lieu — les programmeurs systèmes et ceux qui travaillent avec des systèmes embarqués. Mais même si vous travaillez sur des logiciels applicatifs, comprendre comment les pilotes de système de fichiers ou réseau sont structurés élargit considérablement votre perspective. Vous commencerez à comprendre pourquoi certains opérations d'E/S se comportent comme elles le font.

Le dépôt est vivant, les commits arrivent régulièrement, et le nombre d'étoiles (près de 8 000) indique que le développement de pilotes est toujours pertinent, malgré toutes les tentatives de nous abstraire du « matériel ». Si vous manquiez d'exemples de qualité de programmation système en C, vous les avez trouvés.

Projets similaires