Share via


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를 호출하여 동적 instance 이름을 사용하지 않는 이벤트와 단일 기본 이름 문자열 또는 디바이스 instance PDO ID에 대한 기본 정적 instance 이름만 보낼 수 있습니다. 또한 이벤트는 단일 instance 합니다. 즉, 드라이버는 WmiFireEvent를 호출하여 단일 항목 또는 여러 인스턴스로 구성된 이벤트를 보낼 수 없습니다. 자세한 내용은 WmiFireEvent를 사용하여 이벤트 보내기를 참조하세요.

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