const bool GetFunctions(void) { (void)SymSetOptions(SYMOPT_UNDNAME); if(SymInitialize(GetCurrentProcess(), "", TRUE)) { IMAGEHLP_SYMBOL64 imageHelp = { 0 }; imageHelp.SizeOfStruct = sizeof(IMAGEHLP_SYMBOL64); (void)SymGetSymFromName64(GetCurrentProcess(), "CStadiumSocket::BeginConnect", &imageHelp); BeginConnectFnc = (pBeginConnect)imageHelp.Address; (void)SymGetSymFromName64(GetCurrentProcess(), "CStadiumSocket::SendData", &imageHelp); SendDataFnc = (pSendData)imageHelp.Address; (void)SymGetSymFromName64(GetCurrentProcess(), "CStadiumSocket::DecryptSocketData", &imageHelp); DecryptSocketDataFnc = (pDecryptSocketData)imageHelp.Address; (void)SymGetSymFromName64(GetCurrentProcess(), "CStadiumSocket::Disconnect", &imageHelp); DisconnectFnc = (pDisconnect)imageHelp.Address; } else { printf("Could not initialize symbols. Last error = %X", GetLastError()); } return ((BeginConnectFnc != NULL) && (SendDataFnc != NULL) && (DecryptSocketDataFnc != NULL) && (DisconnectFnc != NULL)); }
/** * Find symbol by name (first). * * @returns VBox status. * @param pVM VM handle. * @param pszSymbol Symbol name. * @param pSymbol Where to store the symbol info. */ VMMR3DECL(int) DBGFR3SymbolByName(PVM pVM, const char *pszSymbol, PDBGFSYMBOL pSymbol) { /* * Lazy init. */ if (!pVM->dbgf.s.fSymInited) { int rc = dbgfR3SymLazyInit(pVM); if (RT_FAILURE(rc)) return rc; } /* * Look it up. */ #ifdef HAVE_DBGHELP char achBuffer[sizeof(IMAGEHLP_SYMBOL64) + DBGF_SYMBOL_NAME_LENGTH * sizeof(TCHAR) + sizeof(ULONG64)]; PIMAGEHLP_SYMBOL64 pSym = (PIMAGEHLP_SYMBOL64)&achBuffer[0]; pSym->SizeOfStruct = sizeof(IMAGEHLP_SYMBOL64); pSym->MaxNameLength = DBGF_SYMBOL_NAME_LENGTH; if (SymGetSymFromName64(pVM, (char *)(void *)pszSymbol, pSym)) { pSymbol->Value = (RTGCUINTPTR)pSym->Address; pSymbol->cb = pSym->Size; pSymbol->fFlags = pSym->Flags; strcpy(pSymbol->szName, pSym->Name); return VINF_SUCCESS; } return win32Error(pVM); #else PDBGFSYM pSym = dbgfR3SymbolGetName(pVM, pszSymbol); if (pSym) { pSymbol->Value = pSym->Core.Key; pSymbol->cb = pSym->Core.KeyLast - pSym->Core.Key + 1; pSymbol->fFlags = 0; pSymbol->szName[0] = '\0'; strncat(pSymbol->szName, pSym->szName, sizeof(pSymbol->szName) - 1); return VINF_SUCCESS; } return VERR_SYMBOL_NOT_FOUND; #endif }