detours.h 37 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060
  1. /////////////////////////////////////////////////////////////////////////////
  2. //
  3. // Core Detours Functionality (detours.h of detours.lib)
  4. //
  5. // Microsoft Research Detours Package, Version 4.0.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 0x4c0c1 // 0xMAJORcMINORcPATCH
  13. //////////////////////////////////////////////////////////////////////////////
  14. //
  15. #undef DETOURS_X64
  16. #undef DETOURS_X86
  17. #undef DETOURS_IA64
  18. #undef DETOURS_ARM
  19. #undef DETOURS_ARM64
  20. #undef DETOURS_BITS
  21. #undef DETOURS_32BIT
  22. #undef DETOURS_64BIT
  23. #if defined(_X86_)
  24. #define DETOURS_X86
  25. #define DETOURS_OPTION_BITS 64
  26. #elif defined(_AMD64_)
  27. #define DETOURS_X64
  28. #define DETOURS_OPTION_BITS 32
  29. #elif defined(_IA64_)
  30. #define DETOURS_IA64
  31. #define DETOURS_OPTION_BITS 32
  32. #elif defined(_ARM_)
  33. #define DETOURS_ARM
  34. #elif defined(_ARM64_)
  35. #define DETOURS_ARM64
  36. #else
  37. #error Unknown architecture (x86, amd64, ia64, arm, arm64)
  38. #endif
  39. #ifdef _WIN64
  40. #undef DETOURS_32BIT
  41. #define DETOURS_64BIT 1
  42. #define DETOURS_BITS 64
  43. // If all 64bit kernels can run one and only one 32bit architecture.
  44. //#define DETOURS_OPTION_BITS 32
  45. #else
  46. #define DETOURS_32BIT 1
  47. #undef DETOURS_64BIT
  48. #define DETOURS_BITS 32
  49. // If all 64bit kernels can run one and only one 32bit architecture.
  50. //#define DETOURS_OPTION_BITS 32
  51. #endif
  52. #define VER_DETOURS_BITS DETOUR_STRINGIFY(DETOURS_BITS)
  53. //////////////////////////////////////////////////////////////////////////////
  54. //
  55. #if (_MSC_VER < 1299)
  56. typedef LONG LONG_PTR;
  57. typedef ULONG ULONG_PTR;
  58. #endif
  59. ///////////////////////////////////////////////// SAL 2.0 Annotations w/o SAL.
  60. //
  61. // These definitions are include so that Detours will build even if the
  62. // compiler doesn't have full SAL 2.0 support.
  63. //
  64. #ifndef DETOURS_DONT_REMOVE_SAL_20
  65. #ifdef DETOURS_TEST_REMOVE_SAL_20
  66. #undef _Analysis_assume_
  67. #undef _Benign_race_begin_
  68. #undef _Benign_race_end_
  69. #undef _Field_range_
  70. #undef _Field_size_
  71. #undef _In_
  72. #undef _In_bytecount_
  73. #undef _In_count_
  74. #undef _In_opt_
  75. #undef _In_opt_bytecount_
  76. #undef _In_opt_count_
  77. #undef _In_opt_z_
  78. #undef _In_range_
  79. #undef _In_reads_
  80. #undef _In_reads_bytes_
  81. #undef _In_reads_opt_
  82. #undef _In_reads_opt_bytes_
  83. #undef _In_reads_or_z_
  84. #undef _In_z_
  85. #undef _Inout_
  86. #undef _Inout_opt_
  87. #undef _Inout_z_count_
  88. #undef _Out_
  89. #undef _Out_opt_
  90. #undef _Out_writes_
  91. #undef _Outptr_result_maybenull_
  92. #undef _Readable_bytes_
  93. #undef _Success_
  94. #undef _Writable_bytes_
  95. #undef _Pre_notnull_
  96. #endif
  97. #if defined(_Deref_out_opt_z_) && !defined(_Outptr_result_maybenull_)
  98. #define _Outptr_result_maybenull_ _Deref_out_opt_z_
  99. #endif
  100. #if defined(_In_count_) && !defined(_In_reads_)
  101. #define _In_reads_(x) _In_count_(x)
  102. #endif
  103. #if defined(_In_opt_count_) && !defined(_In_reads_opt_)
  104. #define _In_reads_opt_(x) _In_opt_count_(x)
  105. #endif
  106. #if defined(_In_opt_bytecount_) && !defined(_In_reads_opt_bytes_)
  107. #define _In_reads_opt_bytes_(x) _In_opt_bytecount_(x)
  108. #endif
  109. #if defined(_In_bytecount_) && !defined(_In_reads_bytes_)
  110. #define _In_reads_bytes_(x) _In_bytecount_(x)
  111. #endif
  112. #ifndef _In_
  113. #define _In_
  114. #endif
  115. #ifndef _In_bytecount_
  116. #define _In_bytecount_(x)
  117. #endif
  118. #ifndef _In_count_
  119. #define _In_count_(x)
  120. #endif
  121. #ifndef _In_opt_
  122. #define _In_opt_
  123. #endif
  124. #ifndef _In_opt_bytecount_
  125. #define _In_opt_bytecount_(x)
  126. #endif
  127. #ifndef _In_opt_count_
  128. #define _In_opt_count_(x)
  129. #endif
  130. #ifndef _In_opt_z_
  131. #define _In_opt_z_
  132. #endif
  133. #ifndef _In_range_
  134. #define _In_range_(x,y)
  135. #endif
  136. #ifndef _In_reads_
  137. #define _In_reads_(x)
  138. #endif
  139. #ifndef _In_reads_bytes_
  140. #define _In_reads_bytes_(x)
  141. #endif
  142. #ifndef _In_reads_opt_
  143. #define _In_reads_opt_(x)
  144. #endif
  145. #ifndef _In_reads_opt_bytes_
  146. #define _In_reads_opt_bytes_(x)
  147. #endif
  148. #ifndef _In_reads_or_z_
  149. #define _In_reads_or_z_
  150. #endif
  151. #ifndef _In_z_
  152. #define _In_z_
  153. #endif
  154. #ifndef _Inout_
  155. #define _Inout_
  156. #endif
  157. #ifndef _Inout_opt_
  158. #define _Inout_opt_
  159. #endif
  160. #ifndef _Inout_z_count_
  161. #define _Inout_z_count_(x)
  162. #endif
  163. #ifndef _Out_
  164. #define _Out_
  165. #endif
  166. #ifndef _Out_opt_
  167. #define _Out_opt_
  168. #endif
  169. #ifndef _Out_writes_
  170. #define _Out_writes_(x)
  171. #endif
  172. #ifndef _Outptr_result_maybenull_
  173. #define _Outptr_result_maybenull_
  174. #endif
  175. #ifndef _Writable_bytes_
  176. #define _Writable_bytes_(x)
  177. #endif
  178. #ifndef _Readable_bytes_
  179. #define _Readable_bytes_(x)
  180. #endif
  181. #ifndef _Success_
  182. #define _Success_(x)
  183. #endif
  184. #ifndef _Pre_notnull_
  185. #define _Pre_notnull_
  186. #endif
  187. #ifdef DETOURS_INTERNAL
  188. #pragma warning(disable:4615) // unknown warning type (suppress with older compilers)
  189. #ifndef _Benign_race_begin_
  190. #define _Benign_race_begin_
  191. #endif
  192. #ifndef _Benign_race_end_
  193. #define _Benign_race_end_
  194. #endif
  195. #ifndef _Field_size_
  196. #define _Field_size_(x)
  197. #endif
  198. #ifndef _Field_range_
  199. #define _Field_range_(x,y)
  200. #endif
  201. #ifndef _Analysis_assume_
  202. #define _Analysis_assume_(x)
  203. #endif
  204. #endif // DETOURS_INTERNAL
  205. #endif // DETOURS_DONT_REMOVE_SAL_20
  206. //////////////////////////////////////////////////////////////////////////////
  207. //
  208. #ifndef GUID_DEFINED
  209. #define GUID_DEFINED
  210. typedef struct _GUID
  211. {
  212. DWORD Data1;
  213. WORD Data2;
  214. WORD Data3;
  215. BYTE Data4[ 8 ];
  216. } GUID;
  217. #ifdef INITGUID
  218. #define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
  219. const GUID name \
  220. = { l, w1, w2, { b1, b2, b3, b4, b5, b6, b7, b8 } }
  221. #else
  222. #define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
  223. const GUID name
  224. #endif // INITGUID
  225. #endif // !GUID_DEFINED
  226. #if defined(__cplusplus)
  227. #ifndef _REFGUID_DEFINED
  228. #define _REFGUID_DEFINED
  229. #define REFGUID const GUID &
  230. #endif // !_REFGUID_DEFINED
  231. #else // !__cplusplus
  232. #ifndef _REFGUID_DEFINED
  233. #define _REFGUID_DEFINED
  234. #define REFGUID const GUID * const
  235. #endif // !_REFGUID_DEFINED
  236. #endif // !__cplusplus
  237. #ifndef ARRAYSIZE
  238. #define ARRAYSIZE(x) (sizeof(x)/sizeof(x[0]))
  239. #endif
  240. //
  241. //////////////////////////////////////////////////////////////////////////////
  242. #ifdef __cplusplus
  243. extern "C" {
  244. #endif // __cplusplus
  245. /////////////////////////////////////////////////// Instruction Target Macros.
  246. //
  247. #define DETOUR_INSTRUCTION_TARGET_NONE ((PVOID)0)
  248. #define DETOUR_INSTRUCTION_TARGET_DYNAMIC ((PVOID)(LONG_PTR)-1)
  249. #define DETOUR_SECTION_HEADER_SIGNATURE 0x00727444 // "Dtr\0"
  250. extern const GUID DETOUR_EXE_RESTORE_GUID;
  251. extern const GUID DETOUR_EXE_HELPER_GUID;
  252. #define DETOUR_TRAMPOLINE_SIGNATURE 0x21727444 // Dtr!
  253. typedef struct _DETOUR_TRAMPOLINE DETOUR_TRAMPOLINE, *PDETOUR_TRAMPOLINE;
  254. /////////////////////////////////////////////////////////// Binary Structures.
  255. //
  256. #pragma pack(push, 8)
  257. typedef struct _DETOUR_SECTION_HEADER
  258. {
  259. DWORD cbHeaderSize;
  260. DWORD nSignature;
  261. DWORD nDataOffset;
  262. DWORD cbDataSize;
  263. DWORD nOriginalImportVirtualAddress;
  264. DWORD nOriginalImportSize;
  265. DWORD nOriginalBoundImportVirtualAddress;
  266. DWORD nOriginalBoundImportSize;
  267. DWORD nOriginalIatVirtualAddress;
  268. DWORD nOriginalIatSize;
  269. DWORD nOriginalSizeOfImage;
  270. DWORD cbPrePE;
  271. DWORD nOriginalClrFlags;
  272. DWORD reserved1;
  273. DWORD reserved2;
  274. DWORD reserved3;
  275. // Followed by cbPrePE bytes of data.
  276. } DETOUR_SECTION_HEADER, *PDETOUR_SECTION_HEADER;
  277. typedef struct _DETOUR_SECTION_RECORD
  278. {
  279. DWORD cbBytes;
  280. DWORD nReserved;
  281. GUID guid;
  282. } DETOUR_SECTION_RECORD, *PDETOUR_SECTION_RECORD;
  283. typedef struct _DETOUR_CLR_HEADER
  284. {
  285. // Header versioning
  286. ULONG cb;
  287. USHORT MajorRuntimeVersion;
  288. USHORT MinorRuntimeVersion;
  289. // Symbol table and startup information
  290. IMAGE_DATA_DIRECTORY MetaData;
  291. ULONG Flags;
  292. // Followed by the rest of the IMAGE_COR20_HEADER
  293. } DETOUR_CLR_HEADER, *PDETOUR_CLR_HEADER;
  294. typedef struct _DETOUR_EXE_RESTORE
  295. {
  296. DWORD cb;
  297. DWORD cbidh;
  298. DWORD cbinh;
  299. DWORD cbclr;
  300. PBYTE pidh;
  301. PBYTE pinh;
  302. PBYTE pclr;
  303. IMAGE_DOS_HEADER idh;
  304. union {
  305. IMAGE_NT_HEADERS inh;
  306. IMAGE_NT_HEADERS32 inh32;
  307. IMAGE_NT_HEADERS64 inh64;
  308. BYTE raw[sizeof(IMAGE_NT_HEADERS64) +
  309. sizeof(IMAGE_SECTION_HEADER) * 32];
  310. };
  311. DETOUR_CLR_HEADER clr;
  312. } DETOUR_EXE_RESTORE, *PDETOUR_EXE_RESTORE;
  313. typedef struct _DETOUR_EXE_HELPER
  314. {
  315. DWORD cb;
  316. DWORD pid;
  317. DWORD nDlls;
  318. CHAR rDlls[4];
  319. } DETOUR_EXE_HELPER, *PDETOUR_EXE_HELPER;
  320. #pragma pack(pop)
  321. #define DETOUR_SECTION_HEADER_DECLARE(cbSectionSize) \
  322. { \
  323. sizeof(DETOUR_SECTION_HEADER),\
  324. DETOUR_SECTION_HEADER_SIGNATURE,\
  325. sizeof(DETOUR_SECTION_HEADER),\
  326. (cbSectionSize),\
  327. \
  328. 0,\
  329. 0,\
  330. 0,\
  331. 0,\
  332. \
  333. 0,\
  334. 0,\
  335. 0,\
  336. 0,\
  337. }
  338. /////////////////////////////////////////////////////////////// Helper Macros.
  339. //
  340. #define DETOURS_STRINGIFY(x) DETOURS_STRINGIFY_(x)
  341. #define DETOURS_STRINGIFY_(x) #x
  342. ///////////////////////////////////////////////////////////// Binary Typedefs.
  343. //
  344. typedef BOOL (CALLBACK *PF_DETOUR_BINARY_BYWAY_CALLBACK)(
  345. _In_opt_ PVOID pContext,
  346. _In_opt_ LPCSTR pszFile,
  347. _Outptr_result_maybenull_ LPCSTR *ppszOutFile);
  348. typedef BOOL (CALLBACK *PF_DETOUR_BINARY_FILE_CALLBACK)(
  349. _In_opt_ PVOID pContext,
  350. _In_ LPCSTR pszOrigFile,
  351. _In_ LPCSTR pszFile,
  352. _Outptr_result_maybenull_ LPCSTR *ppszOutFile);
  353. typedef BOOL (CALLBACK *PF_DETOUR_BINARY_SYMBOL_CALLBACK)(
  354. _In_opt_ PVOID pContext,
  355. _In_ ULONG nOrigOrdinal,
  356. _In_ ULONG nOrdinal,
  357. _Out_ ULONG *pnOutOrdinal,
  358. _In_opt_ LPCSTR pszOrigSymbol,
  359. _In_opt_ LPCSTR pszSymbol,
  360. _Outptr_result_maybenull_ LPCSTR *ppszOutSymbol);
  361. typedef BOOL (CALLBACK *PF_DETOUR_BINARY_COMMIT_CALLBACK)(
  362. _In_opt_ PVOID pContext);
  363. typedef BOOL (CALLBACK *PF_DETOUR_ENUMERATE_EXPORT_CALLBACK)(_In_opt_ PVOID pContext,
  364. _In_ ULONG nOrdinal,
  365. _In_opt_ LPCSTR pszName,
  366. _In_opt_ PVOID pCode);
  367. typedef BOOL (CALLBACK *PF_DETOUR_IMPORT_FILE_CALLBACK)(_In_opt_ PVOID pContext,
  368. _In_opt_ HMODULE hModule,
  369. _In_opt_ LPCSTR pszFile);
  370. typedef BOOL (CALLBACK *PF_DETOUR_IMPORT_FUNC_CALLBACK)(_In_opt_ PVOID pContext,
  371. _In_ DWORD nOrdinal,
  372. _In_opt_ LPCSTR pszFunc,
  373. _In_opt_ PVOID pvFunc);
  374. // Same as PF_DETOUR_IMPORT_FUNC_CALLBACK but extra indirection on last parameter.
  375. typedef BOOL (CALLBACK *PF_DETOUR_IMPORT_FUNC_CALLBACK_EX)(_In_opt_ PVOID pContext,
  376. _In_ DWORD nOrdinal,
  377. _In_opt_ LPCSTR pszFunc,
  378. _In_opt_ PVOID* ppvFunc);
  379. typedef VOID * PDETOUR_BINARY;
  380. typedef VOID * PDETOUR_LOADED_BINARY;
  381. //////////////////////////////////////////////////////////// Transaction APIs.
  382. //
  383. LONG WINAPI DetourTransactionBegin(VOID);
  384. LONG WINAPI DetourTransactionAbort(VOID);
  385. LONG WINAPI DetourTransactionCommit(VOID);
  386. LONG WINAPI DetourTransactionCommitEx(_Out_opt_ PVOID **pppFailedPointer);
  387. LONG WINAPI DetourUpdateThread(_In_ HANDLE hThread);
  388. LONG WINAPI DetourAttach(_Inout_ PVOID *ppPointer,
  389. _In_ PVOID pDetour);
  390. LONG WINAPI DetourAttachEx(_Inout_ PVOID *ppPointer,
  391. _In_ PVOID pDetour,
  392. _Out_opt_ PDETOUR_TRAMPOLINE *ppRealTrampoline,
  393. _Out_opt_ PVOID *ppRealTarget,
  394. _Out_opt_ PVOID *ppRealDetour);
  395. LONG WINAPI DetourDetach(_Inout_ PVOID *ppPointer,
  396. _In_ PVOID pDetour);
  397. BOOL WINAPI DetourSetIgnoreTooSmall(_In_ BOOL fIgnore);
  398. BOOL WINAPI DetourSetRetainRegions(_In_ BOOL fRetain);
  399. PVOID WINAPI DetourSetSystemRegionLowerBound(_In_ PVOID pSystemRegionLowerBound);
  400. PVOID WINAPI DetourSetSystemRegionUpperBound(_In_ PVOID pSystemRegionUpperBound);
  401. ////////////////////////////////////////////////////////////// Code Functions.
  402. //
  403. PVOID WINAPI DetourFindFunction(_In_ LPCSTR pszModule,
  404. _In_ LPCSTR pszFunction);
  405. PVOID WINAPI DetourCodeFromPointer(_In_ PVOID pPointer,
  406. _Out_opt_ PVOID *ppGlobals);
  407. PVOID WINAPI DetourCopyInstruction(_In_opt_ PVOID pDst,
  408. _Inout_opt_ PVOID *ppDstPool,
  409. _In_ PVOID pSrc,
  410. _Out_opt_ PVOID *ppTarget,
  411. _Out_opt_ LONG *plExtra);
  412. BOOL WINAPI DetourSetCodeModule(_In_ HMODULE hModule,
  413. _In_ BOOL fLimitReferencesToModule);
  414. ///////////////////////////////////////////////////// Loaded Binary Functions.
  415. //
  416. HMODULE WINAPI DetourGetContainingModule(_In_ PVOID pvAddr);
  417. HMODULE WINAPI DetourEnumerateModules(_In_opt_ HMODULE hModuleLast);
  418. PVOID WINAPI DetourGetEntryPoint(_In_opt_ HMODULE hModule);
  419. ULONG WINAPI DetourGetModuleSize(_In_opt_ HMODULE hModule);
  420. BOOL WINAPI DetourEnumerateExports(_In_ HMODULE hModule,
  421. _In_opt_ PVOID pContext,
  422. _In_ PF_DETOUR_ENUMERATE_EXPORT_CALLBACK pfExport);
  423. BOOL WINAPI DetourEnumerateImports(_In_opt_ HMODULE hModule,
  424. _In_opt_ PVOID pContext,
  425. _In_opt_ PF_DETOUR_IMPORT_FILE_CALLBACK pfImportFile,
  426. _In_opt_ PF_DETOUR_IMPORT_FUNC_CALLBACK pfImportFunc);
  427. BOOL WINAPI DetourEnumerateImportsEx(_In_opt_ HMODULE hModule,
  428. _In_opt_ PVOID pContext,
  429. _In_opt_ PF_DETOUR_IMPORT_FILE_CALLBACK pfImportFile,
  430. _In_opt_ PF_DETOUR_IMPORT_FUNC_CALLBACK_EX pfImportFuncEx);
  431. _Writable_bytes_(*pcbData)
  432. _Readable_bytes_(*pcbData)
  433. _Success_(return != NULL)
  434. PVOID WINAPI DetourFindPayload(_In_opt_ HMODULE hModule,
  435. _In_ REFGUID rguid,
  436. _Out_ DWORD *pcbData);
  437. _Writable_bytes_(*pcbData)
  438. _Readable_bytes_(*pcbData)
  439. _Success_(return != NULL)
  440. PVOID WINAPI DetourFindPayloadEx(_In_ REFGUID rguid,
  441. _Out_ DWORD * pcbData);
  442. DWORD WINAPI DetourGetSizeOfPayloads(_In_opt_ HMODULE hModule);
  443. ///////////////////////////////////////////////// Persistent Binary Functions.
  444. //
  445. PDETOUR_BINARY WINAPI DetourBinaryOpen(_In_ HANDLE hFile);
  446. _Writable_bytes_(*pcbData)
  447. _Readable_bytes_(*pcbData)
  448. _Success_(return != NULL)
  449. PVOID WINAPI DetourBinaryEnumeratePayloads(_In_ PDETOUR_BINARY pBinary,
  450. _Out_opt_ GUID *pGuid,
  451. _Out_ DWORD *pcbData,
  452. _Inout_ DWORD *pnIterator);
  453. _Writable_bytes_(*pcbData)
  454. _Readable_bytes_(*pcbData)
  455. _Success_(return != NULL)
  456. PVOID WINAPI DetourBinaryFindPayload(_In_ PDETOUR_BINARY pBinary,
  457. _In_ REFGUID rguid,
  458. _Out_ DWORD *pcbData);
  459. PVOID WINAPI DetourBinarySetPayload(_In_ PDETOUR_BINARY pBinary,
  460. _In_ REFGUID rguid,
  461. _In_reads_opt_(cbData) PVOID pData,
  462. _In_ DWORD cbData);
  463. BOOL WINAPI DetourBinaryDeletePayload(_In_ PDETOUR_BINARY pBinary, _In_ REFGUID rguid);
  464. BOOL WINAPI DetourBinaryPurgePayloads(_In_ PDETOUR_BINARY pBinary);
  465. BOOL WINAPI DetourBinaryResetImports(_In_ PDETOUR_BINARY pBinary);
  466. BOOL WINAPI DetourBinaryEditImports(_In_ PDETOUR_BINARY pBinary,
  467. _In_opt_ PVOID pContext,
  468. _In_opt_ PF_DETOUR_BINARY_BYWAY_CALLBACK pfByway,
  469. _In_opt_ PF_DETOUR_BINARY_FILE_CALLBACK pfFile,
  470. _In_opt_ PF_DETOUR_BINARY_SYMBOL_CALLBACK pfSymbol,
  471. _In_opt_ PF_DETOUR_BINARY_COMMIT_CALLBACK pfCommit);
  472. BOOL WINAPI DetourBinaryWrite(_In_ PDETOUR_BINARY pBinary, _In_ HANDLE hFile);
  473. BOOL WINAPI DetourBinaryClose(_In_ PDETOUR_BINARY pBinary);
  474. /////////////////////////////////////////////////// Create Process & Load Dll.
  475. //
  476. typedef BOOL (WINAPI *PDETOUR_CREATE_PROCESS_ROUTINEA)(
  477. _In_opt_ LPCSTR lpApplicationName,
  478. _Inout_opt_ LPSTR lpCommandLine,
  479. _In_opt_ LPSECURITY_ATTRIBUTES lpProcessAttributes,
  480. _In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes,
  481. _In_ BOOL bInheritHandles,
  482. _In_ DWORD dwCreationFlags,
  483. _In_opt_ LPVOID lpEnvironment,
  484. _In_opt_ LPCSTR lpCurrentDirectory,
  485. _In_ LPSTARTUPINFOA lpStartupInfo,
  486. _Out_ LPPROCESS_INFORMATION lpProcessInformation);
  487. typedef BOOL (WINAPI *PDETOUR_CREATE_PROCESS_ROUTINEW)(
  488. _In_opt_ LPCWSTR lpApplicationName,
  489. _Inout_opt_ LPWSTR lpCommandLine,
  490. _In_opt_ LPSECURITY_ATTRIBUTES lpProcessAttributes,
  491. _In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes,
  492. _In_ BOOL bInheritHandles,
  493. _In_ DWORD dwCreationFlags,
  494. _In_opt_ LPVOID lpEnvironment,
  495. _In_opt_ LPCWSTR lpCurrentDirectory,
  496. _In_ LPSTARTUPINFOW lpStartupInfo,
  497. _Out_ LPPROCESS_INFORMATION lpProcessInformation);
  498. BOOL WINAPI DetourCreateProcessWithDllA(_In_opt_ LPCSTR lpApplicationName,
  499. _Inout_opt_ LPSTR lpCommandLine,
  500. _In_opt_ LPSECURITY_ATTRIBUTES lpProcessAttributes,
  501. _In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes,
  502. _In_ BOOL bInheritHandles,
  503. _In_ DWORD dwCreationFlags,
  504. _In_opt_ LPVOID lpEnvironment,
  505. _In_opt_ LPCSTR lpCurrentDirectory,
  506. _In_ LPSTARTUPINFOA lpStartupInfo,
  507. _Out_ LPPROCESS_INFORMATION lpProcessInformation,
  508. _In_ LPCSTR lpDllName,
  509. _In_opt_ PDETOUR_CREATE_PROCESS_ROUTINEA pfCreateProcessA);
  510. BOOL WINAPI DetourCreateProcessWithDllW(_In_opt_ LPCWSTR lpApplicationName,
  511. _Inout_opt_ LPWSTR lpCommandLine,
  512. _In_opt_ LPSECURITY_ATTRIBUTES lpProcessAttributes,
  513. _In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes,
  514. _In_ BOOL bInheritHandles,
  515. _In_ DWORD dwCreationFlags,
  516. _In_opt_ LPVOID lpEnvironment,
  517. _In_opt_ LPCWSTR lpCurrentDirectory,
  518. _In_ LPSTARTUPINFOW lpStartupInfo,
  519. _Out_ LPPROCESS_INFORMATION lpProcessInformation,
  520. _In_ LPCSTR lpDllName,
  521. _In_opt_ PDETOUR_CREATE_PROCESS_ROUTINEW pfCreateProcessW);
  522. #ifdef UNICODE
  523. #define DetourCreateProcessWithDll DetourCreateProcessWithDllW
  524. #define PDETOUR_CREATE_PROCESS_ROUTINE PDETOUR_CREATE_PROCESS_ROUTINEW
  525. #else
  526. #define DetourCreateProcessWithDll DetourCreateProcessWithDllA
  527. #define PDETOUR_CREATE_PROCESS_ROUTINE PDETOUR_CREATE_PROCESS_ROUTINEA
  528. #endif // !UNICODE
  529. BOOL WINAPI DetourCreateProcessWithDllExA(_In_opt_ LPCSTR lpApplicationName,
  530. _Inout_opt_ LPSTR lpCommandLine,
  531. _In_opt_ LPSECURITY_ATTRIBUTES lpProcessAttributes,
  532. _In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes,
  533. _In_ BOOL bInheritHandles,
  534. _In_ DWORD dwCreationFlags,
  535. _In_opt_ LPVOID lpEnvironment,
  536. _In_opt_ LPCSTR lpCurrentDirectory,
  537. _In_ LPSTARTUPINFOA lpStartupInfo,
  538. _Out_ LPPROCESS_INFORMATION lpProcessInformation,
  539. _In_ LPCSTR lpDllName,
  540. _In_opt_ PDETOUR_CREATE_PROCESS_ROUTINEA pfCreateProcessA);
  541. BOOL WINAPI DetourCreateProcessWithDllExW(_In_opt_ LPCWSTR lpApplicationName,
  542. _Inout_opt_ LPWSTR lpCommandLine,
  543. _In_opt_ LPSECURITY_ATTRIBUTES lpProcessAttributes,
  544. _In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes,
  545. _In_ BOOL bInheritHandles,
  546. _In_ DWORD dwCreationFlags,
  547. _In_opt_ LPVOID lpEnvironment,
  548. _In_opt_ LPCWSTR lpCurrentDirectory,
  549. _In_ LPSTARTUPINFOW lpStartupInfo,
  550. _Out_ LPPROCESS_INFORMATION lpProcessInformation,
  551. _In_ LPCSTR lpDllName,
  552. _In_opt_ PDETOUR_CREATE_PROCESS_ROUTINEW pfCreateProcessW);
  553. #ifdef UNICODE
  554. #define DetourCreateProcessWithDllEx DetourCreateProcessWithDllExW
  555. #else
  556. #define DetourCreateProcessWithDllEx DetourCreateProcessWithDllExA
  557. #endif // !UNICODE
  558. BOOL WINAPI DetourCreateProcessWithDllsA(_In_opt_ LPCSTR lpApplicationName,
  559. _Inout_opt_ LPSTR lpCommandLine,
  560. _In_opt_ LPSECURITY_ATTRIBUTES lpProcessAttributes,
  561. _In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes,
  562. _In_ BOOL bInheritHandles,
  563. _In_ DWORD dwCreationFlags,
  564. _In_opt_ LPVOID lpEnvironment,
  565. _In_opt_ LPCSTR lpCurrentDirectory,
  566. _In_ LPSTARTUPINFOA lpStartupInfo,
  567. _Out_ LPPROCESS_INFORMATION lpProcessInformation,
  568. _In_ DWORD nDlls,
  569. _In_reads_(nDlls) LPCSTR *rlpDlls,
  570. _In_opt_ PDETOUR_CREATE_PROCESS_ROUTINEA pfCreateProcessA);
  571. BOOL WINAPI DetourCreateProcessWithDllsW(_In_opt_ LPCWSTR lpApplicationName,
  572. _Inout_opt_ LPWSTR lpCommandLine,
  573. _In_opt_ LPSECURITY_ATTRIBUTES lpProcessAttributes,
  574. _In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes,
  575. _In_ BOOL bInheritHandles,
  576. _In_ DWORD dwCreationFlags,
  577. _In_opt_ LPVOID lpEnvironment,
  578. _In_opt_ LPCWSTR lpCurrentDirectory,
  579. _In_ LPSTARTUPINFOW lpStartupInfo,
  580. _Out_ LPPROCESS_INFORMATION lpProcessInformation,
  581. _In_ DWORD nDlls,
  582. _In_reads_(nDlls) LPCSTR *rlpDlls,
  583. _In_opt_ PDETOUR_CREATE_PROCESS_ROUTINEW pfCreateProcessW);
  584. #ifdef UNICODE
  585. #define DetourCreateProcessWithDlls DetourCreateProcessWithDllsW
  586. #else
  587. #define DetourCreateProcessWithDlls DetourCreateProcessWithDllsA
  588. #endif // !UNICODE
  589. BOOL WINAPI DetourProcessViaHelperA(_In_ DWORD dwTargetPid,
  590. _In_ LPCSTR lpDllName,
  591. _In_ PDETOUR_CREATE_PROCESS_ROUTINEA pfCreateProcessA);
  592. BOOL WINAPI DetourProcessViaHelperW(_In_ DWORD dwTargetPid,
  593. _In_ LPCSTR lpDllName,
  594. _In_ PDETOUR_CREATE_PROCESS_ROUTINEW pfCreateProcessW);
  595. #ifdef UNICODE
  596. #define DetourProcessViaHelper DetourProcessViaHelperW
  597. #else
  598. #define DetourProcessViaHelper DetourProcessViaHelperA
  599. #endif // !UNICODE
  600. BOOL WINAPI DetourProcessViaHelperDllsA(_In_ DWORD dwTargetPid,
  601. _In_ DWORD nDlls,
  602. _In_reads_(nDlls) LPCSTR *rlpDlls,
  603. _In_ PDETOUR_CREATE_PROCESS_ROUTINEA pfCreateProcessA);
  604. BOOL WINAPI DetourProcessViaHelperDllsW(_In_ DWORD dwTargetPid,
  605. _In_ DWORD nDlls,
  606. _In_reads_(nDlls) LPCSTR *rlpDlls,
  607. _In_ PDETOUR_CREATE_PROCESS_ROUTINEW pfCreateProcessW);
  608. #ifdef UNICODE
  609. #define DetourProcessViaHelperDlls DetourProcessViaHelperDllsW
  610. #else
  611. #define DetourProcessViaHelperDlls DetourProcessViaHelperDllsA
  612. #endif // !UNICODE
  613. BOOL WINAPI DetourUpdateProcessWithDll(_In_ HANDLE hProcess,
  614. _In_reads_(nDlls) LPCSTR *rlpDlls,
  615. _In_ DWORD nDlls);
  616. BOOL WINAPI DetourUpdateProcessWithDllEx(_In_ HANDLE hProcess,
  617. _In_ HMODULE hImage,
  618. _In_ BOOL bIs32Bit,
  619. _In_reads_(nDlls) LPCSTR *rlpDlls,
  620. _In_ DWORD nDlls);
  621. BOOL WINAPI DetourCopyPayloadToProcess(_In_ HANDLE hProcess,
  622. _In_ REFGUID rguid,
  623. _In_reads_bytes_(cbData) PVOID pvData,
  624. _In_ DWORD cbData);
  625. BOOL WINAPI DetourRestoreAfterWith(VOID);
  626. BOOL WINAPI DetourRestoreAfterWithEx(_In_reads_bytes_(cbData) PVOID pvData,
  627. _In_ DWORD cbData);
  628. BOOL WINAPI DetourIsHelperProcess(VOID);
  629. VOID CALLBACK DetourFinishHelperProcess(_In_ HWND,
  630. _In_ HINSTANCE,
  631. _In_ LPSTR,
  632. _In_ INT);
  633. //
  634. //////////////////////////////////////////////////////////////////////////////
  635. #ifdef __cplusplus
  636. }
  637. #endif // __cplusplus
  638. //////////////////////////////////////////////// Detours Internal Definitions.
  639. //
  640. #ifdef __cplusplus
  641. #ifdef DETOURS_INTERNAL
  642. #define NOTHROW
  643. // #define NOTHROW (nothrow)
  644. //////////////////////////////////////////////////////////////////////////////
  645. //
  646. #if (_MSC_VER < 1299)
  647. #include <imagehlp.h>
  648. typedef IMAGEHLP_MODULE IMAGEHLP_MODULE64;
  649. typedef PIMAGEHLP_MODULE PIMAGEHLP_MODULE64;
  650. typedef IMAGEHLP_SYMBOL SYMBOL_INFO;
  651. typedef PIMAGEHLP_SYMBOL PSYMBOL_INFO;
  652. static inline
  653. LONG InterlockedCompareExchange(_Inout_ LONG *ptr, _In_ LONG nval, _In_ LONG oval)
  654. {
  655. return (LONG)::InterlockedCompareExchange((PVOID*)ptr, (PVOID)nval, (PVOID)oval);
  656. }
  657. #else
  658. #pragma warning(push)
  659. #pragma warning(disable:4091) // empty typedef
  660. #include <dbghelp.h>
  661. #pragma warning(pop)
  662. #endif
  663. #ifdef IMAGEAPI // defined by DBGHELP.H
  664. typedef LPAPI_VERSION (NTAPI *PF_ImagehlpApiVersionEx)(_In_ LPAPI_VERSION AppVersion);
  665. typedef BOOL (NTAPI *PF_SymInitialize)(_In_ HANDLE hProcess,
  666. _In_opt_ LPCSTR UserSearchPath,
  667. _In_ BOOL fInvadeProcess);
  668. typedef DWORD (NTAPI *PF_SymSetOptions)(_In_ DWORD SymOptions);
  669. typedef DWORD (NTAPI *PF_SymGetOptions)(VOID);
  670. typedef DWORD64 (NTAPI *PF_SymLoadModule64)(_In_ HANDLE hProcess,
  671. _In_opt_ HANDLE hFile,
  672. _In_ LPSTR ImageName,
  673. _In_opt_ LPSTR ModuleName,
  674. _In_ DWORD64 BaseOfDll,
  675. _In_opt_ DWORD SizeOfDll);
  676. typedef BOOL (NTAPI *PF_SymGetModuleInfo64)(_In_ HANDLE hProcess,
  677. _In_ DWORD64 qwAddr,
  678. _Out_ PIMAGEHLP_MODULE64 ModuleInfo);
  679. typedef BOOL (NTAPI *PF_SymFromName)(_In_ HANDLE hProcess,
  680. _In_ LPSTR Name,
  681. _Out_ PSYMBOL_INFO Symbol);
  682. typedef struct _DETOUR_SYM_INFO
  683. {
  684. HANDLE hProcess;
  685. HMODULE hDbgHelp;
  686. PF_ImagehlpApiVersionEx pfImagehlpApiVersionEx;
  687. PF_SymInitialize pfSymInitialize;
  688. PF_SymSetOptions pfSymSetOptions;
  689. PF_SymGetOptions pfSymGetOptions;
  690. PF_SymLoadModule64 pfSymLoadModule64;
  691. PF_SymGetModuleInfo64 pfSymGetModuleInfo64;
  692. PF_SymFromName pfSymFromName;
  693. } DETOUR_SYM_INFO, *PDETOUR_SYM_INFO;
  694. PDETOUR_SYM_INFO DetourLoadImageHlp(VOID);
  695. #endif // IMAGEAPI
  696. #if defined(_INC_STDIO) && !defined(_CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS)
  697. #error detours.h must be included before stdio.h (or at least define _CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS earlier)
  698. #endif
  699. #define _CRT_STDIO_ARBITRARY_WIDE_SPECIFIERS 1
  700. #ifndef DETOUR_TRACE
  701. #if DETOUR_DEBUG
  702. #define DETOUR_TRACE(x) printf x
  703. #define DETOUR_BREAK() __debugbreak()
  704. #include <stdio.h>
  705. #include <limits.h>
  706. #else
  707. #define DETOUR_TRACE(x)
  708. #define DETOUR_BREAK()
  709. #endif
  710. #endif
  711. #if 1 || defined(DETOURS_IA64)
  712. //
  713. // IA64 instructions are 41 bits, 3 per bundle, plus 5 bit bundle template => 128 bits per bundle.
  714. //
  715. #define DETOUR_IA64_INSTRUCTIONS_PER_BUNDLE (3)
  716. #define DETOUR_IA64_TEMPLATE_OFFSET (0)
  717. #define DETOUR_IA64_TEMPLATE_SIZE (5)
  718. #define DETOUR_IA64_INSTRUCTION_SIZE (41)
  719. #define DETOUR_IA64_INSTRUCTION0_OFFSET (DETOUR_IA64_TEMPLATE_SIZE)
  720. #define DETOUR_IA64_INSTRUCTION1_OFFSET (DETOUR_IA64_TEMPLATE_SIZE + DETOUR_IA64_INSTRUCTION_SIZE)
  721. #define DETOUR_IA64_INSTRUCTION2_OFFSET (DETOUR_IA64_TEMPLATE_SIZE + DETOUR_IA64_INSTRUCTION_SIZE + DETOUR_IA64_INSTRUCTION_SIZE)
  722. C_ASSERT(DETOUR_IA64_TEMPLATE_SIZE + DETOUR_IA64_INSTRUCTIONS_PER_BUNDLE * DETOUR_IA64_INSTRUCTION_SIZE == 128);
  723. __declspec(align(16)) struct DETOUR_IA64_BUNDLE
  724. {
  725. public:
  726. union
  727. {
  728. BYTE data[16];
  729. UINT64 wide[2];
  730. };
  731. enum {
  732. A_UNIT = 1u,
  733. I_UNIT = 2u,
  734. M_UNIT = 3u,
  735. B_UNIT = 4u,
  736. F_UNIT = 5u,
  737. L_UNIT = 6u,
  738. X_UNIT = 7u,
  739. };
  740. struct DETOUR_IA64_METADATA
  741. {
  742. ULONG nTemplate : 8; // Instruction template.
  743. ULONG nUnit0 : 4; // Unit for slot 0
  744. ULONG nUnit1 : 4; // Unit for slot 1
  745. ULONG nUnit2 : 4; // Unit for slot 2
  746. };
  747. protected:
  748. static const DETOUR_IA64_METADATA s_rceCopyTable[33];
  749. UINT RelocateBundle(_Inout_ DETOUR_IA64_BUNDLE* pDst, _Inout_opt_ DETOUR_IA64_BUNDLE* pBundleExtra) const;
  750. bool RelocateInstruction(_Inout_ DETOUR_IA64_BUNDLE* pDst,
  751. _In_ BYTE slot,
  752. _Inout_opt_ DETOUR_IA64_BUNDLE* pBundleExtra) const;
  753. // 120 112 104 96 88 80 72 64 56 48 40 32 24 16 8 0
  754. // f. e. d. c. b. a. 9. 8. 7. 6. 5. 4. 3. 2. 1. 0.
  755. // 00
  756. // f.e. d.c. b.a. 9.8. 7.6. 5.4. 3.2. 1.0.
  757. // 0000 0000 0000 0000 0000 0000 0000 001f : Template [4..0]
  758. // 0000 0000 0000 0000 0000 03ff ffff ffe0 : Zero [ 41.. 5]
  759. // 0000 0000 0000 0000 0000 3c00 0000 0000 : Zero [ 45.. 42]
  760. // 0000 0000 0007 ffff ffff c000 0000 0000 : One [ 82.. 46]
  761. // 0000 0000 0078 0000 0000 0000 0000 0000 : One [ 86.. 83]
  762. // 0fff ffff ff80 0000 0000 0000 0000 0000 : Two [123.. 87]
  763. // f000 0000 0000 0000 0000 0000 0000 0000 : Two [127..124]
  764. BYTE GetTemplate() const;
  765. // Get 4 bit opcodes.
  766. BYTE GetInst0() const;
  767. BYTE GetInst1() const;
  768. BYTE GetInst2() const;
  769. BYTE GetUnit(BYTE slot) const;
  770. BYTE GetUnit0() const;
  771. BYTE GetUnit1() const;
  772. BYTE GetUnit2() const;
  773. // Get 37 bit data.
  774. UINT64 GetData0() const;
  775. UINT64 GetData1() const;
  776. UINT64 GetData2() const;
  777. // Get/set the full 41 bit instructions.
  778. UINT64 GetInstruction(BYTE slot) const;
  779. UINT64 GetInstruction0() const;
  780. UINT64 GetInstruction1() const;
  781. UINT64 GetInstruction2() const;
  782. void SetInstruction(BYTE slot, UINT64 instruction);
  783. void SetInstruction0(UINT64 instruction);
  784. void SetInstruction1(UINT64 instruction);
  785. void SetInstruction2(UINT64 instruction);
  786. // Get/set bitfields.
  787. static UINT64 GetBits(UINT64 Value, UINT64 Offset, UINT64 Count);
  788. static UINT64 SetBits(UINT64 Value, UINT64 Offset, UINT64 Count, UINT64 Field);
  789. // Get specific read-only fields.
  790. static UINT64 GetOpcode(UINT64 instruction); // 4bit opcode
  791. static UINT64 GetX(UINT64 instruction); // 1bit opcode extension
  792. static UINT64 GetX3(UINT64 instruction); // 3bit opcode extension
  793. static UINT64 GetX6(UINT64 instruction); // 6bit opcode extension
  794. // Get/set specific fields.
  795. static UINT64 GetImm7a(UINT64 instruction);
  796. static UINT64 SetImm7a(UINT64 instruction, UINT64 imm7a);
  797. static UINT64 GetImm13c(UINT64 instruction);
  798. static UINT64 SetImm13c(UINT64 instruction, UINT64 imm13c);
  799. static UINT64 GetSignBit(UINT64 instruction);
  800. static UINT64 SetSignBit(UINT64 instruction, UINT64 signBit);
  801. static UINT64 GetImm20a(UINT64 instruction);
  802. static UINT64 SetImm20a(UINT64 instruction, UINT64 imm20a);
  803. static UINT64 GetImm20b(UINT64 instruction);
  804. static UINT64 SetImm20b(UINT64 instruction, UINT64 imm20b);
  805. static UINT64 SignExtend(UINT64 Value, UINT64 Offset);
  806. BOOL IsMovlGp() const;
  807. VOID SetInst(BYTE Slot, BYTE nInst);
  808. VOID SetInst0(BYTE nInst);
  809. VOID SetInst1(BYTE nInst);
  810. VOID SetInst2(BYTE nInst);
  811. VOID SetData(BYTE Slot, UINT64 nData);
  812. VOID SetData0(UINT64 nData);
  813. VOID SetData1(UINT64 nData);
  814. VOID SetData2(UINT64 nData);
  815. BOOL SetNop(BYTE Slot);
  816. BOOL SetNop0();
  817. BOOL SetNop1();
  818. BOOL SetNop2();
  819. public:
  820. BOOL IsBrl() const;
  821. VOID SetBrl();
  822. VOID SetBrl(UINT64 target);
  823. UINT64 GetBrlTarget() const;
  824. VOID SetBrlTarget(UINT64 target);
  825. VOID SetBrlImm(UINT64 imm);
  826. UINT64 GetBrlImm() const;
  827. UINT64 GetMovlGp() const;
  828. VOID SetMovlGp(UINT64 gp);
  829. VOID SetStop();
  830. UINT Copy(_Out_ DETOUR_IA64_BUNDLE *pDst, _Inout_opt_ DETOUR_IA64_BUNDLE* pBundleExtra = NULL) const;
  831. };
  832. #endif // DETOURS_IA64
  833. #ifdef DETOURS_ARM
  834. #define DETOURS_PFUNC_TO_PBYTE(p) ((PBYTE)(((ULONG_PTR)(p)) & ~(ULONG_PTR)1))
  835. #define DETOURS_PBYTE_TO_PFUNC(p) ((PBYTE)(((ULONG_PTR)(p)) | (ULONG_PTR)1))
  836. #endif // DETOURS_ARM
  837. //////////////////////////////////////////////////////////////////////////////
  838. #ifdef __cplusplus
  839. extern "C" {
  840. #endif // __cplusplus
  841. #define DETOUR_OFFLINE_LIBRARY(x) \
  842. PVOID WINAPI DetourCopyInstruction##x(_In_opt_ PVOID pDst, \
  843. _Inout_opt_ PVOID *ppDstPool, \
  844. _In_ PVOID pSrc, \
  845. _Out_opt_ PVOID *ppTarget, \
  846. _Out_opt_ LONG *plExtra); \
  847. \
  848. BOOL WINAPI DetourSetCodeModule##x(_In_ HMODULE hModule, \
  849. _In_ BOOL fLimitReferencesToModule); \
  850. DETOUR_OFFLINE_LIBRARY(X86)
  851. DETOUR_OFFLINE_LIBRARY(X64)
  852. DETOUR_OFFLINE_LIBRARY(ARM)
  853. DETOUR_OFFLINE_LIBRARY(ARM64)
  854. DETOUR_OFFLINE_LIBRARY(IA64)
  855. #undef DETOUR_OFFLINE_LIBRARY
  856. //////////////////////////////////////////////////////////////////////////////
  857. //
  858. // Helpers for manipulating page protection.
  859. //
  860. _Success_(return != FALSE)
  861. BOOL WINAPI DetourVirtualProtectSameExecuteEx(_In_ HANDLE hProcess,
  862. _In_ PVOID pAddress,
  863. _In_ SIZE_T nSize,
  864. _In_ DWORD dwNewProtect,
  865. _Out_ PDWORD pdwOldProtect);
  866. _Success_(return != FALSE)
  867. BOOL WINAPI DetourVirtualProtectSameExecute(_In_ PVOID pAddress,
  868. _In_ SIZE_T nSize,
  869. _In_ DWORD dwNewProtect,
  870. _Out_ PDWORD pdwOldProtect);
  871. #ifdef __cplusplus
  872. }
  873. #endif // __cplusplus
  874. //////////////////////////////////////////////////////////////////////////////
  875. #define MM_ALLOCATION_GRANULARITY 0x10000
  876. //////////////////////////////////////////////////////////////////////////////
  877. #endif // DETOURS_INTERNAL
  878. #endif // __cplusplus
  879. #endif // _DETOURS_H_
  880. //
  881. //////////////////////////////////////////////////////////////// End of File.