Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

508 lines
12 KiB

  1. /*++
  2. Copyright (c) 1998-2000 Microsoft Corporation
  3. Module Name:
  4. wow64.h
  5. Abstract:
  6. Public header for wow64.dll
  7. Author:
  8. 11-May-1998 BarryBo
  9. Revision History:
  10. 9-Aug-1999 [askhalid] added WOW64IsCurrentProcess
  11. --*/
  12. #ifndef _WOW64_INCLUDE
  13. #define _WOW64_INCLUDE
  14. //
  15. // Make wow64.dll exports __declspec(dllimport) when this header is included
  16. // by non-wow64 components
  17. //
  18. #if !defined(_WOW64DLLAPI_)
  19. #define WOW64DLLAPI DECLSPEC_IMPORT
  20. #else
  21. #define WOW64DLLAPI
  22. #endif
  23. // crank down some warnings
  24. #pragma warning(4:4312) // conversion to type of greater size
  25. // pull in typedefs for TEB32, PEB32, etc.
  26. #include "wow64t.h"
  27. #include <setjmp.h>
  28. #include <windef.h>
  29. // wow64log constatns
  30. #include "wow64log.h"
  31. //wow64 regremaping
  32. #include "regremap.h"
  33. //
  34. // Enable the wow64 history mechanism
  35. // Eventually, this may only be enabled for debug builds, but for
  36. // now, enable all the time
  37. //
  38. #define WOW64_HISTORY
  39. //
  40. // define a datatype corresponding to the 32-bit machine's CONTEXT
  41. //
  42. #include "wx86nt.h"
  43. #define CONTEXT32 CONTEXT_WX86
  44. #define PCONTEXT32 PCONTEXT_WX86
  45. #define CONTEXT32_CONTROL CONTEXT_CONTROL_WX86
  46. #define CONTEXT32_INTEGER CONTEXT_INTEGER_WX86
  47. #define CONTEXT32_SEGMENTS CONTEXT_SEGMENTS_WX86
  48. #define CONTEXT32_FLOATING_POINT CONTEXT_FLOATING_POINT_WX86
  49. #define CONTEXT32_EXTENDED_REGISTERS CONTEXT_EXTENDED_REGISTERS_WX86
  50. #define CONTEXT32_DEBUG_REGISTERS CONTEXT_DEBUG_REGISTERS_WX86
  51. #define CONTEXT32_FULL CONTEXT_FULL_WX86
  52. #define CONTEXT32_FULLFLOAT (CONTEXT_FULL_WX86|CONTEXT32_FLOATING_POINT|CONTEXT32_EXTENDED_REGISTERS)
  53. #if defined(_AXP64_)
  54. // Enable 4k page emulation in software. IA64 does it in h/w with OS support.
  55. #define SOFTWARE_4K_PAGESIZE 1
  56. #endif
  57. typedef enum _WOW64_API_ERROR_ACTION {
  58. ApiErrorNTSTATUS, //Return exception code as return value
  59. ApiErrorNTSTATUSTebCode, //Some as above with SetLastError on exception code
  60. ApiErrorRetval, //Return a constant parameter
  61. ApiErrorRetvalTebCode //Some as above with SetLastError on exception code
  62. } WOW64_API_ERROR_ACTION, *PWOW64_API_ERROR_ACTION;
  63. // This structure describes what action should occure when thunks hit an unhandled exception.
  64. typedef struct _WOW64_SERVICE_ERROR_CASE {
  65. WOW64_API_ERROR_ACTION ErrorAction;
  66. LONG ErrorActionParam;
  67. } WOW64_SERVICE_ERROR_CASE, *PWOW64_SERVICE_ERROR_CASE;
  68. // This is an extension of KSERVICE_TABLE_DESCRIPTOR
  69. typedef struct _WOW64SERVICE_TABLE_DESCRIPTOR {
  70. PULONG_PTR Base;
  71. PULONG Count;
  72. ULONG Limit;
  73. #if defined(_IA64_)
  74. LONG TableBaseGpOffset;
  75. #endif
  76. PUCHAR Number;
  77. WOW64_API_ERROR_ACTION DefaultErrorAction; //Action if ErrorCases is NULL.
  78. LONG DefaultErrorActionParam; //Action parameter if ErrorCases is NULL.
  79. PWOW64_SERVICE_ERROR_CASE ErrorCases;
  80. } WOW64SERVICE_TABLE_DESCRIPTOR, *PWOW64SERVICE_TABLE_DESCRIPTOR;
  81. // Used to log hit counts for APIs.
  82. typedef struct _WOW64SERVICE_PROFILE_TABLE WOW64SERVICE_PROFILE_TABLE;
  83. typedef struct _WOW64SERVICE_PROFILE_TABLE *PWOW64SERVICE_PROFILE_TABLE;
  84. typedef struct _WOW64SERVICE_PROFILE_TABLE_ELEMENT {
  85. PWSTR ApiName;
  86. SIZE_T HitCount;
  87. PWOW64SERVICE_PROFILE_TABLE SubTable;
  88. BOOLEAN ApiEnabled;
  89. } WOW64SERVICE_PROFILE_TABLE_ELEMENT, *PWOW64SERVICE_PROFILE_TABLE_ELEMENT;
  90. typedef struct _WOW64SERVICE_PROFILE_TABLE {
  91. PWSTR TableName; //OPTIONAL
  92. PWSTR FriendlyTableName; //OPTIONAL
  93. CONST PWOW64SERVICE_PROFILE_TABLE_ELEMENT ProfileTableElements;
  94. SIZE_T NumberProfileTableElements;
  95. } WOW64SERVICE_PROFILE_TABLE, *PWOW64SERVICE_PROFILE_TABLE;
  96. typedef struct _WOW64_SYSTEM_INFORMATION {
  97. SYSTEM_BASIC_INFORMATION BasicInfo;
  98. SYSTEM_PROCESSOR_INFORMATION ProcessorInfo;
  99. ULONG_PTR RangeInfo;
  100. } WOW64_SYSTEM_INFORMATION, *PWOW64_SYSTEM_INFORMATION;
  101. //
  102. // Indices for API thunks.
  103. //
  104. #define WHNT32_INDEX 0 // ntoskrnl
  105. #define WHCON_INDEX 1 // console (replaces LPC calls)
  106. #define WHWIN32_INDEX 2 // win32k
  107. #define WHBASE_INDEX 3 // base/nls (replaces LPC calls)
  108. #define MAX_TABLE_INDEX 4
  109. //
  110. // Logging mechanism. Usage:
  111. // LOGPRINT((verbosity, format, ...))
  112. //
  113. #define LOGPRINT(args) Wow64LogPrint args
  114. #define ERRORLOG LF_ERROR // Always output to debugger. Use for *unexpected*
  115. // errors only
  116. #define TRACELOG LF_TRACE // application trace information
  117. #define INFOLOG LF_TRACE // misc. informational log
  118. #define VERBOSELOG LF_NONE // practically never output to debugger
  119. #if DBG
  120. #define WOW64DOPROFILE
  121. #endif
  122. void
  123. WOW64DLLAPI
  124. Wow64LogPrint(
  125. UCHAR LogLevel,
  126. char *format,
  127. ...
  128. );
  129. //
  130. // WOW64 Assertion Mechanism. Usage:
  131. // - put an ASSERTNAME macro at the top of each .C file
  132. // - WOW64ASSERT(expression)
  133. // - WOW64ASSERTMSG(expression, message)
  134. //
  135. //
  136. VOID
  137. WOW64DLLAPI
  138. Wow64Assert(
  139. IN CONST PSZ exp,
  140. OPTIONAL IN CONST PSZ msg,
  141. IN CONST PSZ mod,
  142. IN LONG LINE
  143. );
  144. #if DBG
  145. #undef ASSERTNAME
  146. #define ASSERTNAME static CONST PSZ szModule = __FILE__;
  147. #define WOWASSERT(exp) \
  148. if (!(exp)) { \
  149. Wow64Assert( #exp, NULL, szModule, __LINE__); \
  150. }
  151. #define WOWASSERTMSG(exp, msg) \
  152. if (!(exp)) { \
  153. Wow64Assert( #exp, msg, szModule, __LINE__); \
  154. }
  155. #else // !DBG
  156. #define WOWASSERT(exp)
  157. #define WOWASSERTMSG(exp, msg)
  158. #endif // !DBG
  159. #define WOWASSERT_PTR32(ptr) WOWASSERT((ULONGLONG)ptr < 0xFFFFFFFF)
  160. WOW64DLLAPI
  161. PVOID
  162. Wow64AllocateHeap(
  163. SIZE_T Size
  164. );
  165. WOW64DLLAPI
  166. VOID
  167. Wow64FreeHeap(
  168. PVOID BaseAddress
  169. );
  170. //
  171. // 64-to-32 callback support for usermode APCs
  172. //
  173. // A list of these sits inside WOW64_TLS_APCLIST
  174. typedef struct tagUserApcList {
  175. struct tagUserApcList *Next;
  176. jmp_buf JumpBuffer;
  177. PCONTEXT32 pContext32;
  178. } USER_APC_ENTRY, *PUSER_APC_ENTRY;
  179. BOOL
  180. WOW64DLLAPI
  181. WOW64IsCurrentProcess (
  182. HANDLE hProcess
  183. );
  184. NTSTATUS
  185. Wow64WrapApcProc(
  186. IN OUT PVOID *pApcProc,
  187. IN OUT PVOID *pApcContext
  188. );
  189. typedef struct UserCallbackData {
  190. jmp_buf JumpBuffer;
  191. PVOID PreviousUserCallbackData;
  192. PVOID OutputBuffer;
  193. ULONG OutputLength;
  194. NTSTATUS Status;
  195. PVOID UserBuffer;
  196. } USERCALLBACKDATA, *PUSERCALLBACKDATA;
  197. ULONG
  198. Wow64KiUserCallbackDispatcher(
  199. PUSERCALLBACKDATA pUserCallbackData,
  200. ULONG ApiNumber,
  201. ULONG ApiArgument,
  202. ULONG ApiSize
  203. );
  204. NTSTATUS
  205. Wow64NtCallbackReturn(
  206. PVOID OutputBuffer,
  207. ULONG OutputLength,
  208. NTSTATUS Status
  209. );
  210. NTSTATUS
  211. Wow64SkipOverBreakPoint(
  212. IN PCLIENT_ID ClientId,
  213. IN PEXCEPTION_RECORD ExceptionRecord);
  214. NTSTATUS
  215. Wow64GetThreadSelectorEntry(
  216. IN HANDLE ThreadHandle,
  217. IN OUT PVOID DescriptorTableEntry,
  218. IN ULONG Length,
  219. OUT PULONG ReturnLength OPTIONAL);
  220. //
  221. // Thread Local Storage (TLS) support. TLS slots are statically allocated.
  222. //
  223. #define WOW64_TLS_STACKPTR64 0 // contains 64-bit stack ptr when simulating 32-bit code
  224. #define WOW64_TLS_CPURESERVED 1 // per-thread data for the CPU simulator
  225. #define WOW64_TLS_INCPUSIMULATION 2 // Set when inside the CPU
  226. #define WOW64_TLS_TEMPLIST 3 // List of memory allocated in thunk call.
  227. #define WOW64_TLS_EXCEPTIONADDR 4 // 32-bit exception address (used during exception unwinds)
  228. #define WOW64_TLS_USERCALLBACKDATA 5 // Used by win32k callbacks
  229. #define WOW64_TLS_EXTENDED_FLOAT 6 // Used in ia64 to pass in floating point
  230. #define WOW64_TLS_APCLIST 7 // List of outstanding usermode APCs
  231. #define WOW64_TLS_FILESYSREDIR 8 // Used to enable/disable the filesystem redirector
  232. #define WOW64_TLS_LASTWOWCALL 9 // Pointer to the last wow call struct (Used when wowhistory is enabled)
  233. #define WOW64_TLS_WOW64INFO 10 // Wow64Info address (structure shared between 32-bit and 64-bit code inside Wow64).
  234. #define WOW64_TLS_INITIAL_TEB32 11 // A pointer to the 32-bit initial TEB
  235. // VOID Wow64TlsSetValue(DWORD dwIndex, LPVOID lpTlsValue);
  236. #define Wow64TlsSetValue(dwIndex, lpTlsValue) \
  237. NtCurrentTeb()->TlsSlots[dwIndex] = lpTlsValue;
  238. // LPVOID Wow64TlsGetValue(DWORD dwIndex);
  239. #define Wow64TlsGetValue(dwIndex) \
  240. (NtCurrentTeb()->TlsSlots[dwIndex])
  241. //
  242. // 32-to-64 thunk routine
  243. //
  244. LONG
  245. WOW64DLLAPI
  246. Wow64SystemService(
  247. IN ULONG ServiceNumber,
  248. IN PCONTEXT32 Context32
  249. );
  250. //
  251. // Wow64RaiseException
  252. //
  253. WOW64DLLAPI
  254. NTSTATUS
  255. Wow64RaiseException(
  256. IN DWORD InterruptNumber,
  257. IN OUT PEXCEPTION_RECORD ExceptionRecord);
  258. //
  259. // Helper routines, called from the thunks
  260. //
  261. #define CHILD_PROCESS_SIGNATURE 0xff00ff0011001100
  262. typedef struct _ChildProcessInfo {
  263. ULONG_PTR Signature;
  264. PPEB32 pPeb32;
  265. SECTION_IMAGE_INFORMATION ImageInformation;
  266. ULONG_PTR TailSignature;
  267. } CHILD_PROCESS_INFO, *PCHILD_PROCESS_INFO;
  268. PVOID
  269. WOW64DLLAPI
  270. Wow64AllocateTemp(
  271. SIZE_T Size
  272. );
  273. NTSTATUS
  274. WOW64DLLAPI
  275. Wow64QueryBasicInformationThread(
  276. IN HANDLE Thread,
  277. OUT PTHREAD_BASIC_INFORMATION ThreadInfo
  278. );
  279. WOW64DLLAPI
  280. NTSTATUS
  281. Wow64NtCreateThread(
  282. OUT PHANDLE ThreadHandle,
  283. IN ACCESS_MASK DesiredAccess,
  284. IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
  285. IN HANDLE ProcessHandle,
  286. OUT PCLIENT_ID ClientId,
  287. IN PCONTEXT ThreadContext,
  288. IN PINITIAL_TEB InitialTeb,
  289. IN BOOLEAN CreateSuspended
  290. );
  291. WOW64DLLAPI
  292. NTSTATUS
  293. Wow64NtTerminateThread(
  294. HANDLE ThreadHandle,
  295. NTSTATUS ExitStatus
  296. );
  297. VOID
  298. Wow64BaseFreeStackAndTerminate(
  299. IN PVOID OldStack,
  300. IN ULONG ExitCode
  301. );
  302. VOID
  303. Wow64BaseSwitchStackThenTerminate (
  304. IN PVOID StackLimit,
  305. IN PVOID NewStack,
  306. IN ULONG ExitCode
  307. );
  308. NTSTATUS
  309. Wow64NtContinue(
  310. IN PCONTEXT ContextRecord, // really a PCONTEXT32
  311. IN BOOLEAN TestAlert
  312. );
  313. NTSTATUS
  314. WOW64DLLAPI
  315. Wow64SuspendThread(
  316. IN HANDLE ThreadHandle,
  317. OUT PULONG PreviousSuspendCount OPTIONAL
  318. );
  319. NTSTATUS
  320. WOW64DLLAPI
  321. Wow64GetContextThread(
  322. IN HANDLE ThreadHandle,
  323. IN OUT PCONTEXT ThreadContext // really a PCONTEXT32
  324. );
  325. NTSTATUS
  326. WOW64DLLAPI
  327. Wow64SetContextThread(
  328. IN HANDLE ThreadHandle,
  329. IN PCONTEXT ThreadContext // really a PCONTEXT32
  330. );
  331. NTSTATUS
  332. Wow64KiRaiseException(
  333. IN PEXCEPTION_RECORD ExceptionRecord,
  334. IN PCONTEXT ContextRecord,
  335. IN BOOLEAN FirstChance
  336. );
  337. ULONG
  338. Wow64SetupApcCall(
  339. IN ULONG NormalRoutine,
  340. IN PCONTEXT32 NormalContext,
  341. IN ULONG Arg1,
  342. IN ULONG Arg2
  343. );
  344. VOID
  345. ThunkExceptionRecord64To32(
  346. IN PEXCEPTION_RECORD pRecord64,
  347. OUT PEXCEPTION_RECORD32 pRecord32
  348. );
  349. BOOLEAN
  350. Wow64NotifyDebugger(
  351. IN PEXCEPTION_RECORD ExceptionRecord,
  352. IN BOOLEAN FirstChance
  353. );
  354. VOID
  355. Wow64SetupExceptionDispatch(
  356. IN PEXCEPTION_RECORD32 pRecord32,
  357. IN PCONTEXT32 pContext32
  358. );
  359. VOID
  360. Wow64NotifyDebuggerHelper(
  361. IN PEXCEPTION_RECORD ExceptionRecord,
  362. IN BOOLEAN FirstChance
  363. );
  364. NTSTATUS
  365. Wow64InitializeEmulatedSystemInformation(
  366. VOID
  367. );
  368. PWOW64_SYSTEM_INFORMATION
  369. Wow64GetEmulatedSystemInformation(
  370. VOID
  371. );
  372. PWOW64_SYSTEM_INFORMATION
  373. Wow64GetRealSystemInformation(
  374. VOID
  375. );
  376. VOID
  377. Wow64Shutdown(
  378. HANDLE ProcessHandle
  379. );
  380. NTSTATUS
  381. Wow64NtCreateFile(
  382. OUT PHANDLE FileHandle,
  383. IN ACCESS_MASK DesiredAccess,
  384. IN POBJECT_ATTRIBUTES ObjectAttributes,
  385. OUT PIO_STATUS_BLOCK IoStatusBlock,
  386. IN PLARGE_INTEGER AllocationSize OPTIONAL,
  387. IN ULONG FileAttributes,
  388. IN ULONG ShareAccess,
  389. IN ULONG CreateDisposition,
  390. IN ULONG CreateOptions,
  391. IN PVOID EaBuffer OPTIONAL,
  392. IN ULONG EaLength
  393. );
  394. NTSTATUS
  395. Wow64NtOpenFile(
  396. OUT PHANDLE FileHandle,
  397. IN ACCESS_MASK DesiredAccess,
  398. IN POBJECT_ATTRIBUTES ObjectAttributes,
  399. OUT PIO_STATUS_BLOCK IoStatusBlock,
  400. IN ULONG ShareAccess,
  401. IN ULONG OpenOptions
  402. );
  403. BOOL
  404. InitWow64Shim ( );
  405. BOOL
  406. CloseWow64Shim ( );
  407. // Defines the argsize of the emulated machine
  408. #define ARGSIZE 4
  409. VOID
  410. ThunkPeb64ToPeb32(
  411. IN PPEB Peb64,
  412. OUT PPEB32 Peb32
  413. );
  414. extern RTL_CRITICAL_SECTION HandleDataCriticalSection;
  415. #endif // _WOW64_INCLUDE