detours.h 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530
  1. //////////////////////////////////////////////////////////////////////////////
  2. //
  3. // Core Detours Functionality (detours.h of detours.lib)
  4. //
  5. // Microsoft Research Detours Package, Version 2.1.
  6. //
  7. // Copyright (c) Microsoft Corporation. All rights reserved.
  8. //
  9. #pragma once
  10. #ifndef _DETOURS_H_
  11. #define _DETOURS_H_
  12. #define DETOURS_VERSION 20100 // 2.1.0
  13. //////////////////////////////////////////////////////////////////////////////
  14. //
  15. #if (_MSC_VER < 1299)
  16. typedef LONG LONG_PTR;
  17. typedef ULONG ULONG_PTR;
  18. #endif
  19. #ifndef __in_z
  20. #define __in_z
  21. #endif
  22. //////////////////////////////////////////////////////////////////////////////
  23. //
  24. #ifndef GUID_DEFINED
  25. #define GUID_DEFINED
  26. typedef struct _GUID
  27. {
  28. DWORD Data1;
  29. WORD Data2;
  30. WORD Data3;
  31. BYTE Data4[ 8 ];
  32. } GUID;
  33. #ifdef INITGUID
  34. #define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
  35. const GUID name \
  36. = { l, w1, w2, { b1, b2, b3, b4, b5, b6, b7, b8 } }
  37. #else
  38. #define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
  39. const GUID name
  40. #endif // INITGUID
  41. #endif // !GUID_DEFINED
  42. #if defined(__cplusplus)
  43. #ifndef _REFGUID_DEFINED
  44. #define _REFGUID_DEFINED
  45. #define REFGUID const GUID &
  46. #endif // !_REFGUID_DEFINED
  47. #else // !__cplusplus
  48. #ifndef _REFGUID_DEFINED
  49. #define _REFGUID_DEFINED
  50. #define REFGUID const GUID * const
  51. #endif // !_REFGUID_DEFINED
  52. #endif // !__cplusplus
  53. //
  54. //////////////////////////////////////////////////////////////////////////////
  55. #ifdef __cplusplus
  56. extern "C" {
  57. #endif // __cplusplus
  58. /////////////////////////////////////////////////// Instruction Target Macros.
  59. //
  60. #define DETOUR_INSTRUCTION_TARGET_NONE ((PVOID)0)
  61. #define DETOUR_INSTRUCTION_TARGET_DYNAMIC ((PVOID)(LONG_PTR)-1)
  62. #define DETOUR_SECTION_HEADER_SIGNATURE 0x00727444 // "Dtr\0"
  63. extern const GUID DETOUR_EXE_RESTORE_GUID;
  64. #define DETOUR_TRAMPOLINE_SIGNATURE 0x21727444 // Dtr!
  65. typedef struct _DETOUR_TRAMPOLINE DETOUR_TRAMPOLINE, *PDETOUR_TRAMPOLINE;
  66. /////////////////////////////////////////////////////////// Binary Structures.
  67. //
  68. #pragma pack(push, 8)
  69. typedef struct _DETOUR_SECTION_HEADER
  70. {
  71. DWORD cbHeaderSize;
  72. DWORD nSignature;
  73. DWORD nDataOffset;
  74. DWORD cbDataSize;
  75. DWORD nOriginalImportVirtualAddress;
  76. DWORD nOriginalImportSize;
  77. DWORD nOriginalBoundImportVirtualAddress;
  78. DWORD nOriginalBoundImportSize;
  79. DWORD nOriginalIatVirtualAddress;
  80. DWORD nOriginalIatSize;
  81. DWORD nOriginalSizeOfImage;
  82. DWORD cbPrePE;
  83. DWORD nOriginalClrFlags;
  84. DWORD reserved1;
  85. DWORD reserved2;
  86. DWORD reserved3;
  87. // Followed by cbPrePE bytes of data.
  88. } DETOUR_SECTION_HEADER, *PDETOUR_SECTION_HEADER;
  89. typedef struct _DETOUR_SECTION_RECORD
  90. {
  91. DWORD cbBytes;
  92. DWORD nReserved;
  93. GUID guid;
  94. } DETOUR_SECTION_RECORD, *PDETOUR_SECTION_RECORD;
  95. typedef struct _DETOUR_CLR_HEADER
  96. {
  97. // Header versioning
  98. ULONG cb;
  99. USHORT MajorRuntimeVersion;
  100. USHORT MinorRuntimeVersion;
  101. // Symbol table and startup information
  102. IMAGE_DATA_DIRECTORY MetaData;
  103. ULONG Flags;
  104. // Followed by the rest of the header.
  105. } DETOUR_CLR_HEADER, *PDETOUR_CLR_HEADER;
  106. typedef struct _DETOUR_EXE_RESTORE
  107. {
  108. ULONG cb;
  109. PIMAGE_DOS_HEADER pidh;
  110. PIMAGE_NT_HEADERS pinh;
  111. PULONG pclrFlags;
  112. DWORD impDirProt;
  113. IMAGE_DOS_HEADER idh;
  114. IMAGE_NT_HEADERS inh;
  115. ULONG clrFlags;
  116. } DETOUR_EXE_RESTORE, *PDETOUR_EXE_RESTORE;
  117. #pragma pack(pop)
  118. #define DETOUR_SECTION_HEADER_DECLARE(cbSectionSize) \
  119. { \
  120. sizeof(DETOUR_SECTION_HEADER),\
  121. DETOUR_SECTION_HEADER_SIGNATURE,\
  122. sizeof(DETOUR_SECTION_HEADER),\
  123. (cbSectionSize),\
  124. \
  125. 0,\
  126. 0,\
  127. 0,\
  128. 0,\
  129. \
  130. 0,\
  131. 0,\
  132. 0,\
  133. 0,\
  134. }
  135. ///////////////////////////////////////////////////////////// Binary Typedefs.
  136. //
  137. typedef BOOL (CALLBACK *PF_DETOUR_BINARY_BYWAY_CALLBACK)(PVOID pContext,
  138. PCHAR pszFile,
  139. PCHAR *ppszOutFile);
  140. typedef BOOL (CALLBACK *PF_DETOUR_BINARY_FILE_CALLBACK)(PVOID pContext,
  141. PCHAR pszOrigFile,
  142. PCHAR pszFile,
  143. PCHAR *ppszOutFile);
  144. typedef BOOL (CALLBACK *PF_DETOUR_BINARY_SYMBOL_CALLBACK)(PVOID pContext,
  145. ULONG nOrigOrdinal,
  146. ULONG nOrdinal,
  147. ULONG *pnOutOrdinal,
  148. PCHAR pszOrigSymbol,
  149. PCHAR pszSymbol,
  150. PCHAR *ppszOutSymbol);
  151. typedef BOOL (CALLBACK *PF_DETOUR_BINARY_COMMIT_CALLBACK)(PVOID pContext);
  152. typedef BOOL (CALLBACK *PF_DETOUR_ENUMERATE_EXPORT_CALLBACK)(PVOID pContext,
  153. ULONG nOrdinal,
  154. PCHAR pszName,
  155. PVOID pCode);
  156. typedef VOID * PDETOUR_BINARY;
  157. typedef VOID * PDETOUR_LOADED_BINARY;
  158. //////////////////////////////////////////////////////////// Detours 2.1 APIs.
  159. //
  160. LONG WINAPI DetourTransactionBegin();
  161. LONG WINAPI DetourTransactionAbort();
  162. LONG WINAPI DetourTransactionCommit();
  163. LONG WINAPI DetourTransactionCommitEx(PVOID **pppFailedPointer);
  164. LONG WINAPI DetourUpdateThread(HANDLE hThread);
  165. LONG WINAPI DetourAttach(PVOID *ppPointer,
  166. PVOID pDetour);
  167. LONG WINAPI DetourAttachEx(PVOID *ppPointer,
  168. PVOID pDetour,
  169. PDETOUR_TRAMPOLINE *ppRealTrampoline,
  170. PVOID *ppRealTarget,
  171. PVOID *ppRealDetour);
  172. LONG WINAPI DetourDetach(PVOID *ppPointer,
  173. PVOID pDetour);
  174. VOID WINAPI DetourSetIgnoreTooSmall(BOOL fIgnore);
  175. ////////////////////////////////////////////////////////////// Code Functions.
  176. //
  177. PVOID WINAPI DetourFindFunction(PCSTR pszModule, PCSTR pszFunction);
  178. PVOID WINAPI DetourCodeFromPointer(PVOID pPointer, PVOID *ppGlobals);
  179. PVOID WINAPI DetourCopyInstruction(PVOID pDst, PVOID pSrc, PVOID *ppTarget);
  180. PVOID WINAPI DetourCopyInstructionEx(PVOID pDst,
  181. PVOID pSrc,
  182. PVOID *ppTarget,
  183. LONG *plExtra);
  184. ///////////////////////////////////////////////////// Loaded Binary Functions.
  185. //
  186. HMODULE WINAPI DetourEnumerateModules(HMODULE hModuleLast);
  187. PVOID WINAPI DetourGetEntryPoint(HMODULE hModule);
  188. ULONG WINAPI DetourGetModuleSize(HMODULE hModule);
  189. BOOL WINAPI DetourEnumerateExports(HMODULE hModule,
  190. PVOID pContext,
  191. PF_DETOUR_ENUMERATE_EXPORT_CALLBACK pfExport);
  192. PVOID WINAPI DetourFindPayload(HMODULE hModule, REFGUID rguid, DWORD *pcbData);
  193. DWORD WINAPI DetourGetSizeOfPayloads(HMODULE hModule);
  194. ///////////////////////////////////////////////// Persistent Binary Functions.
  195. //
  196. PDETOUR_BINARY WINAPI DetourBinaryOpen(HANDLE hFile);
  197. PVOID WINAPI DetourBinaryEnumeratePayloads(PDETOUR_BINARY pBinary,
  198. GUID *pGuid,
  199. DWORD *pcbData,
  200. DWORD *pnIterator);
  201. PVOID WINAPI DetourBinaryFindPayload(PDETOUR_BINARY pBinary,
  202. REFGUID rguid,
  203. DWORD *pcbData);
  204. PVOID WINAPI DetourBinarySetPayload(PDETOUR_BINARY pBinary,
  205. REFGUID rguid,
  206. PVOID pData,
  207. DWORD cbData);
  208. BOOL WINAPI DetourBinaryDeletePayload(PDETOUR_BINARY pBinary, REFGUID rguid);
  209. BOOL WINAPI DetourBinaryPurgePayloads(PDETOUR_BINARY pBinary);
  210. BOOL WINAPI DetourBinaryResetImports(PDETOUR_BINARY pBinary);
  211. BOOL WINAPI DetourBinaryEditImports(PDETOUR_BINARY pBinary,
  212. PVOID pContext,
  213. PF_DETOUR_BINARY_BYWAY_CALLBACK pfByway,
  214. PF_DETOUR_BINARY_FILE_CALLBACK pfFile,
  215. PF_DETOUR_BINARY_SYMBOL_CALLBACK pfSymbol,
  216. PF_DETOUR_BINARY_COMMIT_CALLBACK pfCommit);
  217. BOOL WINAPI DetourBinaryWrite(PDETOUR_BINARY pBinary, HANDLE hFile);
  218. BOOL WINAPI DetourBinaryClose(PDETOUR_BINARY pBinary);
  219. /////////////////////////////////////////////////// Create Process & Load Dll.
  220. //
  221. typedef BOOL (WINAPI *PDETOUR_CREATE_PROCESS_ROUTINEA)
  222. (LPCSTR lpApplicationName,
  223. LPSTR lpCommandLine,
  224. LPSECURITY_ATTRIBUTES lpProcessAttributes,
  225. LPSECURITY_ATTRIBUTES lpThreadAttributes,
  226. BOOL bInheritHandles,
  227. DWORD dwCreationFlags,
  228. LPVOID lpEnvironment,
  229. LPCSTR lpCurrentDirectory,
  230. LPSTARTUPINFOA lpStartupInfo,
  231. LPPROCESS_INFORMATION lpProcessInformation);
  232. typedef BOOL (WINAPI *PDETOUR_CREATE_PROCESS_ROUTINEW)
  233. (LPCWSTR lpApplicationName,
  234. LPWSTR lpCommandLine,
  235. LPSECURITY_ATTRIBUTES lpProcessAttributes,
  236. LPSECURITY_ATTRIBUTES lpThreadAttributes,
  237. BOOL bInheritHandles,
  238. DWORD dwCreationFlags,
  239. LPVOID lpEnvironment,
  240. LPCWSTR lpCurrentDirectory,
  241. LPSTARTUPINFOW lpStartupInfo,
  242. LPPROCESS_INFORMATION lpProcessInformation);
  243. BOOL WINAPI DetourCreateProcessWithDllA(LPCSTR lpApplicationName,
  244. __in_z LPSTR lpCommandLine,
  245. LPSECURITY_ATTRIBUTES lpProcessAttributes,
  246. LPSECURITY_ATTRIBUTES lpThreadAttributes,
  247. BOOL bInheritHandles,
  248. DWORD dwCreationFlags,
  249. LPVOID lpEnvironment,
  250. LPCSTR lpCurrentDirectory,
  251. LPSTARTUPINFOA lpStartupInfo,
  252. LPPROCESS_INFORMATION lpProcessInformation,
  253. LPCSTR lpDetouredDllFullName,
  254. LPCSTR lpDllName,
  255. PDETOUR_CREATE_PROCESS_ROUTINEA
  256. pfCreateProcessA);
  257. BOOL WINAPI DetourCreateProcessWithDllW(LPCWSTR lpApplicationName,
  258. __in_z LPWSTR lpCommandLine,
  259. LPSECURITY_ATTRIBUTES lpProcessAttributes,
  260. LPSECURITY_ATTRIBUTES lpThreadAttributes,
  261. BOOL bInheritHandles,
  262. DWORD dwCreationFlags,
  263. LPVOID lpEnvironment,
  264. LPCWSTR lpCurrentDirectory,
  265. LPSTARTUPINFOW lpStartupInfo,
  266. LPPROCESS_INFORMATION lpProcessInformation,
  267. LPCSTR lpDetouredDllFullName,
  268. LPCSTR lpDllName,
  269. PDETOUR_CREATE_PROCESS_ROUTINEW
  270. pfCreateProcessW);
  271. #ifdef UNICODE
  272. #define DetourCreateProcessWithDll DetourCreateProcessWithDllW
  273. #define PDETOUR_CREATE_PROCESS_ROUTINE PDETOUR_CREATE_PROCESS_ROUTINEW
  274. #else
  275. #define DetourCreateProcessWithDll DetourCreateProcessWithDllA
  276. #define PDETOUR_CREATE_PROCESS_ROUTINE PDETOUR_CREATE_PROCESS_ROUTINEA
  277. #endif // !UNICODE
  278. BOOL WINAPI DetourCopyPayloadToProcess(HANDLE hProcess,
  279. REFGUID rguid,
  280. PVOID pvData,
  281. DWORD cbData);
  282. BOOL WINAPI DetourRestoreAfterWith();
  283. BOOL WINAPI DetourRestoreAfterWithEx(PVOID pvData, DWORD cbData);
  284. HMODULE WINAPI DetourGetDetouredMarker();
  285. //
  286. //////////////////////////////////////////////////////////////////////////////
  287. #ifdef __cplusplus
  288. }
  289. #endif // __cplusplus
  290. //////////////////////////////////////////////// Detours Internal Definitions.
  291. //
  292. #ifdef __cplusplus
  293. #ifdef DETOURS_INTERNAL
  294. #ifndef __deref_out
  295. #define __deref_out
  296. #endif
  297. #ifndef __deref
  298. #define __deref
  299. #endif
  300. //////////////////////////////////////////////////////////////////////////////
  301. //
  302. #if (_MSC_VER < 1299)
  303. #include <imagehlp.h>
  304. typedef IMAGEHLP_MODULE IMAGEHLP_MODULE64;
  305. typedef PIMAGEHLP_MODULE PIMAGEHLP_MODULE64;
  306. typedef IMAGEHLP_SYMBOL SYMBOL_INFO;
  307. typedef PIMAGEHLP_SYMBOL PSYMBOL_INFO;
  308. static inline
  309. LONG InterlockedCompareExchange(LONG *ptr, LONG nval, LONG oval)
  310. {
  311. return (LONG)::InterlockedCompareExchange((PVOID*)ptr, (PVOID)nval, (PVOID)oval);
  312. }
  313. #else
  314. #include <dbghelp.h>
  315. #endif
  316. #ifdef IMAGEAPI // defined by DBGHELP.H
  317. typedef LPAPI_VERSION (NTAPI *PF_ImagehlpApiVersionEx)(LPAPI_VERSION AppVersion);
  318. typedef BOOL (NTAPI *PF_SymInitialize)(IN HANDLE hProcess,
  319. IN LPCSTR UserSearchPath,
  320. IN BOOL fInvadeProcess);
  321. typedef DWORD (NTAPI *PF_SymSetOptions)(IN DWORD SymOptions);
  322. typedef DWORD (NTAPI *PF_SymGetOptions)(VOID);
  323. typedef DWORD64 (NTAPI *PF_SymLoadModule64)(IN HANDLE hProcess,
  324. IN HANDLE hFile,
  325. IN PSTR ImageName,
  326. IN PSTR ModuleName,
  327. IN DWORD64 BaseOfDll,
  328. IN DWORD SizeOfDll);
  329. typedef BOOL (NTAPI *PF_SymGetModuleInfo64)(IN HANDLE hProcess,
  330. IN DWORD64 qwAddr,
  331. OUT PIMAGEHLP_MODULE64 ModuleInfo);
  332. typedef BOOL (NTAPI *PF_SymFromName)(IN HANDLE hProcess,
  333. IN LPSTR Name,
  334. OUT PSYMBOL_INFO Symbol);
  335. typedef struct _DETOUR_SYM_INFO
  336. {
  337. HANDLE hProcess;
  338. HMODULE hDbgHelp;
  339. PF_ImagehlpApiVersionEx pfImagehlpApiVersionEx;
  340. PF_SymInitialize pfSymInitialize;
  341. PF_SymSetOptions pfSymSetOptions;
  342. PF_SymGetOptions pfSymGetOptions;
  343. PF_SymLoadModule64 pfSymLoadModule64;
  344. PF_SymGetModuleInfo64 pfSymGetModuleInfo64;
  345. PF_SymFromName pfSymFromName;
  346. } DETOUR_SYM_INFO, *PDETOUR_SYM_INFO;
  347. PDETOUR_SYM_INFO DetourLoadDbgHelp(VOID);
  348. #endif // IMAGEAPI
  349. #ifndef DETOUR_TRACE
  350. #if DETOUR_DEBUG
  351. #define DETOUR_TRACE(x) printf x
  352. #define DETOUR_BREAK() DebugBreak()
  353. #include <stdio.h>
  354. #include <limits.h>
  355. #else
  356. #define DETOUR_TRACE(x)
  357. #define DETOUR_BREAK()
  358. #endif
  359. #endif
  360. #ifdef DETOURS_IA64
  361. __declspec(align(16)) struct DETOUR_IA64_BUNDLE
  362. {
  363. public:
  364. union
  365. {
  366. BYTE data[16];
  367. UINT64 wide[2];
  368. };
  369. public:
  370. struct DETOUR_IA64_METADATA;
  371. typedef BOOL (DETOUR_IA64_BUNDLE::* DETOUR_IA64_METACOPY)
  372. (const DETOUR_IA64_METADATA *pMeta, DETOUR_IA64_BUNDLE *pDst) const;
  373. enum {
  374. A_UNIT = 1u,
  375. I_UNIT = 2u,
  376. M_UNIT = 3u,
  377. B_UNIT = 4u,
  378. F_UNIT = 5u,
  379. L_UNIT = 6u,
  380. X_UNIT = 7u,
  381. UNIT_MASK = 7u,
  382. STOP = 8u
  383. };
  384. struct DETOUR_IA64_METADATA
  385. {
  386. ULONG nTemplate : 8; // Instruction template.
  387. ULONG nUnit0 : 4; // Unit for slot 0
  388. ULONG nUnit1 : 4; // Unit for slot 1
  389. ULONG nUnit2 : 4; // Unit for slot 2
  390. DETOUR_IA64_METACOPY pfCopy; // Function pointer.
  391. };
  392. protected:
  393. BOOL CopyBytes(const DETOUR_IA64_METADATA *pMeta, DETOUR_IA64_BUNDLE *pDst) const;
  394. BOOL CopyBytesMMB(const DETOUR_IA64_METADATA *pMeta, DETOUR_IA64_BUNDLE *pDst) const;
  395. BOOL CopyBytesMBB(const DETOUR_IA64_METADATA *pMeta, DETOUR_IA64_BUNDLE *pDst) const;
  396. BOOL CopyBytesBBB(const DETOUR_IA64_METADATA *pMeta, DETOUR_IA64_BUNDLE *pDst) const;
  397. BOOL CopyBytesMLX(const DETOUR_IA64_METADATA *pMeta, DETOUR_IA64_BUNDLE *pDst) const;
  398. static const DETOUR_IA64_METADATA s_rceCopyTable[33];
  399. public:
  400. // 120 112 104 96 88 80 72 64 56 48 40 32 24 16 8 0
  401. // f. e. d. c. b. a. 9. 8. 7. 6. 5. 4. 3. 2. 1. 0.
  402. // 00
  403. // f.e. d.c. b.a. 9.8. 7.6. 5.4. 3.2. 1.0.
  404. // 0000 0000 0000 0000 0000 0000 0000 001f : Template [4..0]
  405. // 0000 0000 0000 0000 0000 03ff ffff ffe0 : Zero [ 41.. 5]
  406. // 0000 0000 0000 0000 0000 3c00 0000 0000 : Zero [ 45.. 42]
  407. // 0000 0000 0007 ffff ffff c000 0000 0000 : One [ 82.. 46]
  408. // 0000 0000 0078 0000 0000 0000 0000 0000 : One [ 86.. 83]
  409. // 0fff ffff ff80 0000 0000 0000 0000 0000 : Two [123.. 87]
  410. // f000 0000 0000 0000 0000 0000 0000 0000 : Two [127..124]
  411. BYTE GetTemplate() const;
  412. BYTE GetInst0() const;
  413. BYTE GetInst1() const;
  414. BYTE GetInst2() const;
  415. BYTE GetUnit0() const;
  416. BYTE GetUnit1() const;
  417. BYTE GetUnit2() const;
  418. UINT64 GetData0() const;
  419. UINT64 GetData1() const;
  420. UINT64 GetData2() const;
  421. public:
  422. BOOL IsBrl() const;
  423. VOID SetBrl();
  424. VOID SetBrl(UINT64 target);
  425. UINT64 GetBrlTarget() const;
  426. VOID SetBrlTarget(UINT64 target);
  427. VOID SetBrlImm(UINT64 imm);
  428. UINT64 GetBrlImm() const;
  429. BOOL IsMovlGp() const;
  430. UINT64 GetMovlGp() const;
  431. VOID SetMovlGp(UINT64 gp);
  432. VOID SetInst0(BYTE nInst);
  433. VOID SetInst1(BYTE nInst);
  434. VOID SetInst2(BYTE nInst);
  435. VOID SetData0(UINT64 nData);
  436. VOID SetData1(UINT64 nData);
  437. VOID SetData2(UINT64 nData);
  438. BOOL SetNop0();
  439. BOOL SetNop1();
  440. BOOL SetNop2();
  441. BOOL SetStop();
  442. BOOL Copy(DETOUR_IA64_BUNDLE *pDst) const;
  443. };
  444. #endif // DETOURS_IA64
  445. //////////////////////////////////////////////////////////////////////////////
  446. #endif // DETOURS_INTERNAL
  447. #endif // __cplusplus
  448. #endif // _DETOURS_H_
  449. //
  450. //////////////////////////////////////////////////////////////// End of File.