IRP_MN_ENABLE_EVENTS
하나 이상의 이벤트 블록을 등록하는 모든 WMI 드라이버는 이 IRP를 처리해야 합니다. 드라이버는 WMI 요청 처리에 설명된 대로 WmiSystemControl 을 호출하거나 IRP 자체를 처리 하여 WMI IRP를 처리할 수 있습니다.
드라이버가 WmiSystemControl 을 호출하여 IRP_MN_ENABLE_EVENTS 요청을 처리하는 경우 WMI는 해당 드라이버의 DpWmiFunctionControl 루틴을 차례로 호출합니다.
주 코드
보낸 경우
WMI는 데이터 소비자가 이벤트에 대한 알림을 요청했음을 드라이버에 알리기 위해 이 IRP를 보냅니다.
WMI는 임의 스레드 컨텍스트에서 IRQL = PASSIVE_LEVEL 이 IRP를 보냅니다.
입력 매개 변수
Parameters.WMI.ProviderId 는 요청에 응답해야 하는 드라이버의 디바이스 개체를 가리킵니다. 이 포인터는 IRP에서 드라이버의 I/O 스택 위치에 있습니다.
Parameters.WMI.DataPath 는 사용하도록 설정할 이벤트 블록을 식별하는 GUID를 가리킵니다.
Parameters.WMI.BufferSize 는 Parameters.WMI.Buffer에서 페이지가 지정되지 않은 버퍼의 크기를 나타내며 sizeof(WNODE_HEADER)보다 크거나 같아야 합니다. 추적 블록(WMIREG_FLAG_TRACED_GUID)을 등록하지 않는 드라이버는 이 매개 변수를 무시할 수 있습니다.
Parameters.WMI.Buffer 는 이벤트를 추적해야 하는지( WMI_FLAGS_TRACED_GUID ) 여부를 나타내는 WNODE_HEADER 가리키고 시스템 로거에 대한 핸들을 제공합니다. 추적 블록(WMIREG_FLAG_TRACED_GUID)을 등록하지 않는 드라이버는 이 매개 변수를 무시할 수 있습니다.
출력 매개 변수
없음
I/O 상태 블록
드라이버가 WmiSystemControl을 호출하여 IRP를 처리하는 경우 WMI는 I/O 상태 블록에서 Irp-IoStatus.Status> 및 Irp-IoStatus.Information>를 설정합니다.
그렇지 않으면 드라이버는 Irp-IoStatus.Status>를 STATUS_SUCCESS 또는 다음과 같은 적절한 오류 상태 설정합니다.
STATUS_WMI_GUID_NOT_FOUND
STATUS_INVALID_DEVICE_REQUEST
성공하면 드라이버는 Irp-IoStatus.Information>을 0으로 설정합니다.
작업
드라이버는 WMI 요청 처리에 설명된 대로 WmiSystemControl 을 호출하거나 IRP 자체를 처리 하여 WMI IRP를 처리할 수 있습니다.
드라이버가 WmiSystemControl을 호출하여 WMI IRP를 처리하는 경우 해당 루틴은 드라이버의 DpWmiFunctionControl 루틴을 호출하거나 드라이버가 루틴을 정의하지 않으면 STATUS_SUCCESS 반환합니다.
드라이버가 IRP_MN_ENABLE_EVENTS 요청 자체를 처리하는 경우 Parameters.WMI.ProviderId 가 드라이버가 IoWMIRegistrationControl에 전달한 포인터와 동일한 디바이스 개체를 가리키는 경우에만 처리해야 합니다. 그렇지 않으면 드라이버는 다음 하위 드라이버에 요청을 전달해야 합니다.
드라이버가 요청을 처리하기 전에 Parameters.WMI.DataPath 가 드라이버가 지원하는 GUID를 가리키는지 여부를 결정해야 합니다. 그렇지 않은 경우 드라이버는 IRP에 실패하고 STATUS_WMI_GUID_NOT_FOUND 반환해야 합니다.
드라이버가 이벤트 블록을 지원하는 경우 해당 데이터 블록의 모든 인스턴스에 대해 이벤트를 사용하도록 설정합니다.
WMI는 첫 번째 데이터 소비자가 이벤트를 사용하도록 설정할 때 이벤트 블록에 대해 사용하도록 설정하는 단일 요청을 보내기 때문에 드라이버가 이벤트 블록에 대해 이벤트가 이미 활성화되었는지 여부를 검사 필요가 없습니다. WMI는 중간 사용 안 함 요청 없이 활성화할 다른 요청을 보내지 않습니다.
추적 블록(WMIREG_FLAG_TRACED_GUID)을 등록하는 드라이버도 추적을 위해 WMI 또는 시스템 로거에 이벤트를 보낼지 여부를 결정해야 합니다. 추적이 요청되면 Parameters.WMI.Buffer는 flags가 WNODE_FLAG_TRACED_GUID 사용하여 설정되고 HistoricalContext에 로거에 대한 핸들이 포함된 WNODE_HEADER 구조를 가리킵니다.
이벤트 블록 정의, 이벤트 전송 및 추적에 대한 자세한 내용은 Windows 관리 계측을 참조하세요.
요구 사항
헤더 |
Wdm.h(Wdm.h, Ntddk.h 또는 Ntifs.h 포함) |