Función WmiSystemControl (wmilib.h)
La rutina de WmiSystemControl de es una rutina de distribución para los controladores que usan biblioteca WMI admite rutinas para controlar IRP de WMI.
Sintaxis
NTSTATUS WmiSystemControl(
[in] PWMILIB_CONTEXT WmiLibInfo,
[in] PDEVICE_OBJECT DeviceObject,
[in, out] PIRP Irp,
[out] PSYSCTL_IRP_DISPOSITION IrpDisposition
);
Parámetros
[in] WmiLibInfo
Puntero a una estructura de WMILIB_CONTEXT que contiene información de registro para los bloques de datos y bloques de eventos de un controlador y define los puntos de entrada para las rutinas de devolución de llamada de la biblioteca WMI del controlador.
[in] DeviceObject
Puntero al DEVICE_OBJECTdel controlador.
[in, out] Irp
Puntero al IRP.
[out] IrpDisposition
Puntero a un valor de enumeración de tipo SYSCTL_IRP_DISPOSITION que indica cómo se controló el IRP. WmiSystemControl siempre establece este valor, incluso cuando devuelve un código NTSTATUS no correcto.
SYSCTL_IRP_DISPOSITION es una enumeración en Wmilib.h y contiene los siguientes valores:
IrpProcessed
El IRP se procesó y posiblemente se completó. Si la rutina DpWmi Xxx del controlador llamada por WmiSystemControl no completó el IRP, el controlador debe llamar a WmiCompleteRequest para completar el IRP después de WmiSystemControl devuelve.
IrpNotCompleted
El IRP se procesó pero no se completó, ya sea porque WMI detectó un error y configuró el IRP con un código de error adecuado, o procesó una solicitud de IRP_MN_REGINFO o IRP_MN_REGINFO_EX. El controlador debe completar el IRP llamando a IoCompleteRequest.
IrpNotWmi
El IRP no es una solicitud WMI (es decir, WMI no reconoce el código secundario del IRP). Si el controlador controla las solicitudes IRP_MJ_SYSTEM_CONTROL con este IRP_MN_XXX, debe controlar el IRP; De lo contrario, el controlador debe reenviar el IRP al siguiente controlador inferior. Si el controlador es el controlador de nivel inferior, debe completar el IRP.
IrpForward
El IRP está dirigido a otro objeto de dispositivo (es decir, el puntero de objeto de dispositivo en Parameters.WMI.ProviderId en IRP no coincide con el puntero pasado por el controlador en su llamada a IoWMIRegistrationControl). El controlador debe reenviar el IRP al siguiente controlador inferior. Si el controlador es el controlador de nivel inferior, debe completar el IRP.
Valor devuelto
WmiSystemControl devuelve STATUS_SUCCESS o uno de los siguientes códigos de error:
Observaciones
Cuando un controlador recibe una solicitud de IRP_MJ_SYSTEM_CONTROL con un código secundario IRP de WMI, llama a WmiSystemControl con un puntero a la estructura WMILIB_CONTEXT del controlador, un puntero a su objeto de dispositivo y un puntero al IRP. La estructura WMILIB_CONTEXT contiene información de registro para los bloques de datos y bloques de eventos del controlador y define los puntos de entrada para sus rutinas de devolución de llamada de la biblioteca WMI.
WmiSystemControl confirma que IRP es una solicitud WMI y determina si el bloque especificado por la solicitud es válido para el controlador. Si es así, procesa el IRP llamando al dpWmi adecuadopunto de entrada Xxx en la estructura WMILIB_CONTEXT del controlador. WMI se ejecuta en irQL PASSIVE_LEVEL cuando llama a la rutina DpWmi Xxx del controlador.
Un controlador debe ejecutarse en IRQL PASSIVE_LEVEL cuando reenvía una solicitud de IRP_MJ_SYSTEM_CONTROL al controlador inferior siguiente.