共用方式為


WDI TLV 產生器/剖析器記憶體介面

剖析器和產生器會在內部使用 C++ 搭配 new/delete。 這可簡化數個實作詳細資料。 這表示程式庫的取用者必須在連結至程式庫時,提供這些 API 的多載運算子實作。 這是您的程式碼必須採用的唯一 C++ 相依性。

所有執行任何配置的 API 都會採用參數 CoNtext 類型為具有 2 個欄位的PCTLV_CONTEXT:名為 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);
    }
}