140 lines
2.4 KiB
C++
140 lines
2.4 KiB
C++
|
/*++
|
||
|
|
||
|
Copyright (c) 2000 Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
HeapValidateFrees.cpp
|
||
|
|
||
|
ModAbstract:
|
||
|
|
||
|
Verifies the pointer passed to RtlFreeHeap and RtlReAllocateHeap to make
|
||
|
sure they belong to the heap specified
|
||
|
|
||
|
Notes:
|
||
|
|
||
|
This is a general purpose shim.
|
||
|
|
||
|
History:
|
||
|
|
||
|
04/25/2000 linstev Created
|
||
|
|
||
|
--*/
|
||
|
|
||
|
#include "precomp.h"
|
||
|
|
||
|
IMPLEMENT_SHIM_BEGIN(HeapValidateFrees)
|
||
|
#include "ShimHookMacro.h"
|
||
|
|
||
|
APIHOOK_ENUM_BEGIN
|
||
|
APIHOOK_ENUM_ENTRY(RtlFreeHeap)
|
||
|
APIHOOK_ENUM_ENTRY(RtlReAllocateHeap)
|
||
|
APIHOOK_ENUM_ENTRY(RtlSizeHeap)
|
||
|
APIHOOK_ENUM_END
|
||
|
|
||
|
/*++
|
||
|
|
||
|
Verify that the pointer being freed belongs to the heap.
|
||
|
|
||
|
--*/
|
||
|
|
||
|
BOOL
|
||
|
APIHOOK(RtlFreeHeap)(
|
||
|
PVOID HeapHandle,
|
||
|
ULONG Flags,
|
||
|
PVOID BaseAddress
|
||
|
)
|
||
|
{
|
||
|
BOOL bRet = FALSE;
|
||
|
|
||
|
if (HeapValidate(HeapHandle, 0, BaseAddress))
|
||
|
{
|
||
|
bRet = ORIGINAL_API(RtlFreeHeap)(HeapHandle, Flags, BaseAddress);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
LOGN( eDbgLevelError,
|
||
|
"[APIHook_RtlFreeHeap] Invalid Pointer 0x%x for Heap 0x%x.",
|
||
|
BaseAddress, HeapHandle);
|
||
|
}
|
||
|
|
||
|
return bRet;
|
||
|
}
|
||
|
|
||
|
/*++
|
||
|
|
||
|
Verify that the pointer being freed belongs to the heap.
|
||
|
|
||
|
--*/
|
||
|
|
||
|
LPVOID
|
||
|
APIHOOK(RtlReAllocateHeap)(
|
||
|
HANDLE hHeap,
|
||
|
DWORD dwFlags,
|
||
|
LPVOID lpMem,
|
||
|
DWORD dwBytes
|
||
|
)
|
||
|
{
|
||
|
LPVOID pRet = NULL;
|
||
|
|
||
|
if (HeapValidate(hHeap, 0, lpMem))
|
||
|
{
|
||
|
pRet = ORIGINAL_API(RtlReAllocateHeap)(hHeap, dwFlags, lpMem, dwBytes);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
LOGN( eDbgLevelError,
|
||
|
"[APIHook_RtlReAllocateHeap] Invalid Pointer 0x%x for Heap 0x%x.",
|
||
|
lpMem, hHeap);
|
||
|
}
|
||
|
|
||
|
return pRet;
|
||
|
}
|
||
|
|
||
|
/*++
|
||
|
|
||
|
Verify that the pointer being sized belongs to the heap
|
||
|
|
||
|
--*/
|
||
|
|
||
|
DWORD
|
||
|
APIHOOK(RtlSizeHeap)(
|
||
|
HANDLE hHeap,
|
||
|
DWORD dwFlags,
|
||
|
LPCVOID lpMem
|
||
|
)
|
||
|
{
|
||
|
DWORD dwRet = (DWORD)-1;
|
||
|
|
||
|
if (HeapValidate(hHeap, 0, lpMem))
|
||
|
{
|
||
|
dwRet = ORIGINAL_API(RtlSizeHeap)(hHeap, dwFlags, lpMem);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
LOGN( eDbgLevelError,
|
||
|
"[APIHook_RtlSizeHeap] Invalid Pointer 0x%x for Heap 0x%x.",
|
||
|
lpMem, hHeap);
|
||
|
}
|
||
|
|
||
|
return dwRet;
|
||
|
}
|
||
|
|
||
|
/*++
|
||
|
|
||
|
Register hooked functions
|
||
|
|
||
|
--*/
|
||
|
|
||
|
HOOK_BEGIN
|
||
|
|
||
|
APIHOOK_ENTRY(NTDLL.DLL, RtlFreeHeap)
|
||
|
APIHOOK_ENTRY(NTDLL.DLL, RtlReAllocateHeap)
|
||
|
APIHOOK_ENTRY(NTDLL.DLL, RtlSizeHeap)
|
||
|
|
||
|
HOOK_END
|
||
|
|
||
|
|
||
|
IMPLEMENT_SHIM_END
|
||
|
|