다음을 통해 공유


Driver-Defined 콜백 개체 사용

다른 드라이버에서 정의한 콜백 개체를 사용하려면 드라이버가 개체를 연 다음, 다음 그림과 같이 콜백이 트리거될 때 호출할 루틴을 등록합니다. 알림을 요청하는 드라이버는 콜백 개체의 이름을 알고 있어야 하며 콜백 루틴에 전달된 인수의 의미 체계를 이해해야 합니다.

콜백 알림 등록을 보여 주는 다이어그램

개체를 열기 전에 드라이버는 InitializeObjectAttributes 를 호출하여 개체의 이름을 지정하는 특성 블록을 만들어야 합니다. 특성 블록에 대한 포인터가 있으면 ExCreateCallback을 호출하여 특성 포인터, 콜백에 대한 핸들을 받을 위치, Create 매개 변수에 대한 FALSE를 전달하여 기존 콜백 개체가 필요함을 나타냅니다.

그런 다음 드라이버는 반환된 핸들을 사용하여 ExRegisterCallback 을 호출하여 콜백 루틴을 등록할 수 있습니다.

콜백 루틴에는 다음과 같은 프로토타입이 있습니다.

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

CallbackContext 매개 변수는 호출될 때마다 콜백 루틴에 전달될 컨텍스트 포인터입니다. 일반적으로 이 매개 변수는 컨텍스트 데이터 블록에 대한 포인터로, DISPATCH_LEVEL 루틴을 호출할 수 있는 경우 호출자가 비페이지 풀에서 할당해야 합니다. 두 인수는 콜백을 만든 구성 요소에 의해 정의됩니다. 일반적으로 인수는 콜백을 트리거한 조건에 대한 정보를 제공합니다.

콜백 작성자가 알림을 트리거하면 시스템은 등록된 루틴을 호출하여 컨텍스트와 두 인수에 대한 포인터를 전달합니다. 인수에 대한 값은 콜백을 만든 구성 요소에서 제공합니다. 콜백 루틴은 드라이버 생성이 알림을 트리거하는 동일한 IRQL에서 호출되며, 항상 IRQL <= DISPATCH_LEVEL.

콜백 루틴에서 드라이버는 현재 조건에 필요한 모든 작업을 수행할 수 있습니다.

드라이버에 더 이상 알림이 필요하지 않은 경우 ExUnregisterCallback 을 호출하여 등록된 콜백 목록에서 루틴을 제거하고 콜백 개체에 대한 참조를 제거해야 합니다.