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


Обработка WMI IRP в подпрограмме DispatchSystemControl

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

Если драйвер обрабатывает запрос, он должен:

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

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

IRP_MN_QUERY_SINGLE_INSTANCEIRP_MN_CHANGE_SINGLE_INSTANCEIRP_MN_CHANGE_SINGLE_ITEMIRP_MN_EXECUTE_METHOD Драйвер должен проверка имя экземпляра следующим образом:

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

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

Если драйверу не удается найти экземпляр, указанный instanceIndex или OffsetInstanceName, он должен завершиться ошибкой IRP с STATUS_WMI_INSTANCE_NOT_FOUND.

Для запроса IRP_MN_EXECUTE_METHOD проверка MethodID во входном WNODE_METHOD_ITEM и, если метод не является допустимым для этого блока данных, выполните ошибку IRP с STATUS_WMI_ITEMID_NOT_FOUND.

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

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

Если запрос создает выходные данные и размер буфера является достаточным, запишите следующие выходные данные в буфер в разделе Parameters.WMI.Buffer:

  • Для запроса IRP_MN_QUERY_ALL_DATA драйвер записывает структуру WNODE_ALL_DATA , содержащую данные для всех экземпляров указанного блока данных.
  • Для запроса IRP_MN_QUERY_SINGLE_INSTANCE драйвер записывает структуру WNODE_SINGLE_INSTANCE , содержащую данные для указанного экземпляра блока данных.
  • Для IRP_MN_EXECUTE_METHOD , если метод создает выходные данные, драйвер записывает выходные данные метода в формате, определяемом драйвером, после входных WNODE_METHOD_ITEM в буфере (перезаписывает входные данные, если таковые есть).

Задайте для параметра Irp-IoStatus.Information> число байтов, записанных в буфер, в параметрах Parameters.WMI.Buffer и Irp-IoStatus.Status> значение STATUS_SUCCESS.

Вызовите IoCompleteRequest , чтобы завершить IRP.

Дополнительные сведения см. в разделе Структуры WMI WNODE_XXX.