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 루틴을 구현하지 않는 경우 ExecuteWmiMethod 를 NULL로 설정해야 합니다. 후자의 경우 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에서 제공하는 메서드 식별자가 지정된 데이터 블록에 대한 유효한 식별자이고 호출자가 메서드를 실행할 수 있는지 확인합니다.
- Buffer 및 InBufferSize가 필요한 경우 패딩을 포함하여 지정된 메서드의 입력 매개 변수를 포함할 수 있을 만큼 큰 버퍼를 설명하고 입력 매개 변수가 유효한지 확인합니다.
- Buffer 및 OutBufferSize가 필요한 경우 패딩을 포함하여 지정된 메서드의 출력 데이터를 받을 수 있을 만큼 큰 버퍼를 설명하는지 확인합니다.
지정된 메서드가 카운터 집합의 내용을 가져오고 다시 설정하는 등 데이터 손실을 유발하는 작업을 수행하는 경우 드라이버는 작업을 수행하기 전에 출력 버퍼 크기의 유효성을 검사해야 합니다. 이렇게 하면 드라이버가 STATUS_BUFFER_TOO_SMALL 반환하고 호출자가 카운터를 조기에 다시 설정하지 않고 더 큰 버퍼로 요청을 다시 제출할 수 있습니다.
메서드를 실행하고 버퍼에 출력 데이터를 쓴 후 드라이버는 WmiCompleteRequest 를 호출하여 요청을 완료합니다.
이 루틴은 페이지 가능할 수 있습니다.
이 루틴을 구현하는 방법에 대한 자세한 내용은 WMI IRP 처리를 위해 WmiSystemControl 호출을 참조하세요.
요구 사항
요구 사항 | 값 |
---|---|
대상 플랫폼 | 데스크톱 |
머리글 | wmilib.h(Wmilib.h 포함) |
IRQL | PASSIVE_LEVEL 호출합니다. |