diff --git a/stepmania/src/archutils/Win32/Crash.cpp b/stepmania/src/archutils/Win32/Crash.cpp index a59693cdfd..e87dab4686 100644 --- a/stepmania/src/archutils/Win32/Crash.cpp +++ b/stepmania/src/archutils/Win32/Crash.cpp @@ -433,396 +433,12 @@ static bool IsValidCall(char *buf, int len) { 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 typedef unsigned short ushort; 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; isections; 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) 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; } }