функция обратного вызова 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
Задает блок данных путем предоставления отсчитываемого от нуля индекса в список идентификаторов GUID, предоставленных драйвером в структуре WMILIB_CONTEXT , переданной в WmiSystemControl.
[in] InstanceIndex
Если блок, указанный в GuidIndex , содержит несколько экземпляров, InstanceIndex задает отсчитываемое от нуля значение индекса, идентифицирующее экземпляр.
[in] MethodId
Указывает идентификатор выполняемого метода. Драйвер определяет идентификатор метода как элемент в блоке данных.
[in] InBufferSize
Указывает размер входных данных в байтах. Если входные данные отсутствуют, значение InBufferSize равно нулю.
[in] OutBufferSize
Указывает количество байтов, доступных в буфере для выходных данных.
[in, out] Buffer
Указатель на буфер, который содержит входные данные (если таковые есть) и получает выходные данные (если таковые есть) для метода . Если буфер слишком мал для получения всех выходных данных, драйвер возвращает STATUS_BUFFER_TOO_SMALL и вызывает WmiCompleteRequest с требуемым размером.
Возвращаемое значение
DpWmiExecuteMethod возвращает STATUS_SUCCESS или соответствующий код ошибки, например следующий:
Комментарии
WMI вызывает подпрограмму DpWmiExecuteMethod драйвера после того, как драйвер вызывает WmiSystemControl в ответ на запрос IRP_MN_EXECUTE_METHOD .
Если драйвер реализует подпрограмму DpWmiExecuteMethod , драйвер должен поместить адрес подпрограммы в член ExecuteWmiMethodструктуры WMILIB_CONTEXT , которую он передает WmiSystemControl. Если драйвер не реализует подпрограмму DpWmiExecuteMethod , он должен задать для ExecuteWmiMethodзначение NULL. В последнем случае WMI возвращает STATUS_INVALID_DEVICE_REQUEST вызывающей объекту в ответ на любой запрос IRP_MN_EXECUTE_METHOD .
Драйвер отвечает за проверку всех входных аргументов. В частности, драйвер должен выполнить следующие действия.
- Убедитесь, что значение GuidIndex находится в диапазоне от нуля до GuidCount-1 на основе элемента GuidCountструктуры WMILIB_CONTEXT .
- Убедитесь, что драйвер не помечает указанный блок данных для удаления. Если драйвер недавно указал флаг WMIREG_FLAG_REMOVE_GUID в структуре WMIGUIDREGINFO , содержащейся в структуре WMILIB_CONTEXT , до удаления может быть доставлен дополнительный запрос.
- Убедитесь, что значение InstanceIndex находится в диапазоне индексов экземпляров, поддерживаемых драйвером для блока данных.
- Убедитесь, что идентификатор метода, предоставленный MethodId , является допустимым идентификатором для указанного блока данных и что вызывающему объекту разрешено выполнять метод.
- Убедитесь, что Buffer и InBufferSize описывают буфер, достаточно большой для хранения входных параметров указанного метода, включая заполнение при необходимости, и убедитесь, что входные параметры допустимы.
- Убедитесь, что Buffer и OutBufferSize описывают буфер, который достаточно велик для получения выходных данных указанного метода, включая заполнение при необходимости.
Если указанный метод выполняет операцию, которая вызывает потерю данных, например получение и сброс содержимого набора счетчиков, драйвер должен проверить размер выходного буфера перед выполнением операции. Таким образом, драйвер может вернуть STATUS_BUFFER_TOO_SMALL и разрешить вызывающему объекту повторно отправить запрос с большим буфером без преждевременного сброса счетчиков.
После выполнения метода и записи всех выходных данных в буфер драйвер вызывает WmiCompleteRequest для выполнения запроса.
Эта подпрограмма может быть выстраимаемой.
Дополнительные сведения о реализации этой процедуры см. в статье Вызов WmiSystemControl для обработки WMI IRP.
Требования
Требование | Значение |
---|---|
Целевая платформа | Персональный компьютер |
Верхняя часть | wmilib.h (включая Wmilib.h) |
IRQL | Вызывается на PASSIVE_LEVEL. |