Compartir a través de


IRP_MN_QUERY_ALL_DATA

Todos los controladores que admiten WMI deben controlar este IRP. Un controlador puede controlar irPs de WMI llamando a WmiSystemControl o controlando el propio IRP, como se describe en Control de solicitudes WMI.

Si un controlador llama a WmiSystemControl para controlar una solicitud de IRP_MN_QUERY_ALL_DATA, WMI llama a su vez a la rutina DpWmiQueryDataBlock del controlador.

Código principal

IRP_MJ_SYSTEM_CONTROL

Cuándo se envía

WMI envía este IRP para consultar todas las instancias de un bloque de datos determinado.

WMI envía este IRP en IRQL = PASSIVE_LEVEL en un contexto de subproceso arbitrario.

Parámetros de entrada

Parameters.WMI.ProviderId en la ubicación de la pila de E/S del controlador en el IRP apunta al objeto de dispositivo del controlador que debe responder a la solicitud.

Parameters.WMI.DataPath apunta a un GUID que identifica el bloque de datos.

Parameters.WMI.BufferSize indica el tamaño máximo del búfer no paginado en Parameters.WMI.Buffer, que recibe datos de salida de la solicitud. El tamaño del búfer debe ser mayor o igual que sizeof(WNODE_ALL_DATA) más los tamaños de los nombres de instancia y los datos para que se devuelvan todas las instancias.

Parámetros de salida

Si el controlador controla los IRP de WMI llamando a WmiSystemControl, WMI rellena un WNODE_ALL_DATA llamando a la rutina DpWmiQueryDataBlock del controlador una vez para cada bloque registrado por el controlador.

De lo contrario, el controlador rellena una estructura de WNODE_ALL_DATA en Parameters.WMI.Buffer de la siguiente manera:

  • Establece WnodeHeader.BufferSize en el número de bytes de toda la WNODE_ALL_DATA que se van a devolver, establece WnodeHeader.Timestamp en el valor devuelto por KeQuerySystemTime y establece WnodeHeader.Flags según corresponda para que se devuelvan los datos.

  • Establece InstanceCount en el número de instancias que se van a devolver.

  • Si el bloque usa nombres de instancia dinámicos, establece OffsetInstanceNameOffsets en el desplazamiento en bytes desde el principio del WNODE_ALL_DATA a donde comienza una matriz de desplazamientos de ULONG. Cada elemento de esta matriz es el desplazamiento del WNODE_ALL_DATA a donde se almacena cada nombre de instancia dinámica. Cada nombre de instancia dinámica se almacena como una cadena Unicode con recuento donde el recuento es un USHORT seguido de la cadena Unicode. El recuento no incluye ningún carácter NULO de terminación que pueda formar parte de la cadena Unicode. Si la cadena Unicode incluye un carácter nulo de terminación, este carácter null debe ajustarse al tamaño establecido en WNodeHeader.BufferSize.

  • Si todas las instancias tienen el mismo tamaño:

    • Establece WNODE_FLAG_FIXED_INSTANCE_SIZE en WnodeHeader.Flags y establece FixedInstanceSize en ese tamaño, en bytes.
    • Escribe datos de instancia a partir de DataBlockOffset, con relleno para que cada instancia esté alineada con un límite de 8 bytes. Por ejemplo, si FixedInstanceSize es 6, el controlador agrega 2 bytes de relleno entre instancias.
  • Si las instancias varían en tamaño:

    • Borra WNODE_FLAG_FIXED_INSTANCE_SIZE en WnodeHeader.Flags y escribe una matriz de estructuras InstanceCount OFFSETINSTANCEDATAANDLENGTH a partir de OffsetInstanceDataAndLength. Cada estructura OFFSETINSTANCEDATAANDLENGTH especifica el desplazamiento en bytes desde el principio de la estructura de WNODE_ALL_DATA hasta el principio de los datos para cada instancia y la longitud de los datos. No se usa DataBlockOffset .

    • Escribe datos de instancia después del último elemento de la matriz OffsetInstanceDataAndLength , además de relleno para que cada instancia esté alineada con un límite de 8 bytes.

Si el búfer de Parameters.WMI.Buffer es demasiado pequeño para recibir todos los datos, un controlador rellena el tamaño necesario en una estructura de WNODE_TOO_SMALL en Parameters.WMI.Buffer. Si el búfer es menor que sizeof(WNODE_TOO_SMALL), el controlador produce un error en irP y devuelve STATUS_BUFFER_TOO_SMALL.

Bloque de estado de E/S

Si el controlador controla el IRP llamando a WmiSystemControl, WMI establece Irp-IoStatus.Status> e Irp-IoStatus.Information> en el bloque de estado de E/S.

De lo contrario, el controlador establece Irp-IoStatus.Status> en STATUS_SUCCESS o en un estado de error adecuado, como el siguiente:

STATUS_BUFFER_TOO_SMALL

STATUS_WMI_GUID_NOT_FOUND

Si se ejecuta correctamente, un controlador establece Irp-IoStatus.Information> en el número de bytes escritos en el búfer en Parameters.WMI.Buffer.

Operación

Un controlador puede controlar irPs de WMI llamando a WmiSystemControl o controlando el propio IRP, como se describe en Control de solicitudes WMI.

Si un controlador controla irPs de WMI llamando a WmiSystemControl, esa rutina llama a la rutina DpWmiQueryDataBlock del controlador.

Si un controlador controla una solicitud de IRP_MN_QUERY_ALL_DATA , solo debe hacerlo si Parameters.WMI.ProviderId apunta al mismo objeto de dispositivo que el controlador pasó a IoWMIRegistrationControl. De lo contrario, el controlador debe reenviar la solicitud al controlador inferior siguiente.

Antes de controlar la solicitud, el controlador debe determinar si Parameters.WMI.DataPath apunta a un GUID que admite el controlador. Si no es así, el controlador debe producir un error en irP y devolver STATUS_WMI_GUID_NOT_FOUND.

Si el controlador admite el bloque de datos, debe hacer lo siguiente:

  • Compruebe que Parameters.WMI.BufferSize especifica un búfer lo suficientemente grande como para recibir todos los datos que devolverá el controlador.

  • Rellene una estructura de WNODE_ALL_DATA en Parameters.WMI.Buffer con datos para todas las instancias de ese bloque de datos.

Requisitos

Encabezado

Wdm.h (incluya Wdm.h, Ntddk.h o Ntifs.h)

Consulte también

DpWmiQueryDataBlock

IoWMIRegistrationControl

KeQuerySystemTime

WMILIB_CONTEXT

WmiSystemControl

WNODE_ALL_DATA