remove old code
This commit is contained in:
@@ -433,396 +433,12 @@ static bool IsValidCall(char *buf, int len) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////
|
|
||||||
/*
|
|
||||||
struct ModuleInfo {
|
|
||||||
const char *name;
|
|
||||||
unsigned long base, size;
|
|
||||||
};
|
|
||||||
|
|
||||||
// ARRGH. Where's psapi.h?!?
|
|
||||||
|
|
||||||
struct Win32ModuleInfo {
|
|
||||||
DWORD base, size, entry;
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef BOOL (__stdcall *PENUMPROCESSMODULES)(HANDLE, HMODULE *, DWORD, LPDWORD);
|
|
||||||
typedef DWORD (__stdcall *PGETMODULEBASENAME)(HANDLE, HMODULE, LPTSTR, DWORD);
|
|
||||||
typedef BOOL (__stdcall *PGETMODULEINFORMATION)(HANDLE, HMODULE, Win32ModuleInfo *, DWORD);
|
|
||||||
|
|
||||||
typedef HANDLE (__stdcall *PCREATETOOLHELP32SNAPSHOT)(DWORD, DWORD);
|
|
||||||
typedef BOOL (WINAPI *PMODULE32FIRST)(HANDLE, LPMODULEENTRY32);
|
|
||||||
typedef BOOL (WINAPI *PMODULE32NEXT)(HANDLE, LPMODULEENTRY32);
|
|
||||||
|
|
||||||
static ModuleInfo *CrashGetModules(void *&ptr) {
|
|
||||||
void *pMem = VirtualAlloc(NULL, 65536, MEM_COMMIT, PAGE_READWRITE);
|
|
||||||
|
|
||||||
if (!pMem) {
|
|
||||||
ptr = NULL;
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
// This sucks. If we're running under Windows 9x, we must use
|
|
||||||
// TOOLHELP.DLL to get the module list. Under Windows NT, we must
|
|
||||||
// use PSAPI.DLL. With Windows 2000, we can use both (but prefer
|
|
||||||
// PSAPI.DLL).
|
|
||||||
|
|
||||||
HMODULE hmodPSAPI = LoadLibrary("psapi.dll");
|
|
||||||
|
|
||||||
if (hmodPSAPI) {
|
|
||||||
// Using PSAPI.DLL. Call EnumProcessModules(), then GetModuleFileNameEx()
|
|
||||||
// and GetModuleInformation().
|
|
||||||
|
|
||||||
PENUMPROCESSMODULES pEnumProcessModules = (PENUMPROCESSMODULES)GetProcAddress(hmodPSAPI, "EnumProcessModules");
|
|
||||||
PGETMODULEBASENAME pGetModuleBaseName = (PGETMODULEBASENAME)GetProcAddress(hmodPSAPI, "GetModuleBaseNameA");
|
|
||||||
PGETMODULEINFORMATION pGetModuleInformation = (PGETMODULEINFORMATION)GetProcAddress(hmodPSAPI, "GetModuleInformation");
|
|
||||||
HMODULE *pModules, *pModules0 = (HMODULE *)((char *)pMem + 0xF000);
|
|
||||||
DWORD cbNeeded;
|
|
||||||
|
|
||||||
if (pEnumProcessModules && pGetModuleBaseName && pGetModuleInformation
|
|
||||||
&& pEnumProcessModules(GetCurrentProcess(), pModules0, 0x1000, &cbNeeded)) {
|
|
||||||
|
|
||||||
ModuleInfo *pMod, *pMod0;
|
|
||||||
char *pszHeap = (char *)pMem, *pszHeapLimit;
|
|
||||||
|
|
||||||
if (cbNeeded > 0x1000) cbNeeded = 0x1000;
|
|
||||||
|
|
||||||
pModules = (HMODULE *)((char *)pMem + 0x10000 - cbNeeded);
|
|
||||||
memmove(pModules, pModules0, cbNeeded);
|
|
||||||
|
|
||||||
pMod = pMod0 = (ModuleInfo *)((char *)pMem + 0x10000 - sizeof(ModuleInfo) * (cbNeeded / sizeof(HMODULE) + 1));
|
|
||||||
pszHeapLimit = (char *)pMod;
|
|
||||||
|
|
||||||
do {
|
|
||||||
HMODULE hCurMod = *pModules++;
|
|
||||||
Win32ModuleInfo mi;
|
|
||||||
|
|
||||||
if (pGetModuleBaseName(GetCurrentProcess(), hCurMod, pszHeap, pszHeapLimit - pszHeap)
|
|
||||||
&& pGetModuleInformation(GetCurrentProcess(), hCurMod, &mi, sizeof mi)) {
|
|
||||||
|
|
||||||
char *period = NULL;
|
|
||||||
|
|
||||||
pMod->name = pszHeap;
|
|
||||||
|
|
||||||
while(*pszHeap++)
|
|
||||||
if (pszHeap[-1] == '.')
|
|
||||||
period = pszHeap-1;
|
|
||||||
|
|
||||||
if (period) {
|
|
||||||
*period = 0;
|
|
||||||
pszHeap = period+1;
|
|
||||||
}
|
|
||||||
|
|
||||||
pMod->base = mi.base;
|
|
||||||
pMod->size = mi.size;
|
|
||||||
++pMod;
|
|
||||||
}
|
|
||||||
} while((cbNeeded -= sizeof(HMODULE *)) > 0);
|
|
||||||
|
|
||||||
pMod->name = NULL;
|
|
||||||
|
|
||||||
FreeLibrary(hmodPSAPI);
|
|
||||||
ptr = pMem;
|
|
||||||
return pMod0;
|
|
||||||
}
|
|
||||||
|
|
||||||
FreeLibrary(hmodPSAPI);
|
|
||||||
} else {
|
|
||||||
// No PSAPI. Use the ToolHelp functions in KERNEL.
|
|
||||||
|
|
||||||
HMODULE hmodKERNEL32 = LoadLibrary("kernel32.dll");
|
|
||||||
|
|
||||||
PCREATETOOLHELP32SNAPSHOT pCreateToolhelp32Snapshot = (PCREATETOOLHELP32SNAPSHOT)GetProcAddress(hmodKERNEL32, "CreateToolhelp32Snapshot");
|
|
||||||
PMODULE32FIRST pModule32First = (PMODULE32FIRST)GetProcAddress(hmodKERNEL32, "Module32First");
|
|
||||||
PMODULE32NEXT pModule32Next = (PMODULE32NEXT)GetProcAddress(hmodKERNEL32, "Module32Next");
|
|
||||||
HANDLE hSnap;
|
|
||||||
|
|
||||||
if (pCreateToolhelp32Snapshot && pModule32First && pModule32Next) {
|
|
||||||
if ((HANDLE)-1 != (hSnap = pCreateToolhelp32Snapshot(TH32CS_SNAPMODULE, 0))) {
|
|
||||||
ModuleInfo *pModInfo = (ModuleInfo *)((char *)pMem + 65536);
|
|
||||||
char *pszHeap = (char *)pMem;
|
|
||||||
MODULEENTRY32 me;
|
|
||||||
|
|
||||||
--pModInfo;
|
|
||||||
pModInfo->name = NULL;
|
|
||||||
|
|
||||||
me.dwSize = sizeof(MODULEENTRY32);
|
|
||||||
|
|
||||||
if (pModule32First(hSnap, &me))
|
|
||||||
do {
|
|
||||||
if (pszHeap+strlen(me.szModule) >= (char *)(pModInfo - 1))
|
|
||||||
break;
|
|
||||||
|
|
||||||
strcpy(pszHeap, me.szModule);
|
|
||||||
|
|
||||||
--pModInfo;
|
|
||||||
pModInfo->name = pszHeap;
|
|
||||||
|
|
||||||
char *period = NULL;
|
|
||||||
|
|
||||||
while(*pszHeap++);
|
|
||||||
if (pszHeap[-1]=='.')
|
|
||||||
period = pszHeap-1;
|
|
||||||
|
|
||||||
if (period) {
|
|
||||||
*period = 0;
|
|
||||||
pszHeap = period+1;
|
|
||||||
}
|
|
||||||
|
|
||||||
pModInfo->base = (unsigned long)me.modBaseAddr;
|
|
||||||
pModInfo->size = me.modBaseSize;
|
|
||||||
|
|
||||||
} while(pModule32Next(hSnap, &me));
|
|
||||||
|
|
||||||
CloseHandle(hSnap);
|
|
||||||
|
|
||||||
FreeLibrary(hmodKERNEL32);
|
|
||||||
|
|
||||||
ptr = pMem;
|
|
||||||
return pModInfo;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
FreeLibrary(hmodKERNEL32);
|
|
||||||
}
|
|
||||||
|
|
||||||
VirtualFree(pMem, 0, MEM_RELEASE);
|
|
||||||
|
|
||||||
ptr = NULL;
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
///////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////
|
||||||
//
|
//
|
||||||
// info from Portable Executable/Common Object File Format (PE/COFF) spec
|
// info from Portable Executable/Common Object File Format (PE/COFF) spec
|
||||||
|
|
||||||
typedef unsigned short ushort;
|
typedef unsigned short ushort;
|
||||||
typedef unsigned long ulong;
|
typedef unsigned long ulong;
|
||||||
/*
|
|
||||||
struct PEHeader {
|
|
||||||
ulong signature;
|
|
||||||
ushort machine;
|
|
||||||
ushort sections;
|
|
||||||
ulong timestamp;
|
|
||||||
ulong symbol_table;
|
|
||||||
ulong symbols;
|
|
||||||
ushort opthdr_size;
|
|
||||||
ushort characteristics;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct PESectionHeader {
|
|
||||||
char name[8];
|
|
||||||
ulong virtsize;
|
|
||||||
ulong virtaddr;
|
|
||||||
ulong rawsize;
|
|
||||||
ulong rawptr;
|
|
||||||
ulong relocptr;
|
|
||||||
ulong linenoptr;
|
|
||||||
ushort reloc_cnt;
|
|
||||||
ushort lineno_cnt;
|
|
||||||
ulong characteristics;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct PEExportDirectory {
|
|
||||||
ulong flags;
|
|
||||||
ulong timestamp;
|
|
||||||
ushort major;
|
|
||||||
ushort minor;
|
|
||||||
ulong nameptr;
|
|
||||||
ulong ordbase;
|
|
||||||
ulong addrtbl_cnt;
|
|
||||||
ulong nametbl_cnt;
|
|
||||||
ulong addrtbl_ptr;
|
|
||||||
ulong nametbl_ptr;
|
|
||||||
ulong ordtbl_ptr;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct PE32OptionalHeader {
|
|
||||||
ushort magic; // 0
|
|
||||||
char major_linker_ver; // 2
|
|
||||||
char minor_linker_ver; // 3
|
|
||||||
ulong codesize; // 4
|
|
||||||
ulong idatasize; // 8
|
|
||||||
ulong udatasize; // 12
|
|
||||||
ulong entrypoint; // 16
|
|
||||||
ulong codebase; // 20
|
|
||||||
ulong database; // 24
|
|
||||||
ulong imagebase; // 28
|
|
||||||
ulong section_align; // 32
|
|
||||||
ulong file_align; // 36
|
|
||||||
ushort majoros; // 40
|
|
||||||
ushort minoros; // 42
|
|
||||||
ushort majorimage; // 44
|
|
||||||
ushort minorimage; // 46
|
|
||||||
ushort majorsubsys; // 48
|
|
||||||
ushort minorsubsys; // 50
|
|
||||||
ulong reserved; // 52
|
|
||||||
ulong imagesize; // 56
|
|
||||||
ulong hdrsize; // 60
|
|
||||||
ulong checksum; // 64
|
|
||||||
ushort subsystem; // 68
|
|
||||||
ushort characteristics; // 70
|
|
||||||
ulong stackreserve; // 72
|
|
||||||
ulong stackcommit; // 76
|
|
||||||
ulong heapreserve; // 80
|
|
||||||
ulong heapcommit; // 84
|
|
||||||
ulong loaderflags; // 88
|
|
||||||
ulong dictentries; // 92
|
|
||||||
|
|
||||||
// Not part of header, but it's convienent here
|
|
||||||
|
|
||||||
ulong export_RVA; // 96
|
|
||||||
ulong export_size; // 100
|
|
||||||
};
|
|
||||||
|
|
||||||
struct PE32PlusOptionalHeader {
|
|
||||||
ushort magic; // 0
|
|
||||||
char major_linker_ver; // 2
|
|
||||||
char minor_linker_ver; // 3
|
|
||||||
ulong codesize; // 4
|
|
||||||
ulong idatasize; // 8
|
|
||||||
ulong udatasize; // 12
|
|
||||||
ulong entrypoint; // 16
|
|
||||||
ulong codebase; // 20
|
|
||||||
__int64 imagebase; // 24
|
|
||||||
ulong section_align; // 32
|
|
||||||
ulong file_align; // 36
|
|
||||||
ushort majoros; // 40
|
|
||||||
ushort minoros; // 42
|
|
||||||
ushort majorimage; // 44
|
|
||||||
ushort minorimage; // 46
|
|
||||||
ushort majorsubsys; // 48
|
|
||||||
ushort minorsubsys; // 50
|
|
||||||
ulong reserved; // 52
|
|
||||||
ulong imagesize; // 56
|
|
||||||
ulong hdrsize; // 60
|
|
||||||
ulong checksum; // 64
|
|
||||||
ushort subsystem; // 68
|
|
||||||
ushort characteristics; // 70
|
|
||||||
__int64 stackreserve; // 72
|
|
||||||
__int64 stackcommit; // 80
|
|
||||||
__int64 heapreserve; // 88
|
|
||||||
__int64 heapcommit; // 96
|
|
||||||
ulong loaderflags; // 104
|
|
||||||
ulong dictentries; // 108
|
|
||||||
|
|
||||||
// Not part of header, but it's convienent here
|
|
||||||
|
|
||||||
ulong export_RVA; // 112
|
|
||||||
ulong export_size; // 116
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
static const char *CrashLookupExport(HMODULE hmod, unsigned long addr, unsigned long &fnbase) {
|
|
||||||
char *pBase = (char *)hmod;
|
|
||||||
|
|
||||||
// The PEheader offset is at hmod+0x3c. Add the size of the optional header
|
|
||||||
// to step to the section headers.
|
|
||||||
|
|
||||||
PEHeader *pHeader = (PEHeader *)(pBase + ((long *)hmod)[15]);
|
|
||||||
|
|
||||||
if (pHeader->signature != 'EP')
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
PESectionHeader *pSHdrs = (PESectionHeader *)((char *)pHeader + sizeof(PEHeader) + pHeader->opthdr_size);
|
|
||||||
|
|
||||||
// Scan down the section headers and look for ".edata"
|
|
||||||
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for(i=0; i<pHeader->sections; i++) {
|
|
||||||
MessageBox(NULL, pSHdrs[i].name, "section", MB_OK);
|
|
||||||
if (!memcmp(pSHdrs[i].name, ".edata", 6))
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (i >= pHeader->sections)
|
|
||||||
return NULL;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Verify the optional structure.
|
|
||||||
|
|
||||||
PEExportDirectory *pExportDir;
|
|
||||||
|
|
||||||
if (pHeader->opthdr_size < 104)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
switch(*(short *)((char *)pHeader + sizeof(PEHeader))) {
|
|
||||||
case 0x10b: // PE32
|
|
||||||
{
|
|
||||||
PE32OptionalHeader *pOpt = (PE32OptionalHeader *)((char *)pHeader + sizeof(PEHeader));
|
|
||||||
|
|
||||||
if (pOpt->dictentries < 1)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
pExportDir = (PEExportDirectory *)(pBase + pOpt->export_RVA);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 0x20b: // PE32+
|
|
||||||
{
|
|
||||||
PE32PlusOptionalHeader *pOpt = (PE32PlusOptionalHeader *)((char *)pHeader + sizeof(PEHeader));
|
|
||||||
|
|
||||||
if (pOpt->dictentries < 1)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
pExportDir = (PEExportDirectory *)(pBase + pOpt->export_RVA);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Hmmm... no exports?
|
|
||||||
|
|
||||||
if ((char *)pExportDir == pBase)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
// Find the location of the export information.
|
|
||||||
|
|
||||||
ulong *pNameTbl = (ulong *)(pBase + pExportDir->nametbl_ptr);
|
|
||||||
ulong *pAddrTbl = (ulong *)(pBase + pExportDir->addrtbl_ptr);
|
|
||||||
ushort *pOrdTbl = (ushort *)(pBase + pExportDir->ordtbl_ptr);
|
|
||||||
|
|
||||||
// Scan exports.
|
|
||||||
|
|
||||||
const char *pszName = NULL;
|
|
||||||
ulong bestdelta = 0xFFFFFFFF;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
addr -= (ulong)pBase;
|
|
||||||
|
|
||||||
for(i=0; i<(int) pExportDir->nametbl_cnt; i++) {
|
|
||||||
ulong fnaddr;
|
|
||||||
int idx;
|
|
||||||
|
|
||||||
idx = pOrdTbl[i];
|
|
||||||
fnaddr = pAddrTbl[idx];
|
|
||||||
|
|
||||||
if (addr >= fnaddr) {
|
|
||||||
ulong delta = addr - fnaddr;
|
|
||||||
|
|
||||||
if (delta < bestdelta) {
|
|
||||||
bestdelta = delta;
|
|
||||||
fnbase = fnaddr;
|
|
||||||
|
|
||||||
if (pNameTbl[i])
|
|
||||||
pszName = pBase + pNameTbl[i];
|
|
||||||
else {
|
|
||||||
static char buf[8];
|
|
||||||
|
|
||||||
wsprintf(buf, "ord%d", pOrdTbl[i]);
|
|
||||||
pszName = buf;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return pszName;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
@@ -1196,42 +812,6 @@ static bool ReportCrashCallStack(HWND hwnd, HANDLE hFile, const EXCEPTION_POINTE
|
|||||||
(unsigned long) data, szName,
|
(unsigned long) data, szName,
|
||||||
(unsigned long) meminfo.AllocationBase );
|
(unsigned long) meminfo.AllocationBase );
|
||||||
}
|
}
|
||||||
/*
|
|
||||||
ModuleInfo *pMods = pModules;
|
|
||||||
ModuleInfo mi;
|
|
||||||
char szName[MAX_PATH];
|
|
||||||
|
|
||||||
mi.name = NULL;
|
|
||||||
|
|
||||||
if (pMods) {
|
|
||||||
while(pMods->name) {
|
|
||||||
if (data >= pMods->base && (data - pMods->base) < pMods->size)
|
|
||||||
break;
|
|
||||||
|
|
||||||
++pMods;
|
|
||||||
}
|
|
||||||
|
|
||||||
mi = *pMods;
|
|
||||||
} else {
|
|
||||||
|
|
||||||
// Well, something failed, or we didn't have either PSAPI.DLL or ToolHelp
|
|
||||||
// to play with. So we'll use a nastier method instead.
|
|
||||||
|
|
||||||
mi.base = (unsigned long)meminfo.AllocationBase;
|
|
||||||
mi.name = CrashGetModuleBaseName((HMODULE)mi.base, szName);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mi.name) {
|
|
||||||
unsigned long fnbase;
|
|
||||||
const char *pExportName = CrashLookupExport((HMODULE)mi.base, data, fnbase);
|
|
||||||
|
|
||||||
if (pExportName)
|
|
||||||
Report(hwnd, hFile, "%08lx: %s!%s [%08lx+%lx+%lx]", data, mi.name, pExportName, mi.base, fnbase, (data-mi.base-fnbase));
|
|
||||||
else
|
|
||||||
Report(hwnd, hFile, "%08lx: %s!%08lx", data, mi.name, data - mi.base);
|
|
||||||
} else
|
|
||||||
Report(hwnd, hFile, "%08lx: %08lx", data, data);
|
|
||||||
*/
|
|
||||||
--limit;
|
--limit;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user