Freigeben über


WDI-TLV-Generator/Parser-Speicherschnittstelle

Der Parser und der Generator verwenden C++ intern mit new/delete. Dadurch werden mehrere Implementierungsdetails vereinfacht. Dies bedeutet, dass Consumer der Bibliothek beim Verknüpfen mit der Bibliothek überladene Operatorimplementierungen dieser APIs bereitstellen müssen. Dies ist die einzige C++-Abhängigkeit, die Ihr Code übernehmen muss.

Alle APIs, die Zuordnungen ausführen, verwenden einen Als PCTLV_CONTEXT typisierten Parameter Context mit 2 Feldern: eine ULONG_PTR namens AllocationContext und eine ULONG mit dem Namen PeerVersion. Das Feld AllocationContext wird an den überladenen new Operator übergeben. Dies ermöglicht es Consumern der APIs, die Zuordnung auf verschiedene Weise anzupassen. Weitere Informationen zum parameter TLV_CONTEXT finden Sie unter WDI TLV-Versionsverwaltung.

Warnung Obwohl Sie möglicherweise versucht sind, das Aufrufen der Bereinigungsroutinen der Bibliothek (z. B. FreeParsed, CleanupParsed und FreeGenerated) zu überspringen, überspringen Sie den Aufruf nicht! Dies kann für einige Codepfade funktionieren, führt aber zu schwer zu diagnostizierenden Speicherverlusten.

Hier sehen Sie einen überladenen Beispieloperator.

/*++
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);
    }
}