Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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 |
|
DRIVER_STARTIO |
|
DRIVER_UNLOAD |
|
DRIVER_ADD_DEVICE |
|
| Dispatch_type(typ) DRIVER_DISPATCH | Procedury wysyłania używane przez kierowcę. Zobacz Pisanie procedur wysyłania. |
IO_COMPLETION_ROUTINE |
Procedura IoCompletion jest ustawiana przez wywołanie procedury IoSetCompletionRoutine lub IoSetCompletionRoutineEx i przekazanie wskaźnika funkcji do procedury IoCompletion jako drugi parametr. |
ANULUJ_STEROWNIK |
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 |
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 |
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 |
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.