Compartilhar via


Interface de memória do gerador/analisador do WDI TLV

O analisador e o gerador usam internamente C++ com new/delete. Isso simplifica vários detalhes de implementação. Isso significa que os consumidores da biblioteca devem fornecer implementações de operador sobrecarregadas dessas APIs ao vincular à biblioteca. Essa é a única dependência C++ que seu código deve usar.

Todas as APIs que fazem alocações têm um parâmetro Context digitado como PCTLV_CONTEXT que tem dois campos: um ULONG_PTR chamado AllocationContext e um ULONG chamado PeerVersion. O campo AllocationContext é transmitido para o operador new sobrecarregado. Isso permite que os consumidores das APIs personalizem a alocação de várias maneiras. Para obter mais informações sobre o parâmetro TLV_CONTEXT, consulte controle de versão do WDI TLV.

Aviso Embora você possa estar tentado a ignorar a chamada das rotinas de limpeza da biblioteca (como FreeParsed, CleanupParsed e FreeGenerated), não ignore a chamada. Ele pode funcionar em alguns caminhos de código, mas levará a vazamentos de memória difíceis de diagnosticar.

Aqui está um exemplo de operador sobrecarregado.

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