다음을 통해 공유


콜백 개체 정의

드라이버는 콜백 개체를 만들 수 있으며, 이를 통해 다른 드라이버는 드라이버 만들기에서 정의한 조건에 대한 알림을 요청할 수 있습니다. 다음 그림에서는 콜백 개체 정의와 관련된 단계를 보여줍니다.

콜백 개체를 정의하는 다이어그램

개체를 만들기 전에 드라이버는 InitializeObjectAttributes 를 호출하여 특성을 설정합니다. 콜백 개체에는 시스템 정의 콜백의 이름과 일치할 수 없는 이름이 있어야 합니다. 작성자가 적절하다고 판단하는 다른 특성(일반적으로 OBJ_CASE_INSENSITIVE)을 가질 수 있습니다. 다음으로 드라이버는 ExCreateCallback을 호출하여 초기화된 특성에 대한 포인터와 콜백 개체에 대한 핸들을 받을 위치를 전달합니다. 또한 이러한 명명된 개체가 없는 경우 시스템에서 콜백 개체를 만들어야 하는지 여부와 개체가 등록된 콜백 루틴을 둘 이상 허용해야 하는지 여부를 나타내는 두 개의 부울을 전달합니다.

드라이버는 등록된 콜백 루틴을 호출할 조건을 정의합니다. 조건은 각각 콜백을 만드는 드라이버에서 정의한 매개 변수를 가리키는 두 인수의 형태를 취합니다. 드라이버의 클라이언트에 대해 콜백 개체의 이름 및 알림을 요청하는 IRQL과 함께 이러한 조건을 문서화해야 합니다.

콜백 조건이 발생하면 드라이버는 ExNotifyCallback을 호출하여 해당 핸들을 콜백 개체와 두 인수에 전달합니다. 그런 다음 시스템은 콜백 개체에 등록된 모든 콜백 루틴을 등록된 순서대로 호출하여 루틴이 등록될 때 제공된 컨텍스트에 대한 두 인수와 포인터를 전달합니다. 드라이버는 IRQL <= DISPATCH_LEVEL ExNotifyCallback을 호출해야 합니다. 시스템은 드라이버가 이 호출을 수행한 동일한 IRQL에서 콜백 루틴을 호출합니다.

콜백 개체를 사용하여 모든 작업을 완료한 후 콜백을 만든 드라이버는 ObDereferenceObject 를 호출하여 참조 수를 감소시키고 개체가 삭제되었는지 확인해야 합니다.