Source code of Windows XP (NT5)
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.

359 lines
6.5 KiB

  1. /*++
  2. Copyright (c) 1999 Microsoft Corporation
  3. Module Name:
  4. impl.h
  5. Abstract:
  6. OS-specific thunks.
  7. Author:
  8. Matthew D Hendel (math) 20-Sept-1999
  9. Revision History:
  10. --*/
  11. #pragma once
  12. //
  13. // dbghelp routines
  14. //
  15. typedef
  16. BOOL
  17. (WINAPI * MINI_DUMP_READ_DUMP_STREAM) (
  18. IN PVOID Base,
  19. ULONG StreamNumber,
  20. OUT PMINIDUMP_DIRECTORY * Dir, OPTIONAL
  21. OUT PVOID * Stream, OPTIONAL
  22. OUT ULONG * StreamSize OPTIONAL
  23. );
  24. typedef
  25. BOOL
  26. (WINAPI * MINI_DUMP_WRITE_DUMP) (
  27. IN HANDLE hProcess,
  28. IN DWORD ProcessId,
  29. IN HANDLE hFile,
  30. IN MINIDUMP_TYPE DumpType,
  31. IN CONST PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam, OPTIONAL
  32. IN CONST PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam, OPTIONAL
  33. IN CONST PMINIDUMP_CALLBACK_INFORMATION CallbackParam OPTIONAL
  34. );
  35. extern MINI_DUMP_READ_DUMP_STREAM xxxReadDumpStream;
  36. extern MINI_DUMP_WRITE_DUMP xxxWriteDump;
  37. //
  38. // PSAPI APIs.
  39. //
  40. typedef
  41. BOOL
  42. (WINAPI *
  43. ENUM_PROCESS_MODULES) (
  44. HANDLE hProcess,
  45. HMODULE *lphModule,
  46. DWORD cb,
  47. LPDWORD lpcbNeeded
  48. );
  49. typedef
  50. DWORD
  51. (WINAPI *
  52. GET_MODULE_FILE_NAME_EX_W) (
  53. HANDLE hProcess,
  54. HMODULE hModule,
  55. LPWSTR lpFilename,
  56. DWORD nSize
  57. );
  58. extern ENUM_PROCESS_MODULES xxxEnumProcessModules;
  59. extern GET_MODULE_FILE_NAME_EX_W xxxGetModuleFileNameExW;
  60. #define EnumProcessModules xxxEnumProcessModules
  61. #define GetModuleFileNameExW xxxGetModuleFileNameExW
  62. //
  63. // Functions exportd from impl.c
  64. //
  65. BOOL
  66. MiniDumpSetup(
  67. );
  68. VOID
  69. MiniDumpFree(
  70. );
  71. //
  72. // Redirect the NT APIs since we don't want dbghelp to link to NTDLL directly
  73. //
  74. typedef LONG NTSTATUS;
  75. typedef
  76. NTSTATUS
  77. (WINAPI *
  78. NT_OPEN_THREAD) (
  79. PHANDLE ThreadHandle,
  80. ULONG Mask,
  81. PVOID Attributes,
  82. PVOID ClientId
  83. );
  84. typedef
  85. NTSTATUS
  86. (WINAPI *
  87. NT_QUERY_SYSTEM_INFORMATION) (
  88. IN INT SystemInformationClass,
  89. OUT PVOID SystemInformation,
  90. IN ULONG SystemInformationLength,
  91. OUT PULONG ReturnLength OPTIONAL
  92. );
  93. typedef
  94. NTSTATUS
  95. (WINAPI *
  96. NT_QUERY_INFORMATION_PROCESS) (
  97. IN HANDLE ProcessHandle,
  98. IN INT ProcessInformationClass,
  99. OUT PVOID ProcessInformation,
  100. IN ULONG ProcessInformationLength,
  101. OUT PULONG ReturnLength OPTIONAL
  102. );
  103. typedef
  104. NTSTATUS
  105. (WINAPI *
  106. NT_QUERY_INFORMATION_THREAD) (
  107. IN HANDLE ThreadHandle,
  108. IN INT ThreadInformationClass,
  109. OUT PVOID ThreadInformation,
  110. IN ULONG ThreadInformationLength,
  111. OUT PULONG ReturnLength OPTIONAL
  112. );
  113. typedef
  114. NTSTATUS
  115. (WINAPI *
  116. NT_QUERY_OBJECT) (
  117. IN HANDLE Handle,
  118. IN INT ObjectInformationClass,
  119. OUT PVOID ObjectInformation,
  120. IN ULONG Length,
  121. OUT PULONG ReturnLength OPTIONAL
  122. );
  123. typedef
  124. BOOLEAN
  125. (NTAPI*
  126. RTL_FREE_HEAP) (
  127. IN PVOID HeapHandle,
  128. IN ULONG Flags,
  129. IN PVOID BaseAddress
  130. );
  131. //
  132. // We will be using the xxx routines instead of the real routines.
  133. //
  134. //
  135. // NTDLL APIs.
  136. //
  137. extern NT_OPEN_THREAD xxxNtOpenThread;
  138. extern NT_QUERY_SYSTEM_INFORMATION xxxNtQuerySystemInformation;
  139. extern NT_QUERY_INFORMATION_PROCESS xxxNtQueryInformationProcess;
  140. extern NT_QUERY_INFORMATION_THREAD xxxNtQueryInformationThread;
  141. extern NT_QUERY_OBJECT xxxNtQueryObject;
  142. extern RTL_FREE_HEAP xxxRtlFreeHeap;
  143. //
  144. // Aliased names, for convienence.
  145. //
  146. #define NtOpenThread xxxNtOpenThread
  147. #define NtQuerySystemInformation xxxNtQuerySystemInformation
  148. #define NtQueryInformationProcess xxxNtQueryInformationProcess
  149. #define NtQueryInformationThread xxxNtQueryInformationThread
  150. #define NtQueryObject xxxNtQueryObject
  151. #define RtlFreeHeap xxxRtlFreeHeap
  152. #if defined (_X86_)
  153. //
  154. // Win64 supports the full NT5 Win32 API and does not have any legacy baggage
  155. // to support. Therefore, we can directly link to all toolhelp, PSAPI and
  156. // imagehlp functions.
  157. //
  158. // On some Win32 platforms, like Win95, Win98 and NT4, either Toolhelp, PSAPI,
  159. // or OpenThread (kernel32) may not be supported. For these platforms,
  160. // redirect these functions to internal APIs that fail gracefully.
  161. //
  162. typedef
  163. HANDLE
  164. (WINAPI *
  165. OPEN_THREAD) (
  166. DWORD dwDesiredAccess,
  167. BOOL bInheritHandle,
  168. DWORD dwThreadId
  169. );
  170. typedef
  171. BOOL
  172. (WINAPI *
  173. THREAD32_FIRST) (
  174. HANDLE hSnapshot,
  175. PVOID ThreadEntry
  176. );
  177. typedef
  178. BOOL
  179. (WINAPI *
  180. THREAD32_NEXT) (
  181. HANDLE hSnapshot,
  182. PVOID ThreadEntry
  183. );
  184. typedef
  185. BOOL
  186. (WINAPI *
  187. MODULE32_FIRST) (
  188. HANDLE hSnapshot,
  189. PVOID Module
  190. );
  191. typedef
  192. BOOL
  193. (WINAPI *
  194. MODULE32_NEXT) (
  195. HANDLE hSnapshot,
  196. PVOID Module
  197. );
  198. typedef
  199. HANDLE
  200. (WINAPI *
  201. CREATE_TOOLHELP32_SNAPSHOT) (
  202. DWORD dwFlags,
  203. DWORD th32ProcessID
  204. );
  205. typedef
  206. DWORD
  207. (WINAPI *
  208. GET_LONG_PATH_NAME_A) (
  209. LPCSTR lpszShortPath,
  210. LPSTR lpszLongPath,
  211. DWORD cchBuffer
  212. );
  213. typedef
  214. DWORD
  215. (WINAPI *
  216. GET_LONG_PATH_NAME_W) (
  217. LPCWSTR lpszShortPath,
  218. LPWSTR lpszLongPath,
  219. DWORD cchBuffer
  220. );
  221. struct _IMAGE_NT_HEADERS*
  222. xxxImageNtHeader (
  223. IN PVOID Base
  224. );
  225. PVOID
  226. xxxImageDirectoryEntryToData (
  227. IN PVOID Base,
  228. IN BOOLEAN MappedAsImage,
  229. IN USHORT DirectoryEntry,
  230. OUT PULONG Size
  231. );
  232. //
  233. // We will be using the xxx routines instead of the real routines.
  234. //
  235. //
  236. // Kernel32 APIs.
  237. //
  238. extern OPEN_THREAD xxxOpenThread;
  239. extern THREAD32_FIRST xxxThread32First;
  240. extern THREAD32_NEXT xxxThread32Next;
  241. extern MODULE32_FIRST xxxModule32First;
  242. extern MODULE32_NEXT xxxModule32Next;
  243. extern MODULE32_FIRST xxxModule32FirstW;
  244. extern MODULE32_NEXT xxxModule32NextW;
  245. extern CREATE_TOOLHELP32_SNAPSHOT xxxCreateToolhelp32Snapshot;
  246. extern GET_LONG_PATH_NAME_A xxxGetLongPathNameA;
  247. extern GET_LONG_PATH_NAME_W xxxGetLongPathNameW;
  248. //
  249. // Aliased names, for convienence.
  250. //
  251. #define OpenThread xxxOpenThread
  252. #define Thread32First xxxThread32First
  253. #define Thread32Next xxxThread32Next
  254. #define Module32First xxxModule32First
  255. #define Module32Next xxxModule32Next
  256. #define Module32FirstW xxxModule32FirstW
  257. #define Module32NextW xxxModule32NextW
  258. #define CreateToolhelp32Snapshot xxxCreateToolhelp32Snapshot
  259. #define GetLongPathNameA xxxGetLongPathNameA
  260. #define GetLongPathNameW xxxGetLongPathNameW
  261. //
  262. // Imagehlp functions.
  263. //
  264. #define ImageNtHeader xxxImageNtHeader
  265. #define ImageDirectoryEntryToData xxxImageDirectoryEntryToData
  266. //
  267. // For Win9x support
  268. //
  269. wchar_t *
  270. __cdecl
  271. xxx_wcscpy(
  272. wchar_t * dst,
  273. const wchar_t * src
  274. );
  275. LPWSTR
  276. WINAPI
  277. xxx_lstrcpynW(
  278. OUT LPWSTR lpString1,
  279. IN LPCWSTR lpString2,
  280. IN int iMaxLength
  281. );
  282. size_t
  283. __cdecl
  284. xxx_wcslen (
  285. const wchar_t * wcs
  286. );
  287. #define wcslen xxx_wcslen
  288. #define strlenW xxx_wcslen
  289. #define lstrlenW xxx_wcslen
  290. #define wcscpy xxx_wcscpy
  291. #define strcpyW xxx_wcscpy
  292. #define lstrcpyW xxx_wcscpy
  293. #define lstrcpynW xxx_lstrcpynW
  294. #endif //!X86