Información general sobre la interfaz del analizador TLV de WDI
Modelo de asignación de destinatarios
Un punto de entrada dentro del controlador recibe un mensaje o indicación que contiene TLV. Una vez que el código extrae el identificador de mensaje y determina si es un identificador que quiere controlar, llama a la rutina de análisis genérico y pasa el blob de TLV (después de avanzar más allá del WDI_MESSAGE_HEADER) para analizar los TLV en una estructura C.
ndisStatus = Parse(
cbBufferLength,
pvBuffer,
messageId,
&Context,
&pParsed);
Después de comprobar la devolución de errores, el código puede convertir el búfer de salida (pParsed) en un tipo concreto, como en el ejemplo siguiente.
((WDI_INDICATION_BSS_ENTRY_LIST_PARAMETERS*)pParsed)
Una vez finalizado el autor de la llamada con los datos analizados, el autor de la llamada debe devolver la memoria al analizador. El analizador debe conocer el identificador de mensaje original que se usa para asignar para liberar los datos correctos.
FreeParsed(messageId, pParsed);
pParsed = NULL;
Modelo de asignación del autor de llamada
En este modelo, el autor de la llamada ya ha determinado el TLV específico correcto para analizar y posiblemente usa una pila local para evitar asignaciones en el montón. El autor de la llamada crea el local y llama a una rutina de análisis específica. La API no necesita el identificador de mensaje y el parámetro está fuertemente tipado con un nivel menor de direccionamiento indirecto.
WDI_GET_ADAPTER_CAPABILITIES_PARAMETERS adapterCapabilitiesParsed;
ndisStatus = ParseWdiGetAdapterCapabilities(
cbBufferLength,
pvBuffer,
&Context
&adapterCapabilitiesParsed);
Una vez que el autor de la llamada haya terminado de usar la estructura , el autor de la llamada debe dar al analizador la oportunidad de limpiar cualquier asignación que haya realizado durante el análisis y borrar la estructura para que esté lista para reutilizarse. El parámetro está fuertemente tipado, por lo que el destinatario no necesita parámetros adicionales.
CleanupParsedWdiGetAdapterCapabilities(&adapterCapabilitiesParsed);
Después de llamar a cleanupParse API, todos los datos de la estructura no son válidos.
Algunos mensajes no tienen datos asociados. Para completar la API, se proporcionan los métodos parse con el nombre adecuado. Estos métodos validan que la secuencia de bytes está vacía. Las definiciones de tipo se proporcionan para el tipo de parámetro, pero los llamadores también pueden pasar NULL para el parámetro out si usan el modelo de asignación del llamador. En todos los casos, el analizador evita las asignaciones devolviendo una estructura de análisis vacía constante. Los autores de llamadas nunca deben escribir en esta estructura vacía devuelta (por lo tanto, el único campo se denomina _Reserved). Estos mensajes se documentan como "No hay datos adicionales. Los datos del encabezado son suficientes".
Dirección del mensaje
La mayoría de los mensajes tienen un formato diferente para su M1 frente a su M0, M3 o M4. Para dar cabida a esto, estos mensajes tienen un análisis diferente y generan API. En el caso de los mensajes M1, las API siguen la convención de nomenclatura de Parse<MessageName>ToIhv o Generate<MessageName>ToIhv. Para los mensajes M0, M3 o M4, las API siguen la convención de nomenclatura de Parse<MessageName>FromIhv o Generate<MessageName>FromIhv. Sin embargo, para simplificar el código en la miniporte IHV, se agregan las define al alias ParseMessageName> to Parse<<MessageName>ToIhv y Generate<MessageName to Generate MessageName>>FromIhv.< El código IHV solo debe tener en cuenta este alias si necesita analizar su propio M3 o generar un M1.
Códigos de error
El generador del analizador TLV puede devolver varios códigos de NDIS_STATUS diferentes. Para obtener más información, consulte los registros de seguimiento de WPP. Los registros siempre deben indicar la causa principal. Esta es una lista de los códigos de error más comunes y lo que significan.
NDIS_STATUS_INVALID_DATA |
Al analizar, esto indica que un TLV de tamaño fijo es del tamaño incorrecto. En el caso de las listas, esto significa que el tamaño general no es un múltiplo par del tamaño de elemento individual o hay más elementos de los que debe haber. Esto también podría significar que una lista contenía 0 elementos, cuando se requiere 1 o más. Si se desea 0 elementos, Optional_IsPresent debe establecerse en false (el encabezado TLV no debe estar en la secuencia de bytes). |
NDIS_STATUS_BUFFER_OVERFLOW |
Al generar, esto indica que debido al número de elementos de una matriz (lista), desborda el campo Longitud de 2 bytes dentro del encabezado TLV. Debe reducir el número de elementos. Esto también puede ocurrir cuando un TLV externo tiene demasiados TLV internos (o demasiado grandes), de nuevo desbordando el campo Longitud de 2 bytes del encabezado. Al analizar, esto indica que el campo Length de un encabezado TLV es mayor que el TLV externo o la secuencia de bytes. |
NDIS_STATUS_FILE_NOT_FOUND |
Al analizar, esto indica que un TLV necesario no está presente en la secuencia de bytes. Normalmente es un error con el generador de la secuencia de bytes. |
NDIS_STATUS_RESOURCES |
Al generar, esto indica que se produjo un error en el asignador. |
NDIS_STATUS_UNSUPPORTED_REVISION |
Al analizar o generar, el parámetro Context es NULL o PeerVersion es menor que WDI_VERSION_MIN_SUPPORTED. |