다음을 통해 공유


WMI 이벤트 보내기

드라이버는 WMI 이벤트를 사용하여 애플리케이션이 IRP를 폴링하거나 보낼 필요 없이 사용자 모드 애플리케이션에 이벤트를 알릴 수 있습니다. 드라이버는 WMI 이벤트를 사용하여 WMI 클라이언트에 오류 로깅 대신 예외 조건을 알려야 합니다. 드라이버는 Wmicore.mof의 디바이스 유형에 대해 정의된 표준 이벤트 블록을 지원해야 하며, 디바이스별 알림을 지원하기 위해 추가 사용자 지정 이벤트 블록을 정의하고 등록할 수 있습니다.

이벤트 블록은 추상 기본 클래스 WMIEvent파생되는 데이터 블록일 뿐입니다. 이벤트 블록은 데이터 블록과 동일한 데이터를 포함하거나 비어 있을 수 있습니다. 즉, 이벤트 블록에 드라이버 정의 데이터 항목이 필요하지 않습니다. 이벤트 블록에 데이터가 포함된 경우 WNODE_XXX 및 데이터의 총 크기는 레지스트리 정의 제한인 1킬로바이트를 초과하지 않아야 합니다. 일반적으로 이벤트가 작을수록 시스템 성능이 향상되고 시기 적절하게 알림이 생성됩니다. 블록 정의에 대한 자세한 내용은 WMI 데이터 및 이벤트 블록 MOF 구문 및 WMI 데이터 및 이벤트 블록 디자인참조하세요.

드라이버는 블록의 WMIREGGUID 구조에 설정된 WMIREG_FLAG_EVENT_ONLY_GUID 사용하여 해당 이벤트 블록을 등록하여 이벤트에 대한 지원을 나타냅니다. 블록 등록에 대한 정보는 WMI 데이터 공급자로 등록하기를 참조하세요.

WMI 클라이언트 사용자가 이벤트에 대한 알림을 요청하면 WMI는 드라이버에 IRP_MN_ENABLE_EVENTS 요청을 보내서 드라이버에 이벤트의 드라이버 결정 트리거 조건 모니터링을 시작하도록 경고합니다. 그런 다음 트리거 조건이 발생하면 드라이버는 이벤트를 WMI로 보내 이벤트에 등록된 모든 데이터 소비자에게 전달합니다.

드라이버는 다음 방법 중 하나로 WMI에 이벤트를 보냅니다.

  • 커널 모드 WMI 라이브러리 루틴 WmiFireEvent를 호출합니다. 드라이버는 WmiFireEvent 호출하여 동적 인스턴스 이름을 사용하지 않는 이벤트와 단일 기본 이름 문자열 또는 PDO의 디바이스 인스턴스 ID에 해당 기본 정적 인스턴스 이름만 보낼 수 있습니다. 또한 이벤트는 단일 인스턴스여야 합니다. 즉, 드라이버는 WmiFireEvent 호출하여 단일 항목 또는 여러 인스턴스로 구성된 이벤트를 보낼 수 없습니다. 자세한 내용은 WmiFireEvent사용하여 이벤트 보내기를 참조하세요.

  • 이벤트의 데이터를 포함하는 드라이버 할당 및 초기화된 WNODE_XXX 구조체에 대한 포인터를 사용하여 커널 모드 루틴 IoWMIWriteEvent 호출합니다. 자세한 내용은 IoWMIWriteEvent사용하여 이벤트 보내기를 참조하세요.