Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Megjegyzés:
A Windows 10 2004-es verziójától kezdve a Statikus illesztőprogram-ellenőrző (SDV) már nem igényel megjegyzéseket a WDM-illesztőprogramok kézbesítési rutinjainak szerepkörtípusainak azonosításához. Kövesse a lap Alapszintű és speciális inicializálások szakaszában található útmutatást.
Ahhoz, hogy az SDV értesüljön az illesztőprogram belépési pontjairól egy WDM-illesztőprogram elemzésekor, függvényszerepkör-típusdeklarációkkal kell deklarálnia a függvényeket. A függvényszerepkör-típusok a Wdm.h-ban vannak definiálva. A WDM-illesztőprogram DriverEntry rutinjának minden belépési pontját deklarálni kell a megfelelő szerepkörtípus megadásával. A szerepkörtípusok előre definiált típusdefek, amelyek megfelelnek a WDM-illesztőprogramok felismert belépési pontjainak.
Ha például egy csampUnload nevű illesztőprogram-eltávolítási rutinhoz szeretne függvényszerepkör-típusdeklarációt létrehozni, használja az előre definiált typedef DRIVER_UNLOAD szerepkörtípus-deklarációt. A függvényszerepkör-típus deklarációjának a függvénydefiníció előtt kell megjelennie.
DRIVER_UNLOAD CsampUnload;
A CsampUnload függvény definíciója változatlan marad:
VOID
CsampUnload(
IN PDRIVER_OBJECT DriverObject
)
{
...
}
Az SDV felismeri az alábbi táblázatban látható belépési pontok típusait.
| WDM-függvény szerepkörtípusa | WDM-rutin |
|---|---|
MEGHAJTÓ_INICIALIZÁLÁS |
|
DRIVER_STARTIO |
|
Illesztőprogram kirakása |
|
ILLesztőprogram_hozzáad_eszköz |
|
| Dispatch_type(típus) DRIVER_DISPATCH | A sofőr által használt diszpécserprogram(ok). Lásd : Küldési rutinok írása. |
IO_COMPLETION_ROUTINE |
Az IoCompletion rutin úgy van beállítva, hogy meghívja az IoSetCompletionRoutine-t vagy az IoSetCompletionRoutineEx-et , és a függvénymutatót a második paraméterként átadja az IoCompletion rutinnak. |
DRIVER_CANCEL |
A Mégse rutin úgy van beállítva, hogy meghívja az IoSetCancelRoutine-t , és átadja a függvénymutatót az IRP lemondási rutinjának, mint a függvény második paraméterének. |
IO_DPC_ROUTINE |
A DpcForIsr rutin regisztrálása az IoInitializeDpcRequest meghívásával történik, és a függvénymutatót a DpcForIsr rutinnak adja át második paraméterként. A DPC várólistára helyezéséhez hívja meg az IoQueueDpc-et az ISR rutinból ugyanazzal a DPC-objektummal. |
KDEFERRED_ROUTINE |
A CustomDpc rutin úgy van beállítva, hogy meghívja a KeInitializeDpc parancsot , és a függvénymutatót a CustomDpc-nek adja át második paraméterként. Az illesztőprogram CustomDpc sorba állításához hívja meg az ISR rutinban a KeInsertQueueDpc függvényt ugyanazzal a DPC-objektummal. |
KSERVICE_ROUTINE |
Az InterruptService rutin (ISR) egy eszköz megszakítását kezeli, és szükség esetén ütemezi a fogadott adatok megszakítás utáni feldolgozásának végrehajtását. |
Teljesítve az energiaigény kérése |
A PowerCompletion visszahívási rutinja befejezi a power IRP feldolgozását. Ha az illesztőprogramnak további feladatokat kell végrehajtania, miután az összes többi illesztőprogram elvégezte az IRP-t, az illesztőprogram regisztrál egy PowerCompletion visszahívási rutint az IRP-t lefoglaló PoRequestPowerIrp rutin hívása során. |
MUNKASZÁLAS_ELJÁRÁS |
Rutin A rutin az ExInitializeWorkItem függvény második paraméterében megadott visszahívási rutin. A rutin csak akkor deklarálható így, ha az illesztőprogram meghívja az ExQueueWorkItemet , hogy adja hozzá a munkaelemet egy rendszersorhoz. |
Illesztőprogram-kiszolgálási rutinok deklarálása
A Windows 10 2004-es verziójától kezdődően a rendszer automatikusan pontosítja a küldési rutinok szerepkörtípus-deklarációit az IRP-kategóriájukkal, a WDM-illesztőprogram DriverEntry rutinjában található DriverObject-MajorFunction> tábla inicializálása alapján.
Az illesztőprogram foo-nak az SDV-nek való megfelelés érdekében az alapszintű vagy speciális deklarálási stílus használatával kell szerepkör-deklarációkat végrehajtania.
Alapszintű és speciális inicializálások
Az alapstílus az alábbi példában látható (vegye figyelembe, hogy a FooCreate és a FooCleanup szállítási rutinnevek csak példák, bármilyen megfelelő név használható):
DriverObject->MajorFunction[IRP_MJ_CREATE] = FooCreate; //Basic style
DriverObject->MajorFunction[IRP_MJ_CLEANUP] = FooCleanup;
A lista lerövidítéséhez haladóbb megközelítés alkalmazható. Bár ugyanazt a kézbesítési rutint több IRP-kategóriához is használják, az illesztőprogramok két inicializálást kódolhatnak így:
DriverObject->MajorFunction[IRP_MJ_CREATE] =
DriverObject->MajorFunction[IRP_MJ_CLEANUP] = FooCreateCleanup; // Advanced style for a multi-role dispatch routine
Ahhoz, hogy az illesztőprogram megfelelően tudja futtatni az SDV-t, az illesztőprogramnak csak a fent látható alapszintű vagy speciális stílust kell használnia. Az illesztőprogram SDV-ellenőrzése nem fog a várt módon működni , ha a két módszer egyikét nem használja.
függvényparaméterek és függvényszerepkör-típusok
A C programozási nyelvben szükség szerint a függvénydefinícióban használt paramétertípusoknak meg kell egyezniük a függvény prototípusának paramétertípusával, vagy ebben az esetben a függvényszerepkör típusával. Az SDV az elemzéshez használt függvény-aláírásoktól függ, és figyelmen kívül hagyja azokat a függvényeket, amelyek aláírásai nem egyeznek.
Például deklarálnia kell egy IoCompletion rutint a IO_COMPLETION_ROUTINE függvényszerepkör típusával:
IO_COMPLETION_ROUTINE myCompletionRoutine;
A myCompletionRoutine implementálásakor a paramétertípusoknak meg kell egyeznie a IO_COMPLETION_ROUTINE által használt típusokkal, nevezetesen a PDEVICE_OBJECT, a PIRP és a PVOID értékekkel (a szintaxishoz lásd az IoCompletion rutint).
NTSTATUS
myCompletionRoutine(
PDEVICE_OBJECT DeviceObject,
PIRP Irp,
PVOID Context
)
{
}
Kódelemzés futtatása illesztőprogramokhoz a függvénydeklarációk ellenőrzéséhez
Annak megállapításához, hogy a forráskód készen áll-e, futtassa az illesztőprogram kódelemzéseparancsot. Az illesztőprogramok kódelemzése ellenőrzi a függvényszerepkör-deklarációkat, és segíthet azonosítani azokat a függvénydeklarációkat, amelyek esetleg kimaradtak, vagy figyelmeztetik, ha a függvénydefiníció paraméterei nem egyeznek a függvényszerepkör típusában szereplőkkel.