Index: chrome_frame/vtable_patch_manager.h |
=================================================================== |
--- chrome_frame/vtable_patch_manager.h (revision 0) |
+++ chrome_frame/vtable_patch_manager.h (revision 0) |
@@ -0,0 +1,64 @@ |
+// Copyright (c) 2009 The Chromium Authors. All rights reserved. |
+// 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_ |
+ |
+#include <windows.h> |
+ |
+struct FunctionStub; |
+// This namespace provides methods to patch VTable methods of COM interfaces. |
+namespace vtable_patch { |
+ |
+// This structure represents information about one VTable method. |
+// We allocate an array of these structures per VTable that we patch to |
+// remember the original method. We also use this structure to actually |
+// describe the VTable patch functions |
+struct MethodPatchInfo { |
+ int index_; |
+ PROC method_; |
+ FunctionStub* stub_; |
+}; |
+ |
+// Patches methods in the passed in COM interface. The indexes of the |
+// methods to patch and the actual patch functions are described in the |
+// array pointed to by patches. |
+// @param[in] unknown The pointer of the COM interface to patch |
+// @param[in] patches An array of MethodPatchInfo structures describing |
+// the methods to patch and the patch functions. |
+// The last entry of patches must have index_ set to -1. |
+HRESULT PatchInterfaceMethods(void* unknown, MethodPatchInfo* patches); |
+ |
+// Using the patch info provided in |patches| the function goes through the |
+// list of patched methods and modifies thunks so that they no longer point |
+// to a hook method but rather go straight through to the original target. |
+// The thunk itself is not destroyed to support chaining. |
+// @param[in] patches An array of MethodPatchInfo structures describing |
+// the methods to patch and the patch functions. |
+// The last entry of patches must have index_ set to -1. |
+HRESULT UnpatchInterfaceMethods(MethodPatchInfo* patches); |
+ |
+} // 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 |
+#define VTABLE_PATCH_ENTRY(index, PatchFunction) {\ |
+ index, \ |
+ reinterpret_cast<PROC>(PatchFunction), \ |
+ 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_ |