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


Обработка IRP WMI в процедуре "DispatchSystemControl"

Драйвер, обрабатывающий запросы IRP WMI в подпрограмме 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, используйте OffsetInstanceName в качестве смещения к строке имени экземпляра в структуре входных WNODE_XXXX. 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 Structures.