Compartir a través de


Procesamiento de IRP de WMI en una rutina DispatchSystemControl

Un controlador que controla los IRP de WMI en su rutina DispatchSystemControl debe controlar este tipo de IRP solo si el puntero de objeto de dispositivo en Parameters.WMI.ProviderId coincide con el puntero pasado por el controlador en su llamada a IoWMIRegistrationControl. De lo contrario, el controlador debe reenviar el IRP al siguiente controlador inferior.

Si el controlador controla la solicitud, debe:

Compruebe el GUID en Parameters.WMI.DataPath para determinar si representa un bloque de datos admitido por el controlador y, si no es así, produce un error en el IRP con STATUS_WMI_GUID_NOT_FOUND.

Un controlador debe comprobar la estructura WNODE_XXX de entrada en Parameters.WMI.Buffer para el nombre de instancia al controlar cualquiera de las siguientes solicitudes:

IRP_MN_QUERY_SINGLE_INSTANCE IRP_MN_CHANGE_SINGLE_INSTANCEIRP_MN_CHANGE_SINGLE_ITEMIRP_MN_EXECUTE_METHOD El controlador debe comprobar el nombre de la instancia de la siguiente manera:

  • Si WNODE_FLAG_STATIC_INSTANCE_NAMES se establece en WnodeHeader.Flags, use InstanceIndex como índice en la lista de nombres de instancia estáticos del controlador para ese bloque.

  • Si WNODE_FLAG_STATIC_INSTANCE_NAMES está desactivada en WnodeHeader.Flags, use OffsetInstanceName como desplazamiento para la cadena de nombre de instancia en la estructura WNODE_XXX de entrada. OffsetInstanceName es el desplazamiento en bytes desde el principio de la estructura a un USHORT que indica la longitud de la cadena de nombre de instancia en bytes (no caracteres), incluido el terminador NUL si está presente, seguido de la propia cadena en Unicode.

Si el controlador no puede encontrar la instancia especificada por InstanceIndex o OffsetInstanceName, debe producir un error en el IRP con STATUS_WMI_INSTANCE_NOT_FOUND.

Para una solicitud de IRP_MN_EXECUTE_METHOD , compruebe MethodID en el WNODE_METHOD_ITEM de entrada y, si el método no es válido para ese bloque de datos, produzca un error en el IRP con STATUS_WMI_ITEMID_NOT_FOUND.

Si la solicitud genera la salida, un controlador debe comprobar el tamaño del búfer en Parameters.WMI.BufferSize al controlar cualquiera de las siguientes solicitudes:

IRP_MN_QUERY_ALL_DATAIRP_MN_QUERY_SINGLE_INSTANCEIRP_MN_EXECUTE_METHOD Si el búfer es demasiado pequeño para recibir la salida, pero al menos sizeof(WNODE_TOO_SMALL), el controlador debe realizar correctamente el IRP y escribir una estructura de WNODE_TOO_SMALL en el búfer en Parameters.WMI.Buffer. Si el búfer es menor que sizeof(WNODE_TOO_SMALL), el controlador produce un error irP con un código NTSTATUS de STATUS_BUFFER_TOO_SMALL.

Si la solicitud genera la salida y el tamaño del búfer es adecuado, escriba la siguiente salida en el búfer en Parameters.WMI.Buffer:

  • Para una solicitud de IRP_MN_QUERY_ALL_DATA , el controlador escribe una estructura de WNODE_ALL_DATA que contiene datos para todas las instancias del bloque de datos especificado.
  • Para una solicitud de IRP_MN_QUERY_SINGLE_INSTANCE , el controlador escribe una estructura de WNODE_SINGLE_INSTANCE que contiene datos para la instancia especificada de un bloque de datos.
  • Para una IRP_MN_EXECUTE_METHOD si el método genera la salida, el controlador escribe la salida del método en formato determinado por el controlador siguiendo el WNODE_METHOD_ITEM de entrada en el búfer (sobrescribir los datos de entrada, si existe).

Establezca Irp-IoStatus.Information> en el número de bytes escritos en el búfer en Parameters.WMI.Buffer e Irp-IoStatus.Status> en STATUS_SUCCESS.

Llame a IoCompleteRequest para completar el IRP.

Para obtener más información, vea Estructuras WMI WNODE_XXX.