Compartir a través de


Interfaz de memoria del generador/analizador de TLV de WDI

El analizador y el generador usan internamente C++ con new/delete. Esto simplifica varios detalles de implementación. Esto significa que los consumidores de la biblioteca deben proporcionar implementaciones de operador sobrecargadas de estas API al vincular a la biblioteca. Esta es la única dependencia de C++ que debe tomar el código.

Todas las API que realizan asignaciones toman un parámetro Context escrito como PCTLV_CONTEXT que tiene 2 campos: un ULONG_PTR denominado AllocationContext y un ULONG denominado PeerVersion. El campo AllocationContext se pasa al operador sobrecargado new . Esto permite a los consumidores de las API personalizar la asignación de varias maneras. Para obtener más información sobre el parámetro TLV_CONTEXT, vea Control de versiones de TLV de WDI.

Advertencia Aunque es posible que tenga la tentación de omitir la llamada a las rutinas de limpieza de la biblioteca (como FreeParsed, CleanupParsed y FreeGenerated), no omita llamarlas. Puede funcionar en algunas rutas de acceso de código, pero provocará pérdidas de memoria difíciles de diagnosticar.

Este es un operador sobrecargado de ejemplo.

/*++
Module Name:
    sample.cpp
Abstract:
    Contains sample code to override C++ new/delete for use with TLV parser/generator library
Environment:
    Kernel mode
--*/
#include "precomp.h"

#define TLV_POOL_TAG (ULONG) '_VLT'

void* __cdecl operator new(size_t Size, ULONG_PTR AllocationContext)
/*++
  Override C++ allocation operator.
--*/
{
    PVOID pData = ExAllocatePoolWithTag(NonPagedPoolNx, Size, TLV_POOL_TAG);
    UNREFERENCED_PARAMETER(AllocationContext);
    if (pData != NULL)
    {
        RtlZeroMemory( pData, Size);
    }
    return pData;
} 

void __cdecl operator delete(void* pData)
/*++
  Override C++ delete operator.
--*/
{
    if (pData != NULL)
    {
        ExFreePoolWithTag(pData, TLV_POOL_TAG);
    }
}