| OLD | NEW |
| (Empty) |
| 1 // Copyright 2003-2009 Google Inc. | |
| 2 // | |
| 3 // Licensed under the Apache License, Version 2.0 (the "License"); | |
| 4 // you may not use this file except in compliance with the License. | |
| 5 // You may obtain a copy of the License at | |
| 6 // | |
| 7 // http://www.apache.org/licenses/LICENSE-2.0 | |
| 8 // | |
| 9 // Unless required by applicable law or agreed to in writing, software | |
| 10 // distributed under the License is distributed on an "AS IS" BASIS, | |
| 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| 12 // See the License for the specific language governing permissions and | |
| 13 // limitations under the License. | |
| 14 // ======================================================================== | |
| 15 // | |
| 16 // dynamic loading of dbghelp dll functions | |
| 17 | |
| 18 #include "omaha/base/debug.h" | |
| 19 #include "omaha/base/dynamic_link_dbghelp.h" | |
| 20 | |
| 21 namespace omaha { | |
| 22 | |
| 23 BOOL (CALLBACK *Dbghelp::SymInitialize)(HANDLE, PCSTR, BOOL); | |
| 24 BOOL (CALLBACK *Dbghelp::SymCleanup)(HANDLE); | |
| 25 BOOL (CALLBACK *Dbghelp::SymEnumSymbols)(HANDLE, ULONG64, PCSTR, PSYM_ENUMERATES
YMBOLS_CALLBACK, PVOID); | |
| 26 DWORD (CALLBACK *Dbghelp::SymSetOptions)(DWORD); | |
| 27 BOOL (CALLBACK *Dbghelp::SymSetContext)(HANDLE, PIMAGEHLP_STACK_FRAME, PIMAGEHLP
_CONTEXT); | |
| 28 BOOL (CALLBACK *Dbghelp::SymGetLineFromAddr)(HANDLE, DWORD, PDWORD, PIMAGEHLP_LI
NE); | |
| 29 BOOL (CALLBACK *Dbghelp::SymGetLineFromAddr64)(HANDLE, DWORD64, PDWORD, PIMAGEHL
P_LINE64); | |
| 30 BOOL (CALLBACK *Dbghelp::SymFromAddr)(HANDLE, DWORD64, PDWORD64, PSYMBOL_INFO); | |
| 31 BOOL (CALLBACK *Dbghelp::StackWalk64)(DWORD, HANDLE, HANDLE, LPSTACKFRAME64, PVO
ID, PREAD_PROCESS_MEMORY_ROUTINE64, | |
| 32 PFUNCTION_TABLE_ACCESS_ROUTINE64, PGET_MODULE_BASE_ROUTINE64, PTRANSLATE
_ADDRESS_ROUTINE64); | |
| 33 BOOL (CALLBACK *Dbghelp::StackWalk)(DWORD, HANDLE, HANDLE, LPSTACKFRAME, PVOID,
PREAD_PROCESS_MEMORY_ROUTINE, | |
| 34 PFUNCTION_TABLE_ACCESS_ROUTINE, PGET_MODULE_BASE_ROUTINE, PTRANSLATE_ADD
RESS_ROUTINE); | |
| 35 PVOID (CALLBACK *Dbghelp::SymFunctionTableAccess64)(HANDLE, DWORD64); | |
| 36 PVOID (CALLBACK *Dbghelp::SymFunctionTableAccess)(HANDLE, DWORD); | |
| 37 DWORD64 (CALLBACK *Dbghelp::SymGetModuleBase64)(HANDLE, DWORD64); | |
| 38 DWORD64 (CALLBACK *Dbghelp::SymGetModuleBase)(HANDLE, DWORD); | |
| 39 BOOL (CALLBACK *Dbghelp::SymGetTypeInfo)(HANDLE, DWORD64, ULONG, IMAGEHLP_SYMBOL
_TYPE_INFO, PVOID); | |
| 40 BOOL (CALLBACK *Dbghelp::MiniDumpWriteDump)(HANDLE, DWORD, HANDLE, MINIDUMP_TYPE
, PMINIDUMP_EXCEPTION_INFORMATION, | |
| 41 PMINIDUMP_USER_STREAM_INFORMATION, PMINIDUMP_CALLBACK_INFORMATION); | |
| 42 | |
| 43 Dbghelp::LoadedState Dbghelp::loaded_state_ = Dbghelp::NOT_LOADED; | |
| 44 HINSTANCE Dbghelp::library_ = NULL; | |
| 45 | |
| 46 template <typename T> | |
| 47 bool Dbghelp::GPA(const char * function_name, T& function_pointer) { | |
| 48 ASSERT(function_name, (L"")); | |
| 49 | |
| 50 function_pointer = reinterpret_cast<T>(::GetProcAddress(library_, | |
| 51 function_name)); | |
| 52 return function_pointer != NULL; | |
| 53 } | |
| 54 | |
| 55 HRESULT Dbghelp::Load() { | |
| 56 // If we've already tried to load, don't try again. | |
| 57 if (loaded_state_ != NOT_LOADED) goto Exit; | |
| 58 | |
| 59 Clear(); | |
| 60 | |
| 61 // UTIL_LOG((L2, _T("dbghelp loading"))); | |
| 62 library_ = ::LoadLibrary(_T("dbghelp")); | |
| 63 // UTIL_LOG((L2, _T("dbghelp loaded"))); | |
| 64 | |
| 65 if (!library_) return E_FAIL; | |
| 66 | |
| 67 bool all_valid = (GPA("SymInitialize", SymInitialize)) | |
| 68 & (GPA("SymCleanup", SymCleanup)) | |
| 69 & (GPA("SymSetOptions", SymSetOptions)) | |
| 70 & (GPA("SymGetLineFromAddr", SymGetLineFromAddr)) | |
| 71 & (GPA("SymGetLineFromAddr64", SymGetLineFromAddr64)) | |
| 72 & (GPA("StackWalk", StackWalk)) | |
| 73 & (GPA("StackWalk64", StackWalk64)) | |
| 74 & (GPA("SymFunctionTableAccess", SymFunctionTableAccess)) | |
| 75 & (GPA("SymFunctionTableAccess64", SymFunctionTableAccess64)) | |
| 76 & (GPA("SymGetModuleBase", SymGetModuleBase)) | |
| 77 & (GPA("SymGetModuleBase64", SymGetModuleBase64)) | |
| 78 & (GPA("MiniDumpWriteDump", MiniDumpWriteDump)); | |
| 79 | |
| 80 // These are not supported in the Win2k version of DbgHelp; | |
| 81 // failing to load them is not an error. | |
| 82 GPA("SymEnumSymbols", SymEnumSymbols); | |
| 83 GPA("SymGetTypeInfo", SymGetTypeInfo); | |
| 84 GPA("SymSetContext", SymSetContext); | |
| 85 GPA("SymFromAddr", SymFromAddr); | |
| 86 | |
| 87 if (!all_valid) Unload(); | |
| 88 loaded_state_ = all_valid ? LOAD_SUCCEEDED : LOAD_FAILED; | |
| 89 | |
| 90 Exit: | |
| 91 return (loaded_state_ == LOAD_SUCCEEDED) ? S_OK : E_FAIL; | |
| 92 } | |
| 93 | |
| 94 void Dbghelp::Unload() { | |
| 95 if (library_) { | |
| 96 VERIFY(::FreeLibrary(library_), (L"")); | |
| 97 | |
| 98 // Must set library_ to NULL so that Loaded() will return FALSE. | |
| 99 library_ = NULL; | |
| 100 } | |
| 101 Clear(); | |
| 102 } | |
| 103 | |
| 104 void Dbghelp::Clear() { | |
| 105 // just clear the main entry points | |
| 106 SymInitialize = NULL; | |
| 107 MiniDumpWriteDump = NULL; | |
| 108 } | |
| 109 | |
| 110 } // namespace omaha | |
| 111 | |
| OLD | NEW |