/detours/src/detours.h

https://bitbucket.org/toxicFork/trainerbase · C Header · 626 lines · 405 code · 176 blank · 45 comment · 0 complexity · dda386e771421404df588603ea36adcd MD5 · raw file

  1. //////////////////////////////////////////////////////////////////////////////
  2. //
  3. // Core Detours Functionality (detours.h of detours.lib)
  4. //
  5. // Microsoft Research Detours Package, Version 3.0 Build_316.
  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 30000 // 3.00.00
  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. extern const GUID DETOUR_EXE_HELPER_GUID;
  65. #define DETOUR_TRAMPOLINE_SIGNATURE 0x21727444 // Dtr!
  66. typedef struct _DETOUR_TRAMPOLINE DETOUR_TRAMPOLINE, *PDETOUR_TRAMPOLINE;
  67. /////////////////////////////////////////////////////////// Binary Structures.
  68. //
  69. #pragma pack(push, 8)
  70. typedef struct _DETOUR_SECTION_HEADER
  71. {
  72. DWORD cbHeaderSize;
  73. DWORD nSignature;
  74. DWORD nDataOffset;
  75. DWORD cbDataSize;
  76. DWORD nOriginalImportVirtualAddress;
  77. DWORD nOriginalImportSize;
  78. DWORD nOriginalBoundImportVirtualAddress;
  79. DWORD nOriginalBoundImportSize;
  80. DWORD nOriginalIatVirtualAddress;
  81. DWORD nOriginalIatSize;
  82. DWORD nOriginalSizeOfImage;
  83. DWORD cbPrePE;
  84. DWORD nOriginalClrFlags;
  85. DWORD reserved1;
  86. DWORD reserved2;
  87. DWORD reserved3;
  88. // Followed by cbPrePE bytes of data.
  89. } DETOUR_SECTION_HEADER, *PDETOUR_SECTION_HEADER;
  90. typedef struct _DETOUR_SECTION_RECORD
  91. {
  92. DWORD cbBytes;
  93. DWORD nReserved;
  94. GUID guid;
  95. } DETOUR_SECTION_RECORD, *PDETOUR_SECTION_RECORD;
  96. typedef struct _DETOUR_CLR_HEADER
  97. {
  98. // Header versioning
  99. ULONG cb;
  100. USHORT MajorRuntimeVersion;
  101. USHORT MinorRuntimeVersion;
  102. // Symbol table and startup information
  103. IMAGE_DATA_DIRECTORY MetaData;
  104. ULONG Flags;
  105. // Followed by the rest of the IMAGE_COR20_HEADER
  106. } DETOUR_CLR_HEADER, *PDETOUR_CLR_HEADER;
  107. typedef struct _DETOUR_EXE_RESTORE
  108. {
  109. DWORD cb;
  110. DWORD cbidh;
  111. DWORD cbinh;
  112. DWORD cbclr;
  113. PBYTE pidh;
  114. PBYTE pinh;
  115. PBYTE pclr;
  116. IMAGE_DOS_HEADER idh;
  117. union {
  118. IMAGE_NT_HEADERS inh;
  119. IMAGE_NT_HEADERS32 inh32;
  120. IMAGE_NT_HEADERS64 inh64;
  121. BYTE raw[sizeof(IMAGE_NT_HEADERS64) +
  122. sizeof(IMAGE_SECTION_HEADER) * 32];
  123. };
  124. DETOUR_CLR_HEADER clr;
  125. } DETOUR_EXE_RESTORE, *PDETOUR_EXE_RESTORE;
  126. typedef struct _DETOUR_EXE_HELPER
  127. {
  128. DWORD cb;
  129. DWORD pid;
  130. CHAR DllName[MAX_PATH];
  131. } DETOUR_EXE_HELPER, *PDETOUR_EXE_HELPER;
  132. #pragma pack(pop)
  133. #define DETOUR_SECTION_HEADER_DECLARE(cbSectionSize) \
  134. { \
  135. sizeof(DETOUR_SECTION_HEADER),\
  136. DETOUR_SECTION_HEADER_SIGNATURE,\
  137. sizeof(DETOUR_SECTION_HEADER),\
  138. (cbSectionSize),\
  139. \
  140. 0,\
  141. 0,\
  142. 0,\
  143. 0,\
  144. \
  145. 0,\
  146. 0,\
  147. 0,\
  148. 0,\
  149. }
  150. /////////////////////////////////////////////////////////////// Helper Macros.
  151. //
  152. #define DETOURS_STRINGIFY(x) DETOURS_STRINGIFY_(x)
  153. #define DETOURS_STRINGIFY_(x) #x
  154. ///////////////////////////////////////////////////////////// Binary Typedefs.
  155. //
  156. typedef BOOL (CALLBACK *PF_DETOUR_BINARY_BYWAY_CALLBACK)(PVOID pContext,
  157. PCHAR pszFile,
  158. PCHAR *ppszOutFile);
  159. typedef BOOL (CALLBACK *PF_DETOUR_BINARY_FILE_CALLBACK)(PVOID pContext,
  160. PCHAR pszOrigFile,
  161. PCHAR pszFile,
  162. PCHAR *ppszOutFile);
  163. typedef BOOL (CALLBACK *PF_DETOUR_BINARY_SYMBOL_CALLBACK)(PVOID pContext,
  164. ULONG nOrigOrdinal,
  165. ULONG nOrdinal,
  166. ULONG *pnOutOrdinal,
  167. PCHAR pszOrigSymbol,
  168. PCHAR pszSymbol,
  169. PCHAR *ppszOutSymbol);
  170. typedef BOOL (CALLBACK *PF_DETOUR_BINARY_COMMIT_CALLBACK)(PVOID pContext);
  171. typedef BOOL (CALLBACK *PF_DETOUR_ENUMERATE_EXPORT_CALLBACK)(PVOID pContext,
  172. ULONG nOrdinal,
  173. PCHAR pszName,
  174. PVOID pCode);
  175. typedef BOOL (CALLBACK *PF_DETOUR_IMPORT_FILE_CALLBACK)(PVOID pContext,
  176. HMODULE hModule,
  177. PCSTR pszFile);
  178. typedef BOOL (CALLBACK *PF_DETOUR_IMPORT_FUNC_CALLBACK)(PVOID pContext,
  179. DWORD nOrdinal,
  180. PCSTR pszFunc,
  181. PVOID pvFunc);
  182. typedef VOID * PDETOUR_BINARY;
  183. typedef VOID * PDETOUR_LOADED_BINARY;
  184. //////////////////////////////////////////////////////////// Transaction APIs.
  185. //
  186. LONG WINAPI DetourTransactionBegin(VOID);
  187. LONG WINAPI DetourTransactionAbort(VOID);
  188. LONG WINAPI DetourTransactionCommit(VOID);
  189. LONG WINAPI DetourTransactionCommitEx(PVOID **pppFailedPointer);
  190. LONG WINAPI DetourUpdateThread(HANDLE hThread);
  191. LONG WINAPI DetourAttach(PVOID *ppPointer,
  192. PVOID pDetour);
  193. LONG WINAPI DetourAttachEx(PVOID *ppPointer,
  194. PVOID pDetour,
  195. PDETOUR_TRAMPOLINE *ppRealTrampoline,
  196. PVOID *ppRealTarget,
  197. PVOID *ppRealDetour);
  198. LONG WINAPI DetourDetach(PVOID *ppPointer,
  199. PVOID pDetour);
  200. BOOL WINAPI DetourSetIgnoreTooSmall(BOOL fIgnore);
  201. BOOL WINAPI DetourSetRetainRegions(BOOL fRetain);
  202. ////////////////////////////////////////////////////////////// Code Functions.
  203. //
  204. PVOID WINAPI DetourFindFunction(PCSTR pszModule, PCSTR pszFunction);
  205. PVOID WINAPI DetourCodeFromPointer(PVOID pPointer, PVOID *ppGlobals);
  206. PVOID WINAPI DetourCopyInstruction(PVOID pDst,
  207. PVOID *pDstPool,
  208. PVOID pSrc,
  209. PVOID *ppTarget,
  210. LONG *plExtra);
  211. ///////////////////////////////////////////////////// Loaded Binary Functions.
  212. //
  213. HMODULE WINAPI DetourGetContainingModule(PVOID pvAddr);
  214. HMODULE WINAPI DetourEnumerateModules(HMODULE hModuleLast);
  215. PVOID WINAPI DetourGetEntryPoint(HMODULE hModule);
  216. ULONG WINAPI DetourGetModuleSize(HMODULE hModule);
  217. BOOL WINAPI DetourEnumerateExports(HMODULE hModule,
  218. PVOID pContext,
  219. PF_DETOUR_ENUMERATE_EXPORT_CALLBACK pfExport);
  220. BOOL WINAPI DetourEnumerateImports(HMODULE hModule,
  221. PVOID pContext,
  222. PF_DETOUR_IMPORT_FILE_CALLBACK pfImportFile,
  223. PF_DETOUR_IMPORT_FUNC_CALLBACK pfImportFunc);
  224. PVOID WINAPI DetourFindPayload(HMODULE hModule, REFGUID rguid, DWORD *pcbData);
  225. PVOID WINAPI DetourFindPayloadEx(REFGUID rguid, DWORD * pcbData);
  226. DWORD WINAPI DetourGetSizeOfPayloads(HMODULE hModule);
  227. ///////////////////////////////////////////////// Persistent Binary Functions.
  228. //
  229. PDETOUR_BINARY WINAPI DetourBinaryOpen(HANDLE hFile);
  230. PVOID WINAPI DetourBinaryEnumeratePayloads(PDETOUR_BINARY pBinary,
  231. GUID *pGuid,
  232. DWORD *pcbData,
  233. DWORD *pnIterator);
  234. PVOID WINAPI DetourBinaryFindPayload(PDETOUR_BINARY pBinary,
  235. REFGUID rguid,
  236. DWORD *pcbData);
  237. PVOID WINAPI DetourBinarySetPayload(PDETOUR_BINARY pBinary,
  238. REFGUID rguid,
  239. PVOID pData,
  240. DWORD cbData);
  241. BOOL WINAPI DetourBinaryDeletePayload(PDETOUR_BINARY pBinary, REFGUID rguid);
  242. BOOL WINAPI DetourBinaryPurgePayloads(PDETOUR_BINARY pBinary);
  243. BOOL WINAPI DetourBinaryResetImports(PDETOUR_BINARY pBinary);
  244. BOOL WINAPI DetourBinaryEditImports(PDETOUR_BINARY pBinary,
  245. PVOID pContext,
  246. PF_DETOUR_BINARY_BYWAY_CALLBACK pfByway,
  247. PF_DETOUR_BINARY_FILE_CALLBACK pfFile,
  248. PF_DETOUR_BINARY_SYMBOL_CALLBACK pfSymbol,
  249. PF_DETOUR_BINARY_COMMIT_CALLBACK pfCommit);
  250. BOOL WINAPI DetourBinaryWrite(PDETOUR_BINARY pBinary, HANDLE hFile);
  251. BOOL WINAPI DetourBinaryClose(PDETOUR_BINARY pBinary);
  252. /////////////////////////////////////////////////// Create Process & Load Dll.
  253. //
  254. typedef BOOL (WINAPI *PDETOUR_CREATE_PROCESS_ROUTINEA)
  255. (LPCSTR lpApplicationName,
  256. LPSTR lpCommandLine,
  257. LPSECURITY_ATTRIBUTES lpProcessAttributes,
  258. LPSECURITY_ATTRIBUTES lpThreadAttributes,
  259. BOOL bInheritHandles,
  260. DWORD dwCreationFlags,
  261. LPVOID lpEnvironment,
  262. LPCSTR lpCurrentDirectory,
  263. LPSTARTUPINFOA lpStartupInfo,
  264. LPPROCESS_INFORMATION lpProcessInformation);
  265. typedef BOOL (WINAPI *PDETOUR_CREATE_PROCESS_ROUTINEW)
  266. (LPCWSTR lpApplicationName,
  267. LPWSTR lpCommandLine,
  268. LPSECURITY_ATTRIBUTES lpProcessAttributes,
  269. LPSECURITY_ATTRIBUTES lpThreadAttributes,
  270. BOOL bInheritHandles,
  271. DWORD dwCreationFlags,
  272. LPVOID lpEnvironment,
  273. LPCWSTR lpCurrentDirectory,
  274. LPSTARTUPINFOW lpStartupInfo,
  275. LPPROCESS_INFORMATION lpProcessInformation);
  276. BOOL WINAPI DetourCreateProcessWithDllA(LPCSTR lpApplicationName,
  277. __in_z LPSTR lpCommandLine,
  278. LPSECURITY_ATTRIBUTES lpProcessAttributes,
  279. LPSECURITY_ATTRIBUTES lpThreadAttributes,
  280. BOOL bInheritHandles,
  281. DWORD dwCreationFlags,
  282. LPVOID lpEnvironment,
  283. LPCSTR lpCurrentDirectory,
  284. LPSTARTUPINFOA lpStartupInfo,
  285. LPPROCESS_INFORMATION lpProcessInformation,
  286. LPCSTR lpDllName,
  287. PDETOUR_CREATE_PROCESS_ROUTINEA
  288. pfCreateProcessA);
  289. BOOL WINAPI DetourCreateProcessWithDllW(LPCWSTR lpApplicationName,
  290. __in_z LPWSTR lpCommandLine,
  291. LPSECURITY_ATTRIBUTES lpProcessAttributes,
  292. LPSECURITY_ATTRIBUTES lpThreadAttributes,
  293. BOOL bInheritHandles,
  294. DWORD dwCreationFlags,
  295. LPVOID lpEnvironment,
  296. LPCWSTR lpCurrentDirectory,
  297. LPSTARTUPINFOW lpStartupInfo,
  298. LPPROCESS_INFORMATION lpProcessInformation,
  299. LPCSTR lpDllName,
  300. PDETOUR_CREATE_PROCESS_ROUTINEW
  301. pfCreateProcessW);
  302. #ifdef UNICODE
  303. #define DetourCreateProcessWithDll DetourCreateProcessWithDllW
  304. #define PDETOUR_CREATE_PROCESS_ROUTINE PDETOUR_CREATE_PROCESS_ROUTINEW
  305. #else
  306. #define DetourCreateProcessWithDll DetourCreateProcessWithDllA
  307. #define PDETOUR_CREATE_PROCESS_ROUTINE PDETOUR_CREATE_PROCESS_ROUTINEA
  308. #endif // !UNICODE
  309. BOOL WINAPI DetourCreateProcessWithDllExA(LPCSTR lpApplicationName,
  310. __in_z LPSTR lpCommandLine,
  311. LPSECURITY_ATTRIBUTES lpProcessAttributes,
  312. LPSECURITY_ATTRIBUTES lpThreadAttributes,
  313. BOOL bInheritHandles,
  314. DWORD dwCreationFlags,
  315. LPVOID lpEnvironment,
  316. LPCSTR lpCurrentDirectory,
  317. LPSTARTUPINFOA lpStartupInfo,
  318. LPPROCESS_INFORMATION lpProcessInformation,
  319. LPCSTR lpDllName,
  320. PDETOUR_CREATE_PROCESS_ROUTINEA
  321. pfCreateProcessA);
  322. BOOL WINAPI DetourCreateProcessWithDllExW(LPCWSTR lpApplicationName,
  323. __in_z LPWSTR lpCommandLine,
  324. LPSECURITY_ATTRIBUTES lpProcessAttributes,
  325. LPSECURITY_ATTRIBUTES lpThreadAttributes,
  326. BOOL bInheritHandles,
  327. DWORD dwCreationFlags,
  328. LPVOID lpEnvironment,
  329. LPCWSTR lpCurrentDirectory,
  330. LPSTARTUPINFOW lpStartupInfo,
  331. LPPROCESS_INFORMATION lpProcessInformation,
  332. LPCSTR lpDllName,
  333. PDETOUR_CREATE_PROCESS_ROUTINEW
  334. pfCreateProcessW);
  335. #ifdef UNICODE
  336. #define DetourCreateProcessWithDllEx DetourCreateProcessWithDllExW
  337. #define PDETOUR_CREATE_PROCESS_ROUTINE PDETOUR_CREATE_PROCESS_ROUTINEW
  338. #else
  339. #define DetourCreateProcessWithDllEx DetourCreateProcessWithDllExA
  340. #define PDETOUR_CREATE_PROCESS_ROUTINE PDETOUR_CREATE_PROCESS_ROUTINEA
  341. #endif // !UNICODE
  342. BOOL WINAPI DetourProcessViaHelperA(DWORD dwTargetPid,
  343. LPCSTR lpDllName,
  344. PDETOUR_CREATE_PROCESS_ROUTINEA pfCreateProcessA);
  345. BOOL WINAPI DetourProcessViaHelperW(DWORD dwTargetPid,
  346. LPCSTR lpDllName,
  347. PDETOUR_CREATE_PROCESS_ROUTINEW pfCreateProcessW);
  348. #ifdef UNICODE
  349. #define DetourProcessViaHelper DetourProcessViaHelperW
  350. #else
  351. #define DetourProcessViaHelper DetourProcessViaHelperA
  352. #endif // !UNICODE
  353. BOOL WINAPI DetourUpdateProcessWithDll(HANDLE hProcess,
  354. LPCSTR *plpDlls,
  355. DWORD nDlls);
  356. BOOL WINAPI DetourCopyPayloadToProcess(HANDLE hProcess,
  357. REFGUID rguid,
  358. PVOID pvData,
  359. DWORD cbData);
  360. BOOL WINAPI DetourRestoreAfterWith(VOID);
  361. BOOL WINAPI DetourRestoreAfterWithEx(PVOID pvData, DWORD cbData);
  362. BOOL WINAPI DetourIsHelperProcess(VOID);
  363. VOID CALLBACK DetourFinishHelperProcess(HWND, HINSTANCE, LPSTR, INT);
  364. //
  365. //////////////////////////////////////////////////////////////////////////////
  366. #ifdef __cplusplus
  367. }
  368. #endif // __cplusplus
  369. //////////////////////////////////////////////// Detours Internal Definitions.
  370. //
  371. #ifdef __cplusplus
  372. #ifdef DETOURS_INTERNAL
  373. #ifndef __deref_out
  374. #define __deref_out
  375. #endif
  376. #ifndef __deref
  377. #define __deref
  378. #endif
  379. //////////////////////////////////////////////////////////////////////////////
  380. //
  381. #if (_MSC_VER < 1299)
  382. #include <imagehlp.h>
  383. typedef IMAGEHLP_MODULE IMAGEHLP_MODULE64;
  384. typedef PIMAGEHLP_MODULE PIMAGEHLP_MODULE64;
  385. typedef IMAGEHLP_SYMBOL SYMBOL_INFO;
  386. typedef PIMAGEHLP_SYMBOL PSYMBOL_INFO;
  387. static inline
  388. LONG InterlockedCompareExchange(LONG *ptr, LONG nval, LONG oval)
  389. {
  390. return (LONG)::InterlockedCompareExchange((PVOID*)ptr, (PVOID)nval, (PVOID)oval);
  391. }
  392. #else
  393. #include <dbghelp.h>
  394. #endif
  395. #ifdef IMAGEAPI // defined by DBGHELP.H
  396. typedef LPAPI_VERSION (NTAPI *PF_ImagehlpApiVersionEx)(LPAPI_VERSION AppVersion);
  397. typedef BOOL (NTAPI *PF_SymInitialize)(IN HANDLE hProcess,
  398. IN LPCSTR UserSearchPath,
  399. IN BOOL fInvadeProcess);
  400. typedef DWORD (NTAPI *PF_SymSetOptions)(IN DWORD SymOptions);
  401. typedef DWORD (NTAPI *PF_SymGetOptions)(VOID);
  402. typedef DWORD64 (NTAPI *PF_SymLoadModule64)(IN HANDLE hProcess,
  403. IN HANDLE hFile,
  404. IN PSTR ImageName,
  405. IN PSTR ModuleName,
  406. IN DWORD64 BaseOfDll,
  407. IN DWORD SizeOfDll);
  408. typedef BOOL (NTAPI *PF_SymGetModuleInfo64)(IN HANDLE hProcess,
  409. IN DWORD64 qwAddr,
  410. OUT PIMAGEHLP_MODULE64 ModuleInfo);
  411. typedef BOOL (NTAPI *PF_SymFromName)(IN HANDLE hProcess,
  412. IN LPSTR Name,
  413. OUT PSYMBOL_INFO Symbol);
  414. typedef struct _DETOUR_SYM_INFO
  415. {
  416. HANDLE hProcess;
  417. HMODULE hDbgHelp;
  418. PF_ImagehlpApiVersionEx pfImagehlpApiVersionEx;
  419. PF_SymInitialize pfSymInitialize;
  420. PF_SymSetOptions pfSymSetOptions;
  421. PF_SymGetOptions pfSymGetOptions;
  422. PF_SymLoadModule64 pfSymLoadModule64;
  423. PF_SymGetModuleInfo64 pfSymGetModuleInfo64;
  424. PF_SymFromName pfSymFromName;
  425. } DETOUR_SYM_INFO, *PDETOUR_SYM_INFO;
  426. PDETOUR_SYM_INFO DetourLoadDbgHelp(VOID);
  427. #endif // IMAGEAPI
  428. #ifndef DETOUR_TRACE
  429. #if DETOUR_DEBUG
  430. #define DETOUR_TRACE(x) printf x
  431. #define DETOUR_BREAK() __debugbreak()
  432. #include <stdio.h>
  433. #include <limits.h>
  434. #else
  435. #define DETOUR_TRACE(x)
  436. #define DETOUR_BREAK()
  437. #endif
  438. #endif
  439. #ifdef DETOURS_IA64
  440. #error Feature not supported in this release.
  441. #endif // DETOURS_IA64
  442. #ifdef DETOURS_ARM
  443. #error Feature not supported in this release.
  444. #endif // DETOURS_ARM
  445. //////////////////////////////////////////////////////////////////////////////
  446. #endif // DETOURS_INTERNAL
  447. #endif // __cplusplus
  448. #endif // _DETOURS_H_
  449. //
  450. //////////////////////////////////////////////////////////////// End of File.