Compartir a través de


WMI_QUERY_DATABLOCK_CALLBACK función de devolución de llamada (wmilib.h)

La rutina de DpWmiQueryDataBlock devuelve una sola instancia o todas las instancias de un bloque de datos. Esta rutina es necesaria.

Sintaxis

WMI_QUERY_DATABLOCK_CALLBACK WmiQueryDatablockCallback;

NTSTATUS WmiQueryDatablockCallback(
  [in]      PDEVICE_OBJECT DeviceObject,
  [in]      PIRP Irp,
  [in]      ULONG GuidIndex,
  [in]      ULONG InstanceIndex,
  [in]      ULONG InstanceCount,
  [in, out] PULONG InstanceLengthArray,
  [in]      ULONG BufferAvail,
  [out]     PUCHAR Buffer
)
{...}

Parámetros

[in] DeviceObject

Puntero a la estructura DEVICE_OBJECT WDM del controlador.

[in] Irp

Puntero al IRP.

[in] GuidIndex

Especifica el bloque de datos proporcionando un índice de base cero en la lista de GUID que el controlador proporcionó en la estructura de WMILIB_CONTEXT que pasó a WmiSystemControl.

[in] InstanceIndex

Si se llama a dpWmiQueryDataBlock en respuesta a una solicitud de IRP_MN_QUERY_SINGLE_INSTANCE, instanceIndex especifica un índice de base cero que indica la instancia del bloque de datos especificado que se va a consultar. Si se llama DpWmiQueryDataBlock en respuesta a una solicitud de IRP_MN_QUERY_ALL_DATA, InstanceIndex es cero.

[in] InstanceCount

Si se llama DpWmiQueryDataBlock en respuesta a una solicitud de IRP_MN_QUERY_SINGLE_INSTANCE, InstanceCount es 1. Si se llama dpWmiQueryDataBlock en respuesta a una solicitud de IRP_MN_QUERY_ALL_DATA, InstanceCount es el número de instancias que se van a devolver.

[in, out] InstanceLengthArray

Puntero a una matriz proporcionada por el autor de la llamada InstanceCountmatriz de elementos ULONG. El controlador rellena cada elemento de matriz para indicar la longitud de cada instancia devuelta. Si BufferAvail es cero, InstanceLengthArray es NULL.

[in] BufferAvail

Especifica el número máximo de bytes que están disponibles para recibir datos en el búfer en Búfer. Si este valor es cero, el autor de la llamada solicita que el controlador especifique el tamaño de búfer necesario en su llamada a WmiCompleteRequest. Consulte la sección Comentarios para obtener más información.

[out] Buffer

Puntero al búfer para recibir datos de instancia. Si el búfer es lo suficientemente grande como para recibir todos los datos, el controlador escribe los datos de instancia en el búfer con cada instancia alineada en un límite de 8 bytes. Si el búfer es demasiado pequeño para recibir todos los datos, el controlador llama a WmiCompleteRequest con BufferUsed establecer en el tamaño necesario.

Valor devuelto

dpWmiQueryDataBlock devuelve STATUS_SUCCESS o un estado de error como el siguiente:

Si el controlador no puede completar la solicitud inmediatamente, puede devolver STATUS_PENDING.

Observaciones

WMI llama a la rutina DpWmiQueryDataBlock de un controlador después de que el controlador llame a WmiSystemControl en respuesta a una solicitud de IRP_MN_QUERY_SINGLE_INSTANCE o IRP_MN_QUERY_ALL_DATA. El controlador debe colocar la dirección de su rutina dpWmiQueryDataBlock en la estructura de WMILIB_CONTEXT que pasa a WmiSystemControl.

El controlador es responsable de validar todos los argumentos de entrada. En concreto, el controlador debe hacer lo siguiente:

  • Compruebe que el valor guidIndex de está entre cero y GuidCount-1, en función del miembro guidCount de de la estructura de WMILIB_CONTEXT.
  • Compruebe que el controlador no ha marcado el bloque de datos especificado para su eliminación. Si el controlador especificó recientemente la marca WMIREG_FLAG_REMOVE_GUID en un WMIGUIDREGINFO estructura contenida en una estructura de WMILIB_CONTEXT, es posible que una consulta llegue antes de que se produzca la eliminación.
  • Compruebe que el InstanceIndex y valores de InstanceCount, juntos, especifique una serie de instancias de bloque de datos que está dentro del intervalo admitido por el controlador para el bloque de datos. Si InstanceIndex no es cero, InstanceCount debe ser 1. Si InstanceIndex es 0, InstanceCount no debe ser mayor que el número de instancias admitidas.
  • Compruebe que el búfer descrito por de búfer y bufferAvail sea lo suficientemente grande como para contener todas las instancias solicitadas del bloque de datos. Cada instancia debe comenzar en un límite de 8 bytes y es posible que exista relleno adicional entre los elementos de datos de cada instancia.
Después de escribir datos de instancia en el búfer, el controlador llama a WmiCompleteRequest para completar la solicitud. Si el búfer descrito por Búfer y bufferAvail es cero o es demasiado pequeño para recibir todos los datos solicitados, la llamada a WmiCompleteRequest debe especificar STATUS_BUFFER_TOO_SMALL para el parámetro Status y el tamaño de búfer necesario para el parámetro BufferUsed.

Esta rutina puede ser paginable.

Para obtener más información sobre la implementación de esta rutina, vea Llamada a WmiSystemControl para controlar irps de WMI.

Requisitos

Requisito Valor
de la plataforma de destino de Escritorio
encabezado de wmilib.h (include Wmilib.h)
irQL Se llama en PASSIVE_LEVEL.

Consulte también

IRP_MN_QUERY_ALL_DATA

IRP_MN_QUERY_SINGLE_INSTANCE

WMILIB_CONTEXT

WmiCompleteRequest

WmiSystemControl de