次の方法で共有


WDI TLV ジェネレーター/パーサー メモリ インターフェイス

パーサーとジェネレーターは、new や delete で内部的に C++ を使用します。 これにより、いくつかの実装の詳細が簡略化されます。 つまり、ライブラリのコンシューマーは、ライブラリにリンクするときに、これらの API のオーバーロードされた演算子の実装を指定する必要があります。 これは、コードで受け取る必要がある唯一の C++ 依存関係です。

割り当てを実行するすべての API は、PCTLV_CONTEXT と型が設定されたパラメーター Context を受け取ります。このパラメーターには AllocationContext という名前の ULONG_PTR と、PeerVersion という名前の ULONG という 2 つのフィールドがあります。 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);
    }
}