WDI TLV 生成器/分析器内存接口

分析器和生成器在内部将 C++ 与 new/delete 配合使用。 这简化了多个实现细节。 这意味着,库的使用者在链接到库时必须提供这些 API 的重载运算符实现。 这是代码必须采用的唯一 C++ 依赖项。

执行任何分配的所有 API 都采用类型为 PCTLV_CONTEXT的参数 Context ,其中包含 2 个字段:名为 AllocationContext 的ULONG_PTR和名为 PeerVersion 的 ULONG。 AllocationContext 字段传递到重载new运算符。 这允许 API 使用者以各种方式自定义分配。 有关 TLV_CONTEXT 参数的详细信息,请参阅 WDI TLV 版本控制

警告 尽管你可能想跳过调用库的清理例程 (如 FreeParsed、CleanupParsed 和 FreeGenerated) ,但不要跳过调用它们! 它可能适用于某些代码路径,但会导致难以诊断的内存泄漏。

下面是一个示例重载运算符。

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