다음을 통해 공유


WMI_EXECUTE_METHOD_CALLBACK 콜백 함수(wmilib.h)

DpWmiExecuteMethod 루틴은 데이터 블록과 연결된 메서드를 실행합니다. 이 루틴은 선택 사항입니다.

구문

WMI_EXECUTE_METHOD_CALLBACK WmiExecuteMethodCallback;

NTSTATUS WmiExecuteMethodCallback(
  [in]      PDEVICE_OBJECT DeviceObject,
  [in]      PIRP Irp,
  [in]      ULONG GuidIndex,
  [in]      ULONG InstanceIndex,
  [in]      ULONG MethodId,
  [in]      ULONG InBufferSize,
  [in]      ULONG OutBufferSize,
  [in, out] PUCHAR Buffer
)
{...}

매개 변수

[in] DeviceObject

드라이버의 WDM DEVICE_OBJECT 구조체에 대한 포인터입니다.

[in] Irp

IRP에 대한 포인터입니다.

[in] GuidIndex

드라이버가 WmiSystemControl에 전달한 WMILIB_CONTEXT 구조에서 제공한 GUID 목록에 0부터 시작하는 인덱스를 제공하여 데이터 블록을 지정합니다.

[in] InstanceIndex

GuidIndex에서 지정한 블록에 여러 인스턴스가 있는 경우 InstanceIndex는 instance 식별하는 0부터 시작하는 인덱스 값을 지정합니다.

[in] MethodId

실행할 메서드의 ID를 지정합니다. 드라이버는 메서드 ID를 데이터 블록의 항목으로 정의합니다.

[in] InBufferSize

입력 데이터의 크기(바이트)를 나타냅니다. 입력 데이터가 없는 경우 InBufferSize 는 0입니다.

[in] OutBufferSize

출력 데이터에 대해 버퍼에서 사용할 수 있는 바이트 수를 나타냅니다.

[in, out] Buffer

입력 데이터를 보유하고 있는 경우 메서드에 대한 출력 데이터(있는 경우)를 수신하는 버퍼에 대한 포인터입니다. 버퍼가 너무 작아서 모든 출력 데이터를 수신할 수 없는 경우 드라이버는 STATUS_BUFFER_TOO_SMALL 반환하고 필요한 크기로 WmiCompleteRequest 를 호출합니다.

반환 값

DpWmiExecuteMethod 는 STATUS_SUCCESS 또는 다음과 같은 적절한 오류 코드를 반환합니다.

설명

WMI는 드라이버가 IRP_MN_EXECUTE_METHOD 요청에 대한 응답으로 WmiSystemControl을 호출한 후 드라이버의 DpWmiExecuteMethod 루틴을 호출합니다.

드라이버가 DpWmiExecuteMethod 루틴을 구현하는 경우 드라이버는 WmiSystemControl에 전달하는 WMILIB_CONTEXT 구조체의 ExecuteWmiMethod 멤버에 루틴의 주소를 배치해야 합니다. 드라이버가 DpWmiExecuteMethod 루틴을 구현하지 않는 경우 ExecuteWmiMethodNULL로 설정해야 합니다. 후자의 경우 WMI는 IRP_MN_EXECUTE_METHOD 요청에 대한 응답으로 호출자에게 STATUS_INVALID_DEVICE_REQUEST 반환합니다.

드라이버는 모든 입력 인수의 유효성을 검사해야 합니다. 특히 드라이버는 다음을 수행해야 합니다.

  • WMILIB_CONTEXT 구조체의 GuidCount 멤버에 따라 GuidIndex 값이 0과 GuidCount-1 사이인지 확인합니다.
  • 드라이버가 제거를 위해 지정된 데이터 블록에 플래그를 지정하지 않은지 확인합니다. 드라이버가 최근에 WMILIB_CONTEXT 구조체에 포함된 WMIGUIDREGINFO 구조체에서 WMIREG_FLAG_REMOVE_GUID 플래그를 지정한 경우 제거가 발생하기 전에 추가 요청이 도착할 수 있습니다.
  • InstanceIndex 값이 데이터 블록에 대한 드라이버에서 지원하는 instance 인덱스 범위 내에 있는지 확인합니다.
  • MethodId에서 제공하는 메서드 식별자가 지정된 데이터 블록에 대한 유효한 식별자이고 호출자가 메서드를 실행할 수 있는지 확인합니다.
  • BufferInBufferSize가 필요한 경우 패딩을 포함하여 지정된 메서드의 입력 매개 변수를 포함할 수 있을 만큼 큰 버퍼를 설명하고 입력 매개 변수가 유효한지 확인합니다.
  • BufferOutBufferSize가 필요한 경우 패딩을 포함하여 지정된 메서드의 출력 데이터를 받을 수 있을 만큼 큰 버퍼를 설명하는지 확인합니다.
스레드 컨텍스트가 시작 사용자 모드 애플리케이션의 컨텍스트라고 가정하지 마세요. 상위 수준 드라이버가 이를 변경했을 수 있습니다.

지정된 메서드가 카운터 집합의 내용을 가져오고 다시 설정하는 등 데이터 손실을 유발하는 작업을 수행하는 경우 드라이버는 작업을 수행하기 전에 출력 버퍼 크기의 유효성을 검사해야 합니다. 이렇게 하면 드라이버가 STATUS_BUFFER_TOO_SMALL 반환하고 호출자가 카운터를 조기에 다시 설정하지 않고 더 큰 버퍼로 요청을 다시 제출할 수 있습니다.

메서드를 실행하고 버퍼에 출력 데이터를 쓴 후 드라이버는 WmiCompleteRequest 를 호출하여 요청을 완료합니다.

이 루틴은 페이지 가능할 수 있습니다.

이 루틴을 구현하는 방법에 대한 자세한 내용은 WMI IRP 처리를 위해 WmiSystemControl 호출을 참조하세요.

요구 사항

요구 사항
대상 플랫폼 데스크톱
머리글 wmilib.h(Wmilib.h 포함)
IRQL PASSIVE_LEVEL 호출합니다.

추가 정보

IRP_MN_EXECUTE_METHOD

WMILIB_CONTEXT

WmiCompleteRequest

WmiSystemControl