Index: chrome_frame/vtable_patch_manager.h |
=================================================================== |
--- chrome_frame/vtable_patch_manager.h (revision 29337) |
+++ chrome_frame/vtable_patch_manager.h (working copy) |
@@ -2,11 +2,15 @@ |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
-#ifndef CHROME_FRAME_COMMON_VTABLE_PATCH_MANAGER_H_ |
-#define CHROME_FRAME_COMMON_VTABLE_PATCH_MANAGER_H_ |
+#ifndef CHROME_FRAME_VTABLE_PATCH_MANAGER_H_ |
+#define CHROME_FRAME_VTABLE_PATCH_MANAGER_H_ |
#include <windows.h> |
+#include <list> |
+ |
+#include "base/lock.h" |
+ |
struct FunctionStub; |
// This namespace provides methods to patch VTable methods of COM interfaces. |
namespace vtable_patch { |
@@ -39,13 +43,46 @@ |
// The last entry of patches must have index_ set to -1. |
HRESULT UnpatchInterfaceMethods(MethodPatchInfo* patches); |
+// Disabled as we're not using it atm. |
+#if 0 |
+// Used when dynamically patching zero or more (usually more than 1) |
+// implementations of a particular interface. |
+class DynamicPatchManager { |
+ public: |
+ explicit DynamicPatchManager(const MethodPatchInfo* patch_prototype); |
+ ~DynamicPatchManager(); |
+ |
+ // Returns S_OK if the object was successfully patched, S_FALSE if it was |
+ // already patched or an error value if something bad happened. |
+ HRESULT PatchObject(void* unknown); |
+ |
+ bool UnpatchAll(); |
+ |
+ protected: |
+ struct PatchedObject { |
+ void* vtable_; |
+ MethodPatchInfo patch_info_[1]; |
+ |
+ // Used to match PatchedObject instances based on the vtable when |
+ // searching through the patch list. |
+ bool operator==(const PatchedObject& that) const { |
+ return vtable_ == that.vtable_; |
+ } |
+ }; |
+ |
+ typedef std::list<PatchedObject*> PatchList; |
+ const MethodPatchInfo* patch_prototype_; |
+ mutable Lock patch_list_lock_; |
+ PatchList patch_list_; |
+}; |
+#endif // disable DynamicPatchManager |
+ |
} // namespace vtable_patch |
// Begins the declaration of a VTable patch |
// @param IFName The name of the interface to patch |
#define BEGIN_VTABLE_PATCHES(IFName) \ |
vtable_patch::MethodPatchInfo IFName##_PatchInfo[] = { |
- |
// Defines a single method patch in a VTable |
// @param index The index of the method to patch |
// @param PatchFunction The patch function |
@@ -55,10 +92,27 @@ |
NULL, \ |
}, |
+#define DCHECK_IS_NOT_PATCHED(IFName) \ |
+ for (vtable_patch::MethodPatchInfo* it = IFName##_PatchInfo; \ |
+ it->index_ != -1; ++it) { \ |
+ DCHECK(it->stub_ == NULL); \ |
+ } |
+ |
+#define DCHECK_IS_PATCHED(IFName) \ |
+ for (vtable_patch::MethodPatchInfo* it = IFName##_PatchInfo; \ |
+ it->index_ != -1; ++it) { \ |
+ DCHECK(it->stub_ != NULL); \ |
+ } |
+ |
+// Checks if the interface is patched. Note that only the first method |
+// is checked and subsequent methods are assumed to have the same state. |
+#define IS_PATCHED(IFName) \ |
+ (IFName##_PatchInfo[0].stub_ != NULL) |
+ |
// Ends the declaration of a VTable patch by adding an entry with |
// index set to -1. |
#define END_VTABLE_PATCHES() \ |
-1, NULL, NULL \ |
}; |
-#endif // CHROME_FRAME_COMMON_VTABLE_PATCH_MANAGER_H_ |
+#endif // CHROME_FRAME_VTABLE_PATCH_MANAGER_H_ |
Property changes on: chrome_frame\vtable_patch_manager.h |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |