Interface mémoire du générateur/analyseur WDI TLV
L’analyseur et le générateur utilisent en interne C++ avec new/delete. Cela simplifie plusieurs détails d’implémentation. Cela signifie que les consommateurs de la bibliothèque doivent fournir des implémentations d’opérateurs surchargées de ces API lors de la liaison à la bibliothèque. Il s’agit de la seule dépendance C++ que votre code doit prendre.
Toutes les API qui effectuent des allocations prennent un paramètre Context typé comme PCTLV_CONTEXT qui a 2 champs : un ULONG_PTR nommé AllocationContext et un ULONG nommé PeerVersion. Le champ AllocationContext est transmis à l’opérateur surchargé new
. Cela permet aux consommateurs des API de personnaliser l’allocation de différentes manières. Pour plus d’informations sur le paramètre TLV_CONTEXT, consultez Gestion des versions WDI TLV.
Avertissement Bien que vous soyez tenté d’ignorer l’appel des routines de nettoyage de la bibliothèque (par exemple, FreeParsed, CleanupParsed et FreeGenerated), n’ignorez pas leur appel ! Il peut fonctionner sur certains chemins de code, mais entraîne des fuites de mémoire difficiles à diagnostiquer.
Voici un exemple d’opérateur surchargé.
/*++
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);
}
}