Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

160 lines
3.3 KiB

/*******************************************************************************
*
* (C) COPYRIGHT MICROSOFT CORP., 1993-1995
* TITLE: DEBUG.CPP
* VERSION: 1.0
* AUTHOR: jsenior
* DATE: 10/28/1998
*
********************************************************************************
*
* CHANGE LOG:
*
* DATE REV DESCRIPTION
* ---------- ------- ----------------------------------------------------------
* 10/28/1998 jsenior Original implementation.
*
*******************************************************************************/
#include <windows.h>
#include "debug.h"
#include "vec.h"
struct Info {
PTCHAR File;
ULONG Line;
PVOID Mem;
};
struct AllocInfo {
PTCHAR File;
ULONG Line;
ULONG Size;
HLOCAL Mem;
};
typedef _Vec<AllocInfo> AllocInfoVector;
typedef _Vec<Info> InfoVector;
InfoVector chunks;
AllocInfoVector allocs;
void AddMemoryChunk(PVOID Mem, PTCHAR File, ULONG Line)
{
Info info;
info.File = File;
info.Line = Line;
info.Mem = Mem;
chunks.push_back(info);
}
void RemoveMemoryChunk(PVOID Mem, PTCHAR File, ULONG Line)
{
if (Mem) {
Info *info;
for (info = chunks.begin(); info; info = chunks.next()) {
if (info->Mem == Mem) {
chunks.eraseCurrent();
return;
}
}
TCHAR txt[1024];
wsprintf(txt, TEXT("Invalid Delete: %s, Line %d, 0x%x\n"), File, Line, Mem);
OutputDebugString(txt);
}
}
void DumpOrphans()
{
Info *info;
TCHAR txt[1024];
for (info = chunks.begin(); info; info = chunks.next()) {
wsprintf(txt, TEXT("Leak at: %s, Line %d, 0x%x\n"),
info->File, info->Line, info->Mem);
OutputDebugString(txt);
}
AllocInfo *aInfo;
for (aInfo = allocs.begin(); aInfo; aInfo = allocs.next()) {
wsprintf(txt, TEXT("Leak at: %s, Line %d, Size %d, Mem 0x%x\n"),
aInfo->File, aInfo->Line, aInfo->Size, aInfo->Mem);
OutputDebugString(txt);
}
}
#undef LocalAlloc
#undef LocalFree
HLOCAL
UsbAllocPrivate (
const TCHAR *File,
ULONG Line,
ULONG Flags,
DWORD dwBytes
)
{
DWORD bytes;
AllocInfo info;
HLOCAL hMem=NULL;
if (dwBytes) {
bytes = dwBytes;
hMem = LocalAlloc(Flags, bytes);
if (hMem != NULL) {
info.File = (TCHAR*) File;
info.Line = Line;
info.Size = dwBytes;
info.Mem = hMem;
allocs.push_back(info);
return hMem;
}
}
return hMem;
}
HLOCAL
UsbFreePrivate (
HLOCAL hMem
)
{
if (hMem)
{
AllocInfo *info;
for (info = allocs.begin(); info; info = allocs.next()) {
if (info->Mem == hMem) {
allocs.eraseCurrent();
return LocalFree(hMem);
}
}
TCHAR txt[1024];
wsprintf(txt, TEXT("Invalid Memory Free: Memory 0x%x\n"), hMem);
OutputDebugString(txt);
}
return LocalFree(hMem);
}
#if DBG
ULONG USBUI_Debug_Trace_Level = LERROR;
#endif // DBG
void TRACE(LPCTSTR Format, ...)
{
va_list arglist;
va_start(arglist, Format);
TCHAR buf[200];
wvsprintf(buf, Format, arglist);
OutputDebugString(buf);
va_end(arglist);
}