Függvények deklarálása függvényszerepkör-típusok használatával WDM-illesztőprogramokhoz

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

DriverEntry

DRIVER_STARTIO

StartIO

Illesztőprogram kirakása

Kirakod

ILLesztőprogram_hozzáad_eszköz

AddDevice

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

IoCompletion

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

Mégse

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

DpcForIsr

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

CustomDpc

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

InterruptService

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.