ReactOS  0.4.13-dev-99-g7e18b6d
hivetest.c
Go to the documentation of this file.
1 #include <stdarg.h>
2 #include <string.h>
3 #include <stdio.h>
4 #define WIN32_NO_STATUS
5 #include <windows.h>
6 #define NTOS_MODE_USER
7 #include <ndk/ntndk.h>
8 #include <ndk/rtltypes.h>
9 
10 #define RtlRosInitUnicodeStringFromLiteral(__Name__, __Value__) \
11  { \
12  (__Name__)->Buffer = (__Value__); \
13  (__Name__)->Length = sizeof(__Value__) - sizeof(WCHAR); \
14  (__Name__)->MaximumLength = sizeof(__Value__); \
15  }
16 
19 
20 void dprintf(char* fmt, ...)
21 {
22  va_list args;
23  char buffer[255];
24 
25  va_start(args,fmt);
28  va_end(args);
29 }
30 
32 {
34  KEY_BASIC_INFORMATION KeyInformation[5];
37  HANDLE hKey1;
39 
42  , NULL, NULL);
44  dprintf("NtEnumerateKey : \n");
45  Index=0;
46  while(Status == STATUS_SUCCESS)
47  {
49  ,&KeyInformation[0], sizeof(KeyInformation)
50  ,&Length);
52  {
53  dprintf("\tSubKey Name = ");
54  for (i=0;i<KeyInformation[0].NameLength/2;i++)
55  dprintf("%C",KeyInformation[0].Name[i]);
56  dprintf("\n");
57  }
58  }
59  NtClose(hKey1);
60 }
61 
62 
63 void CreateKeyTest(void)
64 {
65  HANDLE hKey;
68  UNICODE_STRING KeyName = RTL_CONSTANT_STRING(L"\\Registry\\Machine\\Software\\testkey");
69 
70  dprintf("Create key '\\Registry\\Machine\\Software\\testkey':\n");
71 
73  &KeyName,
75  NULL,
76  NULL);
77  dprintf("NtCreateKey:\n");
78  Status = NtCreateKey(&hKey,
81  0,
82  NULL,
84  NULL);
85  dprintf(" Status = %lx\n",Status);
86  if (NT_SUCCESS(Status))
87  {
88  NtClose(hKey);
89  }
90 }
91 
92 
93 void DeleteKeyTest(void)
94 {
96  UNICODE_STRING KeyName = RTL_CONSTANT_STRING(L"\\Registry\\Machine\\Software\\testkey");
97  HANDLE hKey;
99 
100  dprintf("Delete key '\\Registry\\Machine\\Software\\testkey':\n");
101 
103  &KeyName,
105  NULL,
106  NULL);
107  dprintf("NtOpenKey:\n");
108  Status = NtOpenKey(&hKey,
111  dprintf(" Status = %lx\n",Status);
112  if (!NT_SUCCESS(Status))
113  return;
114 
115  dprintf("NtDeleteKey:\n");
116  Status = NtDeleteKey(hKey);
117  dprintf(" Status = %lx\n",Status);
118  NtClose(hKey);
119 }
120 
121 
123 {
124  HANDLE hKey = NULL;
127  UNICODE_STRING KeyName = RTL_CONSTANT_STRING(L"\\Registry\\Machine\\Software");
128  ULONG Index;
129  ULONG Length;
130  ULONG i;
131  KEY_BASIC_INFORMATION KeyInformation[5];
132 
133  dprintf("Enumerate key '\\Registry\\Machine\\Software':\n");
134 
136  &KeyName,
138  NULL,
139  NULL);
140  dprintf("NtOpenKey:\n");
141  Status = NtOpenKey(&hKey,
144  dprintf(" Status = %lx\n", Status);
145  if (!NT_SUCCESS(Status))
146  return;
147 
148  dprintf("NtQueryKey:\n");
149  Status = NtQueryKey(hKey,
151  &KeyInformation[0],
152  sizeof(KeyInformation),
153  &Length);
154  dprintf(" Status = %lx\n", Status);
155  if (NT_SUCCESS(Status))
156  {
157  dprintf("\tKey Name = ");
158  for (i = 0; i < KeyInformation[0].NameLength / 2; i++)
159  dprintf("%C", KeyInformation[0].Name[i]);
160  dprintf("\n");
161  }
162 
163  dprintf("NtEnumerateKey:\n");
164  Index=0;
165  while(NT_SUCCESS(Status))
166  {
167  Status = NtEnumerateKey(hKey,
168  Index,
170  &KeyInformation[0],
171  sizeof(KeyInformation),
172  &Length);
173  if (NT_SUCCESS(Status))
174  {
175  dprintf("\tSubKey Name = ");
176  for (i = 0; i < KeyInformation[0].NameLength / 2; i++)
177  dprintf("%C", KeyInformation[0].Name[i]);
178  dprintf("\n");
179  }
180  Index++;
181  }
182 
183  dprintf("NtClose:\n");
184  Status = NtClose(hKey);
185  dprintf(" Status = %lx\n", Status);
186 }
187 
188 
189 void SetValueTest1(void)
190 {
191  HANDLE hKey;
193  UNICODE_STRING KeyName = RTL_CONSTANT_STRING(L"\\Registry\\Machine\\Software\\testkey");
196 
197  dprintf("Create key '\\Registry\\Machine\\Software\\testkey':\n");
198 
200  &KeyName,
202  NULL,
203  NULL);
204  dprintf("NtCreateKey:\n");
205  Status = NtCreateKey(&hKey,
208  0,
209  NULL,
211  NULL);
212  dprintf(" Status = %lx\n",Status);
213  if (!NT_SUCCESS(Status))
214  return;
215 
216 
217  dprintf("NtSetValueKey:\n");
218  Status = NtSetValueKey(hKey,
219  &ValueName,
220  0,
221  REG_SZ,
222  (PVOID)L"TestString",
223  24);
224  dprintf(" Status = %lx\n",Status);
225 
226  NtClose(hKey);
227 }
228 
229 
230 void SetValueTest2(void)
231 {
232  HANDLE hKey;
234  UNICODE_STRING KeyName = RTL_CONSTANT_STRING(L"\\Registry\\Machine\\Software\\testkey");
237 
238  dprintf("Create key '\\Registry\\Machine\\Software\\testkey':\n");
239 
241  &KeyName,
243  NULL,
244  NULL);
245  dprintf("NtCreateKey:\n");
246  Status = NtCreateKey(&hKey,
249  0,
250  NULL,
252  NULL);
253  dprintf(" Status = %lx\n",Status);
254  if (!NT_SUCCESS(Status))
255  return;
256 
257  dprintf("NtSetValueKey:\n");
258  Status = NtSetValueKey(hKey,
259  &ValueName,
260  0,
261  REG_DWORD,
262  (PVOID)"reac",
263  4);
264  dprintf(" Status = %lx\n",Status);
265 
266  NtClose(hKey);
267 }
268 
269 
270 void DeleteValueTest(void)
271 {
273  UNICODE_STRING KeyName = RTL_CONSTANT_STRING(L"\\Registry\\Machine\\Software\\testkey");
277 
278  dprintf("Open key '\\Registry\\Machine\\Software\\testkey':\n");
279 
281  &KeyName,
283  NULL,
284  NULL);
288  dprintf(" Status = %lx\n", Status);
289  if (!NT_SUCCESS(Status))
290  return;
291 
292  dprintf("Delete value:\n");
293 
294 
296  &ValueName);
297  dprintf(" Status = %lx\n", Status);
298 
299  dprintf("Close key:\n");
301  dprintf(" Status = %lx\n", Status);
302 }
303 
304 
306 {
307  KEY_VALUE_FULL_INFORMATION KeyValueInformation[5];
309  UNICODE_STRING KeyName = RTL_CONSTANT_STRING(L"\\Registry\\Machine\\Software\\testkey");
311  HANDLE hKey = NULL;
313 
314  dprintf("Open key '\\Registry\\Machine\\Software\\testkey':\n");
315 
317  &KeyName,
319  NULL,
320  NULL);
321  Status=NtOpenKey(&hKey,
324  dprintf(" Status = %lx\n", Status);
325  if (!NT_SUCCESS(Status))
326  return;
327 
328  dprintf("Enumerate values:\n");
329  Index = 0;
330  while (Status == STATUS_SUCCESS)
331  {
333  Index++,
335  &KeyValueInformation[0],
336  sizeof(KeyValueInformation),
337  &Length);
338  if (Status == STATUS_SUCCESS)
339  {
340  dprintf(" Value:DO=%d, DL=%d, NL=%d, Name = ",
341  KeyValueInformation[0].DataOffset,
342  KeyValueInformation[0].DataLength,
343  KeyValueInformation[0].NameLength);
344  for (i = 0; i < KeyValueInformation[0].NameLength / 2; i++)
345  dprintf("%C", KeyValueInformation[0].Name[i]);
346  dprintf(", Type = %d\n", KeyValueInformation[0].Type);
347 
348  if (KeyValueInformation[0].Type == REG_SZ)
349  dprintf(" Value = %S\n",
350  ((char*)&KeyValueInformation[0]+KeyValueInformation[0].DataOffset));
351 
352  if (KeyValueInformation[0].Type == REG_DWORD)
353  dprintf(" Value = %X\n",
354  *((DWORD*)((char*)&KeyValueInformation[0]+KeyValueInformation[0].DataOffset)));
355  }
356  }
357 
358  dprintf("NtClose:\n");
359  Status = NtClose(hKey);
360  dprintf(" Status = %lx\n", Status);
361 }
362 
363 
364 
365 
366 void test1(void)
367 {
368  HANDLE hKey = NULL, hKey1;
371  UNICODE_STRING KeyName = RTL_CONSTANT_STRING(L"\\Registry\\Machine\\Software");
373  KEY_BASIC_INFORMATION KeyInformation[5];
374 
375 #if 0
376  dprintf("NtOpenKey \\Registry : ");
377 #endif
378  dprintf("NtOpenKey \\Registry\\Machine\\Software : ");
380  &KeyName,
382  NULL,
383  NULL);
385  dprintf("\t\t\t\tStatus =%x\n",Status);
386  if(Status==0)
387  {
388  dprintf("NtQueryKey : ");
390  ,&KeyInformation[0], sizeof(KeyInformation)
391  ,&Length);
392  dprintf("\t\t\t\t\tStatus =%x\n",Status);
393  if (Status == STATUS_SUCCESS)
394  {
395  dprintf("\tKey Name = ");
396  for (i=0;i<KeyInformation[0].NameLength/2;i++)
397  dprintf("%C",KeyInformation[0].Name[i]);
398  dprintf("\n");
399  }
400  dprintf("NtEnumerateKey : \n");
401  Index=0;
402  while(Status == STATUS_SUCCESS)
403  {
405  ,&KeyInformation[0], sizeof(KeyInformation)
406  ,&Length);
407  if(Status== STATUS_SUCCESS)
408  {
409  dprintf("\tSubKey Name = ");
410  for (i=0;i<KeyInformation[0].NameLength/2;i++)
411  dprintf("%C",KeyInformation[0].Name[i]);
412  dprintf("\n");
413  }
414  }
415  dprintf("NtClose : ");
416  Status = NtClose( hKey1 );
417  dprintf("\t\t\t\t\tStatus =%x\n",Status);
418  }
419  NtClose(hKey);
420 }
421 
422 
423 void test3(void)
424 {
425  HANDLE hKey;
429  char Buffer[10];
430  DWORD Result;
431  dprintf("NtCreateKey non volatile: \n");
432  dprintf(" \\Registry\\Machine\\Software\\test3reactos: ");
433  RtlRosInitUnicodeStringFromLiteral(&KeyName, L"\\Registry\\Machine\\Software\\test3reactos");
435  , NULL, NULL);
438  dprintf("\t\tStatus=%x\n",Status);
439  NtClose(hKey);
440 
441  dprintf("delete \\Registry\\Machine\\software\\test3reactos ?");
443  if (Buffer[0] != 'y' && Buffer[0] != 'Y') return;
444 
445  dprintf("delete \\Registry\\Machine\\software\\test3reactos ?");
446  RtlRosInitUnicodeStringFromLiteral(&KeyName, L"\\Registry\\Machine\\Software\\test3reactos");
448  &KeyName,
450  NULL,
451  NULL);
452  dprintf("NtOpenKey : ");
454  dprintf("\t\t\t\tStatus =%x\n",Status);
455  dprintf("NtDeleteKey : ");
456  Status=NtDeleteKey(hKey);
457  dprintf("\t\t\t\tStatus =%x\n",Status);
458  NtClose(hKey);
459 }
460 
461 void test4(void)
462 {
463  HKEY hKey = NULL,hKey1;
464  DWORD dwDisposition;
465  DWORD dwError;
466  DWORD RegDataType, RegDataSize;
467  BOOL GlobalFifoEnable;
468  HKEY hPortKey;
469  DWORD RegDisposition;
470  WCHAR szClass[260];
471  DWORD cchClass;
472  DWORD cSubKeys;
473  DWORD cchMaxSubkey;
474  DWORD cchMaxClass;
475  DWORD cValues;
476  DWORD cchMaxValueName;
477  DWORD cbMaxValueData;
478  DWORD cbSecurityDescriptor;
479  FILETIME ftLastWriteTime;
480  SYSTEMTIME LastWriteTime;
481 
482  dprintf ("RegOpenKeyExW HKLM\\System\\Setup: ");
484  L"System\\Setup",
485  0,
487  &hKey1);
488  dprintf("\t\tdwError =%x\n",dwError);
489  if (dwError == ERROR_SUCCESS)
490  {
491  dprintf("RegQueryInfoKeyW: ");
492  cchClass=260;
493  dwError = RegQueryInfoKeyW(hKey1
494  , szClass, &cchClass, NULL, &cSubKeys
495  , &cchMaxSubkey, &cchMaxClass, &cValues, &cchMaxValueName
496  , &cbMaxValueData, &cbSecurityDescriptor, &ftLastWriteTime);
497  dprintf ("\t\t\t\tdwError %x\n", dwError);
498  FileTimeToSystemTime(&ftLastWriteTime,&LastWriteTime);
499  dprintf ("\tnb of subkeys=%d,last write : %d/%d/%d %d:%02.2d'%02.2d''%03.3d\n",cSubKeys
500  ,LastWriteTime.wMonth
501  ,LastWriteTime.wDay
502  ,LastWriteTime.wYear
503  ,LastWriteTime.wHour
504  ,LastWriteTime.wMinute
505  ,LastWriteTime.wSecond
506  ,LastWriteTime.wMilliseconds
507  );
508  }
509 
510 
511  dprintf ("RegOpenKeyExW: ");
513  L"System\\ControlSet001\\Services\\Serial",
514  0,
516  &hKey);
517  dprintf ("\t\t\t\t\tdwError %x\n", dwError);
518  RegDataSize = sizeof(GlobalFifoEnable);
519  if (dwError == ERROR_SUCCESS)
520  {
521  dprintf ("RegQueryValueExW: ");
522  dwError = RegQueryValueExW(hKey,
523  L"ForceFifoEnable",
524  NULL,
525  &RegDataType,
526  (PBYTE)&GlobalFifoEnable,
527  &RegDataSize);
528  dprintf("\t\t\t\tdwError =%x\n",dwError);
529  if (dwError == 0)
530  {
531  dprintf("\tValue:DT=%d, DS=%d, Value=%d\n"
532  ,RegDataType
533  ,RegDataSize
534  ,GlobalFifoEnable);
535  }
536  }
537  dprintf ("RegCreateKeyExW: ");
538  dwError = RegCreateKeyExW(hKey,
539  L"Parameters\\Serial001",
540  0,
541  NULL,
542  0,
544  NULL,
545  &hPortKey,
546  &RegDisposition
547  );
548  dprintf ("\t\t\t\tdwError %x\n", dwError);
549 
550  dprintf ("RegCreateKeyExW: ");
552  L"Software\\test4reactos\\test",
553  0,
554  NULL,
557  NULL,
558  &hKey,
559  &dwDisposition);
560 
561  dprintf ("\t\t\t\tdwError %x ", dwError);
562  dprintf ("dwDisposition %x\n", dwDisposition);
563  if (dwError == ERROR_SUCCESS)
564  {
565  dprintf ("RegSetValueExW: ");
566  dwError = RegSetValueExW (hKey,
567  L"TestValue",
568  0,
569  REG_SZ,
570  (BYTE*)L"TestString",
571  20);
572 
573  dprintf ("\t\t\t\tdwError %x\n", dwError);
574  dprintf ("RegCloseKey: ");
575  dwError = RegCloseKey (hKey);
576  dprintf ("\t\t\t\t\tdwError %x\n", dwError);
577  }
578  dprintf ("\n\n");
579 
580  hKey = NULL;
581 
582  dprintf ("RegCreateKeyExW: ");
584  L"software\\Test",
585  0,
586  NULL,
589  NULL,
590  &hKey,
591  &dwDisposition);
592 
593  dprintf ("\t\t\t\tdwError %x ", dwError);
594  dprintf ("dwDisposition %x\n", dwDisposition);
595 
596 
597  if (dwError == ERROR_SUCCESS)
598  {
599  dprintf("RegQueryInfoKeyW: ");
600  cchClass=260;
601  dwError = RegQueryInfoKeyW(hKey
602  , szClass, &cchClass, NULL, &cSubKeys
603  , &cchMaxSubkey, &cchMaxClass, &cValues, &cchMaxValueName
604  , &cbMaxValueData, &cbSecurityDescriptor, &ftLastWriteTime);
605  dprintf ("\t\t\t\tdwError %x\n", dwError);
606  FileTimeToSystemTime(&ftLastWriteTime,&LastWriteTime);
607  dprintf ("\tnb of subkeys=%d,last write : %d/%d/%d %d:%02.2d'%02.2d''%03.3d\n",cSubKeys
608  ,LastWriteTime.wMonth
609  ,LastWriteTime.wDay
610  ,LastWriteTime.wYear
611  ,LastWriteTime.wHour
612  ,LastWriteTime.wMinute
613  ,LastWriteTime.wSecond
614  ,LastWriteTime.wMilliseconds
615  );
616  dprintf ("RegCloseKey: ");
617  dwError = RegCloseKey (hKey);
618  dprintf ("\t\t\t\t\tdwError %x\n", dwError);
619  }
620  dprintf ("\nTests done...\n");
621 }
622 
623 void test5(void)
624 {
625  HANDLE hKey;
629 
630  dprintf("NtOpenKey : \n");
631  dprintf(" \\Registry\\Machine\\Software\\reactos : ");
632  RtlRosInitUnicodeStringFromLiteral(&KeyName,L"\\Registry\\Machine\\Software\\reactos");
634  , NULL, NULL);
636  dprintf("\t\tStatus=%x\n",Status);
637  dprintf("NtFlushKey : \n");
638  Status = NtFlushKey(hKey);
639  dprintf("\t\tStatus=%x\n",Status);
640  dprintf("NtCloseKey : \n");
641  Status=NtClose(hKey);
642  dprintf("\t\tStatus=%x\n",Status);
643 }
644 
645 /* registry link create test */
646 void test6(void)
647 {
648  HANDLE hKey;
652  KEY_VALUE_FULL_INFORMATION KeyValueInformation[5];
653  ULONG Length,i;
654 
655  dprintf("Create target key\n");
656  dprintf(" Key: \\Registry\\Machine\\SOFTWARE\\Reactos\n");
657  RtlRosInitUnicodeStringFromLiteral(&KeyName, L"\\Registry\\Machine\\SOFTWARE\\Reactos");
659  , NULL, NULL);
662  dprintf(" NtCreateKey() called (Status %lx)\n",Status);
663  if (!NT_SUCCESS(Status))
664  return;
665 
666  dprintf("Create target value\n");
667  dprintf(" Value: TestValue = 'Test String'\n");
669  Status=NtSetValueKey(hKey,&ValueName,0,REG_SZ,(PVOID)L"TestString",22);
670  dprintf(" NtSetValueKey() called (Status %lx)\n",Status);
671  if (!NT_SUCCESS(Status))
672  return;
673 
674  dprintf("Close target key\n");
675  NtClose(hKey);
676 
677 
678  dprintf("Create link key\n");
679  dprintf(" Key: \\Registry\\Machine\\SOFTWARE\\Test\n");
680  RtlRosInitUnicodeStringFromLiteral(&KeyName, L"\\Registry\\Machine\\SOFTWARE\\Test");
682  &KeyName,
684  NULL,
685  NULL);
686  Status = NtCreateKey(&hKey,
689  0,
690  NULL,
692  NULL);
693  dprintf(" NtCreateKey() called (Status %lx)\n",Status);
694  if (!NT_SUCCESS(Status))
695  return;
696 
697  dprintf("Create link value\n");
698  dprintf(" Value: SymbolicLinkValue = '\\Registry\\Machine\\SOFTWARE\\Reactos'\n");
699  RtlRosInitUnicodeStringFromLiteral(&ValueName, L"SymbolicLinkValue");
700  Status=NtSetValueKey(hKey,&ValueName,0,REG_LINK,(PVOID)L"\\Registry\\Machine\\SOFTWARE\\Reactos",68);
701  dprintf(" NtSetValueKey() called (Status %lx)\n",Status);
702  if (!NT_SUCCESS(Status))
703  {
704  dprintf("Creating link value failed! Test failed!\n");
705  NtClose(hKey);
706  return;
707  }
708 
709  dprintf("Close link key\n");
710  NtClose(hKey);
711 
712  dprintf("Open link key\n");
713  dprintf(" Key: \\Registry\\Machine\\SOFTWARE\\Test\n");
714  RtlRosInitUnicodeStringFromLiteral(&KeyName, L"\\Registry\\Machine\\SOFTWARE\\Test");
716  , NULL, NULL);
719  dprintf(" NtCreateKey() called (Status %lx)\n",Status);
720  if (!NT_SUCCESS(Status))
721  return;
722 
723  dprintf("Query value\n");
724  dprintf(" Value: TestValue\n");
726  Status=NtQueryValueKey(hKey,
727  &ValueName,
729  &KeyValueInformation[0],
730  sizeof(KeyValueInformation),
731  &Length);
732  dprintf(" NtQueryValueKey() called (Status %lx)\n",Status);
733  if (Status == STATUS_SUCCESS)
734  {
735  dprintf(" Value: Type %d DataLength %d NameLength %d Name '",
736  KeyValueInformation[0].Type,
737  KeyValueInformation[0].DataLength,
738  KeyValueInformation[0].NameLength);
739  for (i=0; i < KeyValueInformation[0].NameLength / sizeof(WCHAR); i++)
740  dprintf("%C",KeyValueInformation[0].Name[i]);
741  dprintf("'\n");
742  if (KeyValueInformation[0].Type == REG_SZ)
743  dprintf(" Value '%S'\n",
744  KeyValueInformation[0].Name+1
745  +KeyValueInformation[0].NameLength/2);
746  }
747 
748  dprintf("Close link key\n");
749  NtClose(hKey);
750 
751  dprintf("Test successful!\n");
752 }
753 
754 /* registry link delete test */
755 void test7(void)
756 {
757  HANDLE hKey;
761 
762  dprintf("Open link key\n");
763  dprintf(" Key: \\Registry\\Machine\\SOFTWARE\\Test\n");
764  RtlRosInitUnicodeStringFromLiteral(&KeyName, L"\\Registry\\Machine\\SOFTWARE\\Test");
766  &KeyName,
768  NULL,
769  NULL);
770  Status = NtCreateKey(&hKey,
773  0,
774  NULL,
776  NULL);
777  dprintf(" NtCreateKey() called (Status %lx)\n",Status);
778  if (!NT_SUCCESS(Status))
779  {
780  dprintf("Could not open the link key. Please run the link create test first!\n");
781  return;
782  }
783 
784  dprintf("Delete link value\n");
785  RtlRosInitUnicodeStringFromLiteral(&ValueName, L"SymbolicLinkValue");
786  Status = NtDeleteValueKey(hKey,
787  &ValueName);
788  dprintf(" NtDeleteValueKey() called (Status %lx)\n",Status);
789 
790  dprintf("Delete link key\n");
791  Status=NtDeleteKey(hKey);
792  dprintf(" NtDeleteKey() called (Status %lx)\n",Status);
793 
794  dprintf("Close link key\n");
795  NtClose(hKey);
796 }
797 
798 
799 void test8(void)
800 {
804  LONG dwError;
805  TOKEN_PRIVILEGES NewPrivileges;
806  HANDLE Token,hKey;
807  LUID Luid = {0};
808  BOOLEAN bRes;
811 // ,TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,&Token);
812  dprintf("\t\t\t\tStatus =%x\n",Status);
813 // bRes=LookupPrivilegeValueA(NULL,SE_RESTORE_NAME,&Luid);
814 // dprintf("\t\t\t\tbRes =%x\n",bRes);
815  NewPrivileges.PrivilegeCount = 1;
816  NewPrivileges.Privileges[0].Luid = Luid;
817 // NewPrivileges.Privileges[0].Luid.u.LowPart=18;
818 // NewPrivileges.Privileges[0].Luid.u.HighPart=0;
819  NewPrivileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
820 
821 // Status = NtAdjustPrivilegesToken(
822  bRes = AdjustTokenPrivileges(
823  Token,
824  FALSE,
825  &NewPrivileges,
826  0,
827  NULL,
828  NULL
829  );
830  dprintf("\t\t\t\tbRes =%x\n",bRes);
831 
832 // Status=NtClose(Token);
833 // dprintf("\t\t\t\tStatus =%x\n",Status);
834 
835 
838  , NULL, NULL);
840  dprintf("\t\t\t\tStatus =%x\n",Status);
841  dwError=RegLoadKey(HKEY_LOCAL_MACHINE,"def"
842  ,"test5");
843  dprintf("\t\t\t\tdwError =%x\n",dwError);
844 
845  dprintf("NtOpenKey \\Registry\\Machine : ");
846  RtlRosInitUnicodeStringFromLiteral(&KeyName, L"\\Registry\\Machine");
848  &KeyName,
850  NULL,
851  NULL);
853  dprintf("\t\t\tStatus =%x\n",Status);
856  , NULL, NULL);
858  dprintf("\t\t\t\tStatus =%x\n",Status);
859 }
860 
861 void test9(void)
862 {
863  HANDLE hKey = NULL, hKey1;
868  KEY_BASIC_INFORMATION KeyInformation[5];
869  KEY_VALUE_FULL_INFORMATION KeyValueInformation[5];
870 
871  dprintf("NtOpenKey \\Registry : ");
873  &KeyName,
875  NULL,
876  NULL);
878  dprintf("\t\t\t\tStatus =%x\n",Status);
879  if (Status == 0) {
880  dprintf("NtQueryKey : ");
881  Status = NtQueryKey(hKey1, KeyBasicInformation, &KeyInformation[0], sizeof(KeyInformation), &Length);
882  dprintf("\t\t\t\t\tStatus =%x\n",Status);
883  if (Status == STATUS_SUCCESS) {
884  dprintf("\tKey Name = ");
885  for (i=0;i<KeyInformation[0].NameLength/2;i++)
886  dprintf("%C",KeyInformation[0].Name[i]);
887  dprintf("\n");
888  }
889 
890  dprintf("NtEnumerateKey : \n");
891  Index = 0;
892  while (Status == STATUS_SUCCESS) {
893  Status = NtEnumerateKey(hKey1,Index++,KeyBasicInformation,&KeyInformation[0], sizeof(KeyInformation),&Length);
894  if (Status == STATUS_SUCCESS) {
895  dprintf("\tSubKey Name = ");
896  for (i = 0; i < KeyInformation[0].NameLength / 2; i++)
897  dprintf("%C",KeyInformation[0].Name[i]);
898  dprintf("\n");
899  }
900  }
901  dprintf("NtClose : ");
902  Status = NtClose( hKey1 );
903  dprintf("\t\t\t\t\tStatus =%x\n",Status);
904  }
905  NtClose(hKey); // RobD - hKey unused so-far, should this have been hKey1 ???
906 
907  dprintf("NtOpenKey \\Registry\\Machine : ");
908  RtlRosInitUnicodeStringFromLiteral(&KeyName, L"\\Registry\\Machine");
910  &KeyName,
912  NULL,
913  NULL);
915  dprintf("\t\t\tStatus =%x\n",Status);
916 
917 //Status of c0000001 opening \Registry\Machine\System\CurrentControlSet\Services\Tcpip\Linkage
918 
919 // dprintf("NtOpenKey System\\CurrentControlSet\\Services\\Tcpip : ");
920 // RtlRosInitUnicodeStringFromLiteral(&KeyName, L"System\\CurrentControlSet\\Services\\Tcpip");
921 #if 1
922  dprintf("NtOpenKey System\\ControlSet001\\Services\\Tcpip\\Parameters : ");
923  RtlRosInitUnicodeStringFromLiteral(&KeyName, L"System\\ControlSet001\\Services\\Tcpip\\Parameters");
924 #else
925  dprintf("NtOpenKey System\\CurrentControlSet\\Services\\Tcpip : ");
926  RtlRosInitUnicodeStringFromLiteral(&KeyName, L"System\\CurrentControlSet\\Services\\Tcpip");
927 #endif
930  dprintf("\t\t\tStatus =%x\n",Status);
931  if (Status == 0) {
932  dprintf("NtQueryValueKey : ");
934  Status = NtQueryValueKey(hKey, &KeyName, KeyValueFullInformation, &KeyValueInformation[0], sizeof(KeyValueInformation), &Length);
935  dprintf("\t\t\t\tStatus =%x\n",Status);
936  if (Status == STATUS_SUCCESS) {
937  dprintf("\tValue:DO=%d, DL=%d, NL=%d, Name = "
938  ,KeyValueInformation[0].DataOffset
939  ,KeyValueInformation[0].DataLength
940  ,KeyValueInformation[0].NameLength);
941  for (i = 0; i < 10 && i < KeyValueInformation[0].NameLength / 2; i++)
942  dprintf("%C", KeyValueInformation[0].Name[i]);
943  dprintf("\n");
944  dprintf("\t\tType = %d\n", KeyValueInformation[0].Type);
945  if (KeyValueInformation[0].Type == REG_SZ)
946  //dprintf("\t\tValue = %S\n", KeyValueInformation[0].Name + 1 + KeyValueInformation[0].NameLength / 2);
947  dprintf("\t\tValue = %S\n", KeyValueInformation[0].Name + KeyValueInformation[0].NameLength / 2);
948  }
949  dprintf("NtEnumerateValueKey : \n");
950  Index = 0;
951  while (Status == STATUS_SUCCESS) {
952  Status = NtEnumerateValueKey(hKey, Index++, KeyValueFullInformation, &KeyValueInformation[0], sizeof(KeyValueInformation), &Length);
953  if (Status == STATUS_SUCCESS) {
954  dprintf("\tValue:DO=%d, DL=%d, NL=%d, Name = "
955  ,KeyValueInformation[0].DataOffset
956  ,KeyValueInformation[0].DataLength
957  ,KeyValueInformation[0].NameLength);
958  for (i = 0; i < KeyValueInformation[0].NameLength / 2; i++)
959  dprintf("%C", KeyValueInformation[0].Name[i]);
960  dprintf(", Type = %d\n", KeyValueInformation[0].Type);
961  if (KeyValueInformation[0].Type == REG_SZ)
962  dprintf("\t\tValue = %S\n", ((char*)&KeyValueInformation[0]+KeyValueInformation[0].DataOffset));
963  if (KeyValueInformation[0].Type == REG_DWORD)
964  dprintf("\t\tValue = %X\n", *((DWORD*)((char*)&KeyValueInformation[0]+KeyValueInformation[0].DataOffset)));
965  }
966  }
967  dprintf("NtClose : ");
968  Status = NtClose(hKey);
969  dprintf("\t\t\t\t\tStatus =%x\n", Status);
970  }
971  NtClose(hKey1);
972 }
973 
974 
975 int main(int argc, char* argv[])
976 {
977  char Buffer[10];
978  DWORD Result;
979 
980  AllocConsole();
983  while(1)
984  {
985  dprintf("choose test :\n");
986  dprintf(" 0 = Exit\n");
987  dprintf(" 1 = Create key\n");
988  dprintf(" 2 = Delete key\n");
989  dprintf(" 3 = Enumerate key\n");
990  dprintf(" 4 = Set value (REG_SZ)\n");
991  dprintf(" 5 = Set value (REG_DWORD)\n");
992  dprintf(" 6 = Delete value\n");
993  dprintf(" 7 = Enumerate value\n");
995  switch (Buffer[0])
996  {
997  case '0':
998  return(0);
999 
1000  case '1':
1001  CreateKeyTest();
1002  break;
1003 
1004  case '2':
1005  DeleteKeyTest();
1006  break;
1007 
1008  case '3':
1009  EnumerateKeyTest();
1010  break;
1011 
1012  case '4':
1013  SetValueTest1();
1014  break;
1015 
1016  case '5':
1017  SetValueTest2();
1018  break;
1019 
1020  case '6':
1021  DeleteValueTest();
1022  break;
1023 
1024  case '7':
1026  break;
1027  }
1028  }
1029  return(0);
1030 }
1031 
#define MAXIMUM_ALLOWED
Definition: nt_native.h:83
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
Definition: conport.c:35
_Must_inspect_result_ _Out_ PNDIS_STATUS _In_ NDIS_HANDLE _In_ ULONG _Out_ PNDIS_STRING KeyName
Definition: ndis.h:4693
void do_enumeratekey(PWSTR Name)
Definition: hivetest.c:31
static int argc
Definition: ServiceArgs.c:12
BOOL WINAPI AllocConsole(VOID)
Definition: console.c:48
void DeleteKeyTest(void)
Definition: hivetest.c:93
NTSTATUS NTAPI NtCreateKey(OUT PHANDLE KeyHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, IN ULONG TitleIndex, IN PUNICODE_STRING Class OPTIONAL, IN ULONG CreateOptions, OUT PULONG Disposition OPTIONAL)
Definition: ntapi.c:240
Type
Definition: Type.h:6
#define ERROR_SUCCESS
Definition: deptool.c:10
_Must_inspect_result_ _Out_ PNDIS_STATUS _In_ NDIS_HANDLE _In_ ULONG _Out_ PNDIS_STRING _Out_ PNDIS_HANDLE KeyHandle
Definition: ndis.h:4693
void SetValueTest2(void)
Definition: hivetest.c:230
WORD wMonth
Definition: winbase.h:871
ACPI_SIZE strlen(const char *String)
Definition: utclib.c:269
void test3(void)
Definition: hivetest.c:423
#define KEY_READ
Definition: nt_native.h:1023
uint16_t * PWSTR
Definition: typedefs.h:54
#define REG_OPTION_OPEN_LINK
Definition: nt_native.h:1070
LONG NTSTATUS
Definition: precomp.h:26
_IRQL_requires_same_ _In_ PLSA_STRING _In_ SECURITY_LOGON_TYPE _In_ ULONG _In_ ULONG _In_opt_ PTOKEN_GROUPS _In_ PTOKEN_SOURCE _Out_ PVOID _Out_ PULONG _Inout_ PLUID _Out_ PHANDLE Token
$ULONG PrivilegeCount
Definition: setypes.h:969
#define OBJ_OPENLINK
Definition: winternl.h:230
HANDLE WINAPI GetStdHandle(IN DWORD nStdHandle)
Definition: console.c:152
GLuint buffer
Definition: glext.h:5915
HANDLE InputHandle
Definition: hivetest.c:18
NTSTATUS NTAPI NtOpenProcessToken(IN HANDLE ProcessHandle, IN ACCESS_MASK DesiredAccess, OUT PHANDLE TokenHandle)
Definition: security.c:342
#define argv
Definition: mplay32.c:18
NTSTATUS NTAPI NtQueryKey(IN HANDLE KeyHandle, IN KEY_INFORMATION_CLASS KeyInformationClass, OUT PVOID KeyInformation, IN ULONG Length, OUT PULONG ResultLength)
Definition: ntapi.c:632
Definition: match.c:390
void dprintf(char *fmt,...)
Definition: hivetest.c:20
#define REG_OPTION_CREATE_LINK
Definition: nt_native.h:1063
LONG WINAPI RegCreateKeyExW(_In_ HKEY hKey, _In_ LPCWSTR lpSubKey, _In_ DWORD Reserved, _In_opt_ LPWSTR lpClass, _In_ DWORD dwOptions, _In_ REGSAM samDesired, _In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes, _Out_ PHKEY phkResult, _Out_opt_ LPDWORD lpdwDisposition)
Definition: reg.c:1094
NTSYSAPI NTSTATUS NTAPI NtEnumerateKey(IN HANDLE KeyHandle, IN ULONG Index, IN KEY_INFORMATION_CLASS KeyInformationClass, IN PVOID KeyInformation, IN ULONG Length, IN PULONG ResultLength)
#define OBJ_OPENIF
Definition: winternl.h:229
_In_ PUNICODE_STRING ValueName
Definition: cmfuncs.h:264
WORD wYear
Definition: winbase.h:870
#define SE_PRIVILEGE_ENABLED
Definition: setypes.h:63
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
LONG WINAPI RegCloseKey(HKEY hKey)
Definition: reg.c:423
#define va_end(ap)
Definition: acmsvcex.h:90
BOOL WINAPI DECLSPEC_HOTPATCH WriteConsoleA(IN HANDLE hConsoleOutput, IN CONST VOID *lpBuffer, IN DWORD nNumberOfCharsToWrite, OUT LPDWORD lpNumberOfCharsWritten, LPVOID lpReserved)
Definition: readwrite.c:1470
unsigned int BOOL
Definition: ntddk_ex.h:94
long LONG
Definition: pedump.c:60
WORD wMinute
Definition: winbase.h:875
unsigned char BOOLEAN
smooth NULL
Definition: ftsmooth.c:416
_At_(*)(_In_ PWSK_CLIENT Client, _In_opt_ PUNICODE_STRING NodeName, _In_opt_ PUNICODE_STRING ServiceName, _In_opt_ ULONG NameSpace, _In_opt_ GUID *Provider, _In_opt_ PADDRINFOEXW Hints, _Outptr_ PADDRINFOEXW *Result, _In_opt_ PEPROCESS OwningProcess, _In_opt_ PETHREAD OwningThread, _Inout_ PIRP Irp Result)(Mem)) NTSTATUS(WSKAPI *PFN_WSK_GET_ADDRESS_INFO
Definition: wsk.h:426
char * va_list
Definition: acmsvcex.h:78
Definition: bufpool.h:45
void test9(void)
Definition: hivetest.c:861
#define STD_INPUT_HANDLE
Definition: winbase.h:264
HANDLE OutputHandle
Definition: hivetest.c:17
void test7(void)
Definition: hivetest.c:755
NTSTATUS NTAPI NtLoadKey(IN POBJECT_ATTRIBUTES KeyObjectAttributes, IN POBJECT_ATTRIBUTES FileObjectAttributes)
Definition: ntapi.c:1109
NTSYSAPI NTSTATUS NTAPI NtDeleteValueKey(IN HANDLE KeyHandle, IN PUNICODE_STRING ValueName)
Definition: ntapi.c:994
#define REG_OPTION_NON_VOLATILE
Definition: nt_native.h:1057
LONG WINAPI RegSetValueExW(_In_ HKEY hKey, _In_ LPCWSTR lpValueName, _In_ DWORD Reserved, _In_ DWORD dwType, _In_ CONST BYTE *lpData, _In_ DWORD cbData)
Definition: reg.c:4917
NTSYSAPI NTSTATUS NTAPI NtQueryValueKey(IN HANDLE KeyHandle, IN PUNICODE_STRING ValueName, IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass, IN PVOID KeyValueInformation, IN ULONG Length, IN PULONG ResultLength)
#define REG_LINK
Definition: nt_native.h:1500
BOOL WINAPI FileTimeToSystemTime(IN CONST FILETIME *lpFileTime, OUT LPSYSTEMTIME lpSystemTime)
Definition: time.c:178
void SetValueTest1(void)
Definition: hivetest.c:189
LONG WINAPI RegQueryValueExW(_In_ HKEY hkeyorg, _In_ LPCWSTR name, _In_ LPDWORD reserved, _In_ LPDWORD type, _In_ LPBYTE data, _In_ LPDWORD count)
Definition: reg.c:4134
__wchar_t WCHAR
Definition: xmlstorage.h:180
int main(int argc, char *argv[])
Definition: hivetest.c:975
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
void EnumerateValueTest(void)
Definition: hivetest.c:305
HANDLE WINAPI GetCurrentProcess(VOID)
Definition: proc.c:1168
void test1(void)
Definition: hivetest.c:366
static const UCHAR Index[8]
Definition: usbohci.c:18
void DeleteValueTest(void)
Definition: hivetest.c:270
unsigned long DWORD
Definition: ntddk_ex.h:95
BOOL WINAPI DECLSPEC_HOTPATCH ReadConsoleA(IN HANDLE hConsoleInput, OUT LPVOID lpBuffer, IN DWORD nNumberOfCharsToRead, OUT LPDWORD lpNumberOfCharsRead, IN PCONSOLE_READCONSOLE_CONTROL pInputControl OPTIONAL)
Definition: readwrite.c:1197
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:101
LONG WINAPI RegQueryInfoKeyW(HKEY hKey, LPWSTR lpClass, LPDWORD lpcClass, LPDWORD lpReserved, LPDWORD lpcSubKeys, LPDWORD lpcMaxSubKeyLen, LPDWORD lpcMaxClassLen, LPDWORD lpcValues, LPDWORD lpcMaxValueNameLen, LPDWORD lpcMaxValueLen, LPDWORD lpcbSecurityDescriptor, PFILETIME lpftLastWriteTime)
Definition: reg.c:3704
NTSTATUS NTAPI NtClose(IN HANDLE Handle)
Definition: obhandle.c:3399
#define OBJ_CASE_INSENSITIVE
Definition: winternl.h:228
WORD wSecond
Definition: winbase.h:876
WORD wMilliseconds
Definition: winbase.h:877
void test8(void)
Definition: hivetest.c:799
static const WCHAR L[]
Definition: oid.c:1250
unsigned char BYTE
Definition: mem.h:68
void CreateKeyTest(void)
Definition: hivetest.c:63
NTSTATUS NTAPI NtEnumerateValueKey(IN HANDLE KeyHandle, IN ULONG Index, IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass, OUT PVOID KeyValueInformation, IN ULONG Length, OUT PULONG ResultLength)
Definition: ntapi.c:542
#define STD_OUTPUT_HANDLE
Definition: winbase.h:265
BOOL WINAPI AdjustTokenPrivileges(HANDLE TokenHandle, BOOL DisableAllPrivileges, PTOKEN_PRIVILEGES NewState, DWORD BufferLength, PTOKEN_PRIVILEGES PreviousState, PDWORD ReturnLength)
Definition: security.c:376
Status
Definition: gdiplustypes.h:24
NTSTATUS NTAPI NtDeleteKey(IN HANDLE KeyHandle)
Definition: ntapi.c:408
WORD wDay
Definition: winbase.h:873
#define KEY_ALL_ACCESS
Definition: nt_native.h:1041
#define KEY_CREATE_LINK
Definition: nt_native.h:1021
NTSTATUS NTAPI NtFlushKey(IN HANDLE KeyHandle)
Definition: ntapi.c:1065
int __cdecl vsprintf(char *_Dest, const char *_Format, va_list _Args)
Definition: sprintf.c:733
WORD wHour
Definition: winbase.h:874
#define va_start(ap, A)
Definition: acmsvcex.h:91
NTSYSAPI NTSTATUS NTAPI NtSetValueKey(IN HANDLE KeyHandle, IN PUNICODE_STRING ValueName, IN ULONG TitleIndex OPTIONAL, IN ULONG Type, IN PVOID Data, IN ULONG DataSize)
Definition: ntapi.c:859
LUID_AND_ATTRIBUTES Privileges[ANYSIZE_ARRAY]
Definition: setypes.h:970
NTSYSAPI NTSTATUS NTAPI NtOpenKey(OUT PHANDLE KeyHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes)
Definition: ntapi.c:336
unsigned int ULONG
Definition: retypes.h:1
LONG WINAPI RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
Definition: reg.c:3381
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
#define RtlRosInitUnicodeStringFromLiteral(__Name__, __Value__)
Definition: hivetest.c:10
#define InitializeObjectAttributes(p, n, a, r, s)
Definition: reg.c:106
#define REG_OPTION_VOLATILE
Definition: nt_native.h:1060
void test5(void)
Definition: hivetest.c:623
_Must_inspect_result_ _Out_writes_to_ DataLength PHIDP_DATA _Inout_ PULONG DataLength
Definition: hidpi.h:333
return STATUS_SUCCESS
Definition: btrfs.c:2725
#define RegLoadKey
Definition: winreg.h:515
#define REG_DWORD
Definition: sdbapi.c:596
#define TOKEN_ADJUST_PRIVILEGES
Definition: setypes.h:876
#define args
Definition: format.c:66
BYTE * PBYTE
Definition: pedump.c:66
Definition: dsound.c:943
void test4(void)
Definition: hivetest.c:461
void test6(void)
Definition: hivetest.c:646
#define HKEY_LOCAL_MACHINE
Definition: winreg.h:12
#define RTL_CONSTANT_STRING(s)
Definition: tunneltest.c:14
#define REG_SZ
Definition: layer.c:22
void EnumerateKeyTest(void)
Definition: hivetest.c:122