Udostępnij przez


Deklarowanie funkcji przy użyciu typów ról funkcji dla sterowników WDM

Uwaga

Począwszy od systemu Windows 10 w wersji 2004, statyczny weryfikator sterowników (SDV) nie wymaga już adnotacji do identyfikowania typów ról procedur wysyłania sterowników WDM. Postępuj zgodnie ze wskazówkami w sekcji Basic and Advanced Initializations (Inicjowanie podstawowe i zaawansowane ) tej strony.

Aby poinformować SDV o punktach wejścia sterownika podczas analizowania sterownika WDM, należy zadeklarować funkcje przy użyciu deklaracji typów ról funkcji. Typy ról funkcji są definiowane w pliku Wdm.h. Każdy punkt wejścia w procedurze DriverEntry w sterowniku WDM musi być zadeklarowany przez określenie odpowiedniego typu roli. Typy ról są wstępnie zdefiniowanymi typedefami, które odpowiadają uznanym punktom wejścia w sterowniku WDM.

Aby na przykład utworzyć deklarację typu roli funkcji dla procedury Unload sterownika o nazwie CsampUnload, użyj wstępnie zdefiniowanej deklaracji typu roli DRIVER_UNLOAD z typedef. Przed definicją funkcji musi zostać wyświetlona deklaracja typu roli funkcji.

DRIVER_UNLOAD CsampUnload;

Definicja funkcji CsampUnload pozostaje niezmieniona:

VOID
CsampUnload(
    IN PDRIVER_OBJECT DriverObject
    )
{
    ...
}

SdV rozpoznaje typy punktów wejścia pokazanych w poniższej tabeli.

Typ roli funkcji WDM Rutyna WDM

DRIVER_INITIALIZE

DriverEntry

DRIVER_STARTIO

StartIO

DRIVER_UNLOAD

rozładunek

DRIVER_ADD_DEVICE

AddDevice

Dispatch_type(typ) DRIVER_DISPATCH

Procedury wysyłania używane przez kierowcę. Zobacz Pisanie procedur wysyłania.

IO_COMPLETION_ROUTINE

IoCompletion

Procedura IoCompletion jest ustawiana przez wywołanie procedury IoSetCompletionRoutine lub IoSetCompletionRoutineEx i przekazanie wskaźnika funkcji do procedury IoCompletion jako drugi parametr.

ANULUJ_STEROWNIK

Anuluj

Procedura Anuluj jest ustawiana przez wywołanie metody IoSetCancelRoutine i przekazanie wskaźnika funkcji do procedury anulowania dla protokołu IRP jako drugiego parametru funkcji.

IO_DPC_ROUTINE

DpcForIsr

Procedura DpcForIsr jest rejestrowana przez wywołanie metody IoInitializeDpcRequest i przekazanie wskaźnika funkcji do procedury DpcForIsr jako drugiego parametru. Aby dodać DPC do kolejki, wywołaj metodę IoQueueDpc w procedurze ISR, używając tego samego obiektu DPC.

KDEFERRED_ROUTINE

CustomDpc

Procedura CustomDpc jest ustawiana przez wywołanie metody KeInitializeDpc i przekazanie wskaźnika funkcji do elementu CustomDpc jako drugiego parametru. Aby umieścić w kolejce CustomDpc dla sterownika, wywołaj KeInsertQueueDpc z procedury ISR przy użyciu tego samego obiektu DPC.

KSERVICE_ROUTINE

Przerwanieusługi

Procedura obsługi przerwania (ISR) zajmuje się przerwaniem urządzenia i, jeśli to konieczne, planuje dalsze przetwarzanie odebranych danych po przerwaniu.

ŻĄDANIE_ZASILANIA_UKOŃCZONE

Procedurę wywołania zwrotnego powerCompletion kończy przetwarzanie protokołu IRP zasilania. Jeśli sterownik musi wykonać dodatkowe zadania po ukończeniu IRP przez wszystkie inne sterowniki, rejestruje procedurę wywołania PowerCompletion podczas wywołania procedury PoRequestPowerIrp, która przydziela IRP.

WORKER_THREAD_ROUTINE

Rutyna

Procedura to procedura wywołania zwrotnego określona w drugim parametrze funkcji ExInitializeWorkItem .

Procedura powinna być zadeklarowana w ten sposób tylko wtedy, gdy sterownik wywołuje element ExQueueWorkItem, aby dodać element roboczy do kolejki systemowej.

Deklarowanie procedur wysyłania sterowników

Począwszy od systemu Windows 10 w wersji 2004, deklaracje typu roli funkcji dla rutyn wysyłania są udoskonalane wraz z ich kategorią IRP, automatycznie na podstawie inicjowania tabeli DriverObject-MajorFunction w procedurze DriverEntry sterownika WDM.

Sterownik Foo musi realizować deklaracje ról przy pomocy podstawowego lub zaawansowanego stylu deklaracji, aby zapewnić zgodność z SDV.

Podstawowa i zaawansowana inicjalizacja

W poniższym przykładzie można zobaczyć podstawowy styl (zwróć uwagę, że nazwy procedur wysyłki FooCreate i FooCleanup są tylko przykładami, można użyć dowolnej odpowiedniej nazwy):

DriverObject->MajorFunction[IRP_MJ_CREATE] = FooCreate; //Basic style
DriverObject->MajorFunction[IRP_MJ_CLEANUP] = FooCleanup;

Bardziej zaawansowane podejście można podjąć, aby skrócić wymaganą listę. Chociaż ta sama procedura wysyłania jest używana dla więcej niż jednej kategorii IRP, sterownik może zakodować dwie inicjacje w następujący sposób:

DriverObject->MajorFunction[IRP_MJ_CREATE] = 
DriverObject->MajorFunction[IRP_MJ_CLEANUP] = FooCreateCleanup; // Advanced style for a multi-role dispatch routine 

Aby sterownik mógł prawidłowo uruchomić sdV, sterownik musi używać tylko stylu podstawowego lub zaawansowanego pokazanego powyżej. Weryfikacja SDV sterownika nie będzie działać zgodnie z oczekiwaniami , jeśli jedna z tych dwóch metod nie jest używana.

Parametry funkcji i typy ról funkcji

Zgodnie z wymaganiami w języku programowania C typy parametrów używane w definicji funkcji muszą być zgodne z typami parametrów prototypu funkcji lub w tym przypadku typem roli funkcji. SdV zależy od sygnatur funkcji do analizy i ignoruje funkcje, których podpisy nie są zgodne.

Na przykład należy zadeklarować procedurę IoCompletion przy użyciu typu roli funkcji IO_COMPLETION_ROUTINE:

IO_COMPLETION_ROUTINE myCompletionRoutine;

Podczas implementacji myCompletionRoutine, typy parametrów muszą być zgodne z tymi używanymi przez IO_COMPLETION_ROUTINE, a mianowicie PDEVICE_OBJECT, PIRP i PVOID (aby zobaczyć składnię, zobacz procedurę IoCompletion).

NTSTATUS
myCompletionRoutine(
 PDEVICE_OBJECT  DeviceObject,
 PIRP  Irp,
 PVOID  Context
 )
{
}

Uruchamianie analizy kodu dla sterowników w celu zweryfikowania deklaracji funkcji

Aby ułatwić określenie, czy kod źródłowy jest przygotowany, uruchom polecenie Analiza kodu dla sterowników. Funkcja Analiza kodu dla sterowników sprawdza deklaracje typów ról funkcji i może pomóc zidentyfikować deklaracje funkcji, które mogły zostać pominięte lub ostrzegać, gdy parametry definicji funkcji nie pasują do tych w typie roli funkcji.