>_ DevTrendspl

Język

Strona główna

Języki

Sekcje

Frontend Backend Mobilne DevOps AI / ML GameDev Blockchain Systemy wbudowane Bezpieczeństwo
C

Jak przestać bać się Niebieskiego Ekranu i zacząć pisać sterowniki Windows

Dawniej pisanie sterowników uważano za coś w rodzaju czarnej magii. Siedziałeś w ciemnym pokoju, otoczony specyfikacjami magistrali, modląc się, żeby kolejne uruchomienie WinDbg nie zakończyło się zawieszeniem systemu. Dziś bariera wejścia jest niższa, ale strach przed „Ring 0" ни gdzie nie zniknął. Jeśli kiedykolwiek zastanawiałeś się, jak system operacyjny tak naprawdę komunikuje się ze „sprzętem", albo potrzebujesz napisać oprogramowanie do filtrowania ruchu sieciowego lub ochrony danych, to Windows-driver-samples od Microsoft to Twoje miejsce startowe.

To nie tylko zbiór kodu, ale oficjalna baza wiedzy, którą inżynierowie Microsoftu regularnie aktualizują dla Windows 11. Zawiera setki przykładów: od prostego „Hello World" w trybie jądra po złożone implementacje dla Bluetooth, NFC i podsystemów graficznych.

Dlaczego zwykły programista potrzebuje tego

Większość z nas pisze w językach wysokiego poziomu i nie myśli o tym, co dzieje się pod maską. Ale są zadania, których nie da się rozwiązać w przestrzeni użytkownika (User Mode). Na przykład jeśli tworzysz program antywirusowy, system monitorowania aktywności dysku lub konkretne urządzenie USB, będziesz musiał zejść na poziom sterowników.

Zamiast zgadywać, jak prawidłowo alokować pamięć w jądrze lub obsługiwać przerwanie, lepiej zobaczyć, jak robią to twórcy systemu operacyjnego. To repozytorium zawiera gotowe szablony, których możesz użyć jako punkt wyjścia, bez wymyślania koła na nowo z ryzykiem zapchania systemu BSOD-em.

Co znajdziesz w tym repozytorium

Repozytorium jest ogromne. Ma prawie 180 tysięcy plików obejmujących praktycznie każdy aspekt interakcji ze sprzętem. Microsoft podzielił przykłady na kategorie, żeby można było jakoś się w nich orientować.

Uniwersalne sterowniki Windows

Obecnie Microsoft promuje koncepcję „jeden sterownik dla wszystkich urządzeń". Kod napisany w tym modelu będzie działać na zwykłym komputerze stacjonarnym, tablecie i systemach wbudowanych. Repozytorium jest pełne przykładów używających wyłącznie zatwierdzonych API, co gwarantuje kompatybilność z przyszłymi aktualizacjami Windows 11.

Frameworki WDF: KMDF i UMDF

Jeśli pamiętasz stary WDM (Windows Driver Model), wiesz, jakim koszmarem było ręczne zarządzanie pakietami IRP. Nowoczesny rozwój sterowników opiera się na WDF (Windows Driver Frameworks).

  • KMDF (Kernel-Mode Driver Framework) jest potrzebny do bezpośredniej pracy z pamięcią i przerwaniami.
  • UMDF (User-Mode Driver Framework) pozwala pisać sterowniki działające w zwykłym procesie użytkownika. Jeśli taki sterownik się zawiesi, system przetrwa. Repozytorium zawiera doskonałe przykłady dla obu przypadków.

Przykłady dla konkretnych technologii

Tutaj znajdziesz implementacje dosłownie wszystkiego: od czujników światła i akcelerometrów po złożone filtry sieciowe i silniki audio. Szczególnie przydatne są przykłady pracy z USB i Bluetooth, ponieważ te protokoły wcale nie są trywialne.

Jak pracować z tym w praktyce

Żeby zacząć, nie możesz po prostu pobrać repozytorium i nacisnąć „Build". Będziesz potrzebować Visual Studio 2022 i zainstalowanego WDK (Windows Driver Kit). Microsoft zintegrował narzędzia do tworzenia sterowników bezpośrednio z IDE, więc proces budowania niewiele różni się teraz od kompilacji zwykłej aplikacji konsolowej C++.

Oto przykład tego, jak wygląda minimalny sterownik oparty na KMDF. W repozytorium znajdziesz szczegółową implementację DriverEntry — punktu wejścia, gdzie wszystko się zaczyna:

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;
}

Co ciekawe, repozytorium zawiera nawet instrukcje dotyczące używania GitHub Actions do automatycznego budowania sterowników. To wygodne, jeśli chcesz skonfigurować CI/CD dla swojego projektu niskiego poziomu.

Na co zwrócić uwagę

Ważna kwestia: nie możesz po prostu skopiować kodu z tych przykładów i wysłać go do produkcji. Microsoft specjalnie to podkreśla w dokumentacji „From Sample Code to Production Driver". Będziesz musiał:

  1. Wygenerować nowe GUID-y dla swoich urządzeń.
  2. Dokładnie przejrzeć obsługę błędów (w przykładach jest ona często uproszczona dla jasności).
  3. Skonfigurować podpisywanie cyfrowe, w przeciwnym razie Windows po prostu odmówi załadowania Twojego pliku binarnego.

Przy okazji, jeśli dopiero zaczynasz, polecam najpierw zajrzeć do folderu ze sterownikami UMDF. Jest bezpieczniej. Będziesz mógł debugować kod jak zwykłą aplikację, bez obawy, że jeden błąd wskaźnika zmusi komputer do restartu.

Kto powinien studiować to repozytorium

Przede wszystkim — programiści systemowi i osoby pracujące z systemami wbudowanymi. Ale nawet jeśli zajmujesz się oprogramowaniem aplikacyjnym, zrozumienie struktury sterowników systemu plików czy sieci znacznie poszerza perspektywę. Zaczniesz rozumieć, dlaczego pewne operacje I/O zachowują się tak, a nie inaczej.

Repozytorium jest żywe, commity pojawiają się regularnie, a liczba gwiazdek (prawie 8 tysięcy) świadczy o tym, że programowanie sterowników wciąż jest aktualne, mimo wszystkich prób abstrakcji od „sprzętu". Jeśli brakowało Ci jakościowych przykładów programowania systemowego w C, znalazłeś je.

Powiązane projekty