bool AVMPI_getFunctionNameFromPC(uintptr_t pc, char *buffer, size_t bufferSize) { #ifdef UNDER_CE (void)pc; (void)buffer; (void)bufferSize; return false; #else if(!InitDbgHelp()) return false; // gleaned from IMAGEHLP_SYMBOL64 docs IMAGEHLP_SYMBOL64 *pSym = (IMAGEHLP_SYMBOL64 *) alloca(sizeof(IMAGEHLP_SYMBOL64) + MaxNameLength); pSym->SizeOfStruct = sizeof(IMAGEHLP_SYMBOL64); pSym->MaxNameLength = MaxNameLength; DWORD64 offsetFromSymbol; if(!g_DbgHelpDll.m_SymGetSymFromAddr64 || !(*g_DbgHelpDll.m_SymGetSymFromAddr64)(GetCurrentProcess(), pc, &offsetFromSymbol, pSym)) { return false; } StringCchPrintfA(buffer, bufferSize, "%s", pSym->Name); //printf("%s\n", pSym->Name); return true; #endif //UNDER_CE }
bool GetLoadedModules(char *&buf, size_t &size) { EnumBuf e; e.bufPtr = buf; e.size = 0; if(buf) { buf[0] = 'W'; buf[1] = 'N'; buf[2] = '3'; buf[3] = '2'; buf[4] = 'C'; buf[5] = 'A'; buf[6] = 'L'; buf[7] = 'L'; e.bufPtr += 8; } e.size += 8; bool inited = InitDbgHelp(); if(inited) dynSymEnumerateModules64W(GetCurrentProcess(), &EnumModule, &e); size = e.size; return true; }
Win32Callstack::Win32Callstack() { bool ret = InitDbgHelp(); if(ret && renderdocBase != NULL) Collect(); }
bool AVMPI_getFileAndLineInfoFromPC(uintptr_t pc, char *filenameBuffer, size_t bufferSize, uint32_t* lineNumber) { #ifdef UNDER_CE (void)pc; (void)lineNumber; (void)filenameBuffer; (void)bufferSize; return false; #else if(!InitDbgHelp()) return false; // gleaned from IMAGEHLP_SYMBOL64 docs IMAGEHLP_SYMBOL64 *pSym = (IMAGEHLP_SYMBOL64 *) alloca(sizeof(IMAGEHLP_SYMBOL64) + MaxNameLength); pSym->SizeOfStruct = sizeof(IMAGEHLP_SYMBOL64); pSym->MaxNameLength = MaxNameLength; DWORD64 offsetFromSymbol; if(!g_DbgHelpDll.m_SymGetSymFromAddr64 || !(*g_DbgHelpDll.m_SymGetSymFromAddr64)(GetCurrentProcess(), pc, &offsetFromSymbol, pSym)) { return false; } // get line IMAGEHLP_LINE64 line; VMPI_memset(&line, 0, sizeof(IMAGEHLP_LINE64)); line.SizeOfStruct = sizeof(IMAGEHLP_LINE64); DWORD offsetFromLine; if(!g_DbgHelpDll.m_SymGetLineFromAddr64 || !(*g_DbgHelpDll.m_SymGetLineFromAddr64)(GetCurrentProcess(), pc, &offsetFromLine, &line)) { return false; } // success! char *fileName = line.FileName + VMPI_strlen(line.FileName); // skip everything up to last slash while(fileName > line.FileName && *fileName != '\\') fileName--; fileName++; StringCchPrintfA(filenameBuffer, bufferSize, "%s", fileName); *lineNumber = line.LineNumber; return true; #endif // UNDER_CE }
int main(int argc, char* argv[]) { HRESULT hr; CHAR szSpecFile[MAX_PATH]; PSTR pszSpecFile; PEXPORT_DATA pExportData; HMODULE hmod; /* Check parameters */ if ((argc < 2) || !strcmp(argv[1], "/?")) { printf("syntax: createspec <image file> [<spec file>]\n"); return 0; } /* Check if we have a spec file name */ if (argc > 2) { pszSpecFile = argv[2]; } else { /* Create spec file name from image file name */ PSTR pszStart = strrchr(argv[1], '\\'); if (pszStart == 0) pszStart = argv[1]; strcpy_s(szSpecFile, sizeof(szSpecFile), pszStart); strcat_s(szSpecFile, sizeof(szSpecFile), ".spec"); pszSpecFile = szSpecFile; } /* Initialize dbghelp.dll */ if (!InitDbgHelp()) { error("Failed to init dbghelp!\n" "Make sure you have dbghelp.dll and symsrv.dll in the same folder.\n"); return E_FAIL; } /* Load the file including symbols */ printf("Loading symbols for '%s', please wait...\n", argv[1]); hmod = LoadModuleWithSymbols(argv[1]); if (hmod == NULL) { error("Failed to load module '%s'!", argv[1]); return E_FAIL; } /* Get the exports */ hr = GetExportsFromFile(hmod, &pExportData); if (!SUCCEEDED(hr)) { error("Failed to get exports: %lx\n", hr); return hr; } /* Get additional info from symbols */ hr = ParseImageSymbols(hmod, pExportData); if (!SUCCEEDED(hr)) { error("Failed to get symbol information: hr=%lx\n", hr); } /* Write the spec file */ hr = CreateSpecFile(pszSpecFile, pExportData); printf("Spec file '%s' was successfully written.\n", szSpecFile); return hr; }