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 |