다음을 통해 공유


드라이버에서 WMI 데이터 블록 및 이벤트 지원

[KMDF에만 적용]

프레임워크 기반 드라이버는 이벤트 콜백 함수를 제공하여 WMI 데이터 블록을 지원합니다. 드라이버는 WMI 클라이언트에 이벤트를 보내는 개체 메서드를 호출하여 WMI 이벤트를 지원합니다.

읽기/쓰기 WMI 데이터 블록 지원

WMI 데이터 블록의 정보가 읽기 가능하고 WMI 클라이언트에서 쓸 수 있는 경우 드라이버는 클라이언트의 읽기 요청을 서비스하는 EvtWmiInstanceQueryInstance 콜백 함수와 클라이언트의 쓰기 요청을 서비스하는 EvtWmiInstanceSetInstance 또는 EvtWmiInstanceSetItem 콜백 함수(또는 둘 다)를 제공해야 합니다.

데이터 블록에 클라이언트의 요청에서 드라이버가 실행하는 메서드가 포함된 경우 드라이버는 EvtWmiInstanceExecuteMethod 콜백 함수도 제공해야 합니다.

WMI 데이터 블록이 쓰기 전용인 경우(즉, WMI 클라이언트는 데이터 블록에 정보를 쓸 수 있지만 데이터 블록을 읽을 수 없음) 드라이버는 EvtWmiInstanceQueryInstance 콜백 함수를 제공하지 않습니다.

Read-Only WMI 데이터 블록 지원

WMI 클라이언트에서 WMI 데이터 블록의 정보를 수정할 수 없는 경우 드라이버는 EvtWmiInstanceSetInstance 또는 EvtWmiInstanceSetItem 콜백 함수를 제공하지 않습니다. WMI 클라이언트의 데이터 블록 정보에 대한 요청을 지원하기 위해 드라이버는 다음 중 하나를 수행할 수 있습니다.

드라이버가 UseContextForQueryTRUE로 설정하면 WMI 클라이언트가 instance 정보를 요청할 때 프레임워크는 instance 개체의 컨텍스트 공간을 WMI 제공 버퍼에 복사합니다. 드라이버에 개체 컨텍스트 영역에서 읽기 전용 고정 길이 데이터를 제공하는 단일 WMI instance 있는 경우 EvtWmiInstanceXxx 콜백이 필요하지 않습니다.

읽기 전용 데이터 블록에 클라이언트의 요청에서 드라이버가 실행하는 메서드가 포함된 경우 드라이버는 EvtWmiInstanceExecuteMethod 콜백 함수를 제공할 수도 있습니다.

비용이 많이 드는 WMI 데이터 블록 지원

드라이버가 WMI 데이터 블록 중 하나를 지원하기 위해 비교적 많은 양의 동적 데이터를 수집하는 경우 드라이버는 다음을 수행해야 합니다.

  • WMI 공급자 개체의 WDF_WMI_PROVIDER_CONFIG 구조의 Flags 멤버에서 WdfWmiProviderExpensive 플래그를 설정하여 데이터 블록을 "비용"으로 선언합니다.

  • 데이터 블록에 대한 데이터 수집을 사용하거나 사용하지 않도록 설정하는 EvtWmiProviderFunctionControl 콜백 함수를 제공하거나 WdfWmiProviderIsEnabled 를 호출하여 드라이버가 데이터 수집을 사용하거나 사용하지 않도록 설정해야 하는지 여부를 결정합니다.

드라이버가 WdfWmiProviderExpensive 플래그를 설정하는 경우 WMI 클라이언트가 데이터 블록에 액세스하기 위해 등록할 때 프레임워크는 EvtWmiProviderFunctionControl 콜백 함수를 호출합니다. 콜백 함수는 드라이버가 데이터를 수집하는 기능을 사용하도록 설정해야 합니다. 모든 WMI 클라이언트가 데이터 블록에 대한 등록을 제거하는 경우 프레임워크는 드라이버가 데이터 수집을 중지할 수 있도록 EvtWmiProviderFunctionControl 콜백 함수를 다시 호출합니다.

WMI 이벤트 지원

드라이버는 WMI 이벤트를 사용하여 WMI 클라이언트에 예외 조건을 알릴 수 있습니다. 로깅 오류 대신 WMI 이벤트를 사용하면 안 됩니다. 데이터 항목과 마찬가지로 WMI 이벤트는 관리되는 개체 형식(.mof) 파일 내에서 WMI 데이터 블록에 정의됩니다.

WMI 클라이언트는 WMI 이벤트 알림을 등록합니다. 등록된 WMI 클라이언트에 이벤트를 보내려면 드라이버가 WdfWmiInstanceFireEvent 메서드를 호출합니다. 이 메서드를 사용하면 드라이버가 필요에 따라 클라이언트에 이벤트별 데이터를 보낼 수 있습니다.

이벤트를 정의하는 WMI 데이터 블록에도 WMI 데이터 항목 또는 메서드 항목이 포함된 경우 드라이버는 적절한 WMI 콜백 함수를 제공합니다. 데이터 블록이 이벤트를 정의하지만 데이터 또는 메서드 항목이 없는 경우 드라이버는 WMI 공급자 개체의 WDF_WMI_PROVIDER_CONFIG 구조의 Flags 멤버에서 WdfWmiProviderEventOnly 플래그를 설정해야 합니다.

드라이버는 WMI 클라이언트가 이벤트 알림에 등록된 경우에만 WdfWmiInstanceFireEvent 를 호출해야 합니다. 드라이버는 EvtWmiProviderFunctionControl 콜백 함수를 제공하거나 WdfWmiProviderIsEnabled를 호출하여 WdfWmiInstanceFireEvent를 호출해야 하는지 여부를 확인할 수 있습니다.

WMI 이벤트 추적 지원

추적 이벤트는 다른 WMI 이벤트와 동일한 방식으로 .mof 파일에 정의됩니다. 드라이버가 추적 이벤트에 대한 WMI 공급자 개체를 만들 때 공급자 개체의 WDF_WMI_PROVIDER_CONFIG 구조의 Flags 멤버에서 WdfWmiProviderTracing 플래그를 설정해야 합니다.

공급자 instance 등록된 후 드라이버는 WdfWmiProviderGetTracingHandle을 호출하여 추적 핸들을 가져올 수 있습니다. 드라이버는 추적 핸들을 WmiTraceMessage 루틴에 대한 입력으로 사용할 수 있습니다.

이벤트 추적에 대한 자세한 내용은 다음을 참조하세요.