IRP_MN_QUERY_ALL_DATA
Все драйверы, поддерживающие WMI, должны обрабатывать этот IRP. Драйвер может обрабатывать IP-адреса WMI, вызывая WmiSystemControl или обрабатывая сам IRP, как описано в разделе "Обработка запросов WMI".
Если драйвер вызывает WmiSystemControl для обработки запроса IRP_MN_QUERY_ALL_DATA, WMI в свою очередь вызывает подпрограмму DpWmiQueryDataBlock драйвера.
Основной код
При отправке
WMI отправляет этот IRP для запроса ко всем экземплярам заданного блока данных.
WMI отправляет этот IRP в IRQL = PASSIVE_LEVEL в произвольном контексте потока.
Входные параметры
Parameters.WMI.ProviderId в расположении стека ввода-вывода драйвера в IRP указывает на объект устройства драйвера, который должен отвечать на запрос.
Parameters.WMI.DataPath указывает на GUID, определяющий блок данных.
Parameters.WMI.BufferSize указывает максимальный размер непагированного буфера в Parameters.WMI.Buffer, который получает выходные данные из запроса. Размер буфера должен быть больше или равен размеру (WNODE_ALL_DATA) и размерам имен экземпляров и данных для возвращаемых экземпляров.
Выходные параметры
Если драйвер обрабатывает irps WMI путем вызова WmiSystemControl, WMI заполняет WNODE_ALL_DATA путем вызова подпрограммы DpWmiQueryDataBlock драйвера один раз для каждого блока, зарегистрированного драйвером.
В противном случае драйвер заполняет структуру WNODE_ALL_DATA в Parameters.WMI.Buffer следующим образом:
Задает значение WnodeHeader.BufferSize в число байтов всего возвращаемого WNODE_ALL_DATA, задает метку WnodeHeader.Timestamp значением, возвращаемым KeQuerySystemTime, и задает WnodeHeader.Flags соответствующим образом для возвращаемых данных.
Задает InstanceCount число возвращаемых экземпляров.
Если блок использует имена динамических экземпляров, задает offsetInstanceNameOffsets в байтах с начала WNODE_ALL_DATA , где начинается массив смещения ULONG. Каждый элемент в этом массиве — смещение от WNODE_ALL_DATA до места хранения каждого имени динамического экземпляра. Каждое имя динамического экземпляра хранится в виде подсчитываемой строки Юникода, где число — это USHORT, за которым следует строка Юникода. Число не включает в себя конечный символ NULL, который может быть частью строки Юникода. Если строка Юникода содержит завершающий символ NULL, этот символ NULL должен по-прежнему соответствовать размеру, установленному в WNodeHeader.BufferSize.
Если все экземпляры имеют одинаковый размер:
- Задает WNODE_FLAG_FIXED_INSTANCE_SIZE в WnodeHeader.Flags и задает FixedInstanceSize для этого размера в байтах.
- Записывает данные экземпляра, начиная с DataBlockOffset, с заполнением, чтобы каждый экземпляр был выровнен с границой 8-байтов. Например, если параметр FixedInstanceSize равен 6, драйвер добавляет 2 байта заполнения между экземплярами.
Если экземпляры зависят от размера:
Очищает WNODE_FLAG_FIXED_INSTANCE_SIZE в WnodeHeader.Flags и записывает массив структур OFFSETINSTANCEDATAANDLENGTH, начиная с OffsetInstanceDataAndLength. Каждая структура OFFSETINSTANCEDATAANDLENGTH указывает смещение в байтах с начала WNODE_ALL_DATA структуры до начала данных для каждого экземпляра и длину данных. DataBlockOffset не используется.
Записывает данные экземпляра после последнего элемента массива OffsetInstanceDataAndLength , а также заполнение, чтобы каждый экземпляр был выровнен с границой 8-байтов.
Если буфер в Parameters.WMI.Buffer слишком мал, чтобы получить все данные, драйвер заполняет необходимый размер в структуре WNODE_TOO_SMALL в Parameters.WMI.Buffer. Если буфер меньше размера (WNODE_TOO_SMALL), драйвер завершает ошибку IRP и возвращает STATUS_BUFFER_TOO_SMALL.
Блок состояния ввода-вывода
Если драйвер обрабатывает IRP путем вызова WmiSystemControl, WMI задает Irp-IoStatus.Status и Irp-IoStatus.Information> в блоке состояния ввода-вывода>.
В противном случае драйвер устанавливает для Irp-IoStatus.Status> значение STATUS_SUCCESS или соответствующее состояние ошибки, например следующее:
STATUS_BUFFER_TOO_SMALL
STATUS_WMI_GUID_NOT_FOUND
При успешном выполнении драйвер задает Irp-IoStatus.Information> число байтов, записанных в буфер в Parameters.WMI.Buffer.
Операция
Драйвер может обрабатывать IP-адреса WMI, вызывая WmiSystemControl или обрабатывая сам IRP, как описано в разделе "Обработка запросов WMI".
Если драйвер обрабатывает irps WMI путем вызова WmiSystemControl, эта подпрограмма вызывает подпрограмму DpWmiQueryDataBlock драйвера.
Если драйвер обрабатывает запрос IRP_MN_QUERY_ALL_DATA, он должен сделать это только в том случае, если Parameters.WMI.ProviderId указывает на тот же объект устройства, что драйвер, переданный в IoWMIRegistrationControl. В противном случае драйвер должен перенаправить запрос на следующий драйвер ниже.
Перед обработкой запроса драйвер должен определить, указывает ли Parameters.WMI.DataPath на GUID, поддерживаемый драйвером. В противном случае драйвер должен завершиться ошибкой IRP и вернуть STATUS_WMI_GUID_NOT_FOUND.
Если драйвер поддерживает блок данных, он должен выполнить следующие действия:
Убедитесь, что Parameters.WMI.BufferSize указывает буфер, который достаточно велик, чтобы получить все возвращаемые драйвером данные.
Заполните структуру WNODE_ALL_DATA в Parameters.WMI.Buffer данными для всех экземпляров этого блока данных.
Требования
Верхний колонтитул |
Wdm.h (включая Wdm.h, Ntddk.h или Ntifs.h) |