Función ScsiPortWmiSetData (scsiwmi.h)

La rutina ScsiPortWmiSetData actualiza la estructura de WNODE_ALL_DATA dentro del contexto de solicitud para especificar la posición y la longitud de los datos de una instancia.

Nota Los modelos del controlador de puerto SCSI y del controlador de miniporte SCSI pueden modificarse o no estar disponibles en el futuro. En su lugar, se recomienda usar el controlador Storport y los modelos de controlador de miniport storport .
 

Sintaxis

PVOID ScsiPortWmiSetData(
  [in]      PSCSIWMI_REQUEST_CONTEXT RequestContext,
  [in]      ULONG                    InstanceIndex,
  [in]      ULONG                    DataLength,
  [out]     PULONG                   BufferAvail,
  [in, out] PULONG                   SizeNeeded
);

Parámetros

[in] RequestContext

Puntero a una estructura de tipo SCSIWMI_REQUEST_CONTEXT que contiene el contexto de solicitud de un SRB de WMI.

[in] InstanceIndex

Contiene un índice que indica la instancia para la que se va a especificar la posición y la longitud de los datos de instancia.

[in] DataLength

Especifica el número de bytes de datos necesarios para describir la instancia.

[out] BufferAvail

Debe contener, en entrada, el número de bytes de espacio en búfer en la estructura de WNODE_ALL_DATA que se puede usar para describir los nombres de instancia y los datos. Al devolver, este miembro contiene el número de bytes de espacio en búfer que permanecen.

Hay tres rutinas WMI de puerto SCSI que devuelven un valor para el tamaño de búfer disponible en su parámetro BufferAvail :

ScsiPortWmiSetInstanceCount

ScsiPortWmiSetData

ScsiPortWmiSetInstanceName

El controlador de miniport debe llamar primero a ScsiPortWmiSetInstanceCount , pero después de llamar a ScsiPortWmiSetInstanceCount , no importa en qué orden el minidriver llama a ScsiPortWmiSetData y ScsiPortWmiSetInstanceName. Al llamar a ScsiPortWmiSetData o ScsiPortWmiSetInstanceName, el valor pasado a la rutina en su parámetro BufferAvail debe ser el mismo que el valor devuelto en el parámetro BufferAvail por la rutina WMI de puerto SCSI más reciente. Por ejemplo, supongamos que el minidriver llama primero a ScsiPortWmiSetInstanceCount y esta rutina devuelve un valor de 1000 en su parámetro BufferAvail . A continuación, el minidriver llama a ScsiPortWmiSetData , que devuelve un valor de 500 en su parámetro BufferAvail . Por último, el minidriver llama a ScsiPortWmiSetInstanceName , que devuelve un valor de 200 en su parámetro BufferAvail . El valor inicial de 1000 debe pasarse a ScsiPortWmiSetData en BufferAvail y el valor de 500 debe pasarse a ScsiPortWmiSetInstanceName.

Si no hay suficiente memoria disponible para agregar nuevos datos de instancia de tamaño DataLength bytes, se devolverá un cero en el miembro BufferAvail .

[in, out] SizeNeeded

Indica, en la entrada, el número de bytes necesarios para describir todo el WNODE antes de agregar los datos descriptivos para la instancia especificada por InstanceIndex. Al devolverlo, este miembro contendrá el tamaño del WNODE, incluidos los datos de la nueva instancia.

Valor devuelto

La rutina ScsiPortWmiSetData devuelve un puntero al búfer donde el autor de la llamada puede almacenar información descriptiva sobre la instancia identificada por InstanceIndex. Si ScsiPortWmiSetData no puede asignar suficiente memoria para los datos de instancia o si el WNODE contenido en el contexto de solicitud no es de tipo WNODE_ALL_DATA, ScsiPortWmiSetData devuelve NULL.

Comentarios

El minidriver debe llamar a ScsiPortWmiSetInstanceCount antes de llamar a ScsiPortWmiSetData.

El parámetro RequestContext apunta a una estructura de contexto de solicitud, SCSIWMI_REQUEST_CONTEXT, que contiene información asociada a un bloque de solicitud SCSI (SRB) de Instrumental de administración de Windows (WMI). La estructura del contexto de solicitud, a su vez, contiene una de las estructuras de WNODE_XXX WMI que usa el sistema WMI para pasar datos entre consumidores de datos en modo de usuario y proveedores de datos en modo kernel, como controladores.

La rutina ScsiPortWmiSetData requiere que la estructura WNODE definida dentro del contexto de solicitud sea de tipo WNODE_ALL_DATA. Esto se debe a que ScsiPortWmiSetData puede especificar la ubicación y la longitud de los búferes de datos para cualquiera de las instancias asociadas a un bloque de datos WMI. A diferencia de la estructura de WNODE_SINGLE_INSTANCE que contiene información sobre una sola instancia, la estructura de WNODE_ALL_DATA contiene una matriz de punteros a áreas de búfer para varias instancias y ScsiPortWmiSetData usa el parámetro InstanceIndex como índice en esta matriz para inicializar el elemento de matriz adecuado para una instancia determinada. Cada elemento de matriz, una vez inicializado, contiene el tamaño y la ubicación de un área de búfer para una instancia.

La memoria asignada para el contexto de solicitud debe permanecer válida hasta después de que el controlador de miniporte llame a ScsiPortWmiPostProcess y ScsiPortWmiPostProcess devuelve el estado final del SRB y el tamaño del búfer. Si el SRB se puede escribir, la memoria del contexto de solicitud debe asignarse desde la extensión SRB. Si el SRB no puede escribirse, la memoria se puede asignar desde un marco de pila que no sale del ámbito.

Requisitos

Requisito Value
Plataforma de destino Escritorio
Encabezado scsiwmi.h (incluya Miniport.h, Scsi.h)

Consulte también

SCSIWMI_REQUEST_CONTEXT

WNODE_ALL_DATA

WNODE_SINGLE_INSTANCE