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.

1715 lines
43 KiB

  1. // RegIntercept.cpp: implementation of the CRegIntercept class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include <windows.h>
  5. #include <tchar.h>
  6. #include <stdio.h>
  7. #include <conio.h>
  8. #include "RegIntercept.h"
  9. CRegIntercept* CRegIntercept::pRegInterceptInstance=0;
  10. CRegIntercept::CRegIntercept()
  11. {
  12. }
  13. CRegIntercept::~CRegIntercept()
  14. {
  15. }
  16. #define RESTORE_FUNCTION(x, y) {for(int i = 0; i < 2; ((DWORD *)x)[i] = y[i], i++);}
  17. #define INTERCEPT_FUNCTION(x, y) {for(int i = 0; i < 2; ((DWORD *)x)[i] = y[i], i++);}
  18. #define MYAPI NTAPI
  19. /////////////////////////////////////////////////////////////////////
  20. #define BEGIN_NEW_FUNC1(FuncName, t1, p1)\
  21. typedef LONG (MYAPI *INTERCEPTED_##FuncName)(t1 p1);\
  22. \
  23. LONG MYAPI New##FuncName(t1 p1);\
  24. \
  25. LONG gl_ResultOf##FuncName = NULL;\
  26. \
  27. DWORD gl_Backup##FuncName[2] = {0, 0},\
  28. gl_Intercept##FuncName[2] = {0, 0};\
  29. \
  30. INTERCEPTED_##FuncName gl_p##FuncName = NULL; \
  31. \
  32. \
  33. LONG MYAPI New##FuncName(t1 p1) \
  34. {\
  35. RESTORE_FUNCTION(gl_p##FuncName, gl_Backup##FuncName);\
  36. \
  37. gl_ResultOf##FuncName = gl_p##FuncName(p1);
  38. #define BEGIN_NEW_FUNC2(FuncName, t1, p1, t2, p2)\
  39. typedef LONG (MYAPI *INTERCEPTED_##FuncName)(t1 p1, t2 p2);\
  40. \
  41. LONG MYAPI New##FuncName(t1 p1, t2 p2);\
  42. \
  43. LONG gl_ResultOf##FuncName = NULL;\
  44. \
  45. DWORD gl_Backup##FuncName[2] = {0, 0},\
  46. gl_Intercept##FuncName[2] = {0, 0};\
  47. \
  48. INTERCEPTED_##FuncName gl_p##FuncName = NULL; \
  49. \
  50. \
  51. LONG MYAPI New##FuncName(t1 p1, t2 p2) \
  52. {\
  53. RESTORE_FUNCTION(gl_p##FuncName, gl_Backup##FuncName);\
  54. \
  55. gl_ResultOf##FuncName = gl_p##FuncName(p1, p2);
  56. #define BEGIN_NEW_FUNC3(FuncName, t1, p1, t2, p2, t3, p3)\
  57. typedef LONG (MYAPI *INTERCEPTED_##FuncName)(t1 p1, t2 p2, t3 p3);\
  58. \
  59. LONG MYAPI New##FuncName(t1 p1, t2 p2, t3 p3);\
  60. \
  61. LONG gl_ResultOf##FuncName = NULL;\
  62. \
  63. DWORD gl_Backup##FuncName[2] = {0, 0},\
  64. gl_Intercept##FuncName[2] = {0, 0};\
  65. \
  66. INTERCEPTED_##FuncName gl_p##FuncName = NULL; \
  67. \
  68. \
  69. LONG MYAPI New##FuncName(t1 p1, t2 p2, t3 p3) \
  70. {\
  71. RESTORE_FUNCTION(gl_p##FuncName, gl_Backup##FuncName);\
  72. \
  73. gl_ResultOf##FuncName = gl_p##FuncName(p1, p2, p3);
  74. #define BEGIN_NEW_FUNC4(FuncName, t1, p1, t2, p2, t3, p3, t4, p4)\
  75. typedef LONG (MYAPI *INTERCEPTED_##FuncName)(t1 p1, t2 p2, t3 p3, t4 p4);\
  76. \
  77. LONG MYAPI New##FuncName(t1 p1, t2 p2, t3 p3, t4 p4);\
  78. \
  79. LONG gl_ResultOf##FuncName = NULL;\
  80. \
  81. DWORD gl_Backup##FuncName[2] = {0, 0},\
  82. gl_Intercept##FuncName[2] = {0, 0};\
  83. \
  84. INTERCEPTED_##FuncName gl_p##FuncName = NULL; \
  85. \
  86. \
  87. LONG MYAPI New##FuncName(t1 p1, t2 p2, t3 p3, t4 p4) \
  88. {\
  89. RESTORE_FUNCTION(gl_p##FuncName, gl_Backup##FuncName);\
  90. \
  91. gl_ResultOf##FuncName = gl_p##FuncName(p1, p2, p3, p4);
  92. #define BEGIN_NEW_FUNC5(FuncName, t1, p1, t2, p2, t3, p3, t4, p4, t5, p5)\
  93. typedef LONG (MYAPI *INTERCEPTED_##FuncName)(t1 p1, t2 p2, t3 p3, t4 p4, t5 p5);\
  94. \
  95. LONG MYAPI New##FuncName(t1 p1, t2 p2, t3 p3, t4 p4, t5 p5);\
  96. \
  97. LONG gl_ResultOf##FuncName = NULL;\
  98. \
  99. DWORD gl_Backup##FuncName[2] = {0, 0},\
  100. gl_Intercept##FuncName[2] = {0, 0};\
  101. \
  102. INTERCEPTED_##FuncName gl_p##FuncName = NULL; \
  103. \
  104. \
  105. LONG MYAPI New##FuncName(t1 p1, t2 p2, t3 p3, t4 p4, t5 p5) \
  106. {\
  107. RESTORE_FUNCTION(gl_p##FuncName, gl_Backup##FuncName);\
  108. \
  109. gl_ResultOf##FuncName = gl_p##FuncName(p1, p2, p3, p4, p5);
  110. #define BEGIN_NEW_FUNC6(FuncName, t1, p1, t2, p2, t3, p3, t4, p4, t5, p5, t6, p6)\
  111. typedef LONG (MYAPI *INTERCEPTED_##FuncName)(t1 p1, t2 p2, t3 p3, t4 p4, t5 p5, t6 p6);\
  112. \
  113. LONG MYAPI New##FuncName(t1 p1, t2 p2, t3 p3, t4 p4, t5 p5, t6 p6);\
  114. \
  115. LONG gl_ResultOf##FuncName = NULL;\
  116. \
  117. DWORD gl_Backup##FuncName[2] = {0, 0},\
  118. gl_Intercept##FuncName[2] = {0, 0};\
  119. \
  120. INTERCEPTED_##FuncName gl_p##FuncName = NULL; \
  121. \
  122. \
  123. LONG MYAPI New##FuncName(t1 p1, t2 p2, t3 p3, t4 p4, t5 p5, t6 p6) \
  124. {\
  125. RESTORE_FUNCTION(gl_p##FuncName, gl_Backup##FuncName);\
  126. \
  127. gl_ResultOf##FuncName = gl_p##FuncName(p1, p2, p3, p4, p5, p6);
  128. #define BEGIN_NEW_FUNC7(FuncName, t1, p1, t2, p2, t3, p3, t4, p4, t5, p5, t6, p6, t7, p7)\
  129. typedef LONG (MYAPI *INTERCEPTED_##FuncName)(t1 p1, t2 p2, t3 p3, t4 p4, t5 p5, t6 p6, t7 p7);\
  130. \
  131. LONG MYAPI New##FuncName(t1 p1, t2 p2, t3 p3, t4 p4, t5 p5, t6 p6, t7 p7);\
  132. \
  133. LONG gl_ResultOf##FuncName = NULL;\
  134. \
  135. DWORD gl_Backup##FuncName[2] = {0, 0},\
  136. gl_Intercept##FuncName[2] = {0, 0};\
  137. \
  138. INTERCEPTED_##FuncName gl_p##FuncName = NULL; \
  139. \
  140. \
  141. LONG MYAPI New##FuncName(t1 p1, t2 p2, t3 p3, t4 p4, t5 p5, t6 p6, t7 p7) \
  142. {\
  143. RESTORE_FUNCTION(gl_p##FuncName, gl_Backup##FuncName);\
  144. \
  145. gl_ResultOf##FuncName = gl_p##FuncName(p1, p2, p3, p4, p5, p6, p7);
  146. #define BEGIN_NEW_FUNC8(FuncName, t1, p1, t2, p2, t3, p3, t4, p4, t5, p5, t6, p6, t7, p7, t8, p8)\
  147. typedef LONG (MYAPI *INTERCEPTED_##FuncName)(t1 p1, t2 p2, t3 p3, t4 p4, t5 p5, t6 p6, t7 p7, t8 p8);\
  148. \
  149. LONG MYAPI New##FuncName(t1 p1, t2 p2, t3 p3, t4 p4, t5 p5, t6 p6, t7 p7, t8 p8);\
  150. \
  151. LONG gl_ResultOf##FuncName = NULL;\
  152. \
  153. DWORD gl_Backup##FuncName[2] = {0, 0},\
  154. gl_Intercept##FuncName[2] = {0, 0};\
  155. \
  156. INTERCEPTED_##FuncName gl_p##FuncName = NULL; \
  157. \
  158. \
  159. LONG MYAPI New##FuncName(t1 p1, t2 p2, t3 p3, t4 p4, t5 p5, t6 p6, t7 p7, t8 p8) \
  160. {\
  161. RESTORE_FUNCTION(gl_p##FuncName, gl_Backup##FuncName);\
  162. \
  163. gl_ResultOf##FuncName = gl_p##FuncName(p1, p2, p3, p4, p5, p6, p7, p8);
  164. #define BEGIN_NEW_FUNC9(FuncName, t1, p1, t2, p2, t3, p3, t4, p4, t5, p5, t6, p6, t7, p7, t8, p8, t9, p9)\
  165. typedef LONG (MYAPI *INTERCEPTED_##FuncName)(t1 p1, t2 p2, t3 p3, t4 p4, t5 p5, t6 p6, t7 p7, t8 p8, t9 p9);\
  166. \
  167. LONG MYAPI New##FuncName(t1 p1, t2 p2, t3 p3, t4 p4, t5 p5, t6 p6, t7 p7, t8 p8, t9 p9);\
  168. \
  169. LONG gl_ResultOf##FuncName = NULL;\
  170. \
  171. DWORD gl_Backup##FuncName[2] = {0, 0},\
  172. gl_Intercept##FuncName[2] = {0, 0};\
  173. \
  174. INTERCEPTED_##FuncName gl_p##FuncName = NULL; \
  175. \
  176. \
  177. LONG MYAPI New##FuncName(t1 p1, t2 p2, t3 p3, t4 p4, t5 p5, t6 p6, t7 p7, t8 p8, t9 p9) \
  178. {\
  179. RESTORE_FUNCTION(gl_p##FuncName, gl_Backup##FuncName);\
  180. \
  181. gl_ResultOf##FuncName = gl_p##FuncName(p1, p2, p3, p4, p5, p6, p7, p8, p9);
  182. #define BEGIN_NEW_FUNC10(FuncName, t1, p1, t2, p2, t3, p3, t4, p4, t5, p5, t6, p6, t7, p7, t8, p8, t9, p9, t10, p10)\
  183. typedef LONG (MYAPI *INTERCEPTED_##FuncName)(t1 p1, t2 p2, t3 p3, t4 p4, t5 p5, t6 p6, t7 p7, t8 p8, t9 p9, t10 p10);\
  184. \
  185. LONG MYAPI New##FuncName(t1 p1, t2 p2, t3 p3, t4 p4, t5 p5, t6 p6, t7 p7, t8 p8, t9 p9, t10 p10);\
  186. \
  187. LONG gl_ResultOf##FuncName = NULL;\
  188. \
  189. DWORD gl_Backup##FuncName[2] = {0, 0},\
  190. gl_Intercept##FuncName[2] = {0, 0};\
  191. \
  192. INTERCEPTED_##FuncName gl_p##FuncName = NULL; \
  193. \
  194. \
  195. LONG MYAPI New##FuncName(t1 p1, t2 p2, t3 p3, t4 p4, t5 p5, t6 p6, t7 p7, t8 p8, t9 p9, t10 p10) \
  196. {\
  197. RESTORE_FUNCTION(gl_p##FuncName, gl_Backup##FuncName);\
  198. \
  199. gl_ResultOf##FuncName = gl_p##FuncName(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10);
  200. #define BEGIN_NEW_FUNC11(FuncName, t1, p1, t2, p2, t3, p3, t4, p4, t5, p5, t6, p6, t7, p7, t8, p8, t9, p9, t10, p10, t11, p11)\
  201. typedef LONG (MYAPI *INTERCEPTED_##FuncName)(t1 p1, t2 p2, t3 p3, t4 p4, t5 p5, t6 p6, t7 p7, t8 p8, t9 p9, t10 p10, t11 p11);\
  202. \
  203. LONG MYAPI New##FuncName(t1 p1, t2 p2, t3 p3, t4 p4, t5 p5, t6 p6, t7 p7, t8 p8, t9 p9, t10 p10, t11 p11);\
  204. \
  205. LONG gl_ResultOf##FuncName = NULL;\
  206. \
  207. DWORD gl_Backup##FuncName[2] = {0, 0},\
  208. gl_Intercept##FuncName[2] = {0, 0};\
  209. \
  210. INTERCEPTED_##FuncName gl_p##FuncName = NULL; \
  211. \
  212. \
  213. LONG MYAPI New##FuncName(t1 p1, t2 p2, t3 p3, t4 p4, t5 p5, t6 p6, t7 p7, t8 p8, t9 p9, t10 p10, t11 p11) \
  214. {\
  215. RESTORE_FUNCTION(gl_p##FuncName, gl_Backup##FuncName);\
  216. \
  217. gl_ResultOf##FuncName = gl_p##FuncName(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11);
  218. #define BEGIN_NEW_FUNC12(FuncName, t1, p1, t2, p2, t3, p3, t4, p4, t5, p5, t6, p6, t7, p7, t8, p8, t9, p9, t10, p10, t11, p11, t12, p12)\
  219. typedef LONG (MYAPI *INTERCEPTED_##FuncName)(t1 p1, t2 p2, t3 p3, t4 p4, t5 p5, t6 p6, t7 p7, t8 p8, t9 p9, t10 p10, t11 p11, t12 p12);\
  220. \
  221. LONG MYAPI New##FuncName(t1 p1, t2 p2, t3 p3, t4 p4, t5 p5, t6 p6, t7 p7, t8 p8, t9 p9, t10 p10, t11 p11, t12 p12);\
  222. \
  223. LONG gl_ResultOf##FuncName = NULL;\
  224. \
  225. DWORD gl_Backup##FuncName[2] = {0, 0},\
  226. gl_Intercept##FuncName[2] = {0, 0};\
  227. \
  228. INTERCEPTED_##FuncName gl_p##FuncName = NULL; \
  229. \
  230. \
  231. LONG MYAPI New##FuncName(t1 p1, t2 p2, t3 p3, t4 p4, t5 p5, t6 p6, t7 p7, t8 p8, t9 p9, t10 p10, t11 p11, t12 p12) \
  232. {\
  233. RESTORE_FUNCTION(gl_p##FuncName, gl_Backup##FuncName);\
  234. \
  235. gl_ResultOf##FuncName = gl_p##FuncName(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12);
  236. /////////////////////////////////////////////////////////////////////
  237. #define OVERIDE_INST CRegIntercept::pRegInterceptInstance
  238. #define OVR_FUNC1(FuncName, t1, p1) \
  239. BEGIN_NEW_FUNC1(FuncName, t1, p1) \
  240. if (OVERIDE_INST) \
  241. OVERIDE_INST->FuncName(p1); \
  242. END_NEW_FUNC(FuncName)
  243. #define OVR_FUNC2(FuncName, t1, p1, t2, p2) \
  244. BEGIN_NEW_FUNC2(FuncName, t1, p1, t2, p2) \
  245. if (OVERIDE_INST) \
  246. OVERIDE_INST->FuncName(p1, p2); \
  247. END_NEW_FUNC(FuncName)
  248. #define OVR_FUNC3(FuncName, t1, p1, t2, p2, t3, p3) \
  249. BEGIN_NEW_FUNC3(FuncName, t1, p1, t2, p2, t3, p3) \
  250. if (OVERIDE_INST) \
  251. OVERIDE_INST->FuncName(p1, p2, p3); \
  252. END_NEW_FUNC(FuncName)
  253. #define OVR_FUNC4(FuncName, t1, p1, t2, p2, t3, p3, t4, p4) \
  254. BEGIN_NEW_FUNC4(FuncName, t1, p1, t2, p2, t3, p3, t4, p4) \
  255. if (OVERIDE_INST) \
  256. OVERIDE_INST->FuncName(p1, p2, p3, p4); \
  257. END_NEW_FUNC(FuncName)
  258. #define OVR_FUNC5(FuncName, t1, p1, t2, p2, t3, p3, t4, p4, t5, p5) \
  259. BEGIN_NEW_FUNC5(FuncName, t1, p1, t2, p2, t3, p3, t4, p4, t5, p5) \
  260. if (OVERIDE_INST) \
  261. OVERIDE_INST->FuncName(p1, p2, p3, p4, p5); \
  262. END_NEW_FUNC(FuncName)
  263. #define OVR_FUNC6(FuncName, t1, p1, t2, p2, t3, p3, t4, p4, t5, p5, t6, p6) \
  264. BEGIN_NEW_FUNC6(FuncName, t1, p1, t2, p2, t3, p3, t4, p4, t5, p5, t6, p6) \
  265. if (OVERIDE_INST) \
  266. OVERIDE_INST->FuncName(p1, p2, p3, p4, p5, p6); \
  267. END_NEW_FUNC(FuncName)
  268. #define OVR_FUNC7(FuncName, t1, p1, t2, p2, t3, p3, t4, p4, t5, p5, t6, p6, t7, p7) \
  269. BEGIN_NEW_FUNC7(FuncName, t1, p1, t2, p2, t3, p3, t4, p4, t5, p5, t6, p6, t7, p7) \
  270. if (OVERIDE_INST) \
  271. OVERIDE_INST->FuncName(p1, p2, p3, p4, p5, p6, p7); \
  272. END_NEW_FUNC(FuncName)
  273. #define OVR_FUNC8(FuncName, t1, p1, t2, p2, t3, p3, t4, p4, t5, p5, t6, p6, t7, p7, t8, p8) \
  274. BEGIN_NEW_FUNC8(FuncName, t1, p1, t2, p2, t3, p3, t4, p4, t5, p5, t6, p6, t7, p7, t8, p8) \
  275. if (OVERIDE_INST) \
  276. OVERIDE_INST->FuncName(p1, p2, p3, p4, p5, p6, p7, p8); \
  277. END_NEW_FUNC(FuncName)
  278. #define OVR_FUNC9(FuncName, t1, p1, t2, p2, t3, p3, t4, p4, t5, p5, t6, p6, t7, p7, t8, p8, t9, p9) \
  279. BEGIN_NEW_FUNC9(FuncName, t1, p1, t2, p2, t3, p3, t4, p4, t5, p5, t6, p6, t7, p7, t8, p8, t9, p9) \
  280. if (OVERIDE_INST) \
  281. OVERIDE_INST->FuncName(p1, p2, p3, p4, p5, p6, p7, p8, p9); \
  282. END_NEW_FUNC(FuncName)
  283. #define OVR_FUNC10(FuncName, t1, p1, t2, p2, t3, p3, t4, p4, t5, p5, t6, p6, t7, p7, t8, p8, t9, p9, t10, p10) \
  284. BEGIN_NEW_FUNC10(FuncName, t1, p1, t2, p2, t3, p3, t4, p4, t5, p5, t6, p6, t7, p7, t8, p8, t9, p9, t10, p10) \
  285. if (OVERIDE_INST) \
  286. OVERIDE_INST->FuncName(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10); \
  287. END_NEW_FUNC(FuncName)
  288. #define OVR_FUNC11(FuncName, t1, p1, t2, p2, t3, p3, t4, p4, t5, p5, t6, p6, t7, p7, t8, p8, t9, p9, t10, p10, t11, p11) \
  289. BEGIN_NEW_FUNC11(FuncName, t1, p1, t2, p2, t3, p3, t4, p4, t5, p5, t6, p6, t7, p7, t8, p8, t9, p9, t10, p10, t11, p11) \
  290. if (OVERIDE_INST) \
  291. OVERIDE_INST->FuncName(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11); \
  292. END_NEW_FUNC(FuncName)
  293. #define OVR_FUNC12(FuncName, t1, p1, t2, p2, t3, p3, t4, p4, t5, p5, t6, p6, t7, p7, t8, p8, t9, p9, t10, p10, t11, p11, t12, p12) \
  294. BEGIN_NEW_FUNC12(FuncName, t1, p1, t2, p2, t3, p3, t4, p4, t5, p5, t6, p6, t7, p7, t8, p8, t9, p9, t10, p10, t11, p11, t12, p12) \
  295. if (OVERIDE_INST) \
  296. OVERIDE_INST->FuncName(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12); \
  297. END_NEW_FUNC(FuncName)
  298. #define END_NEW_FUNC(FuncName) \
  299. INTERCEPT_FUNCTION(gl_p##FuncName, gl_Intercept##FuncName);\
  300. return gl_ResultOf##FuncName;\
  301. }
  302. /////////////////////////////////////////////////////////////////////
  303. #define INTERCEPT(FuncName) \
  304. gl_p##FuncName = (INTERCEPTED_##FuncName)GetProcAddress(hKernel32, #FuncName);\
  305. if(!gl_p##FuncName)\
  306. return FALSE;\
  307. \
  308. ::VirtualProtect(gl_p##FuncName, 10, PAGE_EXECUTE_READWRITE, &dwResult);\
  309. \
  310. ((BYTE *)gl_Intercept##FuncName)[0] = 0xE9;\
  311. ((DWORD *)(((BYTE *)gl_Intercept##FuncName) + 1))[0] = DWORD(New##FuncName) - (DWORD(gl_p##FuncName) + 5);\
  312. \
  313. for(int i = 0; i < 2; gl_Backup##FuncName[i] = ((DWORD *)gl_p##FuncName)[i], \
  314. ((DWORD *)gl_p##FuncName)[i] = gl_Intercept##FuncName[i], i++)
  315. #define RESTORE(FuncName) RESTORE_FUNCTION(gl_p##FuncName, gl_Backup##FuncName)
  316. ////////////////////////////////////////////////////////////////////////////////
  317. ////////////////////////////////////////////////////////////////////////////////
  318. //Registry Access
  319. ////////////////////////////////////////////////////////////////////////////////
  320. //NTSYSCALLAPI
  321. NTSTATUS
  322. NTAPI
  323. NtCreateKey(
  324. OUT PHANDLE KeyHandle,
  325. IN ACCESS_MASK DesiredAccess,
  326. IN POBJECT_ATTRIBUTES ObjectAttributes,
  327. IN ULONG TitleIndex,
  328. IN PUNICODE_STRING Class OPTIONAL,
  329. IN ULONG CreateOptions,
  330. OUT PULONG Disposition OPTIONAL
  331. );
  332. //NTSYSCALLAPI
  333. NTSTATUS
  334. NTAPI
  335. NtDeleteKey(
  336. IN HANDLE KeyHandle
  337. );
  338. //NTSYSCALLAPI
  339. NTSTATUS
  340. NTAPI
  341. NtDeleteValueKey(
  342. IN HANDLE KeyHandle,
  343. IN PUNICODE_STRING ValueName
  344. );
  345. //NTSYSCALLAPI
  346. NTSTATUS
  347. NTAPI
  348. NtEnumerateKey(
  349. IN HANDLE KeyHandle,
  350. IN ULONG Index,
  351. IN KEY_INFORMATION_CLASS KeyInformationClass,
  352. OUT PVOID KeyInformation,
  353. IN ULONG Length,
  354. OUT PULONG ResultLength
  355. );
  356. //NTSYSCALLAPI
  357. NTSTATUS
  358. NTAPI
  359. NtEnumerateValueKey(
  360. IN HANDLE KeyHandle,
  361. IN ULONG Index,
  362. IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
  363. OUT PVOID KeyValueInformation,
  364. IN ULONG Length,
  365. OUT PULONG ResultLength
  366. );
  367. //NTSYSCALLAPI
  368. NTSTATUS
  369. NTAPI
  370. NtOpenKey(
  371. OUT PHANDLE KeyHandle,
  372. IN ACCESS_MASK DesiredAccess,
  373. IN POBJECT_ATTRIBUTES ObjectAttributes
  374. );
  375. //NTSYSCALLAPI
  376. NTSTATUS
  377. NTAPI
  378. NtQueryKey(
  379. IN HANDLE KeyHandle,
  380. IN KEY_INFORMATION_CLASS KeyInformationClass,
  381. OUT PVOID KeyInformation,
  382. IN ULONG Length,
  383. OUT PULONG ResultLength
  384. );
  385. //NTSYSCALLAPI
  386. NTSTATUS
  387. NTAPI
  388. NtQueryValueKey(
  389. IN HANDLE KeyHandle,
  390. IN PUNICODE_STRING ValueName,
  391. IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
  392. OUT PVOID KeyValueInformation,
  393. IN ULONG Length,
  394. OUT PULONG ResultLength
  395. );
  396. //NTSYSCALLAPI
  397. NTSTATUS
  398. NTAPI
  399. NtQueryMultipleValueKey(
  400. IN HANDLE KeyHandle,
  401. IN OUT PKEY_VALUE_ENTRY ValueEntries,
  402. IN ULONG EntryCount,
  403. OUT PVOID ValueBuffer,
  404. IN OUT PULONG BufferLength,
  405. OUT OPTIONAL PULONG RequiredBufferLength
  406. );
  407. NTSTATUS
  408. NTAPI
  409. NtSetValueKey(
  410. IN HANDLE KeyHandle,
  411. IN PUNICODE_STRING ValueName,
  412. IN ULONG TitleIndex OPTIONAL,
  413. IN ULONG Type,
  414. IN PVOID Data,
  415. IN ULONG DataSize
  416. );
  417. ////////////////////////////////////////////////////////////////////////////////
  418. //File System Access
  419. ////////////////////////////////////////////////////////////////////////////////
  420. NTSTATUS
  421. NTAPI
  422. NtDeleteFile(
  423. IN POBJECT_ATTRIBUTES ObjectAttributes
  424. );
  425. NTSTATUS
  426. NTAPI
  427. NtQueryAttributesFile(
  428. IN POBJECT_ATTRIBUTES ObjectAttributes,
  429. OUT PFILE_BASIC_INFORMATION FileInformation
  430. );
  431. NTSTATUS
  432. NTAPI
  433. NtQueryFullAttributesFile(
  434. IN POBJECT_ATTRIBUTES ObjectAttributes,
  435. OUT PFILE_NETWORK_OPEN_INFORMATION FileInformation
  436. );
  437. NTSTATUS
  438. NTAPI
  439. NtCreateFile(
  440. OUT PHANDLE FileHandle,
  441. IN ACCESS_MASK DesiredAccess,
  442. IN POBJECT_ATTRIBUTES ObjectAttributes,
  443. OUT PIO_STATUS_BLOCK IoStatusBlock,
  444. IN PLARGE_INTEGER AllocationSize OPTIONAL,
  445. IN ULONG FileAttributes,
  446. IN ULONG ShareAccess,
  447. IN ULONG CreateDisposition,
  448. IN ULONG CreateOptions,
  449. IN PVOID EaBuffer OPTIONAL,
  450. IN ULONG EaLength
  451. );
  452. NTSTATUS
  453. NTAPI
  454. NtOpenFile(
  455. OUT PHANDLE FileHandle,
  456. IN ACCESS_MASK DesiredAccess,
  457. IN POBJECT_ATTRIBUTES ObjectAttributes,
  458. OUT PIO_STATUS_BLOCK IoStatusBlock,
  459. IN ULONG ShareAccess,
  460. IN ULONG OpenOptions
  461. );
  462. /*
  463. NTSYSCALLAPI
  464. NTSTATUS
  465. NTAPI
  466. NtReadFile(
  467. IN HANDLE FileHandle,
  468. IN HANDLE Event OPTIONAL,
  469. IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
  470. IN PVOID ApcContext OPTIONAL,
  471. OUT PIO_STATUS_BLOCK IoStatusBlock,
  472. OUT PVOID Buffer,
  473. IN ULONG Length,
  474. IN PLARGE_INTEGER ByteOffset OPTIONAL,
  475. IN PULONG Key OPTIONAL
  476. );
  477. */
  478. NTSTATUS
  479. NTAPI
  480. NtQueryInformationFile(
  481. IN HANDLE FileHandle,
  482. OUT PIO_STATUS_BLOCK IoStatusBlock,
  483. OUT PVOID FileInformation,
  484. IN ULONG Length,
  485. IN FILE_INFORMATION_CLASS FileInformationClass
  486. );
  487. NTSTATUS
  488. NTAPI
  489. NtSetInformationFile(
  490. IN HANDLE FileHandle,
  491. OUT PIO_STATUS_BLOCK IoStatusBlock,
  492. IN PVOID FileInformation,
  493. IN ULONG Length,
  494. IN FILE_INFORMATION_CLASS FileInformationClass
  495. );
  496. ////////////////////////////////////////////////////////////////////////////////
  497. //Driver Related
  498. ////////////////////////////////////////////////////////////////////////////////
  499. //NTSYSCALLAPI
  500. NTSTATUS
  501. NTAPI
  502. NtLoadDriver(
  503. IN PUNICODE_STRING DriverServiceName
  504. );
  505. /*
  506. //NTSYSCALLAPI
  507. NTSTATUS
  508. NTAPI
  509. NtDeviceIoControlFile(
  510. IN HANDLE FileHandle,
  511. IN HANDLE Event OPTIONAL,
  512. IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
  513. IN PVOID ApcContext OPTIONAL,
  514. OUT PIO_STATUS_BLOCK IoStatusBlock,
  515. IN ULONG IoControlCode,
  516. IN PVOID InputBuffer OPTIONAL,
  517. IN ULONG InputBufferLength,
  518. OUT PVOID OutputBuffer OPTIONAL,
  519. IN ULONG OutputBufferLength
  520. );
  521. //NTSYSCALLAPI
  522. NTSTATUS
  523. NTAPI
  524. NtFsControlFile(
  525. IN HANDLE FileHandle,
  526. IN HANDLE Event OPTIONAL,
  527. IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
  528. IN PVOID ApcContext OPTIONAL,
  529. OUT PIO_STATUS_BLOCK IoStatusBlock,
  530. IN ULONG FsControlCode,
  531. IN PVOID InputBuffer OPTIONAL,
  532. IN ULONG InputBufferLength,
  533. OUT PVOID OutputBuffer OPTIONAL,
  534. IN ULONG OutputBufferLength
  535. );
  536. */
  537. ////////////////////////////////////////////////////////////////////////////////
  538. //Misc System Functions
  539. ////////////////////////////////////////////////////////////////////////////////
  540. /*
  541. NtGetPlugPlayEvent
  542. NtPlugPlayControl*
  543. NtCreateDirectoryObject*
  544. NtCreateSymbolicLinkObject*
  545. NtOpenDirectoryObject*
  546. NtOpenSymbolicLinkObject*
  547. NtQueryObject
  548. NtCreatePort
  549. NtCreateWaitablePort
  550. NtConnectPort
  551. .<a lot more of them>
  552. NtCreateProcess*
  553. NtCreateProcessEx*
  554. NtCreateThread*
  555. NtOpenProcess*
  556. NtOpenThread*
  557. NtQueryDefaultLocale*
  558. NtSetDefaultLocale*
  559. NtQuerySystemEnvironmentValue*
  560. NtSetSystemEnvironmentValue*
  561. NtCreateTimer*
  562. NtOpenTimer*
  563. NtQuerySystemTime*
  564. NtSetSystemTime*
  565. NtGetTickCount
  566. NtWaitForSingleObject*
  567. NtWaitForMultipleObjects*
  568. NtSignalAndWaitForSingleObject*
  569. NtCreateSection
  570. NtOpenSection
  571. NtAllocateLocallyUniqueId
  572. NtQuerySystemInformation*
  573. NtAllocateUuids
  574. NtSetSystemInformation*
  575. NtCreateJobObject
  576. NtOpenJobObject
  577. */
  578. //
  579. // Plug and Play user APIs
  580. //
  581. /*
  582. NTSTATUS
  583. NTAPI
  584. NtGetPlugPlayEvent(
  585. IN HANDLE EventHandle,
  586. IN PVOID Context OPTIONAL,
  587. OUT PPLUGPLAY_EVENT_BLOCK EventBlock,
  588. IN ULONG EventBufferLength
  589. );
  590. */
  591. NTSTATUS
  592. NTAPI
  593. NtPlugPlayControl(
  594. IN PLUGPLAY_CONTROL_CLASS PnPControlClass,
  595. IN OUT PVOID PnPControlData,
  596. IN ULONG PnPControlDataLength
  597. );
  598. NTSYSCALLAPI
  599. NTSTATUS
  600. NTAPI
  601. NtCreateSymbolicLinkObject(
  602. OUT PHANDLE LinkHandle,
  603. IN ACCESS_MASK DesiredAccess,
  604. IN POBJECT_ATTRIBUTES ObjectAttributes,
  605. IN PUNICODE_STRING LinkTarget
  606. );
  607. NTSTATUS
  608. NTAPI
  609. NtOpenSymbolicLinkObject(
  610. OUT PHANDLE LinkHandle,
  611. IN ACCESS_MASK DesiredAccess,
  612. IN POBJECT_ATTRIBUTES ObjectAttributes
  613. );
  614. NTSTATUS
  615. NTAPI
  616. NtCreateDirectoryObject(
  617. OUT PHANDLE DirectoryHandle,
  618. IN ACCESS_MASK DesiredAccess,
  619. IN POBJECT_ATTRIBUTES ObjectAttributes
  620. );
  621. NTSTATUS
  622. NTAPI
  623. NtOpenDirectoryObject(
  624. OUT PHANDLE DirectoryHandle,
  625. IN ACCESS_MASK DesiredAccess,
  626. IN POBJECT_ATTRIBUTES ObjectAttributes
  627. );
  628. NTSTATUS
  629. NTAPI
  630. NtSignalAndWaitForSingleObject(
  631. IN HANDLE SignalHandle,
  632. IN HANDLE WaitHandle,
  633. IN BOOLEAN Alertable,
  634. IN PLARGE_INTEGER Timeout OPTIONAL
  635. );
  636. NTSTATUS
  637. NTAPI
  638. NtWaitForSingleObject(
  639. IN HANDLE Handle,
  640. IN BOOLEAN Alertable,
  641. IN PLARGE_INTEGER Timeout OPTIONAL
  642. );
  643. NTSTATUS
  644. NTAPI
  645. NtWaitForMultipleObjects(
  646. IN ULONG Count,
  647. IN HANDLE Handles[],
  648. IN WAIT_TYPE WaitType,
  649. IN BOOLEAN Alertable,
  650. IN PLARGE_INTEGER Timeout OPTIONAL
  651. );
  652. NTSTATUS
  653. NTAPI
  654. NtCreatePort(
  655. OUT PHANDLE PortHandle,
  656. IN POBJECT_ATTRIBUTES ObjectAttributes,
  657. IN ULONG MaxConnectionInfoLength,
  658. IN ULONG MaxMessageLength,
  659. IN ULONG MaxPoolUsage
  660. );
  661. NTSTATUS
  662. NTAPI
  663. NtCreateWaitablePort(
  664. OUT PHANDLE PortHandle,
  665. IN POBJECT_ATTRIBUTES ObjectAttributes,
  666. IN ULONG MaxConnectionInfoLength,
  667. IN ULONG MaxMessageLength,
  668. IN ULONG MaxPoolUsage
  669. );
  670. NTSTATUS
  671. NTAPI
  672. NtCreateThread(
  673. OUT PHANDLE ThreadHandle,
  674. IN ACCESS_MASK DesiredAccess,
  675. IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
  676. IN HANDLE ProcessHandle,
  677. OUT PCLIENT_ID ClientId,
  678. IN PCONTEXT ThreadContext,
  679. IN PINITIAL_TEB InitialTeb,
  680. IN BOOLEAN CreateSuspended
  681. );
  682. NTSTATUS
  683. NTAPI
  684. NtOpenThread (
  685. OUT PHANDLE ThreadHandle,
  686. IN ACCESS_MASK DesiredAccess,
  687. IN POBJECT_ATTRIBUTES ObjectAttributes,
  688. IN PCLIENT_ID ClientId OPTIONAL
  689. );
  690. NTSTATUS
  691. NTAPI
  692. NtCreateProcess(
  693. OUT PHANDLE ProcessHandle,
  694. IN ACCESS_MASK DesiredAccess,
  695. IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
  696. IN HANDLE ParentProcess,
  697. IN BOOLEAN InheritObjectTable,
  698. IN HANDLE SectionHandle OPTIONAL,
  699. IN HANDLE DebugPort OPTIONAL,
  700. IN HANDLE ExceptionPort OPTIONAL
  701. );
  702. NTSTATUS
  703. NTAPI
  704. NtCreateProcessEx(
  705. OUT PHANDLE ProcessHandle,
  706. IN ACCESS_MASK DesiredAccess,
  707. IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
  708. IN HANDLE ParentProcess,
  709. IN ULONG Flags,
  710. IN HANDLE SectionHandle OPTIONAL,
  711. IN HANDLE DebugPort OPTIONAL,
  712. IN HANDLE ExceptionPort OPTIONAL,
  713. IN ULONG JobMemberLevel
  714. );
  715. // begin_ntddk begin_ntifs
  716. NTSTATUS
  717. NTAPI
  718. NtOpenProcess (
  719. OUT PHANDLE ProcessHandle,
  720. IN ACCESS_MASK DesiredAccess,
  721. IN POBJECT_ATTRIBUTES ObjectAttributes,
  722. IN PCLIENT_ID ClientId OPTIONAL
  723. );
  724. NTSTATUS
  725. NTAPI
  726. NtQueryDefaultLocale(
  727. IN BOOLEAN UserProfile,
  728. OUT PLCID DefaultLocaleId
  729. );
  730. NTSTATUS
  731. NTAPI
  732. NtSetDefaultLocale(
  733. IN BOOLEAN UserProfile,
  734. IN LCID DefaultLocaleId
  735. );
  736. NTSTATUS
  737. NTAPI
  738. NtQuerySystemEnvironmentValue (
  739. IN PUNICODE_STRING VariableName,
  740. OUT PWSTR VariableValue,
  741. IN USHORT ValueLength,
  742. OUT PUSHORT ReturnLength OPTIONAL
  743. );
  744. NTSTATUS
  745. NTAPI
  746. NtSetSystemEnvironmentValue (
  747. IN PUNICODE_STRING VariableName,
  748. IN PUNICODE_STRING VariableValue
  749. );
  750. NTSTATUS
  751. NTAPI
  752. NtQuerySystemEnvironmentValueEx (
  753. IN PUNICODE_STRING VariableName,
  754. IN LPGUID VendorGuid,
  755. OUT PVOID Value,
  756. IN OUT PULONG ValueLength,
  757. OUT PULONG Attributes OPTIONAL
  758. );
  759. NTSTATUS
  760. NTAPI
  761. NtSetSystemEnvironmentValueEx (
  762. IN PUNICODE_STRING VariableName,
  763. IN LPGUID VendorGuid,
  764. IN PVOID Value,
  765. IN ULONG ValueLength,
  766. IN ULONG Attributes
  767. );
  768. NTSTATUS
  769. NTAPI
  770. NtEnumerateSystemEnvironmentValuesEx (
  771. IN ULONG InformationClass,
  772. OUT PVOID Buffer,
  773. IN OUT PULONG BufferLength
  774. );
  775. NTSTATUS
  776. NTAPI
  777. NtQuerySystemTime (
  778. OUT PLARGE_INTEGER SystemTime
  779. );
  780. NTSTATUS
  781. NTAPI
  782. NtSetSystemTime (
  783. IN PLARGE_INTEGER SystemTime,
  784. OUT PLARGE_INTEGER PreviousTime OPTIONAL
  785. );
  786. NTSTATUS
  787. NTAPI
  788. NtQuerySystemInformation (
  789. IN SYSTEM_INFORMATION_CLASS SystemInformationClass,
  790. OUT PVOID SystemInformation,
  791. IN ULONG SystemInformationLength,
  792. OUT PULONG ReturnLength OPTIONAL
  793. );
  794. NTSTATUS
  795. NTAPI
  796. NtSetSystemInformation (
  797. IN SYSTEM_INFORMATION_CLASS SystemInformationClass,
  798. IN PVOID SystemInformation,
  799. IN ULONG SystemInformationLength
  800. );
  801. /*
  802. NTSTATUS
  803. NTAPI
  804. NtAddBootEntry (
  805. IN PBOOT_ENTRY BootEntry,
  806. OUT PULONG Id OPTIONAL
  807. );
  808. NTSTATUS
  809. NTAPI
  810. NtDeleteBootEntry (
  811. IN ULONG Id
  812. );
  813. NTSTATUS
  814. NTAPI
  815. NtEnumerateBootEntries (
  816. OUT PVOID Buffer,
  817. IN OUT PULONG BufferLength
  818. );
  819. NTSTATUS
  820. NTAPI
  821. NtQueryBootEntryOrder (
  822. OUT PULONG Ids,
  823. IN OUT PULONG Count
  824. );
  825. NTSTATUS
  826. NTAPI
  827. NtSetBootEntryOrder (
  828. IN PULONG Ids,
  829. IN ULONG Count
  830. );
  831. NTSTATUS
  832. NTAPI
  833. NtQueryBootOptions (
  834. OUT PBOOT_OPTIONS BootOptions,
  835. IN OUT PULONG BootOptionsLength
  836. );
  837. NTSTATUS
  838. NTAPI
  839. NtSetBootOptions (
  840. IN PBOOT_OPTIONS BootOptions,
  841. IN ULONG FieldsToChange
  842. );
  843. NTSTATUS
  844. NTAPI
  845. NtAddDriverEntry (
  846. IN PEFI_DRIVER_ENTRY DriverEntry,
  847. OUT PULONG Id OPTIONAL
  848. );
  849. NTSTATUS
  850. NTAPI
  851. NtDeleteDriverEntry (
  852. IN ULONG Id
  853. );
  854. NTSTATUS
  855. NTAPI
  856. NtModifyDriverEntry (
  857. IN PEFI_DRIVER_ENTRY DriverEntry
  858. );
  859. NTSTATUS
  860. NTAPI
  861. NtEnumerateDriverEntries (
  862. OUT PVOID Buffer,
  863. IN OUT PULONG BufferLength
  864. );
  865. NTSTATUS
  866. NTAPI
  867. NtQueryDriverEntryOrder (
  868. OUT PULONG Ids,
  869. IN OUT PULONG Count
  870. );
  871. NTSTATUS
  872. NTAPI
  873. NtSetDriverEntryOrder (
  874. IN PULONG Ids,
  875. IN ULONG Count
  876. );
  877. NTSTATUS
  878. NTAPI
  879. NtCreateEvent (
  880. OUT PHANDLE EventHandle,
  881. IN ACCESS_MASK DesiredAccess,
  882. IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
  883. IN EVENT_TYPE EventType,
  884. IN BOOLEAN InitialState
  885. );
  886. NTSTATUS
  887. NTAPI
  888. NtOpenEvent (
  889. OUT PHANDLE EventHandle,
  890. IN ACCESS_MASK DesiredAccess,
  891. IN POBJECT_ATTRIBUTES ObjectAttributes
  892. );
  893. NTSTATUS
  894. NTAPI
  895. NtCreateEventPair (
  896. OUT PHANDLE EventPairHandle,
  897. IN ACCESS_MASK DesiredAccess,
  898. IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL
  899. );
  900. NTSTATUS
  901. NTAPI
  902. NtOpenEventPair(
  903. OUT PHANDLE EventPairHandle,
  904. IN ACCESS_MASK DesiredAccess,
  905. IN POBJECT_ATTRIBUTES ObjectAttributes
  906. );
  907. NTSTATUS
  908. NTAPI
  909. NtCreateMutant (
  910. OUT PHANDLE MutantHandle,
  911. IN ACCESS_MASK DesiredAccess,
  912. IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
  913. IN BOOLEAN InitialOwner
  914. );
  915. NTSTATUS
  916. NTAPI
  917. NtOpenMutant (
  918. OUT PHANDLE MutantHandle,
  919. IN ACCESS_MASK DesiredAccess,
  920. IN POBJECT_ATTRIBUTES ObjectAttributes
  921. );
  922. */
  923. ////////////////////////////////////////////////////////////////////////////////
  924. //Registry related
  925. OVR_FUNC3(NtOpenKey, PHANDLE, KeyHandle, ACCESS_MASK, DesiredAccess, POBJECT_ATTRIBUTES, ObjectAttributes)
  926. OVR_FUNC7(NtCreateKey, PHANDLE, KeyHandle, ACCESS_MASK, DesiredAccess, POBJECT_ATTRIBUTES, ObjectAttributes, ULONG, TitleIndex, PUNICODE_STRING, Class, ULONG, CreateOptions, PULONG, Disposition)
  927. OVR_FUNC2(NtDeleteValueKey, HANDLE, KeyHandle, PUNICODE_STRING, ValueName)
  928. OVR_FUNC6(NtEnumerateKey, HANDLE, KeyHandle, ULONG, Index, KEY_INFORMATION_CLASS, KeyInformationClass, PVOID, KeyInformation, ULONG, Length, PULONG, ResultLength)
  929. OVR_FUNC6(NtEnumerateValueKey, HANDLE, KeyHandle, ULONG, Index, KEY_VALUE_INFORMATION_CLASS, KeyValueInformationClass, PVOID, KeyValueInformation, ULONG, Length, PULONG, ResultLength)
  930. OVR_FUNC5(NtQueryKey, HANDLE, KeyHandle, KEY_INFORMATION_CLASS, KeyInformationClass, PVOID, KeyInformation, ULONG, Length, PULONG, ResultLength)
  931. OVR_FUNC6(NtQueryValueKey, HANDLE, KeyHandle, PUNICODE_STRING, ValueName, KEY_VALUE_INFORMATION_CLASS, KeyValueInformationClass, PVOID, KeyValueInformation, ULONG, Length, PULONG, ResultLength)
  932. OVR_FUNC6(NtQueryMultipleValueKey, HANDLE, KeyHandle, PKEY_VALUE_ENTRY, ValueEntries, ULONG, EntryCount, PVOID, ValueBuffer, PULONG, BufferLength, PULONG, RequiredBufferLength)
  933. OVR_FUNC6(NtSetValueKey, HANDLE, KeyHandle, PUNICODE_STRING, ValueName, ULONG, TitleIndex,ULONG, Type, PVOID, Data, ULONG, DataSize)
  934. #define PREFUNC1(FuncName, t1, p1)\
  935. typedef LONG (MYAPI *INTERCEPTED_##FuncName)(t1 p1);\
  936. \
  937. LONG MYAPI New##FuncName(t1 p1);\
  938. \
  939. LONG gl_ResultOf##FuncName = NULL;\
  940. \
  941. DWORD gl_Backup##FuncName[2] = {0, 0},\
  942. gl_Intercept##FuncName[2] = {0, 0};\
  943. \
  944. INTERCEPTED_##FuncName gl_p##FuncName = NULL; \
  945. \
  946. \
  947. LONG MYAPI New##FuncName(t1 p1) \
  948. {\
  949. RESTORE_FUNCTION(gl_p##FuncName, gl_Backup##FuncName);\
  950. if (OVERIDE_INST) \
  951. OVERIDE_INST->FuncName(p1); \
  952. gl_ResultOf##FuncName = gl_p##FuncName(p1);\
  953. \
  954. INTERCEPT_FUNCTION(gl_p##FuncName, gl_Intercept##FuncName);\
  955. return gl_ResultOf##FuncName;\
  956. }
  957. PREFUNC1(NtDeleteKey, HANDLE, KeyHandle)
  958. ////////////////////////////////////////////////////////////////////////////////
  959. //File System Related
  960. OVR_FUNC1(NtDeleteFile, POBJECT_ATTRIBUTES, ObjectAttributes)
  961. OVR_FUNC2(NtQueryAttributesFile, POBJECT_ATTRIBUTES, ObjectAttributes, PFILE_BASIC_INFORMATION, FileInformation)
  962. OVR_FUNC2(NtQueryFullAttributesFile, POBJECT_ATTRIBUTES, ObjectAttributes, PFILE_NETWORK_OPEN_INFORMATION, FileInformation)
  963. OVR_FUNC11(NtCreateFile,
  964. PHANDLE, FileHandle,
  965. ACCESS_MASK, DesiredAccess,
  966. POBJECT_ATTRIBUTES, ObjectAttributes,
  967. PIO_STATUS_BLOCK, IoStatusBlock,
  968. PLARGE_INTEGER, AllocationSize,
  969. ULONG, FileAttributes,
  970. ULONG, ShareAccess,
  971. ULONG, CreateDisposition,
  972. ULONG, CreateOptions,
  973. PVOID, EaBuffer,
  974. ULONG, EaLength)
  975. OVR_FUNC6(NtOpenFile,
  976. PHANDLE, FileHandle,
  977. ACCESS_MASK, DesiredAccess,
  978. POBJECT_ATTRIBUTES, ObjectAttributes,
  979. PIO_STATUS_BLOCK, IoStatusBlock,
  980. ULONG, ShareAccess,
  981. ULONG, OpenOptions)
  982. OVR_FUNC5(NtQueryInformationFile,
  983. IN HANDLE, FileHandle,
  984. OUT PIO_STATUS_BLOCK, IoStatusBlock,
  985. OUT PVOID, FileInformation,
  986. IN ULONG, Length,
  987. IN FILE_INFORMATION_CLASS, FileInformationClass)
  988. OVR_FUNC5(NtSetInformationFile,
  989. IN HANDLE, FileHandle,
  990. OUT PIO_STATUS_BLOCK, IoStatusBlock,
  991. IN PVOID, FileInformation,
  992. IN ULONG, Length,
  993. IN FILE_INFORMATION_CLASS, FileInformationClass)
  994. /*
  995. NtSetInformationFile
  996. NtQueryInformationFile
  997. NtReadFile
  998. NtWriteFile
  999. */
  1000. ////////////////////////////////////////////////////////////////////////////////
  1001. //Driver Related
  1002. //
  1003. OVR_FUNC1(NtLoadDriver, PUNICODE_STRING, DriverServiceName)
  1004. /*
  1005. OVR_FUNC10(NtDeviceIoControlFile,
  1006. HANDLE, FileHandle,
  1007. HANDLE, Event,
  1008. PIO_APC_ROUTINE, ApcRoutine,
  1009. PVOID, ApcContext,
  1010. PIO_STATUS_BLOCK, IoStatusBlock,
  1011. ULONG, IoControlCode,
  1012. PVOID, InputBuffer,
  1013. ULONG, InputBufferLength,
  1014. PVOID, OutputBuffer,
  1015. ULONG, OutputBufferLength)
  1016. OVR_FUNC10(NtFsControlFile,
  1017. HANDLE, FileHandle,
  1018. HANDLE, Event,
  1019. PIO_APC_ROUTINE, ApcRoutine,
  1020. PVOID, ApcContext,
  1021. PIO_STATUS_BLOCK, IoStatusBlock,
  1022. ULONG, FsControlCode,
  1023. PVOID, InputBuffer,
  1024. ULONG, InputBufferLength,
  1025. PVOID, OutputBuffer,
  1026. ULONG, OutputBufferLength)
  1027. */
  1028. ////////////////////////////////////////////////////////////////////////////////
  1029. // Misc System Functions
  1030. /*
  1031. OVR_FUNC5(NtWaitForMultipleObjects,
  1032. IN ULONG, Count,
  1033. IN HANDLE, Handles[],
  1034. IN WAIT_TYPE, WaitType,
  1035. IN BOOLEAN, Alertable,
  1036. IN PLARGE_INTEGER, Timeout)*/
  1037. OVR_FUNC3(NtPlugPlayControl,
  1038. IN PLUGPLAY_CONTROL_CLASS, PnPControlClass,
  1039. IN OUT PVOID, PnPControlData,
  1040. IN ULONG,PnPControlDataLength)
  1041. OVR_FUNC4(NtCreateSymbolicLinkObject,
  1042. OUT PHANDLE, LinkHandle,
  1043. IN ACCESS_MASK, DesiredAccess,
  1044. IN POBJECT_ATTRIBUTES, ObjectAttributes,
  1045. IN PUNICODE_STRING, LinkTarget)
  1046. OVR_FUNC3(NtOpenSymbolicLinkObject,
  1047. OUT PHANDLE, LinkHandle,
  1048. IN ACCESS_MASK, DesiredAccess,
  1049. IN POBJECT_ATTRIBUTES, ObjectAttributes)
  1050. OVR_FUNC3(NtCreateDirectoryObject,
  1051. OUT PHANDLE, DirectoryHandle,
  1052. IN ACCESS_MASK, DesiredAccess,
  1053. IN POBJECT_ATTRIBUTES, ObjectAttributes)
  1054. OVR_FUNC3(NtOpenDirectoryObject,
  1055. OUT PHANDLE, DirectoryHandle,
  1056. IN ACCESS_MASK, DesiredAccess,
  1057. IN POBJECT_ATTRIBUTES, ObjectAttributes)
  1058. OVR_FUNC4(NtSignalAndWaitForSingleObject,
  1059. IN HANDLE, SignalHandle,
  1060. IN HANDLE, WaitHandle,
  1061. IN BOOLEAN, Alertable,
  1062. IN PLARGE_INTEGER, Timeout)
  1063. OVR_FUNC3(NtWaitForSingleObject,
  1064. IN HANDLE, Handle,
  1065. IN BOOLEAN, Alertable,
  1066. IN PLARGE_INTEGER, Timeout)
  1067. OVR_FUNC5(NtWaitForMultipleObjects,
  1068. IN ULONG, Count,
  1069. IN HANDLE*, Handles,
  1070. IN WAIT_TYPE, WaitType,
  1071. IN BOOLEAN, Alertable,
  1072. IN PLARGE_INTEGER, Timeout)
  1073. OVR_FUNC5(NtCreatePort,
  1074. OUT PHANDLE, PortHandle,
  1075. IN POBJECT_ATTRIBUTES, ObjectAttributes,
  1076. IN ULONG, MaxConnectionInfoLength,
  1077. IN ULONG, MaxMessageLength,
  1078. IN ULONG, MaxPoolUsage)
  1079. OVR_FUNC5(NtCreateWaitablePort,
  1080. OUT PHANDLE, PortHandle,
  1081. IN POBJECT_ATTRIBUTES, ObjectAttributes,
  1082. IN ULONG, MaxConnectionInfoLength,
  1083. IN ULONG, MaxMessageLength,
  1084. IN ULONG, MaxPoolUsage)
  1085. OVR_FUNC8(NtCreateThread,
  1086. OUT PHANDLE, ThreadHandle,
  1087. IN ACCESS_MASK, DesiredAccess,
  1088. IN POBJECT_ATTRIBUTES, ObjectAttributes OPTIONAL,
  1089. IN HANDLE, ProcessHandle,
  1090. OUT PCLIENT_ID, ClientId,
  1091. IN PCONTEXT, ThreadContext,
  1092. IN PINITIAL_TEB, InitialTeb,
  1093. IN BOOLEAN, CreateSuspended)
  1094. OVR_FUNC4(NtOpenThread,
  1095. OUT PHANDLE, ThreadHandle,
  1096. IN ACCESS_MASK, DesiredAccess,
  1097. IN POBJECT_ATTRIBUTES, ObjectAttributes,
  1098. IN PCLIENT_ID, ClientId)
  1099. OVR_FUNC8(NtCreateProcess,
  1100. OUT PHANDLE, ProcessHandle,
  1101. IN ACCESS_MASK, DesiredAccess,
  1102. IN POBJECT_ATTRIBUTES, ObjectAttributes OPTIONAL,
  1103. IN HANDLE, ParentProcess,
  1104. IN BOOLEAN, InheritObjectTable,
  1105. IN HANDLE, SectionHandle OPTIONAL,
  1106. IN HANDLE, DebugPort OPTIONAL,
  1107. IN HANDLE, ExceptionPort OPTIONAL)
  1108. OVR_FUNC9(NtCreateProcessEx,
  1109. OUT PHANDLE, ProcessHandle,
  1110. IN ACCESS_MASK, DesiredAccess,
  1111. IN POBJECT_ATTRIBUTES, ObjectAttributes OPTIONAL,
  1112. IN HANDLE, ParentProcess,
  1113. IN ULONG, Flags,
  1114. IN HANDLE, SectionHandle OPTIONAL,
  1115. IN HANDLE ,DebugPort OPTIONAL,
  1116. IN HANDLE, ExceptionPort OPTIONAL,
  1117. IN ULONG, JobMemberLevel)
  1118. OVR_FUNC4(NtOpenProcess,
  1119. OUT PHANDLE, ProcessHandle,
  1120. IN ACCESS_MASK, DesiredAccess,
  1121. IN POBJECT_ATTRIBUTES, ObjectAttributes,
  1122. IN PCLIENT_ID, ClientId OPTIONAL)
  1123. OVR_FUNC2(NtQueryDefaultLocale,
  1124. IN BOOLEAN, UserProfile,
  1125. OUT PLCID, DefaultLocaleId)
  1126. OVR_FUNC2(NtSetDefaultLocale,
  1127. IN BOOLEAN, UserProfile,
  1128. IN LCID, DefaultLocaleId)
  1129. OVR_FUNC4(NtQuerySystemEnvironmentValue,
  1130. IN PUNICODE_STRING, VariableName,
  1131. OUT PWSTR, VariableValue,
  1132. IN USHORT, ValueLength,
  1133. OUT PUSHORT, ReturnLength OPTIONAL)
  1134. OVR_FUNC2(NtSetSystemEnvironmentValue,
  1135. IN PUNICODE_STRING, VariableName,
  1136. IN PUNICODE_STRING, VariableValue)
  1137. OVR_FUNC5(NtQuerySystemEnvironmentValueEx,
  1138. IN PUNICODE_STRING, VariableName,
  1139. IN LPGUID, VendorGuid,
  1140. OUT PVOID, Value,
  1141. IN OUT PULONG, ValueLength,
  1142. OUT PULONG, Attributes OPTIONAL)
  1143. OVR_FUNC5(NtSetSystemEnvironmentValueEx,
  1144. IN PUNICODE_STRING, VariableName,
  1145. IN LPGUID, VendorGuid,
  1146. IN PVOID, Value,
  1147. IN ULONG, ValueLength,
  1148. IN ULONG, Attributes)
  1149. OVR_FUNC3(NtEnumerateSystemEnvironmentValuesEx,
  1150. IN ULONG, InformationClass,
  1151. OUT PVOID, Buffer,
  1152. IN OUT PULONG, BufferLength)
  1153. OVR_FUNC1(NtQuerySystemTime,
  1154. OUT PLARGE_INTEGER, SystemTime)
  1155. OVR_FUNC2(NtSetSystemTime,
  1156. IN PLARGE_INTEGER, SystemTime,
  1157. OUT PLARGE_INTEGER, PreviousTime OPTIONAL)
  1158. OVR_FUNC4(NtQuerySystemInformation,
  1159. IN SYSTEM_INFORMATION_CLASS, SystemInformationClass,
  1160. OUT PVOID, SystemInformation,
  1161. IN ULONG, SystemInformationLength,
  1162. OUT PULONG, ReturnLength OPTIONAL)
  1163. OVR_FUNC3(NtSetSystemInformation,
  1164. IN SYSTEM_INFORMATION_CLASS, SystemInformationClass,
  1165. IN PVOID, SystemInformation,
  1166. IN ULONG, SystemInformationLength)
  1167. ////////////////////////////////////////////////////////////////////////////////
  1168. ////////////////////////////////////////////////////////////////////////////////
  1169. BOOL CRegIntercept::InterceptRegistryAPI(CRegIntercept* pRegInterceptInstance)
  1170. {
  1171. DWORD dwResult;
  1172. HINSTANCE hKernel32;
  1173. hKernel32 = LoadLibrary(TEXT("ntdll.DLL"));
  1174. //Registry
  1175. INTERCEPT(NtOpenKey);
  1176. INTERCEPT(NtCreateKey);
  1177. INTERCEPT(NtDeleteKey);
  1178. INTERCEPT(NtDeleteValueKey);
  1179. INTERCEPT(NtEnumerateKey);
  1180. INTERCEPT(NtEnumerateValueKey);
  1181. INTERCEPT(NtQueryKey);
  1182. INTERCEPT(NtQueryValueKey);
  1183. INTERCEPT(NtQueryMultipleValueKey);
  1184. INTERCEPT(NtSetValueKey);
  1185. //File System
  1186. INTERCEPT(NtDeleteFile);
  1187. INTERCEPT(NtQueryAttributesFile);
  1188. INTERCEPT(NtQueryFullAttributesFile);
  1189. INTERCEPT(NtCreateFile);
  1190. INTERCEPT(NtOpenFile);
  1191. INTERCEPT(NtSetInformationFile);
  1192. INTERCEPT(NtQueryInformationFile);
  1193. //Driver
  1194. INTERCEPT(NtLoadDriver);
  1195. // INTERCEPT(NtDeviceIoControlFile);
  1196. // INTERCEPT(NtFsControlFile);
  1197. //Misc
  1198. INTERCEPT(NtPlugPlayControl);
  1199. INTERCEPT(NtCreateSymbolicLinkObject);
  1200. INTERCEPT(NtOpenSymbolicLinkObject);
  1201. INTERCEPT(NtCreateDirectoryObject);
  1202. INTERCEPT(NtOpenDirectoryObject);
  1203. INTERCEPT(NtSignalAndWaitForSingleObject);
  1204. INTERCEPT(NtWaitForSingleObject);
  1205. INTERCEPT(NtWaitForMultipleObjects);
  1206. INTERCEPT(NtCreatePort);
  1207. INTERCEPT(NtCreateWaitablePort);
  1208. INTERCEPT(NtCreateThread);
  1209. INTERCEPT(NtOpenThread);
  1210. INTERCEPT(NtCreateProcess);
  1211. INTERCEPT(NtCreateProcessEx);
  1212. INTERCEPT(NtOpenProcess);
  1213. INTERCEPT(NtQueryDefaultLocale);
  1214. INTERCEPT(NtSetDefaultLocale);
  1215. INTERCEPT(NtQuerySystemEnvironmentValue);
  1216. INTERCEPT(NtSetSystemEnvironmentValue);
  1217. INTERCEPT(NtQuerySystemEnvironmentValueEx);
  1218. INTERCEPT(NtSetSystemEnvironmentValueEx);
  1219. INTERCEPT(NtEnumerateSystemEnvironmentValuesEx);
  1220. INTERCEPT(NtQuerySystemTime);
  1221. INTERCEPT(NtSetSystemTime);
  1222. INTERCEPT(NtQuerySystemInformation);
  1223. INTERCEPT(NtSetSystemInformation);
  1224. CRegIntercept::pRegInterceptInstance = pRegInterceptInstance;
  1225. return TRUE;
  1226. }
  1227. void CRegIntercept::RestoreRegistryAPI()
  1228. {
  1229. //Registry
  1230. RESTORE(NtOpenKey);
  1231. RESTORE(NtCreateKey);
  1232. RESTORE(NtDeleteKey);
  1233. RESTORE(NtDeleteValueKey);
  1234. RESTORE(NtEnumerateKey);
  1235. RESTORE(NtEnumerateValueKey);
  1236. RESTORE(NtQueryKey);
  1237. RESTORE(NtQueryValueKey);
  1238. RESTORE(NtQueryMultipleValueKey);
  1239. RESTORE(NtSetValueKey);
  1240. //File System
  1241. RESTORE(NtDeleteFile);
  1242. RESTORE(NtQueryAttributesFile);
  1243. RESTORE(NtQueryFullAttributesFile);
  1244. RESTORE(NtCreateFile);
  1245. RESTORE(NtOpenFile);
  1246. RESTORE(NtSetInformationFile);
  1247. RESTORE(NtQueryInformationFile);
  1248. //Driver
  1249. RESTORE(NtLoadDriver);
  1250. // RESTORE(NtDeviceIoControlFile);
  1251. // RESTORE(NtFsControlFile);
  1252. //Misc
  1253. RESTORE(NtPlugPlayControl);
  1254. RESTORE(NtCreateSymbolicLinkObject);
  1255. RESTORE(NtOpenSymbolicLinkObject);
  1256. RESTORE(NtCreateDirectoryObject);
  1257. RESTORE(NtOpenDirectoryObject);
  1258. RESTORE(NtSignalAndWaitForSingleObject);
  1259. RESTORE(NtWaitForSingleObject);
  1260. RESTORE(NtWaitForMultipleObjects);
  1261. RESTORE(NtCreatePort);
  1262. RESTORE(NtCreateWaitablePort);
  1263. RESTORE(NtCreateThread);
  1264. RESTORE(NtOpenThread);
  1265. RESTORE(NtCreateProcess);
  1266. RESTORE(NtCreateProcessEx);
  1267. RESTORE(NtOpenProcess);
  1268. RESTORE(NtQueryDefaultLocale);
  1269. RESTORE(NtSetDefaultLocale);
  1270. RESTORE(NtQuerySystemEnvironmentValue);
  1271. RESTORE(NtSetSystemEnvironmentValue);
  1272. RESTORE(NtQuerySystemEnvironmentValueEx);
  1273. RESTORE(NtSetSystemEnvironmentValueEx);
  1274. RESTORE(NtEnumerateSystemEnvironmentValuesEx);
  1275. RESTORE(NtQuerySystemTime);
  1276. RESTORE(NtSetSystemTime);
  1277. RESTORE(NtQuerySystemInformation);
  1278. RESTORE(NtSetSystemInformation);
  1279. }
  1280. typedef enum _OBJECT_INFORMATION_CLASS {
  1281. ObjectBasicInformation,
  1282. ObjectNameInformation,
  1283. ObjectTypeInformation,
  1284. ObjectTypesInformation,
  1285. ObjectHandleFlagInformation,
  1286. } OBJECT_INFORMATION_CLASS;
  1287. typedef struct _OBJECT_BASIC_INFORMATION {
  1288. ULONG Attributes;
  1289. ACCESS_MASK GrantedAccess;
  1290. ULONG HandleCount;
  1291. ULONG PointerCount;
  1292. ULONG PagedPoolCharge;
  1293. ULONG NonPagedPoolCharge;
  1294. ULONG Reserved[ 3 ];
  1295. ULONG NameInfoSize;
  1296. ULONG TypeInfoSize;
  1297. ULONG SecurityDescriptorSize;
  1298. LARGE_INTEGER CreationTime;
  1299. } OBJECT_BASIC_INFORMATION, *POBJECT_BASIC_INFORMATION;
  1300. typedef struct _OBJECT_NAME_INFORMATION { // ntddk wdm nthal
  1301. UNICODE_STRING Name; // ntddk wdm nthal
  1302. } OBJECT_NAME_INFORMATION, *POBJECT_NAME_INFORMATION; // ntddk wdm nthal
  1303. typedef struct _OBJECT_TYPE_INFORMATION {
  1304. UNICODE_STRING TypeName;
  1305. ULONG TotalNumberOfObjects;
  1306. ULONG TotalNumberOfHandles;
  1307. ULONG TotalPagedPoolUsage;
  1308. ULONG TotalNonPagedPoolUsage;
  1309. ULONG TotalNamePoolUsage;
  1310. ULONG TotalHandleTableUsage;
  1311. ULONG HighWaterNumberOfObjects;
  1312. ULONG HighWaterNumberOfHandles;
  1313. ULONG HighWaterPagedPoolUsage;
  1314. ULONG HighWaterNonPagedPoolUsage;
  1315. ULONG HighWaterNamePoolUsage;
  1316. ULONG HighWaterHandleTableUsage;
  1317. ULONG InvalidAttributes;
  1318. GENERIC_MAPPING GenericMapping;
  1319. ULONG ValidAccessMask;
  1320. BOOLEAN SecurityRequired;
  1321. BOOLEAN MaintainHandleCount;
  1322. ULONG PoolType;
  1323. ULONG DefaultPagedPoolCharge;
  1324. ULONG DefaultNonPagedPoolCharge;
  1325. } OBJECT_TYPE_INFORMATION, *POBJECT_TYPE_INFORMATION;
  1326. typedef struct _OBJECT_TYPES_INFORMATION {
  1327. ULONG NumberOfTypes;
  1328. // OBJECT_TYPE_INFORMATION TypeInformation;
  1329. } OBJECT_TYPES_INFORMATION, *POBJECT_TYPES_INFORMATION;
  1330. typedef struct _OBJECT_HANDLE_FLAG_INFORMATION {
  1331. BOOLEAN Inherit;
  1332. BOOLEAN ProtectFromClose;
  1333. } OBJECT_HANDLE_FLAG_INFORMATION, *POBJECT_HANDLE_FLAG_INFORMATION;
  1334. /*
  1335. //NTSYSCALLAPI
  1336. NTSTATUS
  1337. NTAPI
  1338. NtQueryObject(
  1339. IN HANDLE Handle,
  1340. IN OBJECT_INFORMATION_CLASS ObjectInformationClass,
  1341. OUT PVOID ObjectInformation,
  1342. IN ULONG Length,
  1343. OUT PULONG ReturnLength OPTIONAL
  1344. );
  1345. */
  1346. typedef LONG (NTAPI* NtQueryObjectT) (HANDLE, OBJECT_INFORMATION_CLASS, PVOID, ULONG, PULONG);
  1347. NtQueryObjectT NtQueryObject=0;
  1348. bool CRegIntercept::GetHandleName(HANDLE handle, TCHAR *buf, bool bAppendBackslash)
  1349. {
  1350. if (buf == NULL)
  1351. return false;
  1352. buf[0] = NULL;
  1353. if ((handle == 0) || (handle == INVALID_HANDLE_VALUE))
  1354. return true;
  1355. DWORD rc;
  1356. char Buffer[1024];
  1357. POBJECT_NAME_INFORMATION pObjectNameInfo=(POBJECT_NAME_INFORMATION)Buffer;
  1358. rc=NtQueryObject( handle,
  1359. ObjectNameInformation,
  1360. Buffer,
  1361. sizeof(Buffer),
  1362. NULL);
  1363. if (rc==0)
  1364. {
  1365. _tcscpy(buf, pObjectNameInfo->Name.Buffer);
  1366. if (bAppendBackslash)
  1367. {
  1368. AppendBackSlash(buf);
  1369. }
  1370. return true;
  1371. }
  1372. else
  1373. return false;
  1374. }
  1375. bool CRegIntercept::Init()
  1376. {
  1377. HMODULE hLibrary = NULL;
  1378. hLibrary = LoadLibrary (L"ntdll.dll");
  1379. if (hLibrary)
  1380. {
  1381. NtQueryObject = (NtQueryObjectT) GetProcAddress (hLibrary, "NtQueryObject");
  1382. return (NtQueryObject != 0);
  1383. }
  1384. return false;
  1385. }
  1386. void CRegIntercept::AppendBackSlash(TCHAR *buf)
  1387. {
  1388. int len = _tcslen(buf);
  1389. if (buf[len-1] != L'\\')
  1390. {
  1391. buf[len] = L'\\';
  1392. buf[len+1] = NULL;
  1393. }
  1394. }