55SYMBOL_PARSER::SYMBOL_PARSER ()
66{
77 m_Initialized = false ;
8+ m_Ready = false ;
89 m_SymbolTable = 0 ;
910 m_Filesize = 0 ;
1011 m_hPdbFile = nullptr ;
@@ -15,14 +16,22 @@ SYMBOL_PARSER::~SYMBOL_PARSER()
1516{
1617 if (m_Initialized)
1718 {
18- SymUnloadModule64 (m_hProcess, m_SymbolTable);
19+ if (m_SymbolTable)
20+ {
21+ SymUnloadModule64 (m_hProcess, m_SymbolTable);
22+ }
1923
2024 SymCleanup (m_hProcess);
25+ }
2126
27+ if (m_hProcess)
28+ {
2229 CloseHandle (m_hProcess);
23- CloseHandle (m_hPdbFile);
30+ }
2431
25- m_Initialized = false ;
32+ if (m_hPdbFile)
33+ {
34+ CloseHandle (m_hPdbFile);
2635 }
2736}
2837
@@ -125,7 +134,7 @@ bool SYMBOL_PARSER::VerifyExistingPdb(const GUID & guid)
125134
126135DWORD SYMBOL_PARSER::Initialize (const std::string szModulePath, const std::string path, std::string * pdb_path_out, bool Redownload, bool WaitForConnection)
127136{
128- if (m_Initialized )
137+ if (m_Ready )
129138 {
130139 return SYMBOL_ERR_ALREADY_INITIALIZED;
131140 }
@@ -328,26 +337,27 @@ DWORD SYMBOL_PARSER::Initialize(const std::string szModulePath, const std::strin
328337 while (InternetCheckConnectionA (" https://msdl.microsoft.com" , FLAG_ICC_FORCE_CONNECTION, NULL ) == FALSE )
329338 {
330339 Sleep (10 );
340+ }
341+ }
331342
332- if (WaitForSingleObject (DownloadManager::hInterrupEvent, 0 ) == WAIT_OBJECT_0)
333- {
334- VirtualFree (pLocalImageBase, 0 , MEM_RELEASE);
343+ char szCacheFile[MAX_PATH]{ 0 };
335344
336- delete[] pRawData;
345+ if (FAILED (URLDownloadToCacheFileA (nullptr , url.c_str (), szCacheFile, MAX_PATH , NULL , nullptr )))
346+ {
347+ VirtualFree (pLocalImageBase, 0 , MEM_RELEASE);
337348
338- return SYMBOL_ERR_DOWNLOAD_FAILED ;
339- }
340- }
349+ delete[] pRawData ;
350+
351+ return SYMBOL_ERR_DOWNLOAD_FAILED;
341352 }
342353
343- DownloadManager dm;
344- if (FAILED (URLDownloadToFileA (nullptr , url.c_str (), m_szPdbPath.c_str (), NULL , &dm)))
354+ if (!CopyFileA (szCacheFile, m_szPdbPath.c_str (), FALSE ))
345355 {
346356 VirtualFree (pLocalImageBase, 0 , MEM_RELEASE);
347357
348358 delete[] pRawData;
349359
350- return SYMBOL_ERR_DOWNLOAD_FAILED ;
360+ return SYMBOL_ERR_COPYFILE_FAILED ;
351361 }
352362 }
353363
@@ -365,24 +375,24 @@ DWORD SYMBOL_PARSER::Initialize(const std::string szModulePath, const std::strin
365375 Filesize = file_attr_data.nFileSizeLow ;
366376 }
367377
368- HANDLE hPdbFile = CreateFileA (m_szPdbPath.c_str (), GENERIC_READ, FILE_SHARE_READ, nullptr , OPEN_EXISTING, NULL , nullptr );
369- if (hPdbFile == INVALID_HANDLE_VALUE)
378+ m_hPdbFile = CreateFileA (m_szPdbPath.c_str (), GENERIC_READ, FILE_SHARE_READ, nullptr , OPEN_EXISTING, NULL , nullptr );
379+ if (m_hPdbFile == INVALID_HANDLE_VALUE)
370380 {
371381 return SYMBOL_ERR_CANT_OPEN_PDB_FILE;
372382 }
373383
374384 m_hProcess = OpenProcess (PROCESS_QUERY_LIMITED_INFORMATION, FALSE , GetCurrentProcessId ());
375385 if (!m_hProcess)
376386 {
377- CloseHandle (hPdbFile );
387+ CloseHandle (m_hPdbFile );
378388
379389 return SYMBOL_ERR_CANT_OPEN_PROCESS;
380390 }
381391
382392 if (!SymInitialize (m_hProcess, m_szPdbPath.c_str (), FALSE ))
383393 {
384394 CloseHandle (m_hProcess);
385- CloseHandle (hPdbFile );
395+ CloseHandle (m_hPdbFile );
386396
387397 return SYMBOL_ERR_SYM_INIT_FAIL;
388398 }
@@ -395,7 +405,7 @@ DWORD SYMBOL_PARSER::Initialize(const std::string szModulePath, const std::strin
395405 SymCleanup (m_hProcess);
396406
397407 CloseHandle (m_hProcess);
398- CloseHandle (hPdbFile );
408+ CloseHandle (m_hPdbFile );
399409
400410 return SYMBOL_ERR_SYM_LOAD_TABLE;
401411 }
@@ -405,14 +415,14 @@ DWORD SYMBOL_PARSER::Initialize(const std::string szModulePath, const std::strin
405415 *pdb_path_out = m_szPdbPath;
406416 }
407417
408- m_Initialized = true ;
418+ m_Ready = true ;
409419
410420 return SYMBOL_ERR_SUCCESS;
411421}
412422
413423DWORD SYMBOL_PARSER::GetSymbolAddress (const char * szSymbolName, DWORD & RvaOut)
414424{
415- if (!m_Initialized )
425+ if (!m_Ready )
416426 {
417427 return SYMBOL_ERR_NOT_INITIALIZED;
418428 }
@@ -432,4 +442,34 @@ DWORD SYMBOL_PARSER::GetSymbolAddress(const char * szSymbolName, DWORD & RvaOut)
432442 RvaOut = (DWORD)(si.Address - si.ModBase );
433443
434444 return SYMBOL_ERR_SUCCESS;
445+ }
446+
447+ void SYMBOL_PARSER::InterruptCleanup ()
448+ {
449+ if (m_Initialized)
450+ {
451+ if (m_SymbolTable)
452+ {
453+ SymUnloadModule64 (m_hProcess, m_SymbolTable);
454+ }
455+
456+ SymCleanup (m_hProcess);
457+ }
458+
459+ if (m_hProcess)
460+ {
461+ CloseHandle (m_hProcess);
462+ }
463+
464+ if (m_hPdbFile)
465+ {
466+ CloseHandle (m_hPdbFile);
467+ }
468+
469+ m_Initialized = false ;
470+ m_Ready = false ;
471+ m_SymbolTable = 0 ;
472+ m_Filesize = 0 ;
473+ m_hPdbFile = nullptr ;
474+ m_hProcess = nullptr ;
435475}
0 commit comments