다음을 통해 공유


IoWMIWriteEvent를 사용하여 이벤트 보내기

드라이버는 IoWMIWriteEvent 를 호출하여 이벤트를 보낼 수 있습니다. 이벤트는 단일 항목, 단일 instance 또는 데이터 블록의 모든 인스턴스로 구성되며 동적 instance 이름을 사용할 수 있습니다.

WMI에 의해 할당되고 부분적으로 초기화된 쿼리 또는 변경 요청으로 전달된 WNODE_XXX 구조와 달리 드라이버는 이벤트를 포함하는 WNODE_XXX 구조체의 모든 멤버를 할당하고 초기화해야 합니다.

드라이버는 WMI가 이벤트를 사용하도록 설정하기 위해 IRP_MN_ENABLE_EVENTS 요청을 보낸 후에만 이벤트를 보내야 합니다. 그런 다음, 이벤트의 트리거 조건이 발생하면 드라이버는 다음을 수행합니다.

  1. 변수 데이터의 공간을 포함하여 이벤트에 필요한 WNODE_XXX 구조를 포함하도록 비페이지 풀에서 버퍼를 할당합니다(있는 경우).

    이벤트에 따라 드라이버는 이벤트에 대한 WNODE_SINGLE_ITEM, WNODE_SINGLE_INSTANCE 또는 WNODE_ALL_DATA 할당할 수 있습니다. WNODE_XXX 및 변수 데이터의 크기는 레지스트리 정의 제한인 1K를 초과하면 안 됩니다.

  2. WnodeHeader.Flags를 포함하여 WNODE_XXX 구조체의 모든 멤버를 초기화합니다.

    • 드라이버는 구조체가 이벤트임을 나타내기 위해 WNODE_FLAG_EVENT_ITEM 플래그를 설정합니다.

    • 드라이버는 다음 플래그 중 하나를 설정하여 WNODE_XXX 구조체의 형식을 나타냅니다.

      WNODE_FLAG_ALL_DATA

      WNODE_FLAG_SINGLE_INSTANCE

      WNODE_FLAG_SINGLE_ITEM

    • 드라이버는 블록이 정적 또는 동적 instance 이름을 사용하는지 여부를 나타내기 위해 다음 플래그를 설정하거나 지웁니다.

      WNODE_FLAG_STATIC_INSTANCE_NAMES

      WNODE_FLAG_PDO_INSTANCE_NAMES

    • 드라이버는 이벤트에 따라 추가 플래그를 설정할 수 있습니다.

  3. WNODE_XXX에 대한 포인터를 PWNODE_EVENT_ITEM 캐스팅합니다.

  4. 포인터를 사용하여 IoWMIWriteEvent 를 호출합니다.

    IoWMIWriteEvent가 성공적으로 완료되면 WMI는 이벤트에 대한 드라이버 할당 메모리를 해제합니다.

IoWMIWriteEvent가 반환된 후 드라이버는 WMI가 해당 이벤트를 사용하지 않도록 설정하는 IRP_MN_DISABLE_EVENTS 요청을 보낼 때까지 이벤트의 트리거 조건 모니터링을 다시 시작하고 트리거 조건이 발생할 때마다 이벤트를 보냅니다.

이벤트의 크기가 레지스트리에서 정의한 최대 1K를 초과하는 경우(권장되지 않음) 드라이버는 이벤트의 GUID, 크기 및 instance 인덱스(정적 instance 이름) 또는 이름(동적 instance 이름)을 지정하는 초기화된 WNODE_EVENT_REFERENCE 사용하여 IoWmiWriteEvent를 호출해야 합니다. WMI는 WNODE_EVENT_REFERENCE 정보를 사용하여 이벤트를 쿼리합니다.

드라이버는 동적 instance 이름을 사용하지 않고 WMI 라이브러리 루틴 WmiFireEvent를 호출하여 단일 instance 구성된 이벤트를 보낼 수 있습니다. 드라이버는 WmiFireEvent 호출에 대한 WNODE_XXX 구조를 할당하고 초기화할 필요가 없습니다. WMI는 드라이버의 이벤트 데이터를 WNODE_SINGLE_INSTANCE 패키지하고 데이터 소비자에게 제공합니다. WmiFireEvent를 사용하여 이벤트를 보내는 방법에 대한 자세한 내용은 WmiFireEvent를 사용하여 이벤트 보내기를 참조하세요.