BlackBone
Windows memory hacking library
 All Classes Functions
HookHandlerStdcall.h
1 #pragma once
2 
3 namespace blackbone
4 {
5 
6 template<typename R, typename... Args, class C>
7 struct HookHandler<R( __stdcall* )(Args...), C> : public DetourBase
8 {
9  typedef typename std::conditional<std::is_same<R, void>::value, int, R>::type ReturnType;
10 
11  typedef R( __stdcall *type )(Args...);
12  typedef R( __stdcall *hktype )(Args&...);
13  typedef R( C::*hktypeC )(Args&...);
14 
15  //
16  // Workaround for void return type
17  //
18  typedef ReturnType( __stdcall *typeR )(Args...);
19  typedef ReturnType( __stdcall *hktypeR )(Args&...);
20  typedef ReturnType( C::*hktypeCR )(Args&...);
21 
22  static __declspec(noinline) ReturnType __stdcall Handler( Args... args )
23  {
24  HookHandler* pInst = (HookHandler*)((_NT_TIB*)NtCurrentTeb())->ArbitraryUserPointer;
25  return pInst->HandlerP( std::forward<Args>( args )... );
26  }
27 
28  ReturnType HandlerP( Args&&... args )
29  {
30  ReturnType val_new, val_original;
31 
32  DisableHook();
33 
34  if (_order == CallOrder::HookFirst)
35  {
36  val_new = CallCallback( std::forward<Args>( args )... );
37  val_original = CallOriginal( std::forward<Args>( args )... );
38  }
39  else if (_order == CallOrder::HookLast)
40  {
41  val_original = CallOriginal( std::forward<Args>( args )... );
42  val_new = CallCallback( std::forward<Args>( args )... );
43  }
44  else
45  {
46  val_original = val_new = CallCallback( std::forward<Args>( args )... );
47  }
48 
49  EnableHook();
50 
51  return (_retType == ReturnMethod::UseOriginal ? val_original : val_new);
52  }
53 
54  inline ReturnType CallOriginal( Args&&... args )
55  {
56  return (reinterpret_cast<typeR>(_callOriginal))(args...);
57  }
58 
59  inline ReturnType CallCallback( Args&&... args )
60  {
61  if (_callbackClass != nullptr)
62  return ((C*)_callbackClass->*brutal_cast<hktypeCR>(_callback))(args...);
63  else
64  return (reinterpret_cast<hktypeR>(_callback))(args...);
65  }
66 };
67 
68 }
Definition: LocalHookBase.h:48
Definition: HookHandlers.h:10
Definition: AsmHelper32.cpp:6