다음을 통해 공유


WDI TLV 생성기/파서 메모리 인터페이스

파서 및 생성기는 내부적으로 C++를 new/delete와 함께 사용합니다. 이렇게 하면 몇 가지 구현 세부 정보가 간소화됩니다. 즉, 라이브러리의 소비자는 라이브러리에 연결할 때 이러한 API의 오버로드된 연산자 구현을 제공해야 합니다. 코드에서 사용해야 하는 유일한 C++ 종속성입니다.

모든 할당을 수행하는 모든 API는 PCTLV_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);
    }
}