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


Функция WmiSystemControl (wmilib.h)

Подпрограмма WmiSystemControl — это подпрограмма диспетчеризации для драйверов, использующих подпрограммы поддержки библиотекИ WMI для обработки WMI IRP.

Синтаксис

NTSTATUS WmiSystemControl(
  [in]      PWMILIB_CONTEXT         WmiLibInfo,
  [in]      PDEVICE_OBJECT          DeviceObject,
  [in, out] PIRP                    Irp,
  [out]     PSYSCTL_IRP_DISPOSITION IrpDisposition
);

Параметры

[in] WmiLibInfo

Указатель на структуру WMILIB_CONTEXT , которая содержит сведения о регистрации блоков данных драйвера и блоков событий и определяет точки входа для процедур обратного вызова библиотеки WMI драйвера.

[in] DeviceObject

Указатель на DEVICE_OBJECT драйвера.

[in, out] Irp

Указатель на IRP.

[out] IrpDisposition

Указатель на значение перечисления типа SYSCTL_IRP_DISPOSITION , указывающее способ обработки IRP. WmiSystemControl всегда задает это значение, даже если он возвращает код NTSTATUS, отличный от успешного выполнения.

SYSCTL_IRP_DISPOSITION является перечислением в Wmilib.h и содержит следующие значения:

IrpProcessed

IRP был обработан и, возможно, завершен. Если подпрограмма DpWmiXxx драйвера, вызываемая WmiSystemControl , не завершила IRP, драйвер должен вызвать WmiCompleteRequest , чтобы завершить IRP после возврата WmiSystemControl .

IrpNotCompleted

IRP был обработан, но не завершен из-за того, что WMI обнаружил ошибку и настроил IRP с соответствующим кодом ошибки либо обработал запрос IRP_MN_REGINFO или IRP_MN_REGINFO_EX . Драйвер должен завершить IRP, вызвав IoCompleteRequest.

IrpNotWmi

IRP не является запросом WMI (то есть WMI не распознает дополнительный код IRP). Если драйвер обрабатывает запросы IRP_MJ_SYSTEM_CONTROL с помощью этого IRP_MN_XXX, он должен обрабатывать IRP; В противном случае драйвер должен перенаправить IRP в следующий драйвер ниже. Если драйвер является драйвером самого низкого уровня, он должен завершить IRP.

IrpForward

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

Возвращаемое значение

WmiSystemControl возвращает STATUS_SUCCESS или один из следующих кодов ошибок:

Комментарии

Когда драйвер получает запрос IRP_MJ_SYSTEM_CONTROL с дополнительным кодом WMI IRP, он вызывает WmiSystemControl с указателем на структуру WMILIB_CONTEXT драйвера, указателем на объект устройства и указателем на IRP. Структура WMILIB_CONTEXT содержит сведения о регистрации блоков данных драйвера и блоков событий, а также определяет точки входа для процедур обратного вызова библиотеки WMI.

WmiSystemControl подтверждает, что IRP является запросом WMI, и определяет, является ли блок, указанный в запросе, допустимым для драйвера. Если это так, он обрабатывает IRP, вызывая соответствующую точку входа DpWmiXxx в структуре WMILIB_CONTEXT драйвера. WMI выполняется на PASSIVE_LEVEL IRQL при вызове процедуры DpWmiXxx драйвера.

Драйвер должен работать в PASSIVE_LEVEL IRQL, когда он перенаправит запрос IRP_MJ_SYSTEM_CONTROL в следующий драйвер ниже.

Требования

Требование Значение
Минимальная версия клиента Доступно в Windows 2000 и более поздних версиях Windows.
Целевая платформа Универсальное
Верхняя часть wmilib.h (включая Wmilib.h)
Библиотека Wmilib.lib
IRQL PASSIVE_LEVEL (см. раздел "Примечания")
Правила соответствия DDI WmiComplete(wdm)

См. также раздел

DpWmiExecuteMethod

DpWmiFunctionControl

DpWmiQueryDataBlock

DpWmiQueryReginfo

DpWmiSetDataBlock

DpWmiSetDataItem

IRP_MJ_SYSTEM_CONTROL

IRP_MN_REGINFO_EX

IoCompleteRequest

WMILIB_CONTEXT