IRP_MN_CHANGE_SINGLE_INSTANCE
Все драйверы, поддерживающие WMI, должны обрабатывать этот IRP. Драйвер может обрабатывать WMI IRP путем вызова WmiSystemControl или обработки самого IRP, как описано в разделе Обработка запросов WMI.
Если драйвер вызывает WmiSystemControl для обработки запроса IRP_MN_CHANGE_SINGLE_INSTANCE , WMI, в свою очередь, вызывает подпрограмму DpWmiSetDataBlock этого драйвера.
Основной код
При отправке
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_INSTANCE структуру, которая идентифицирует экземпляр и задает новые значения данных.
Выходные параметры
Нет.
Блок состояния ввода-вывода
Если драйвер обрабатывает IRP путем вызова WmiSystemControl, WMI задает Irp-IoStatus.Status и Irp-IoStatus.Information в блоке состояния ввода-вывода>>.
В противном случае драйвер задает Irp-IoStatus.Status> значение STATUS_SUCCESS или соответствующее состояние ошибки, например следующее:
STATUS_WMI_INSTANCE_NOT_FOUND
STATUS_WMI_GUID_NOT_FOUND
STATUS_WMI_READ_ONLY
STATUS_WMI_SET_FAILURE
При успешном выполнении драйвер устанавливает значение Irp-IoStatus.Information> равным нулю.
Операция
Если драйвер обрабатывает WMI IRP путем вызова WmiSystemControl, эта подпрограмма вызывает подпрограмму DpWmiSetDataBlock драйвера или возвращает STATUS_WMI_READ_ONLY, если драйвер не определяет подпрограмму.
Если драйвер сам обрабатывает запрос IRP_MN_CHANGE_SINGLE_INSTANCE , он делает это только в том случае, если указатель объекта устройства Parameters.WMI.ProviderId соответствует указателю, переданного драйвером при вызове IoWMIRegistrationControl. В противном случае драйвер должен переслать запрос следующему драйверу.
Если драйвер обрабатывает запрос, он должен сначала проверка GUID в Parameters.WMI.DataPath, чтобы определить, определяет ли он блок данных, поддерживаемый драйвером. В противном случае драйвер должен завершиться ошибкой IRP и вернуть STATUS_WMI_GUID_NOT_FOUND.
Если драйвер поддерживает блок данных, он должен проверка полученную структуру WNODE_SINGLE_INSTANCEв Parameters.WMI.Buffer для имени экземпляра следующим образом:
Если WNODE_FLAG_STATIC_INSTANCE_NAMES задано в WnodeHeader.Flags, драйвер использует InstanceIndex в качестве индекса в списке статических имен экземпляров драйвера для этого блока. WMI получает индекс из регистрационных данных, предоставленных драйвером при регистрации блока.
Если WNODE_FLAG_STATIC_INSTANCE_NAMES в WnodeHeader.Flags не WNODE_FLAG_STATIC_INSTANCE_NAMES, драйвер использует смещение в OffsetInstanceName , чтобы найти строку имени экземпляра во входном WNODE_SINGLE_INSTANCE. OffsetInstanceName — это смещение в байтах от начала структуры до длины строки имени экземпляра размера USHORT в байтах (не символах), включая завершающее значение NULL, если оно имеется, за которым следует строка имени экземпляра в Юникоде.
Драйвер отвечает за проверку всех входных значений. В частности, драйвер должен выполнить следующие действия, если он обрабатывает сам запрос IRP:
Для статических имен убедитесь, что элемент InstanceIndex структуры WNODE_SINGLE_INSTANCE находится в диапазоне индексов экземпляров, поддерживаемых драйвером для блока данных.
Для динамических имен убедитесь, что строка имени экземпляра определяет экземпляр блока данных, поддерживаемый драйвером.
Убедитесь, что элементы DataBlockOffset и SizeDataBlock структуры WNODE_SINGLE_INSTANCE описывают блок данных допустимого размера, включая все заполнения, которые существуют между элементами данных, и что содержимое буфера является допустимым для блока данных.
Убедитесь, что указанный блок данных является блоком данных, для которого драйвер разрешает изменения, инициированные вызывающим объектом. Другими словами, драйвер не должен разрешать изменения блоков данных, которые должны быть доступны только для чтения.
Не предполагайте, что контекст потока является контекстом инициирующего приложения пользовательского режима. Возможно, драйвер более высокого уровня изменил его.
Если драйверу не удается найти указанный экземпляр, он должен завершить ошибку IRP и вернуть STATUS_WMI_INSTANCE_NOT_FOUND. Если экземпляр имеет динамическое имя экземпляра, это состояние указывает на то, что драйвер не поддерживает экземпляр. Таким образом, WMI может продолжать запрашивать другие поставщики данных и возвращать соответствующую ошибку потребителю данных, если другой поставщик находит экземпляр, но не может обработать запрос по какой-либо другой причине.
Если драйвер находит экземпляр и может обработать запрос, он устанавливает для записываемых элементов данных в экземпляре значения в структуре WNODE_SINGLE_INSTANCE , оставляя все элементы, доступные только для чтения, без изменений. Если весь блок данных доступен только для чтения, драйвер должен завершить ошибку IRP и вернуть STATUS_WMI_READ_ONLY.
Если экземпляр действителен, но драйвер не может обработать запрос, он может вернуть любое соответствующее состояние ошибки.
Требования
Заголовок |
Wdm.h (включая Wdm.h, Ntddk.h или Ntifs.h) |