WDK 新增的重载运算符

Overloading operator new with WDK

本文关键字:运算符 重载 新增 WDK      更新时间:2023-10-16

我正在"本机子系统"的WDK中构建一个简单的代码我有一个重载新建和删除运算符的库这是代码:


    #include<ntddk.h>
    #define HEAP_ZERO_MEMORY    0x00000008
    #define HEAP_GROWABLE       0x00000002
    typedef NTSTATUS
    (NTAPI * PRTL_HEAP_COMMIT_ROUTINE)(
        IN PVOID Base,
        IN OUT PVOID *CommitAddress,
        IN OUT PSIZE_T CommitSize
        );
    typedef struct _RTL_HEAP_PARAMETERS {
        ULONG Length;
        SIZE_T SegmentReserve;
        SIZE_T SegmentCommit;
        SIZE_T DeCommitFreeBlockThreshold;
        SIZE_T DeCommitTotalFreeThreshold;
        SIZE_T MaximumAllocationSize;
        SIZE_T VirtualMemoryThreshold;
        SIZE_T InitialCommit;
        SIZE_T InitialReserve;
        PRTL_HEAP_COMMIT_ROUTINE CommitRoutine;
        SIZE_T Reserved[ 2 ];
    } RTL_HEAP_PARAMETERS, *PRTL_HEAP_PARAMETERS;

    void*  operator new(size_t sz);
    void   operator delete(void* p);
    void* mg_malloc(unsigned int size);
    int mg_free(void *buffer);
    void InitAPSupportLibrary();
    void FinishAPSupportLibrary();
    extern "C"
    {
    PVOID RtlAllocateHeap(
            __in      PVOID HeapHandle,
            __in_opt  ULONG Flags,
            __in      SIZE_T Size
            );
        BOOLEAN RtlFreeHeap(
            __in      PVOID HeapHandle,
            __in_opt  ULONG Flags,
            __in      PVOID HeapBase
            );
    PVOID
    RtlCreateHeap(

      IN ULONG                Flags,
      IN PVOID                Base ,
      IN ULONG                Reserve ,
      IN ULONG                Commit,
      IN BOOLEAN              Lock ,
      IN PRTL_HEAP_PARAMETERS RtlHeapParams  );


        PVOID RtlDestroyHeap(
            __in  PVOID HeapHandle
            );
    }

和 cpp 文件代码:


    #include "main.h"
    PVOID mainHeapHandle = NULL;

    void InitAPSupportLibrary()
    {
        mainHeapHandle = RtlCreateHeap(HEAP_GROWABLE,NULL,0,0,NULL,0);
    }
    void FinishAPSupportLibrary()
    {
        if(mainHeapHandle) RtlDestroyHeap(mainHeapHandle);
    }

    void* mg_malloc(unsigned int size)
    {
        if(!mainHeapHandle) 
            InitAPSupportLibrary();
        void *buf  = RtlAllocateHeap(mainHeapHandle,HEAP_ZERO_MEMORY,size);
        return buf;
    }
    int mg_free(void *buffer)
    {
        if (!mainHeapHandle) return 0;
        return RtlFreeHeap(mainHeapHandle,0,buffer)?1:0;
    }
    void*  operator new(size_t sz)
    {
        void* p = (void*)mg_malloc(sz);
        return p;
    }
    void  operator delete(void* p)
    {
        mg_free(p);
    }

错误是: 错误 C2373:"运算符新":重定义;不同类型的修饰符 错误 C2373:"运算符删除":重定义;不同类型的修饰符

感谢您的帮助

如果您查看编译器的 <new> 标头,operator delete的声明如下所示:

void __CRTDECL operator delete(void *) _THROW0();

如果宏__CRTDECL扩展到非无(但可能是__cdecl)以外的内容,则可能与声明不匹配。

operator new类似.