Udostępnij przez


Używanie obiektu wywołania zwrotnego zdefiniowanego przez sterownik

Aby użyć obiektu wywołania zwrotnego zdefiniowanego przez inny sterownik, sterownik otwiera obiekt, a następnie rejestruje procedurę wywoływaną po wyzwoleniu wywołania zwrotnego, jak pokazano na poniższej ilustracji. Sterownik żądający powiadomienia musi znać nazwę obiektu wywołania zwrotnego i musi zrozumieć semantyka argumentów przekazanych do procedury wywołania zwrotnego.

diagram ilustrujący rejestrację dla powiadomienia zwrotnego.

Aby można było otworzyć obiekt, sterownik musi wywołać InitializeObjectAttributes, aby utworzyć blok atrybutów, określając nazwę obiektu. Po uzyskaniu wskaźnika do bloku atrybutów wywołuje ExCreateCallback, przekazując wskaźnik atrybutu, lokalizację, w której ma zostać odebrane dojście do funkcji zwrotnej, oraz FALSE dla parametru Create, co wskazuje, że wymaga istniejącego obiektu wywołania zwrotnego.

Następnie kierowca może wywołać ExRegisterCallback z zwróconym uchwytem, aby zarejestrować procedurę wywołania zwrotnego.

Procedura wywołania zwrotnego ma następujący prototyp:

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

Parametr CallbackContext jest wskaźnikiem kontekstu przekazywanym do procedury wywołania zwrotnego za każdym razem, gdy jest wywoływany. Zazwyczaj ten parametr jest wskaźnikiem do bloku danych kontekstowych, które wywołujący powinien przydzielić z niestronicowanej puli, jeśli można tę rutynę wywołać na poziomie DISPATCH_LEVEL. Dwa argumenty są definiowane przez składnik, który utworzył wywołanie zwrotne. Zazwyczaj argumenty zawierają informacje o warunkach, które wyzwoliły wywołanie zwrotne.

Kiedy twórca wywołania zwrotnego uruchamia powiadomienie, system wywołuje zarejestrowaną procedurę, przekazując wskaźnik do kontekstu oraz dwa argumenty. Wartości argumentów są dostarczane przez składnik, który utworzył wywołanie zwrotne. Procedura wywołania zwrotnego jest wywoływana na tym samym poziomie IRQL, na którym sterownik tworzący wyzwolił powiadomienie, co zawsze jest na poziomie IRQL <= DISPATCH_LEVEL.

W swojej procedurze wywołania zwrotnego sterownik może wykonywać wszystkie zadania wymagane dla bieżących warunków.

Gdy sterownik nie wymaga już powiadomienia, powinien wywołać ExUnregisterCallback, aby usunąć swoją procedurę z listy zarejestrowanych wywołań zwrotnych i usunąć odwołanie do obiektu wywołania zwrotnego.