Visszahívási objektum definiálása

Az illesztőprogram létrehozhat egy visszahívási objektumot, amelyen keresztül más illesztőprogramok értesítést kérhetnek a létrehozó illesztőprogram által meghatározott feltételekről. Az alábbi ábra a visszahívási objektum meghatározásának lépéseit mutatja be.

visszahívási objektum definiálását szemléltető diagram.

Az objektum létrehozása előtt az illesztőprogram meghívja az InitializeObjectAttributes parancsot az attribútumainak beállításához. A visszahívási objektumoknak olyan névvel kell rendelkezniük, amely nem egyezik a rendszer által definiált visszahívás nevével; bármilyen más attribútummal rendelkezhet, amelyet a létrehozója megfelelőnek tart, általában OBJ_CASE_INSENSITIVE. Ezután az illesztőprogram meghívja az ExCreateCallbacket, és átad egy mutatót az inicializált attribútumoknak és egy helynek, ahol egy leírót szeretne kapni a visszahívási objektumnak. Két logikai értéket is átad, amelyek azt jelzik, hogy a rendszernek létre kell-e hoznia a visszahívási objektumot, ha egy ilyen nevű objektum még nem létezik, és hogy az objektumnak engedélyeznie kell-e egynél több regisztrált visszahívási rutint.

Az illesztőprogram meghatározza azokat a feltételeket, amelyekhez meghívja a regisztrált visszahívási rutinokat. A feltételek két argumentumból tevődnek össze, amelyek mindegyike a visszahívást létrehozó illesztőprogram által meghatározott paraméterre mutat. Dokumentálnia kell ezeket a feltételeket, valamint a visszahívási objektum nevét és az IRQL szintet, amelyen értesítést kér, az illesztőprogram ügyfelei érdekében.

A visszahívási feltétel bekövetkezésekor az illesztőprogram meghívja az ExNotifyCallbacket, és átadja a leíróját a visszahívási objektumnak és a két argumentumnak. A rendszer ezután meghívja a visszahívási objektumhoz regisztrált összes visszahívási rutint abban a sorrendben, amelyben regisztrálták őket, átadva a két argumentumot és egy mutatót a rutin regisztrálásakor megadott környezetnek. Az illesztőprogramnak az ExNotifyCallback-ot kell hívnia az IRQL <= DISPATCH_LEVEL szinten; a rendszer ugyanezen az IRQL szinten hívja meg a visszahívási rutinokat, mint amelyiken az illesztőprogram kezdeményezte ezt a hívást.

Miután az összes művelet befejeződött a visszahívási objektummal, a visszahívást létrehozó illesztőprogramnak meg kell hívnia az ObDereferenceObject parancsot a hivatkozási számának mérsékléséhez, és győződjön meg arról, hogy az objektum törölve lett.