IRP_MN_CHANGE_SINGLE_ITEM
Все драйверы, поддерживающие WMI, должны обрабатывать этот IRP. Драйвер может обрабатывать WMI IRP путем вызова WmiSystemControl или путем обработки самого IRP, как описано в разделе Обработка запросов WMI.
Если драйвер вызывает WmiSystemControl для обработки запроса IRP_MN_CHANGE_SINGLE_ITEM , WMI, в свою очередь, вызывает подпрограмму DpWmiSetDataItem этого драйвера.
Основной код
При отправке
WMI отправляет этот IRP для изменения одного элемента данных в одном экземпляре блока данных.
WMI отправляет этот IRP в IRQL = PASSIVE_LEVEL в произвольном контексте потока.
Входные параметры
Parameters.WMI.ProviderId указывает на объект устройства драйвера, который должен отвечать на запрос. Этот указатель находится в расположении стека ввода-вывода драйвера в IRP.
Parameters.WMI.DataPath указывает на GUID, который определяет блок данных, который необходимо задать.
Parameters.WMI.BufferSize указывает размер буфера без пагузированного в Parameters.WMI.Buffer.
Parameters.WMI.Buffer указывает на структуру WNODE_SINGLE_ITEM , которая идентифицирует экземпляр блока данных, идентификатор устанавливаемого элемента и новое значение данных.
Выходные параметры
Нет.
Блок состояния ввода-вывода
Если драйвер обрабатывает IRP путем вызова WmiSystemControl, WMI задает Irp-IoStatus.Status и Irp-IoStatus.Information в блоке состояния ввода-вывода>>.
В противном случае драйвер устанавливает для Irp-IoStatus.Status> значение STATUS_SUCCESS или соответствующее состояние ошибки, например следующее:
STATUS_WMI_INSTANCE_NOT_FOUND
STATUS_WMI_ITEMID_NOT_FOUND
STATUS_WMI_GUID_NOT_FOUND
STATUS_WMI_READ_ONLY
STATUS_WMI_SET_FAILURE
При успешном выполнении драйвер устанавливает значение Irp-IoStatus.Information> равным нулю.
Операция
Если драйвер обрабатывает WMI IRP путем вызова WmiSystemControl, эта подпрограмма вызывает подпрограмму DpWmiSetDataItem драйвера или возвращает STATUS_WMI_READ_ONLY, если драйвер не определяет подпрограмму.
Если драйвер обрабатывает IRP_MN_CHANGE_SINGLE_ITEM запросы, он должен делать это только в том случае, если Parameters.WMI.ProviderId указывает на тот же объект устройства, что и указатель, переданный драйвером в IoWMIRegistrationControl. В противном случае драйвер должен перенаправить запрос следующему драйверу ниже.
Не реализуйте поддержку IRP_MN_CHANGE_SINGLE_ITEM , если вы не уверены, что эта возможность требуется компоненту пользовательского режима системы.
Перед обработкой запроса драйвер должен определить, указывает ли Parameters.WMI.DataPath на guid, поддерживаемый драйвером. Если это не так, драйвер должен не выполнить IRP и вернуть STATUS_WMI_GUID_NOT_FOUND.
Если драйвер поддерживает блок данных, он должен проверка входные WNODE_SINGLE_ITEM структуру, на которую указывает Parameters.WMI.Buffer для имени экземпляра, следующим образом:
Если WNODE_FLAG_STATIC_INSTANCE_NAMES задано в WnodeHeader.Flags, драйвер использует InstanceIndex в качестве индекса в списке статических имен экземпляров для этого блока. WMI получает индекс из регистрационных данных, предоставленных драйвером при регистрации блока.
Если WNODE_FLAG_STATIC_INSTANCE_NAMES в WnodeHeader.Flags не задано, драйвер использует смещение в OffsetInstanceName , чтобы найти строку имени экземпляра во входной WNODE_SINGLE_ITEM структуре. OffsetInstanceName — это смещение в байтах от начала структуры до длины строки имени экземпляра размера USHORT в байтах (не символов). Эта длина включает признак конца NULL, если он присутствует, за которым следует строка имени экземпляра в Юникоде.
Драйвер отвечает за проверку всех входных значений. В частности, драйвер должен выполнить следующие действия, если он сам обрабатывает запрос IRP:
Для статических имен убедитесь, что элемент InstanceIndex структуры WNODE_SINGLE_ITEM находится в диапазоне индексов экземпляров, поддерживаемых драйвером для блока данных.
Для динамических имен убедитесь, что строка имени экземпляра идентифицирует экземпляр блока данных, поддерживаемый драйвером.
Убедитесь, что элемент ItemId структуры WNODE_SINGLE_ITEM находится в диапазоне идентификаторов элементов, поддерживаемых драйвером для блока данных.
Убедитесь, что элементы DataBlockOffset и SizeDataItem структуры WNODE_SINGLE_ITEM описывают блок данных допустимого размера и что содержимое буфера является допустимым для элемента данных.
Убедитесь, что указанный элемент данных является элементом, для которого драйвер разрешает изменения, инициированные вызывающим объектом. Другими словами, драйвер не должен разрешать изменения элементов данных, которые должны быть доступны только для чтения.
Не предполагайте, что контекст потока является контекстом инициирующего приложения пользовательского режима. Возможно, драйвер более высокого уровня изменил его.
Если драйверу не удается найти указанный экземпляр, он должен завершить ошибку IRP и вернуть STATUS_WMI_INSTANCE_NOT_FOUND. Для экземпляра с динамическим именем экземпляра это состояние указывает, что драйвер не поддерживает экземпляр. Таким образом, WMI может продолжать запрашивать другие поставщики данных и возвращать соответствующую ошибку потребителю данных, если другой поставщик находит экземпляр, но не может обработать запрос по какой-либо другой причине.
Если драйвер находит экземпляр и может обрабатывать запрос, он устанавливает для элемента данных в экземпляре значение в WNODE_SINGLE_ITEM. Если элемент данных доступен только для чтения, драйвер оставляет элемент без изменений, завершает работу IRP и возвращает STATUS_WMI_READ_ONLY.
Если экземпляр действителен, но драйвер не может обработать запрос, он может вернуть любое соответствующее состояние ошибки.
Требования
Заголовок |
Wdm.h (включая Wdm.h, Ntddk.h или Ntifs.h) |