You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
139 lines
2.4 KiB
139 lines
2.4 KiB
/*++
|
|
|
|
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
|
|
|