summaryrefslogtreecommitdiffstats
path: root/chrome_frame/vtable_patch_manager.h
diff options
context:
space:
mode:
Diffstat (limited to 'chrome_frame/vtable_patch_manager.h')
-rw-r--r--chrome_frame/vtable_patch_manager.h62
1 files changed, 58 insertions, 4 deletions
diff --git a/chrome_frame/vtable_patch_manager.h b/chrome_frame/vtable_patch_manager.h
index 944b9ef..f326def 100644
--- a/chrome_frame/vtable_patch_manager.h
+++ b/chrome_frame/vtable_patch_manager.h
@@ -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 @@ HRESULT PatchInterfaceMethods(void* unknown, MethodPatchInfo* patches);
// 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 @@ HRESULT UnpatchInterfaceMethods(MethodPatchInfo* patches);
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_