Dela via


Använda ett Driver-Defined motringningsobjekt

Om du vill använda ett motringningsobjekt som definierats av en annan drivrutin öppnar en drivrutin objektet och registrerar sedan en rutin som ska anropas när återanropet utlöses, enligt följande bild. Den drivrutin som begär meddelandet måste känna till namnet på återanropsobjektet och måste förstå innebörden av argumenten som skickas till återanropsrutinen.

diagram som illustrerar registrering för återanropsmeddelande.

Innan objektet kan öppnas måste drivrutinen anropa InitializeObjectAttributes för att skapa ett attributblock som anger objektets namn. När den har en pekare till ett attributblock anropar den ExCreateCallback, skickar attributpekaren, en plats där det kan ta emot ett handtag till återanropet och FALSE för parametern Skapa, vilket indikerar att det kräver ett befintligt återanropsobjekt.

Drivrutinen kan sedan anropa ExRegisterCallback med det returnerade handtaget för att registrera sin callback-rutin.

Återanropsrutinen har följande prototyp:

typedef VOID (*PCALLBACK_FUNCTION ) (
    IN PVOID CallbackContext,
    IN PVOID Argument1,
    IN PVOID Argument2
    );

Parametern CallbackContext är kontextpekaren som skickas till återanropsrutinen varje gång den anropas. Den här parametern är vanligtvis en pekare till ett block med kontextdata, som anroparen ska allokera från en icke-sidsidig pool om rutinen kan anropas på DISPATCH_LEVEL. De två argumenten definieras av komponenten som skapade återanropet. Vanligtvis ger argumenten information om de villkor som utlöste återanropet.

När skaparen av återanropet utlöser meddelandet anropar systemet den registrerade rutinen och skickar en pekare till kontexten och de två argumenten. Värden för argumenten tillhandahålls av komponenten som skapade återanropet. Återanropsrutinen anropas på samma IRQL som den nivå där den skapande drivrutinen utlöste notifieringen, vilket alltid är IRQL <= DISPATCH_LEVEL.

I sin återanropsrutin kan en drivrutin utföra vilka uppgifter som helst som krävs för de aktuella villkoren.

När drivrutinen inte längre kräver avisering bör den anropa ExUnregisterCallback för att ta bort sin rutin från listan över registrerade återanrop och ta bort referensen till motringningsobjektet.