Поделиться через


IRP_MN_EXECUTE_METHOD

Все драйверы, поддерживающие методы в блоках данных, должны обрабатывать этот IRP. Драйвер может обрабатывать WMI IRP путем вызова WmiSystemControl или путем обработки самого IRP, как описано в разделе Обработка запросов WMI.

Если драйвер вызывает WmiSystemControl для обработки запроса IRP_MN_EXECUTE_METHOD , WMI, в свою очередь, вызывает подпрограмму DpWmiExecuteMethod этого драйвера.

Основной код

IRP_MJ_SYSTEM_CONTROL

При отправке

WMI отправляет этот IRP для выполнения метода, связанного с блоком данных.

WMI отправляет этот IRP в IRQL = PASSIVE_LEVEL в произвольном контексте потока.

WMI отправит IRP_MN_QUERY_SINGLE_INSTANCE перед отправкой IRP_MN_EXECUTE_METHOD. Если драйвер поддерживает IRP_MN_EXECUTE_METHOD он должен иметь обработчик IRP_MN_QUERY_SINGLE_INSTANCE для того же блока данных, метод которого выполняется.

Входные параметры

Parameters.WMI.ProviderId указывает на объект устройства драйвера, который должен отвечать на запрос. Этот указатель находится в расположении стека ввода-вывода драйвера в IRP.

Parameters.WMI.DataPath указывает на GUID, идентифицирующий блок данных, связанный с выполняемым методом.

Parameters.WMI.BufferSize указывает размер непагрегированного буфера в Parameters.WMI.Buffer , который должен быть >= sizeof(WNODE_METHOD_ITEM) плюс размер всех выходных данных для метода .

Parameters.WMI.Buffer указывает на структуру WNODE_METHOD_ITEM , в которой MethodID указывает идентификатор метода для выполнения, а DataBlockOffset — смещение в байтах от начала структуры до первого байта входных данных, если таковые есть. Parameters.WMI.Buffer-> SizeDataBlock указывает размер входных WNODE_METHOD_ITEM в байтах, включая входные данные, или нуль, если входные данные отсутствуют.

Выходные параметры

Если драйвер обрабатывает WMI IRP путем вызова WmiSystemControl, WMI заполняет WNODE_METHOD_ITEM данными, возвращаемыми подпрограммой DpWmiExecuteMethod драйвера.

В противном случае драйвер заполняет структуру WNODE_METHOD_ITEM , на которую указывает Parameters.WMI.Buffer , следующим образом:

  • Обновления WnodeHeader.BufferSize размер выходного WNODE_METHOD_ITEM, включая все выходные данные.

  • Обновления SizeDataBlock с размером выходных данных или нулем, если выходные данные отсутствуют.

  • Проверяет Parameters.WMI.Buffersize , чтобы определить, достаточно ли большой буфер для получения выходных WNODE_METHOD_ITEM включая любые выходные данные. Если буфер недостаточно велик, драйвер заполняет необходимый размер в WNODE_TOO_SMALL структуре, на которую указывает Parameters.WMI.Buffer. Если буфер меньше , чем sizeof(WNODE_TOO_SMALL), драйвер не выполняет IRP и возвращает STATUS_BUFFER_TOO_SMALL.

  • Записывает выходные данные(при наличии) поверх входных данных, начиная с DataBlockOffset. Драйвер не должен изменять входное значение DataBlockOffset.

Блок состояния ввода-вывода

Если драйвер обрабатывает IRP путем вызова WmiSystemControl, WMI задает Irp-IoStatus.Status и Irp-IoStatus.Information в блоке состояния ввода-вывода>>.

В противном случае драйвер устанавливает для Irp-IoStatus.Status> значение STATUS_SUCCESS или соответствующее состояние ошибки, например следующее:

STATUS_BUFFER_TOO_SMALL

STATUS_WMI_GUID_NOT_FOUND

STATUS_WMI_INSTANCE_NOT_FOUND

STATUS_WMI_ITEMID_NOT_FOUND

При успешном выполнении драйвер задает Irp-IoStatus.Information> число байтов, записанных в буфер в parameters.WMI.Buffer.

Операция

Драйвер может обрабатывать WMI IRP путем вызова WmiSystemControl или путем обработки самого IRP, как описано в разделе Обработка запросов WMI.

Если драйвер обрабатывает WMI IRP путем вызова WmiSystemControl, эта подпрограмма вызывает подпрограмму DpWmiExecuteMethod драйвера или возвращает STATUS_INVALID_DEVICE_REQUEST, если драйвер не определяет подпрограмму.

Если драйвер сам обрабатывает запрос IRP_MN_EXECUTE_METHOD , он должен делать это только в том случае, если Parameters.WMI.ProviderId указывает на тот же объект устройства, что и указатель, переданный драйвером в IoWMIRegistrationControl. В противном случае драйвер должен перенаправить запрос следующему драйверу ниже.

Драйвер отвечает за проверку всех входных значений. В частности, драйвер должен выполнить следующие действия, если он сам обрабатывает запрос IRP:

  • Для статических имен убедитесь, что элемент InstanceIndex структуры WNODE_METHOD_ITEM находится в диапазоне индексов экземпляров, поддерживаемых драйвером для блока данных.

  • Для динамических имен убедитесь, что строка имени экземпляра идентифицирует экземпляр блока данных, поддерживаемый драйвером.

  • Убедитесь, что элемент MethodId структуры WNODE_METHOD_ITEM находится в диапазоне идентификаторов методов, поддерживаемых драйвером для блока данных, и что вызывающему объекту разрешено выполнять метод.

  • Убедитесь, что элементы DataBlockOffset и SizeDataBlock структуры WNODE_METHOD_ITEM описывают буфер, который достаточно велик для хранения параметров указанного метода и что параметры являются допустимыми для метода.

  • Убедитесь, что параметр Parameters.WMI.Buffersize указывает буфер, который достаточно велик для получения структуры WNODE_METHOD_ITEM после обновления с помощью выходных данных.

Не предполагайте, что контекст потока является контекстом инициирующего приложения пользовательского режима. Возможно, драйвер более высокого уровня изменил его.

Перед обработкой запроса драйвер должен определить, указывает ли Parameters.WMI.DataPath на GUID, поддерживаемый драйвером. В противном случае драйвер должен сбой IRP и возвратить STATUS_WMI_GUID_NOT_FOUND.

Если драйвер поддерживает блок данных, он проверяет входные WNODE_METHOD_ITEMв Parameters.WMI.Buffer для имени экземпляра следующим образом:

  • Если WNODE_FLAG_STATIC_INSTANCE_NAMES задано в WnodeHeader.Flags, драйвер использует InstanceIndex в качестве индекса в списке статических имен экземпляров для этого блока. WMI получает индекс из регистрационных данных, предоставленных драйвером при регистрации блока.

  • Если WNODE_FLAG_STATIC_INSTANCE_NAMES в WnodeHeader.Flags не задано, драйвер использует смещение в OffsetInstanceName , чтобы найти строку имени экземпляра во входном WNODE_METHOD_ITEM. OffsetInstanceName — это смещение в байтах от начала структуры до USHORT, представляющего собой длину строки имени экземпляра в байтах (а не символах), включая завершающее значение NULL, если оно присутствует, за которым следует строка имени экземпляра в Юникоде.

Если драйверу не удается найти указанный экземпляр, он должен завершить ошибку IRP и вернуть STATUS_WMI_INSTANCE_NOT_FOUND. Для экземпляра с динамическим именем экземпляра это состояние указывает, что драйвер не поддерживает экземпляр. Таким образом, WMI может продолжать запрашивать другие поставщики данных и возвращать соответствующую ошибку потребителю данных, если другой поставщик находит экземпляр, но не может обработать запрос по какой-либо другой причине.

Затем драйвер проверяет идентификатор метода во входном WNODE_METHOD_ITEM , чтобы определить, является ли он допустимым методом для этого блока данных. В противном случае драйвер завершает работу IRP и возвращает STATUS_WMI_ITEMID_NOT_FOUND.

Если метод создает выходные данные, драйвер должен проверка размер выходного буфера в Parameters.WMI.BufferSize перед выполнением любой операции, которая может иметь побочные эффекты или которая не должна выполняться дважды. Например, если метод возвращает значения группы счетчиков, а затем сбрасывает счетчики, драйвер должен проверка размер буфера (и сбой IRP, если буфер слишком мал) перед сбросом счетчиков. Это гарантирует, что WMI сможет безопасно повторно отправить запрос с большим буфером.

Если экземпляр и идентификатор метода являются допустимыми, а размер буфера достаточно, драйвер выполняет метод . Если sizeDataBlock во входной WNODE_METHOD_ITEM ненулевое, драйвер использует данные, начиная с DataBlockOffset , в качестве входных данных для метода .

Если метод создает выходные данные, драйвер записывает выходные данные в буфер, начиная с DataBlockOffset , и задает sizeDataBlock в выходном WNODE_METHOD_ITEM количество байт выходных данных. Если метод не содержит выходных данных, драйвер устанавливает для SizeDataBlock значение 0. Драйвер не должен изменять входное значение DataBlockOffset.

Если экземпляр действителен, но драйвер не может обработать запрос, он может вернуть любое соответствующее состояние ошибки.

Требования

Заголовок

Wdm.h (включая Wdm.h, Ntddk.h или Ntifs.h)

См. также раздел

DpWmiExecuteMethod

IoWMIRegistrationControl

WMILIB_CONTEXT

WmiSystemControl

WNODE_METHOD_ITEM