Função WmiSystemControl (wmilib.h)
A rotina de WmiSystemControl é uma rotina de expedição para drivers que usam rotinas de suporte biblioteca WMI para lidar com IRPs WMI.
Sintaxe
NTSTATUS WmiSystemControl(
[in] PWMILIB_CONTEXT WmiLibInfo,
[in] PDEVICE_OBJECT DeviceObject,
[in, out] PIRP Irp,
[out] PSYSCTL_IRP_DISPOSITION IrpDisposition
);
Parâmetros
[in] WmiLibInfo
Um ponteiro para uma estrutura de WMILIB_CONTEXT que contém informações de registro para blocos de dados e blocos de eventos de um driver e define pontos de entrada para as rotinas de retorno de chamada da biblioteca WMI do driver.
[in] DeviceObject
Um ponteiro para o DEVICE_OBJECTdo driver.
[in, out] Irp
Um ponteiro para o IRP.
[out] IrpDisposition
Um ponteiro para um valor de enumeração do tipo SYSCTL_IRP_DISPOSITION que indica como o IRP foi tratado. WmiSystemControl sempre define esse valor, mesmo quando retorna um código NTSTATUS sem sucesso.
SYSCTL_IRP_DISPOSITION é uma enumeração em Wmilib.h e contém os seguintes valores:
IrpProcessed
O IRP foi processado e possivelmente concluído. Se a rotina DpWmi do driverxxx chamada por WmiSystemControl não tiver concluído o IRP, o driver deverá chamar WmiCompleteRequest para concluir o IRP após wmiSystemControl retornar.
IrpNotCompleted
O IRP foi processado, mas não concluído, porque o WMI detectou um erro e configurou o IRP com um código de erro apropriado ou processou uma solicitação de IRP_MN_REGINFO ou IRP_MN_REGINFO_EX. O driver deve concluir o IRP chamando IoCompleteRequest .
IrpNotWmi
O IRP não é uma solicitação WMI (ou seja, o WMI não reconhece o código secundário do IRP). Se o driver manipular solicitações IRP_MJ_SYSTEM_CONTROL com esse IRP_MN_XXX, ele deverá manipular o IRP; caso contrário, o driver deve encaminhar o IRP para o próximo driver inferior. Se o driver for o driver de nível mais baixo, ele deverá concluir o IRP.
IrpForward
O IRP é direcionado para outro objeto de dispositivo (ou seja, o ponteiro do objeto do dispositivo em Parameters.WMI.ProviderId no IRP não corresponde ao ponteiro passado pelo driver em sua chamada para IoWMIRegistrationControl). O driver deve encaminhar o IRP para o próximo driver inferior. Se o driver for o driver de nível mais baixo, ele deverá concluir o IRP.
Valor de retorno
WmiSystemControl retorna STATUS_SUCCESS ou um dos seguintes códigos de erro:
Observações
Quando um driver recebe uma solicitação IRP_MJ_SYSTEM_CONTROL com um código secundário WMI IRP, ele chama WmiSystemControl com um ponteiro para a estrutura de WMILIB_CONTEXT do driver, um ponteiro para seu objeto de dispositivo e um ponteiro para o IRP. A estrutura WMILIB_CONTEXT contém informações de registro para blocos de dados e blocos de eventos do driver e define pontos de entrada para suas rotinas de retorno de chamada da biblioteca WMI.
WmiSystemControl confirma que o IRP é uma solicitação WMI e determina se o bloco especificado pela solicitação é válido para o driver. Nesse caso, ele processa o IRP chamando o DpWmi apropriadoponto de entrada Xxx na estrutura de WMILIB_CONTEXT do driver. O WMI está em execução no PASSIVE_LEVEL IRQL quando chama a rotina de DpWmixxx do driver.
Um driver deve estar em execução no IRQL PASSIVE_LEVEL quando encaminhar uma solicitação de IRP_MJ_SYSTEM_CONTROL para o próximo driver inferior.