| 217 | m_szSymPath = NULL; |
| 218 | } |
| 219 | BOOL Init(LPCSTR szSymPath) |
| 220 | { |
| 221 | if (m_parent == NULL) |
| 222 | return FALSE; |
| 223 | // Dynamically load the Entry-Points for dbghelp.dll: |
| 224 | // First try to load the newsest one from |
| 225 | TCHAR szTemp[4096]; |
| 226 | // But before wqe do this, we first check if the ".local" file exists |
| 227 | if (GetModuleFileName(NULL, szTemp, 4096) > 0) |
| 228 | { |
| 229 | _tcscat_s(szTemp, _T(".local")); |
| 230 | if (GetFileAttributes(szTemp) == INVALID_FILE_ATTRIBUTES) |
| 231 | { |
| 232 | // ".local" file does not exist, so we can try to load the dbghelp.dll from the "Debugging Tools for Windows" |
| 233 | if (GetEnvironmentVariable(_T("ProgramFiles"), szTemp, 4096) > 0) |
| 234 | { |
| 235 | _tcscat_s(szTemp, _T("\\Debugging Tools for Windows\\dbghelp.dll")); |
| 236 | // now check if the file exists: |
| 237 | if (GetFileAttributes(szTemp) != INVALID_FILE_ATTRIBUTES) |
| 238 | { |
| 239 | m_hDbhHelp = LoadLibrary(szTemp); |
| 240 | } |
| 241 | } |
| 242 | // Still not found? Then try to load the 64-Bit version: |
| 243 | if ( (m_hDbhHelp == NULL) && (GetEnvironmentVariable(_T("ProgramFiles"), szTemp, 4096) > 0) ) |
| 244 | { |
| 245 | _tcscat_s(szTemp, _T("\\Debugging Tools for Windows 64-Bit\\dbghelp.dll")); |
| 246 | if (GetFileAttributes(szTemp) != INVALID_FILE_ATTRIBUTES) |
| 247 | { |
| 248 | m_hDbhHelp = LoadLibrary(szTemp); |
| 249 | } |
| 250 | } |
| 251 | } |
| 252 | } |
| 253 | if (m_hDbhHelp == NULL) // if not already loaded, try to load a default-one |
| 254 | m_hDbhHelp = LoadLibrary( _T("dbghelp.dll") ); |
| 255 | if (m_hDbhHelp == NULL) |
| 256 | return FALSE; |
| 257 | pSI = (tSI) GetProcAddress(m_hDbhHelp, "SymInitialize" ); |
| 258 | pSC = (tSC) GetProcAddress(m_hDbhHelp, "SymCleanup" ); |
| 259 | |
| 260 | pSW = (tSW) GetProcAddress(m_hDbhHelp, "StackWalk64" ); |
| 261 | pSGO = (tSGO) GetProcAddress(m_hDbhHelp, "SymGetOptions" ); |
| 262 | pSSO = (tSSO) GetProcAddress(m_hDbhHelp, "SymSetOptions" ); |
| 263 | |
| 264 | pSFTA = (tSFTA) GetProcAddress(m_hDbhHelp, "SymFunctionTableAccess64" ); |
| 265 | pSGLFA = (tSGLFA) GetProcAddress(m_hDbhHelp, "SymGetLineFromAddr64" ); |
| 266 | pSGMB = (tSGMB) GetProcAddress(m_hDbhHelp, "SymGetModuleBase64" ); |
| 267 | pSGMI = (tSGMI) GetProcAddress(m_hDbhHelp, "SymGetModuleInfo64" ); |
| 268 | //pSGMI_V3 = (tSGMI_V3) GetProcAddress(m_hDbhHelp, "SymGetModuleInfo64" ); |
| 269 | pSGSFA = (tSGSFA) GetProcAddress(m_hDbhHelp, "SymGetSymFromAddr64" ); |
| 270 | pUDSN = (tUDSN) GetProcAddress(m_hDbhHelp, "UnDecorateSymbolName" ); |
| 271 | pSLM = (tSLM) GetProcAddress(m_hDbhHelp, "SymLoadModule64" ); |
| 272 | pSGSP =(tSGSP) GetProcAddress(m_hDbhHelp, "SymGetSearchPath" ); |
| 273 | |
| 274 | if ( pSC == NULL || pSFTA == NULL || pSGMB == NULL || pSGMI == NULL || |
| 275 | pSGO == NULL || pSGSFA == NULL || pSI == NULL || pSSO == NULL || |
| 276 | pSW == NULL || pUDSN == NULL || pSLM == NULL ) |