WMI IRP를 처리하기 위해 WmiSystemControl 호출

WMI 라이브러리 루틴은 이러한 각 요청을 처리하는 대신 드라이버가 WmiSystemControl을 호출하기 때문에 WMI 요청 처리를 간소화합니다. WmiSystemControl 호출에서 드라이버는 드라이버의 WMI 라이브러리 콜백 루틴(DpWmiXxx 루틴)에 진입점을 포함하는 초기화된 WMILIB_CONTEXT 구조와 드라이버의 데이터 블록 및 이벤트 블록에 대한 정보를 전달합니다.

WMI 라이브러리는 동적 instance 이름 또는 정적 instance 이름 목록을 전달하는 메커니즘을 제공하지 않으므로 드라이버는 WMI 라이브러리를 사용하여 PDO 또는 단일 기본 이름 문자열을 기반으로 정적 instance 이름의 데이터 블록만 포함하는 요청을 처리할 수 있습니다. 정적 및 동적 instance 이름에 대한 자세한 내용은 WMI 인스턴스 이름 정의를 참조하세요. 어떤 것도 드라이버가 WMI 라이브러리를 사용하여 이러한 블록에 대한 요청을 처리하고 DispatchSystemControl 루틴의 다른 블록에 대한 요청을 처리하는 것을 방지하지 않습니다. 자세한 내용은 DispatchSystemControl 루틴에서 WMI IRP 처리를 참조하세요.

WmiSystemControl을 호출하여 WMI IRP를 처리하려면 드라이버가 필요한 특정 DpWmiXxx 콜백 루틴을 구현해야 하며 추가 선택적 DpWmiXxx 콜백 루틴을 구현할 수 있습니다.

드라이버의 DpWmiXxx 루틴에는 드라이버 작성기에서 선택한 모든 이름이 있을 수 있습니다.

WmiSystemControl을 호출하기 전에 드라이버는 DpWmiXxx 루틴에 대한 진입점과 데이터 블록 및 이벤트 블록에 대한 정보를 사용하여 WMILIB_CONTEXT 구조를 초기화해야 합니다.

드라이버가 WMI 요청을 수신하는 경우:

  1. 드라이버는 초기화된 WMILIB_CONTEXT 구조체에 대한 포인터, 디바이스 개체에 대한 포인터 및 IRP에 대한 포인터를 사용하여 WmiSystemControl을 호출합니다.

  2. WMI는 IRP 매개 변수의 유효성을 검사하고 요청을 처리하는 드라이버의 DpWmiXxx 루틴을 호출합니다. 드라이버가 선택적 DpWmiXxx 루틴에 대한 WMILIB_CONTEXT 진입점을 설정하지 않은 경우 WMI는 기본값으로 IRP를 완료하고 상태.

  3. DpWmiXxx 루틴에서 드라이버는 요청을 처리하고 모든 출력을 호출자가 제공한 버퍼에 씁니다. 예를 들어 드라이버의 DpWmiQueryDataBlock 루틴은 지정된 블록의 요청된 instance 버퍼에 씁니다.

  4. DpWmiQueryReginfo를 제외한 모든 DpWmiXxx 루틴에서 드라이버는 WmiCompleteRequest를 호출하여 요청을 완료하거나 IRP와 마찬가지로 완료를 연기하기 위해 STATUS_PENDING 반환합니다.

  5. WMI는 필요한 후처리를 수행하고, 적절한 WNODE_XXX 구조로 출력을 패키지하고, 출력 및 상태 데이터 소비자에게 전달합니다.