Click here to Skip to main content
15,894,825 members
Articles / Programming Languages / C++

A C++ Style of Intercepting Functions

Rate me:
Please Sign up or sign in to vote.
4.84/5 (27 votes)
12 Nov 2010CPOL8 min read 91.2K   667   93  
This article is about detouring functions in a more safe C++ programming style.
In this article, you will see how C++ templates, encapsulation and automatic destruction makes it much easier to safely rewrite executable code, or even more, to use OOP when intercepting functions.
////// patcher_defines.h //////////////

#ifndef ____C_CPP_PATCHER_DEFINISIONS_INCL____
#error Don't #include the file patcher_defines.h
#endif
#undef  ____C_CPP_PATCHER_DEFINISIONS_INCL____

#define DEFINE_T_CLASSES_LIST_0
#define DEFINE_T_CLASSES_LIST_1  DEFINE_T_CLASSES_LIST_0,  class TArg1
#define DEFINE_T_CLASSES_LIST_2  DEFINE_T_CLASSES_LIST_1,  class TArg2
#define DEFINE_T_CLASSES_LIST_3  DEFINE_T_CLASSES_LIST_2,  class TArg3
#define DEFINE_T_CLASSES_LIST_4  DEFINE_T_CLASSES_LIST_3,  class TArg4
#define DEFINE_T_CLASSES_LIST_5  DEFINE_T_CLASSES_LIST_4,  class TArg5
#define DEFINE_T_CLASSES_LIST_6  DEFINE_T_CLASSES_LIST_5,  class TArg6
#define DEFINE_T_CLASSES_LIST_7  DEFINE_T_CLASSES_LIST_6,  class TArg7
#define DEFINE_T_CLASSES_LIST_8  DEFINE_T_CLASSES_LIST_7,  class TArg8
#define DEFINE_T_CLASSES_LIST_9  DEFINE_T_CLASSES_LIST_8,  class TArg9
#define DEFINE_T_CLASSES_LIST_10 DEFINE_T_CLASSES_LIST_9,  class TArg10
#define DEFINE_T_CLASSES_LIST_11 DEFINE_T_CLASSES_LIST_10, class TArg11
#define DEFINE_T_CLASSES_LIST_12 DEFINE_T_CLASSES_LIST_11, class TArg12
#define DEFINE_T_CLASSES_LIST_13 DEFINE_T_CLASSES_LIST_12, class TArg13
#define DEFINE_T_CLASSES_LIST_14 DEFINE_T_CLASSES_LIST_13, class TArg14
#define DEFINE_T_CLASSES_LIST_15 DEFINE_T_CLASSES_LIST_14, class TArg15
#define DEFINE_T_CLASSES_LIST_16 DEFINE_T_CLASSES_LIST_15, class TArg16
#define DEFINE_T_CLASSES_LIST_17 DEFINE_T_CLASSES_LIST_16, class TArg17
#define DEFINE_T_CLASSES_LIST_18 DEFINE_T_CLASSES_LIST_17, class TArg18
#define DEFINE_T_CLASSES_LIST_19 DEFINE_T_CLASSES_LIST_18, class TArg19
#define DEFINE_T_CLASSES_LIST_20 DEFINE_T_CLASSES_LIST_19, class TArg20
#define DEFINE_T_CLASSES_LIST_21 DEFINE_T_CLASSES_LIST_20, class TArg21
#define DEFINE_T_CLASSES_LIST_22 DEFINE_T_CLASSES_LIST_21, class TArg22
#define DEFINE_T_CLASSES_LIST_23 DEFINE_T_CLASSES_LIST_22, class TArg23
#define DEFINE_T_CLASSES_LIST_24 DEFINE_T_CLASSES_LIST_23, class TArg24
#define DEFINE_T_CLASSES_LIST_25 DEFINE_T_CLASSES_LIST_24, class TArg25
#define DEFINE_T_CLASSES_LIST_26 DEFINE_T_CLASSES_LIST_25, class TArg26
#define DEFINE_T_CLASSES_LIST_27 DEFINE_T_CLASSES_LIST_26, class TArg27
#define DEFINE_T_CLASSES_LIST_28 DEFINE_T_CLASSES_LIST_27, class TArg28
#define DEFINE_T_CLASSES_LIST_29 DEFINE_T_CLASSES_LIST_28, class TArg29
#define DEFINE_T_CLASSES_LIST_30 DEFINE_T_CLASSES_LIST_29, class TArg30
#define DEFINE_T_CLASSES_LIST_31 DEFINE_T_CLASSES_LIST_30, class TArg31
#define DEFINE_T_CLASSES_LIST_32 DEFINE_T_CLASSES_LIST_31, class TArg32
#define DEFINE_T_CLASSES_LIST_33 DEFINE_T_CLASSES_LIST_32, class TArg33
#define DEFINE_T_CLASSES_LIST_34 DEFINE_T_CLASSES_LIST_33, class TArg34
#define DEFINE_T_CLASSES_LIST_35 DEFINE_T_CLASSES_LIST_34, class TArg35
#define DEFINE_T_CLASSES_LIST_36 DEFINE_T_CLASSES_LIST_35, class TArg36
#define DEFINE_T_CLASSES_LIST_37 DEFINE_T_CLASSES_LIST_36, class TArg37
#define DEFINE_T_CLASSES_LIST_38 DEFINE_T_CLASSES_LIST_37, class TArg38
#define DEFINE_T_CLASSES_LIST_39 DEFINE_T_CLASSES_LIST_38, class TArg39
#define DEFINE_T_CLASSES_LIST_40 DEFINE_T_CLASSES_LIST_39, class TArg40
#define DEFINE_T_CLASSES_LIST_41 DEFINE_T_CLASSES_LIST_40, class TArg41
#define DEFINE_T_CLASSES_LIST_42 DEFINE_T_CLASSES_LIST_41, class TArg42
#define DEFINE_T_CLASSES_LIST_43 DEFINE_T_CLASSES_LIST_42, class TArg43
#define DEFINE_T_CLASSES_LIST_44 DEFINE_T_CLASSES_LIST_43, class TArg44
#define DEFINE_T_CLASSES_LIST_45 DEFINE_T_CLASSES_LIST_44, class TArg45
#define DEFINE_T_CLASSES_LIST_46 DEFINE_T_CLASSES_LIST_45, class TArg46
#define DEFINE_T_CLASSES_LIST_47 DEFINE_T_CLASSES_LIST_46, class TArg47
#define DEFINE_T_CLASSES_LIST_48 DEFINE_T_CLASSES_LIST_47, class TArg48
#define DEFINE_T_CLASSES_LIST_49 DEFINE_T_CLASSES_LIST_48, class TArg49
#define DEFINE_T_CLASSES_LIST_50 DEFINE_T_CLASSES_LIST_49, class TArg50

#define DEFINE_T_ARGS_N_0
#define DEFINE_T_ARGS_N_1  TArg1
#define DEFINE_T_ARGS_N_2  DEFINE_T_ARGS_N_1,   TArg2
#define DEFINE_T_ARGS_N_3  DEFINE_T_ARGS_N_2,   TArg3
#define DEFINE_T_ARGS_N_4  DEFINE_T_ARGS_N_3,   TArg4
#define DEFINE_T_ARGS_N_5  DEFINE_T_ARGS_N_4,   TArg5
#define DEFINE_T_ARGS_N_6  DEFINE_T_ARGS_N_5,   TArg6
#define DEFINE_T_ARGS_N_7  DEFINE_T_ARGS_N_6,   TArg7
#define DEFINE_T_ARGS_N_8  DEFINE_T_ARGS_N_7,   TArg8
#define DEFINE_T_ARGS_N_9  DEFINE_T_ARGS_N_8,   TArg9
#define DEFINE_T_ARGS_N_10 DEFINE_T_ARGS_N_9,   TArg10
#define DEFINE_T_ARGS_N_11 DEFINE_T_ARGS_N_10,  TArg11
#define DEFINE_T_ARGS_N_12 DEFINE_T_ARGS_N_11,  TArg12
#define DEFINE_T_ARGS_N_13 DEFINE_T_ARGS_N_12,  TArg13
#define DEFINE_T_ARGS_N_14 DEFINE_T_ARGS_N_13,  TArg14
#define DEFINE_T_ARGS_N_15 DEFINE_T_ARGS_N_14,  TArg15
#define DEFINE_T_ARGS_N_16 DEFINE_T_ARGS_N_15,  TArg16
#define DEFINE_T_ARGS_N_17 DEFINE_T_ARGS_N_16,  TArg17
#define DEFINE_T_ARGS_N_18 DEFINE_T_ARGS_N_17,  TArg18
#define DEFINE_T_ARGS_N_19 DEFINE_T_ARGS_N_18,  TArg19
#define DEFINE_T_ARGS_N_20 DEFINE_T_ARGS_N_19,  TArg20
#define DEFINE_T_ARGS_N_21 DEFINE_T_ARGS_N_20,  TArg21
#define DEFINE_T_ARGS_N_22 DEFINE_T_ARGS_N_21,  TArg22
#define DEFINE_T_ARGS_N_23 DEFINE_T_ARGS_N_22,  TArg23
#define DEFINE_T_ARGS_N_24 DEFINE_T_ARGS_N_23,  TArg24
#define DEFINE_T_ARGS_N_25 DEFINE_T_ARGS_N_24,  TArg25
#define DEFINE_T_ARGS_N_26 DEFINE_T_ARGS_N_25,  TArg26
#define DEFINE_T_ARGS_N_27 DEFINE_T_ARGS_N_26,  TArg27
#define DEFINE_T_ARGS_N_28 DEFINE_T_ARGS_N_27,  TArg28
#define DEFINE_T_ARGS_N_29 DEFINE_T_ARGS_N_28,  TArg29
#define DEFINE_T_ARGS_N_30 DEFINE_T_ARGS_N_29,  TArg30
#define DEFINE_T_ARGS_N_31 DEFINE_T_ARGS_N_30,  TArg31
#define DEFINE_T_ARGS_N_32 DEFINE_T_ARGS_N_31,  TArg32
#define DEFINE_T_ARGS_N_33 DEFINE_T_ARGS_N_32,  TArg33
#define DEFINE_T_ARGS_N_34 DEFINE_T_ARGS_N_33,  TArg34
#define DEFINE_T_ARGS_N_35 DEFINE_T_ARGS_N_34,  TArg35
#define DEFINE_T_ARGS_N_36 DEFINE_T_ARGS_N_35,  TArg36
#define DEFINE_T_ARGS_N_37 DEFINE_T_ARGS_N_36,  TArg37
#define DEFINE_T_ARGS_N_38 DEFINE_T_ARGS_N_37,  TArg38
#define DEFINE_T_ARGS_N_39 DEFINE_T_ARGS_N_38,  TArg39
#define DEFINE_T_ARGS_N_40 DEFINE_T_ARGS_N_39,  TArg40
#define DEFINE_T_ARGS_N_41 DEFINE_T_ARGS_N_40,  TArg41
#define DEFINE_T_ARGS_N_42 DEFINE_T_ARGS_N_41,  TArg42
#define DEFINE_T_ARGS_N_43 DEFINE_T_ARGS_N_42,  TArg43
#define DEFINE_T_ARGS_N_44 DEFINE_T_ARGS_N_43,  TArg44
#define DEFINE_T_ARGS_N_45 DEFINE_T_ARGS_N_44,  TArg45
#define DEFINE_T_ARGS_N_46 DEFINE_T_ARGS_N_45,  TArg46
#define DEFINE_T_ARGS_N_47 DEFINE_T_ARGS_N_46,  TArg47
#define DEFINE_T_ARGS_N_48 DEFINE_T_ARGS_N_47,  TArg48
#define DEFINE_T_ARGS_N_49 DEFINE_T_ARGS_N_48,  TArg49
#define DEFINE_T_ARGS_N_50 DEFINE_T_ARGS_N_49,  TArg50



#define DEFINE_2_N_ARGS_FUNCTIONS(N) TReturnVal (TClassSource::*&pfn_source)(DEFINE_T_ARGS_N_##N), TReturnVal (TClassTarget::*pfn_target) (DEFINE_T_ARGS_N_##N)
#define DEFINE_TEMPLATE(N) template<class TClassSource, class TClassTarget, class TReturnVal DEFINE_T_CLASSES_LIST_##N>


#define DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(N) DEFINE_TEMPLATE(N)       \
	explicit CPatch(DEFINE_2_N_ARGS_FUNCTIONS(N),                           \
		bool patch_now = true, bool set_forever = false)                    \
								: m_valid(false)                            \
								, m_patched(false)                          \
								, m_set_forever(set_forever)                \
								, m_PatchInstructionSet(0)                  \
								, m_RestorePatchSet(0)                      \
	{                                                                       \
		HookClassFunctions(pfn_source, pfn_target, patch_now, set_forever); \
	}

	DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(0)
	DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(1)
	DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(2)
	DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(3)
	DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(4)
	DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(5)
	DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(6)
	DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(7)
	DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(8)
	DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(9)
	DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(10)
	DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(11)
	DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(12)
	DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(13)
	DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(14)
	DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(15)
	DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(16)
	DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(17)
	DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(18)
	DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(19)
	DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(20)
	DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(21)
	DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(22)
	DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(23)
	DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(24)
	DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(25)
	DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(26)
	DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(27)
	DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(28)
	DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(29)
	DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(30)
	DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(31)
	DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(32)
	DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(33)
	DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(34)
	DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(35)
	DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(36)
	DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(37)
	DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(38)
	DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(39)
	DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(40)
	DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(41)
	DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(42)
	DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(43)
	DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(44)
	DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(45)
	DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(46)
	DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(47)
	DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(48)
	DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(49)
	DEFINE_CPATCH_CTOR_FUNCTION_WITH_N_ARGS(50)

////////////////// experimental, don't use //////////////////////////////////////
#define DEFINE_T_CLASSES_LIST_MN(M, N) DEFINE_T_CLASSES_LIST_##(M), TArg##N
#define DEFINE_TEMPLATE_MN(M,N) template<class TClassSource, class TClassTarget, class TReturnVal DEFINE_T_CLASSES_LIST_MN(M, N) > //DEFINE_T_CLASSES_LIST_##N>

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Software Developer Thomson Reuters
Moldova (Republic of) Moldova (Republic of)
I'm C/C++ developer since 1999.
My favorite language is C++ and my favorite programming environment is Microsoft Visual Studio.

Comments and Discussions