OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef CHROME_FRAME_MODULE_UTILS_H_ | 5 #ifndef CHROME_FRAME_MODULE_UTILS_H_ |
6 #define CHROME_FRAME_MODULE_UTILS_H_ | 6 #define CHROME_FRAME_MODULE_UTILS_H_ |
7 | 7 |
8 #include <ObjBase.h> | 8 #include <ObjBase.h> |
9 #include <windows.h> | 9 #include <windows.h> |
10 | 10 |
11 #include <map> | |
12 | |
13 // A helper class that will find the named loaded module in the current | |
14 // process with the lowest version, increment its ref count and return | |
15 // a pointer to its DllGetClassObject() function if it exports one. If | |
16 // the oldest named module is the current module, then this class does nothing | |
17 // (does not muck with module ref count) and calls to | |
18 // get_dll_get_class_object_ptr() will return NULL. | |
19 class DllRedirector { | 11 class DllRedirector { |
20 public: | 12 public: |
21 typedef std::map<std::wstring, HMODULE> PathToHModuleMap; | 13 // Attempts to register a window class under a well known name and appends to |
| 14 // its extra data a handle to the current module. Will fail if the window |
| 15 // class is already registered. This is intended to be called from DllMain |
| 16 // under PROCESS_ATTACH. |
| 17 static bool DllRedirector::RegisterAsFirstCFModule(); |
22 | 18 |
23 DllRedirector(); | 19 // Unregisters the well known window class if we registered it earlier. |
24 ~DllRedirector(); | 20 // This is intended to be called from DllMain under PROCESS_DETACH. |
| 21 static void DllRedirector::UnregisterAsFirstCFModule(); |
25 | 22 |
26 // Must call this before calling get_dll_get_class_object_ptr(). On first call | 23 // Helper function that extracts the HMODULE parameter from our well known |
27 // this performs the work of scanning the loaded modules for an old version | 24 // window class. |
28 // to delegate to. Not thread safe. | 25 static HMODULE GetFirstCFModule(); |
29 void EnsureInitialized(const wchar_t* module_name, REFCLSID clsid); | |
30 | 26 |
31 LPFNGETCLASSOBJECT get_dll_get_class_object_ptr() const; | |
32 | |
33 private: | |
34 | |
35 // Returns the pointer to the named loaded module's DllGetClassObject export | |
36 // or NULL if either the pointer could not be found or if the pointer would | |
37 // point into the current module. | |
38 // Sets module_handle_ and increments the modules reference count. | |
39 // | |
40 // For sanity's sake, the module must return a non-null class factory for | |
41 // the given class id. | |
42 LPFNGETCLASSOBJECT GetDllGetClassObjectFromModuleName( | |
43 const wchar_t* module_name, REFCLSID clsid); | |
44 | |
45 // Returns a handle in |module_handle| to the loaded module called | |
46 // |module_name| in the current process. If there are multiple modules with | |
47 // the same name, it returns the module with the oldest version number in its | |
48 // VERSIONINFO block. The version string is expected to be of a form that | |
49 // base::Version can parse. | |
50 // | |
51 // For sanity's sake, when there are multiple instances of the module, | |
52 // |product_short_name|, if non-NULL, must match the module's | |
53 // ProductShortName value | |
54 // | |
55 // Returns true if a named module with the given ProductShortName can be | |
56 // found, returns false otherwise. Can return the current module handle. | |
57 bool GetOldestNamedModuleHandle(const std::wstring& module_name, | |
58 REFCLSID clsid, | |
59 HMODULE* module_handle); | |
60 | |
61 // Given a PathToBaseAddressMap, iterates over the module images whose paths | |
62 // are the keys and returns the handle to the module with the lowest | |
63 // version number in its VERSIONINFO block whose DllGetClassObject returns a | |
64 // class factory for the given CLSID. | |
65 HMODULE GetHandleOfOldestModule(const PathToHModuleMap& map, REFCLSID clsid); | |
66 | |
67 private: | |
68 // Helper function to return the DllGetClassObject function pointer from | 27 // Helper function to return the DllGetClassObject function pointer from |
69 // the given module. On success, the return value is non-null and module | 28 // the given module. On success, the return value is non-null and module |
70 // will have had its reference count incremented. | 29 // will have had its reference count incremented. |
71 LPFNGETCLASSOBJECT GetDllGetClassObjectPtr(HMODULE module); | 30 static LPFNGETCLASSOBJECT GetDllGetClassObjectPtr(HMODULE module); |
72 | 31 |
73 HMODULE module_handle_; | 32 private: |
74 LPFNGETCLASSOBJECT dcgo_ptr_; | 33 // Use this to keep track of whether or not we have registered the window |
75 bool initialized_; | 34 // class in this module. |
| 35 static ATOM atom_; |
76 | 36 |
77 friend class ModuleUtilsTest; | 37 friend class ModuleUtilsTest; |
78 }; | 38 }; |
79 | 39 |
80 #endif // CHROME_FRAME_MODULE_UTILS_H_ | 40 #endif // CHROME_FRAME_MODULE_UTILS_H_ |
OLD | NEW |