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


IRP_MN_QUERY_ALL_DATA

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

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

Основной код

IRP_MJ_SYSTEM_CONTROL

При отправке

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)

См. также

DpWmiQueryDataBlock

IoWMIRegistrationControl

KeQuerySystemTime

WMILIB_CONTEXT

WmiSystemControl

WNODE_ALL_DATA