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.

648 lines
17 KiB

  1. /*++
  2. Copyright (c) 1990 Microsoft Corporation
  3. Module Name:
  4. dbgsec.c
  5. Abstract:
  6. Argus debugging extensions. The routines here dump out Security Descriptors
  7. and allow you to examine them.
  8. Author:
  9. Krishna Ganugapati (KrishnaG) 1-July-1993
  10. Revision History:
  11. KrishnaG: Created: 1-July-1993 (imported most of IanJa's stuff)
  12. KrishnaG: Added: 7-July-1993 (added AndrewBe's UnicodeAnsi conversion routines)
  13. KrishnaG Added: 3-Aug-1993 (added DevMode/SecurityDescriptor dumps)
  14. To do:
  15. --*/
  16. #define NOMINMAX
  17. #define SECURITY_WIN32
  18. #include <nt.h>
  19. #include <ntrtl.h>
  20. #include <nturtl.h>
  21. #include <windows.h>
  22. #include <stdlib.h>
  23. #include <math.h>
  24. #include <ntsdexts.h>
  25. #include <windows.h>
  26. #include <winspool.h>
  27. #include <security.h>
  28. #include <wchar.h>
  29. #include "dbglocal.h"
  30. #define NULL_TERMINATED 0
  31. #define VERBOSE_ON 1
  32. #define VERBOSE_OFF 0
  33. #define MAX_SDC_FLAGS 7
  34. typedef struct _DBG_SED_CONTROL{
  35. unsigned short Flag;
  36. LPSTR String;
  37. }DBG_SED_CONTROL, *PDBG_SED_CONTROL;
  38. DBG_SED_CONTROL SDC_Table[] =
  39. {
  40. 0x0001, "SE_OWNER_DEFAULTED",
  41. 0x0002, "SE_GROUP_DEFAULTED",
  42. 0x0004, "SE_DACL_PRESENT",
  43. 0x0008, "SE_DACL_DEFAULTED",
  44. 0x0010, "SE_SACL_PRESENT",
  45. 0x0020, "SE_SACL_DEFAULTED",
  46. 0x8000, "SE_SELF_RELATIVE"
  47. };
  48. #define MAX_ACE_FLAGS 6
  49. typedef struct _DBG_ACE_FLAGS{
  50. UCHAR Flags;
  51. LPSTR String;
  52. }DBG_ACE_FLAGS, *PDBG_ACE_FLAGS;
  53. DBG_ACE_FLAGS AceFlagsTable[] =
  54. {
  55. 0x1, "OBJECT_INHERIT_ACE",
  56. 0x2, "CONTAINER_INHERIT_ACE",
  57. 0x4, "NO_PROPAGATE_INHERIT_ACE",
  58. 0x8, "INHERIT_ONLY_ACE",
  59. 0x40, "SUCCESSFUL_ACCESS_ACE_FLAG",
  60. 0x80, "FAILED_ACCESS_ACE_FLAG"
  61. };
  62. typedef struct _ACCESSMASKTAB{
  63. DWORD Flag;
  64. LPSTR String;
  65. }ACCESSMASKTAB, *PACCESSMASKTAB;
  66. ACCESSMASKTAB AccessMaskTable[33] =
  67. {
  68. 0x00000001, "SERVER_ACCESS_ADMINSTER",
  69. 0x00000002, "SERVER_ACCESS_ENUMERATE",
  70. 0x00000004, "PRINTER_ACCESS_ADMINSTER",
  71. 0x00000008, "PRINTER_ACCESS_USE",
  72. 0x00000010, "JOB_ACCESS_ADMINISTER",
  73. 0x00010000, "DELETE",
  74. 0x00020000, "READ_CONTROL",
  75. 0x00040000, "WRITE_DAC",
  76. 0x00080000, "WRITE_OWNER",
  77. 0x00100000, "SYNCHRONIZE",
  78. 0x01000000, "ACCESS_SYSTEM_SECURITY",
  79. 0x10000000, "GENERIC_ALL",
  80. 0x20000000, "GENERIC_EXECUTE",
  81. 0x40000000, "GENERIC_WRITE",
  82. 0x80000000, "GENERIC_READ",
  83. 0x0000FFFF, "SPECIFIC_RIGHTS_ALL",
  84. 0x000F0000, "STANDARD_RIGHTS_REQUIRED <D-R/C-W/DAC-W/O>",
  85. 0x001F0000, "STANDARD_RIGHTS_ALL <D-R/C-W/DAC-W/O-S>",
  86. READ_CONTROL, "STANDARD_RIGHTS_READ <R/C>",
  87. READ_CONTROL, "STANDARD_RIGHTS_WRITE <R/C>",
  88. READ_CONTROL, "STANDARD_RIGHTS_EXECUTE <R/C>",
  89. SERVER_ALL_ACCESS, "SERVER_ALL_ACCESS <SRREQ-SAA-SAE>",
  90. SERVER_READ, "SERVER_READ <SRR-SAE>",
  91. SERVER_WRITE, "SERVER_WRITE <SRW-SAA-SAE>",
  92. SERVER_EXECUTE, "SERVER_EXECUTE <SRE-SAE>",
  93. PRINTER_ALL_ACCESS, "PRINTER_ALL_ACCESS <SRREQ-PAA-PAU>",
  94. PRINTER_READ, "PRINTER_READ <SRR-PAU>",
  95. PRINTER_WRITE, "PRINTER_WRITE <SRW-PAU>",
  96. PRINTER_EXECUTE, "PRINTER_EXECUTE <SRE-PAU>",
  97. JOB_ALL_ACCESS, "JOB_ALL_ACCESS <SRREQ-JAA>",
  98. JOB_READ, "JOB_READ <SRR-JAA>",
  99. JOB_WRITE, "JOB_WRITE <SRW-JAA>",
  100. JOB_EXECUTE, "JOB_EXECUTE <SRE-JAA>"
  101. };
  102. BOOL
  103. DbgDumpSecurityDescriptor(
  104. HANDLE hCurrentProcess,
  105. PNTSD_OUTPUT_ROUTINE Print,
  106. PISECURITY_DESCRIPTOR pSecurityDescriptor
  107. )
  108. {
  109. BOOL bSe_Self_Relative = FALSE;
  110. DWORD i;
  111. DWORD OwnerSidAddress, GroupSidAddress;
  112. DWORD SaclAddress, DaclAddress;
  113. SECURITY_DESCRIPTOR SecurityDescriptor;
  114. memset(&SecurityDescriptor, 0, sizeof(SECURITY_DESCRIPTOR));
  115. movestruct(pSecurityDescriptor, &SecurityDescriptor, SECURITY_DESCRIPTOR);
  116. (*Print)("SecurityDescriptor\n");
  117. bSe_Self_Relative = SecurityDescriptor.Control & SE_SELF_RELATIVE;
  118. if (bSe_Self_Relative) {
  119. (*Print)("This Security Descriptor is a Self-Relative Security Descriptor\n");
  120. }
  121. (*Print)("UCHAR Revision 0x%x\n", SecurityDescriptor.Revision);
  122. (*Print)("UCHAR Sbz1 0x%x\n", SecurityDescriptor.Sbz1);
  123. (*Print)("USHORT Control 0x%x\n", SecurityDescriptor.Control);
  124. for (i = 0; i < MAX_SDC_FLAGS; i++ ) {
  125. if (SecurityDescriptor.Control & SDC_Table[i].Flag) {
  126. (*Print)("%s - ON (%.4x)\n", SDC_Table[i].String, SDC_Table[i].Flag);
  127. } else {
  128. (*Print)("%s - OFF (%.4x)\n", SDC_Table[i].String, SDC_Table[i].Flag);
  129. }
  130. }
  131. //
  132. // Now dumping out the owner's sid
  133. //
  134. if (SecurityDescriptor.Owner == NULL) {
  135. (*Print)("PSID Owner null -- no owner sid present in the security descriptor\n");
  136. }else {
  137. if (bSe_Self_Relative) {
  138. // (*Print)("PSID Owner Offset 0x%.8x\n",SecurityDescriptor.Owner);
  139. OwnerSidAddress = (DWORD)pSecurityDescriptor + (DWORD)SecurityDescriptor.Owner;
  140. }else {
  141. OwnerSidAddress = (DWORD)SecurityDescriptor.Owner;
  142. }
  143. // (*Print)("PSID Owner 0x%.8x\n", OwnerSidAddress);
  144. }
  145. (*Print)("The owner's sid is:\t\n");
  146. DbgDumpSid(hCurrentProcess, Print, (PVOID)OwnerSidAddress);
  147. (*Print)("\n\n");
  148. //
  149. // Now dumping out the group's sid
  150. if (SecurityDescriptor.Group == NULL) {
  151. (*Print)("PSID Group null -- no group sid present in the security descriptor\n");
  152. }else {
  153. if (bSe_Self_Relative) {
  154. // (*Print)("PSID Group Offset 0x%.8x\n", SecurityDescriptor.Group);
  155. GroupSidAddress = (DWORD)pSecurityDescriptor + (DWORD)SecurityDescriptor.Group;
  156. }else {
  157. GroupSidAddress = (DWORD)SecurityDescriptor.Group;
  158. }
  159. // (*Print)("PSID Group 0x%.8x\n", GroupSidAddress);
  160. }
  161. (*Print)("The group's sid is:\t\n");
  162. DbgDumpSid(hCurrentProcess, Print, (PVOID)GroupSidAddress);
  163. (*Print)("\n");
  164. if (SecurityDescriptor.Sacl == NULL) {
  165. (*Print)("PACL Sacl null -- no sacl present in this security descriptor\n");
  166. }else {
  167. if (bSe_Self_Relative) {
  168. // (*Print)("PACL Sacl Offset %.8x\n", SecurityDescriptor.Sacl);
  169. SaclAddress = (DWORD)pSecurityDescriptor + (DWORD)SecurityDescriptor.Sacl;
  170. }else{
  171. SaclAddress = (DWORD)SecurityDescriptor.Sacl;
  172. }
  173. // (*Print)("PACL Sacl 0x%.8x\n", SaclAddress);
  174. }
  175. if (SecurityDescriptor.Dacl == NULL) {
  176. (*Print)("PACL Dacl null -- no dacl present in this security descriptor\n");
  177. }else {
  178. if (bSe_Self_Relative) {
  179. // (*Print)("PACL Dacl Offset %.8x\n", SecurityDescriptor.Dacl);
  180. DaclAddress = (DWORD)pSecurityDescriptor + (DWORD)SecurityDescriptor.Dacl;
  181. }else {
  182. DaclAddress = (DWORD)SecurityDescriptor.Dacl;
  183. }
  184. (*Print)("PACL Dacl 0x%.8x\n", DaclAddress);
  185. DbgDumpAcl(hCurrentProcess, Print,(PVOID)DaclAddress);
  186. }
  187. }
  188. BOOL
  189. DbgDumpSid(
  190. HANDLE hCurrentProcess,
  191. PNTSD_OUTPUT_ROUTINE Print,
  192. PVOID SidAddress
  193. )
  194. {
  195. BYTE Sid[256];
  196. CHAR SidString[256];
  197. SID_NAME_USE SidType = 1;
  198. // (*Print)("Size of a SID is %d\n", sizeof(SID));
  199. // movestruct(SidAddress, &Sid, SID);
  200. memset(Sid, 0, 256);
  201. movemem(SidAddress, Sid, 256);
  202. ConvertSidToAsciiString(Sid, SidString);
  203. (*Print)("PSID %s\n", SidString);
  204. }
  205. BOOL
  206. DbgDumpAceHeader(
  207. HANDLE hCurrentProcess,
  208. PNTSD_OUTPUT_ROUTINE Print,
  209. PVOID AceHeaderAddress
  210. )
  211. {
  212. ACE_HEADER AceHeader;
  213. DWORD i = 0;
  214. memset(&AceHeader, 0, sizeof(ACE_HEADER));
  215. movestruct(AceHeaderAddress, &AceHeader, ACE_HEADER);
  216. (*Print)("UCHAR AceType %.2x\n", AceHeader.AceType);
  217. switch (AceHeader.AceType) {
  218. case ACCESS_ALLOWED_ACE_TYPE:
  219. (*Print)("This is an ace of type: ACCESS_ALLOWED_ACE_TYPE\n");
  220. break;
  221. case ACCESS_DENIED_ACE_TYPE:
  222. (*Print)("This is an ace of type: ACCESS_DENIED_ACE_TYPE\n");
  223. break;
  224. case SYSTEM_AUDIT_ACE_TYPE:
  225. (*Print)("This is an ace of type: SYSTEM_AUDIT_ACE_TYPE\n");
  226. break;
  227. case SYSTEM_ALARM_ACE_TYPE:
  228. (*Print)("This is an ace of type: SYSTEM_ALARM_ACE_TYPE\n");
  229. break;
  230. }
  231. (*Print)("UCHAR AceFlags %.2x\n", AceHeader.AceFlags);
  232. for (i = 0; i < MAX_ACE_FLAGS; i++ ) {
  233. if (AceFlagsTable[i].Flags & AceHeader.AceFlags) {
  234. (*Print)("%s - ON (%d)\n", AceFlagsTable[i].String, AceFlagsTable[i].Flags);
  235. }else {
  236. (*Print)("%s - OFF (%d)\n", AceFlagsTable[i].String, AceFlagsTable[i].Flags);
  237. }
  238. }
  239. (*Print)("USHORT AceSize %d\n", AceHeader.AceSize);
  240. }
  241. BOOL
  242. DbgDumpAcl(
  243. HANDLE hCurrentProcess,
  244. PNTSD_OUTPUT_ROUTINE Print,
  245. PVOID AclAddress
  246. )
  247. {
  248. ACL Acl;
  249. PVOID AceAddress;
  250. ACE_HEADER AceHeader;
  251. ACCESS_ALLOWED_ACE AccessAllowedAce;
  252. ACCESS_DENIED_ACE AccessDeniedAce;
  253. SYSTEM_AUDIT_ACE SystemAuditAce;
  254. SYSTEM_ALARM_ACE SystemAlarmAce;
  255. DWORD i;
  256. DWORD SidAddress;
  257. // Pull the Acl across
  258. movestruct(AclAddress, &Acl, ACL);
  259. (*Print)("ACL\n");
  260. (*Print)("UCHAR AclRevision 0x%x\n", Acl.AclRevision);
  261. (*Print)("UCHAR Sbz1 0x%x\n", Acl.Sbz1);
  262. (*Print)("USHORT AclSize %d\n", Acl.AclSize);
  263. (*Print)("USHORT AceCount %d\n", Acl.AceCount);
  264. (*Print)("USHORT Sz2 0x%x\n", Acl.Sbz2);
  265. AceAddress = (LPBYTE)AclAddress + sizeof(ACL);
  266. for (i = 0; i < Acl.AceCount; i++ ) {
  267. (*Print)("\nAce # %d: ",i);
  268. DbgDumpAceHeader(hCurrentProcess, Print, AceAddress);
  269. movestruct(AceAddress, &AceHeader, ACE_HEADER);
  270. switch (AceHeader.AceType) {
  271. case ACCESS_ALLOWED_ACE_TYPE:
  272. memset(&AccessAllowedAce, 0, sizeof(ACCESS_ALLOWED_ACE));
  273. movestruct(AceAddress, &AccessAllowedAce, ACCESS_ALLOWED_ACE);
  274. (*Print)("ACCESSMASK AccessMask %.8x\n", AccessAllowedAce.Mask);
  275. SidAddress = (DWORD)((LPBYTE)AceAddress + sizeof(ACE_HEADER) + sizeof(ACCESS_MASK));
  276. // (*Print)("The Address of the Sid is %.8x\n", SidAddress);
  277. DbgDumpSid(hCurrentProcess, Print, (PVOID)SidAddress);
  278. break;
  279. case ACCESS_DENIED_ACE_TYPE:
  280. memset(&AccessDeniedAce, 0, sizeof(ACCESS_DENIED_ACE));
  281. movestruct(AceAddress, &AccessDeniedAce, ACCESS_DENIED_ACE);
  282. (*Print)("ACCESSMASK AccessMask %.8x\n", AccessDeniedAce.Mask);
  283. SidAddress = (DWORD)((LPBYTE)AceAddress + sizeof(ACE_HEADER) + sizeof(ACCESS_MASK));
  284. DbgDumpSid(hCurrentProcess, Print, (PVOID)SidAddress);
  285. break;
  286. case SYSTEM_AUDIT_ACE_TYPE:
  287. memset(&SystemAuditAce, 0, sizeof(SYSTEM_AUDIT_ACE));
  288. movestruct(AceAddress, &SystemAuditAce, SYSTEM_AUDIT_ACE);
  289. (*Print)("ACCESSMASK AccessMask %.8x\n", SystemAuditAce.Mask);
  290. SidAddress = (DWORD)((LPBYTE)AceAddress + sizeof(ACE_HEADER) + sizeof(ACCESS_MASK));
  291. DbgDumpSid(hCurrentProcess, Print, (PVOID)SidAddress);
  292. break;
  293. case SYSTEM_ALARM_ACE_TYPE:
  294. memset(&SystemAlarmAce, 0, sizeof(SYSTEM_ALARM_ACE));
  295. movestruct(AceAddress, &SystemAlarmAce, SYSTEM_ALARM_ACE);
  296. (*Print)("ACCESSMASK AccessMask %.8x\n", SystemAlarmAce.Mask);
  297. SidAddress = (DWORD)((LPBYTE)AceAddress + sizeof(ACE_HEADER) + sizeof(ACCESS_MASK));
  298. DbgDumpSid(hCurrentProcess, Print, (PVOID)SidAddress);
  299. break;
  300. }
  301. AceAddress = (PVOID)((DWORD)AceAddress + AceHeader.AceSize);
  302. (*Print)("\n");
  303. }
  304. }
  305. BOOL
  306. dsd(
  307. HANDLE hCurrentProcess,
  308. HANDLE hCurrentThread,
  309. DWORD dwCurrentPc,
  310. PNTSD_EXTENSION_APIS lpExtensionApis,
  311. LPSTR lpArgumentString)
  312. {
  313. PNTSD_OUTPUT_ROUTINE Print;
  314. PNTSD_GET_EXPRESSION EvalExpression;
  315. PNTSD_GET_SYMBOL GetSymbol;
  316. DWORD dwAddress = (DWORD)NULL;
  317. DWORD dwCount = 0;
  318. BOOL bThereAreOptions = TRUE;
  319. UNREFERENCED_PARAMETER(hCurrentProcess);
  320. UNREFERENCED_PARAMETER(hCurrentThread);
  321. UNREFERENCED_PARAMETER(dwCurrentPc);
  322. Print = lpExtensionApis->lpOutputRoutine;
  323. EvalExpression = lpExtensionApis->lpGetExpressionRoutine;
  324. GetSymbol = lpExtensionApis->lpGetSymbolRoutine;
  325. while (bThereAreOptions) {
  326. while (isspace(*lpArgumentString)) {
  327. lpArgumentString++;
  328. }
  329. switch (*lpArgumentString) {
  330. case 'c':
  331. lpArgumentString++;
  332. dwCount = EvalValue(&lpArgumentString, EvalExpression, Print);
  333. break;
  334. default: // go get the address because there's nothing else
  335. bThereAreOptions = FALSE;
  336. break;
  337. }
  338. }
  339. if (*lpArgumentString != 0) {
  340. dwAddress = EvalValue(&lpArgumentString, EvalExpression, Print);
  341. }
  342. // if we've got no address, then quit now - nothing we can do
  343. if (dwAddress == (DWORD)NULL) {
  344. Print("We have a Null address\n");
  345. return(0);
  346. }
  347. DbgDumpSecurityDescriptor(
  348. hCurrentProcess,
  349. Print,
  350. (PISECURITY_DESCRIPTOR)dwAddress
  351. );
  352. // Add Command to the Command Queue
  353. return 0;
  354. DBG_UNREFERENCED_PARAMETER(hCurrentProcess);
  355. DBG_UNREFERENCED_PARAMETER(hCurrentThread);
  356. DBG_UNREFERENCED_PARAMETER(dwCurrentPc);
  357. }
  358. BOOL
  359. dsid(
  360. HANDLE hCurrentProcess,
  361. HANDLE hCurrentThread,
  362. DWORD dwCurrentPc,
  363. PNTSD_EXTENSION_APIS lpExtensionApis,
  364. LPSTR lpArgumentString)
  365. {
  366. PNTSD_OUTPUT_ROUTINE Print;
  367. PNTSD_GET_EXPRESSION EvalExpression;
  368. PNTSD_GET_SYMBOL GetSymbol;
  369. DWORD dwAddress = (DWORD)NULL;
  370. DWORD dwCount = 0;
  371. BOOL bThereAreOptions = TRUE;
  372. UNREFERENCED_PARAMETER(hCurrentProcess);
  373. UNREFERENCED_PARAMETER(hCurrentThread);
  374. UNREFERENCED_PARAMETER(dwCurrentPc);
  375. Print = lpExtensionApis->lpOutputRoutine;
  376. EvalExpression = lpExtensionApis->lpGetExpressionRoutine;
  377. GetSymbol = lpExtensionApis->lpGetSymbolRoutine;
  378. while (bThereAreOptions) {
  379. while (isspace(*lpArgumentString)) {
  380. lpArgumentString++;
  381. }
  382. switch (*lpArgumentString) {
  383. case 'c':
  384. lpArgumentString++;
  385. dwCount = EvalValue(&lpArgumentString, EvalExpression, Print);
  386. break;
  387. default: // go get the address because there's nothing else
  388. bThereAreOptions = FALSE;
  389. break;
  390. }
  391. }
  392. if (*lpArgumentString != 0) {
  393. dwAddress = EvalValue(&lpArgumentString, EvalExpression, Print);
  394. }
  395. // if we've got no address, then quit now - nothing we can do
  396. if (dwAddress == (DWORD)NULL) {
  397. Print("We have a Null address\n");
  398. return(0);
  399. }
  400. DbgDumpSid(
  401. hCurrentProcess,
  402. Print,
  403. (PVOID)dwAddress
  404. );
  405. // Add Command to the Command Queue
  406. return 0;
  407. DBG_UNREFERENCED_PARAMETER(hCurrentProcess);
  408. DBG_UNREFERENCED_PARAMETER(hCurrentThread);
  409. DBG_UNREFERENCED_PARAMETER(dwCurrentPc);
  410. }
  411. BOOL
  412. DbgDumpAccessMask(
  413. HANDLE hCurrentProcess,
  414. PNTSD_OUTPUT_ROUTINE Print,
  415. DWORD AccessMask
  416. )
  417. {
  418. DWORD i;
  419. for (i = 0; i < 33; i++) {
  420. if (AccessMask & AccessMaskTable[i].Flag) {
  421. (*Print)("%s\t\tON\n", AccessMaskTable[i].String);
  422. }else {
  423. (*Print)("%s\t\tOFF\n", AccessMaskTable[i].String);
  424. }
  425. }
  426. return TRUE;
  427. }
  428. BOOL
  429. dam(
  430. HANDLE hCurrentProcess,
  431. HANDLE hCurrentThread,
  432. DWORD dwCurrentPc,
  433. PNTSD_EXTENSION_APIS lpExtensionApis,
  434. LPSTR lpArgumentString)
  435. {
  436. PNTSD_OUTPUT_ROUTINE Print;
  437. PNTSD_GET_EXPRESSION EvalExpression;
  438. PNTSD_GET_SYMBOL GetSymbol;
  439. DWORD AccessMask = (DWORD)NULL;
  440. DWORD dwCount = 0;
  441. BOOL bThereAreOptions = TRUE;
  442. UNREFERENCED_PARAMETER(hCurrentProcess);
  443. UNREFERENCED_PARAMETER(hCurrentThread);
  444. UNREFERENCED_PARAMETER(dwCurrentPc);
  445. Print = lpExtensionApis->lpOutputRoutine;
  446. EvalExpression = lpExtensionApis->lpGetExpressionRoutine;
  447. GetSymbol = lpExtensionApis->lpGetSymbolRoutine;
  448. while (bThereAreOptions) {
  449. while (isspace(*lpArgumentString)) {
  450. lpArgumentString++;
  451. }
  452. switch (*lpArgumentString) {
  453. case 'c':
  454. lpArgumentString++;
  455. dwCount = EvalValue(&lpArgumentString, EvalExpression, Print);
  456. break;
  457. default: // go get the address because there's nothing else
  458. bThereAreOptions = FALSE;
  459. break;
  460. }
  461. }
  462. if (*lpArgumentString != 0) {
  463. AccessMask = EvalValue(&lpArgumentString, EvalExpression, Print);
  464. }
  465. // if we've got no address, then quit now - nothing we can do
  466. if (AccessMask == (DWORD)NULL) {
  467. Print("We have a Null address\n");
  468. return(0);
  469. }
  470. DbgDumpAccessMask(
  471. hCurrentProcess,
  472. Print,
  473. AccessMask
  474. );
  475. // Add Command to the Command Queue
  476. return 0;
  477. DBG_UNREFERENCED_PARAMETER(hCurrentProcess);
  478. DBG_UNREFERENCED_PARAMETER(hCurrentThread);
  479. DBG_UNREFERENCED_PARAMETER(dwCurrentPc);
  480. }
  481.