Fixed hivetest.
[reactos.git] / rosapps / tests / hivetest / hivetest.c
1 #include <stdarg.h>
2 #include <string.h>
3 #include <stdio.h>
4
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
17 HANDLE OutputHandle;
18 HANDLE InputHandle;
19
20 void dprintf(char* fmt, ...)
21 {
22 va_list args;
23 char buffer[255];
24
25 va_start(args,fmt);
26 vsprintf(buffer,fmt,args);
27 WriteConsoleA(OutputHandle, buffer, strlen(buffer), NULL, NULL);
28 va_end(args);
29 }
30
31 void do_enumeratekey(PWSTR Name)
32 {
33 ULONG Index,Length,i;
34 KEY_BASIC_INFORMATION KeyInformation[5];
35 NTSTATUS Status;
36 OBJECT_ATTRIBUTES ObjectAttributes;
37 HANDLE hKey1;
38 UNICODE_STRING KeyName;
39
40 RtlInitUnicodeString(&KeyName, Name);
41 InitializeObjectAttributes(&ObjectAttributes, &KeyName, OBJ_CASE_INSENSITIVE
42 , NULL, NULL);
43 Status=NtOpenKey( &hKey1, MAXIMUM_ALLOWED, &ObjectAttributes);
44 dprintf("NtEnumerateKey : \n");
45 Index=0;
46 while(Status == STATUS_SUCCESS)
47 {
48 Status=NtEnumerateKey(hKey1,Index++,KeyBasicInformation
49 ,&KeyInformation[0], sizeof(KeyInformation)
50 ,&Length);
51 if(Status== STATUS_SUCCESS)
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;
66 OBJECT_ATTRIBUTES ObjectAttributes;
67 NTSTATUS Status;
68 UNICODE_STRING KeyName = RTL_CONSTANT_STRING(L"\\Registry\\Machine\\Software\\testkey");
69
70 dprintf("Create key '\\Registry\\Machine\\Software\\testkey':\n");
71
72 InitializeObjectAttributes(&ObjectAttributes,
73 &KeyName,
74 OBJ_CASE_INSENSITIVE,
75 NULL,
76 NULL);
77 dprintf("NtCreateKey:\n");
78 Status = NtCreateKey(&hKey,
79 KEY_ALL_ACCESS,
80 &ObjectAttributes,
81 0,
82 NULL,
83 REG_OPTION_NON_VOLATILE,
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 {
95 OBJECT_ATTRIBUTES ObjectAttributes;
96 UNICODE_STRING KeyName = RTL_CONSTANT_STRING(L"\\Registry\\Machine\\Software\\testkey");
97 HANDLE hKey;
98 NTSTATUS Status;
99
100 dprintf("Delete key '\\Registry\\Machine\\Software\\testkey':\n");
101
102 InitializeObjectAttributes(&ObjectAttributes,
103 &KeyName,
104 OBJ_CASE_INSENSITIVE,
105 NULL,
106 NULL);
107 dprintf("NtOpenKey:\n");
108 Status = NtOpenKey(&hKey,
109 KEY_ALL_ACCESS,
110 &ObjectAttributes);
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
122 void EnumerateKeyTest(void)
123 {
124 HANDLE hKey = NULL;
125 OBJECT_ATTRIBUTES ObjectAttributes;
126 NTSTATUS Status;
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
135 InitializeObjectAttributes(&ObjectAttributes,
136 &KeyName,
137 OBJ_CASE_INSENSITIVE,
138 NULL,
139 NULL);
140 dprintf("NtOpenKey:\n");
141 Status = NtOpenKey(&hKey,
142 KEY_ALL_ACCESS,
143 &ObjectAttributes);
144 dprintf(" Status = %lx\n", Status);
145 if (!NT_SUCCESS(Status))
146 return;
147
148 dprintf("NtQueryKey:\n");
149 Status = NtQueryKey(hKey,
150 KeyBasicInformation,
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,
169 KeyBasicInformation,
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;
192 OBJECT_ATTRIBUTES ObjectAttributes;
193 UNICODE_STRING KeyName = RTL_CONSTANT_STRING(L"\\Registry\\Machine\\Software\\testkey");
194 UNICODE_STRING ValueName = RTL_CONSTANT_STRING(L"TestValue");
195 NTSTATUS Status;
196
197 dprintf("Create key '\\Registry\\Machine\\Software\\testkey':\n");
198
199 InitializeObjectAttributes(&ObjectAttributes,
200 &KeyName,
201 OBJ_CASE_INSENSITIVE | OBJ_OPENIF,
202 NULL,
203 NULL);
204 dprintf("NtCreateKey:\n");
205 Status = NtCreateKey(&hKey,
206 KEY_ALL_ACCESS,
207 &ObjectAttributes,
208 0,
209 NULL,
210 REG_OPTION_NON_VOLATILE,
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;
233 OBJECT_ATTRIBUTES ObjectAttributes;
234 UNICODE_STRING KeyName = RTL_CONSTANT_STRING(L"\\Registry\\Machine\\Software\\testkey");
235 UNICODE_STRING ValueName = RTL_CONSTANT_STRING(L"TestValue");
236 NTSTATUS Status;
237
238 dprintf("Create key '\\Registry\\Machine\\Software\\testkey':\n");
239
240 InitializeObjectAttributes(&ObjectAttributes,
241 &KeyName,
242 OBJ_CASE_INSENSITIVE | OBJ_OPENIF,
243 NULL,
244 NULL);
245 dprintf("NtCreateKey:\n");
246 Status = NtCreateKey(&hKey,
247 KEY_ALL_ACCESS,
248 &ObjectAttributes,
249 0,
250 NULL,
251 REG_OPTION_NON_VOLATILE,
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 {
272 OBJECT_ATTRIBUTES ObjectAttributes;
273 UNICODE_STRING KeyName = RTL_CONSTANT_STRING(L"\\Registry\\Machine\\Software\\testkey");
274 UNICODE_STRING ValueName = RTL_CONSTANT_STRING(L"TestValue");
275 HANDLE KeyHandle;
276 NTSTATUS Status;
277
278 dprintf("Open key '\\Registry\\Machine\\Software\\testkey':\n");
279
280 InitializeObjectAttributes(&ObjectAttributes,
281 &KeyName,
282 OBJ_CASE_INSENSITIVE,
283 NULL,
284 NULL);
285 Status=NtOpenKey(&KeyHandle,
286 MAXIMUM_ALLOWED,
287 &ObjectAttributes);
288 dprintf(" Status = %lx\n", Status);
289 if (!NT_SUCCESS(Status))
290 return;
291
292 dprintf("Delete value:\n");
293
294
295 Status = NtDeleteValueKey(KeyHandle,
296 &ValueName);
297 dprintf(" Status = %lx\n", Status);
298
299 dprintf("Close key:\n");
300 Status = NtClose(KeyHandle);
301 dprintf(" Status = %lx\n", Status);
302 }
303
304
305 void EnumerateValueTest(void)
306 {
307 KEY_VALUE_FULL_INFORMATION KeyValueInformation[5];
308 OBJECT_ATTRIBUTES ObjectAttributes;
309 UNICODE_STRING KeyName = RTL_CONSTANT_STRING(L"\\Registry\\Machine\\Software\\testkey");
310 ULONG Index,Length,i;
311 HANDLE hKey = NULL;
312 NTSTATUS Status;
313
314 dprintf("Open key '\\Registry\\Machine\\Software\\testkey':\n");
315
316 InitializeObjectAttributes(&ObjectAttributes,
317 &KeyName,
318 OBJ_CASE_INSENSITIVE,
319 NULL,
320 NULL);
321 Status=NtOpenKey(&hKey,
322 MAXIMUM_ALLOWED,
323 &ObjectAttributes);
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 {
332 Status = NtEnumerateValueKey(hKey,
333 Index++,
334 KeyValueFullInformation,
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;
369 OBJECT_ATTRIBUTES ObjectAttributes;
370 NTSTATUS Status;
371 UNICODE_STRING KeyName = RTL_CONSTANT_STRING(L"\\Registry\\Machine\\Software");
372 ULONG Index,Length,i;
373 KEY_BASIC_INFORMATION KeyInformation[5];
374
375 #if 0
376 dprintf("NtOpenKey \\Registry : ");
377 #endif
378 dprintf("NtOpenKey \\Registry\\Machine\\Software : ");
379 InitializeObjectAttributes(&ObjectAttributes,
380 &KeyName,
381 OBJ_CASE_INSENSITIVE,
382 NULL,
383 NULL);
384 Status=NtOpenKey( &hKey1, MAXIMUM_ALLOWED, &ObjectAttributes);
385 dprintf("\t\t\t\tStatus =%x\n",Status);
386 if(Status==0)
387 {
388 dprintf("NtQueryKey : ");
389 Status=NtQueryKey(hKey1,KeyBasicInformation
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 {
404 Status=NtEnumerateKey(hKey1,Index++,KeyBasicInformation
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;
426 OBJECT_ATTRIBUTES ObjectAttributes;
427 UNICODE_STRING KeyName;
428 NTSTATUS Status;
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");
434 InitializeObjectAttributes(&ObjectAttributes, &KeyName, OBJ_CASE_INSENSITIVE
435 , NULL, NULL);
436 Status = NtCreateKey ( &hKey, KEY_ALL_ACCESS , &ObjectAttributes
437 ,0,NULL,REG_OPTION_NON_VOLATILE,NULL);
438 dprintf("\t\tStatus=%x\n",Status);
439 NtClose(hKey);
440
441 dprintf("delete \\Registry\\Machine\\software\\test3reactos ?");
442 ReadConsoleA(InputHandle, Buffer, 3, &Result, NULL) ;
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");
447 InitializeObjectAttributes(&ObjectAttributes,
448 &KeyName,
449 OBJ_CASE_INSENSITIVE,
450 NULL,
451 NULL);
452 dprintf("NtOpenKey : ");
453 Status=NtOpenKey( &hKey, KEY_ALL_ACCESS, &ObjectAttributes);
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: ");
483 dwError = RegOpenKeyExW(HKEY_LOCAL_MACHINE,
484 L"System\\Setup",
485 0,
486 KEY_ALL_ACCESS,
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: ");
512 dwError = RegOpenKeyExW(HKEY_LOCAL_MACHINE,
513 L"System\\ControlSet001\\Services\\Serial",
514 0,
515 KEY_ALL_ACCESS,
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,
543 KEY_ALL_ACCESS,
544 NULL,
545 &hPortKey,
546 &RegDisposition
547 );
548 dprintf ("\t\t\t\tdwError %x\n", dwError);
549
550 dprintf ("RegCreateKeyExW: ");
551 dwError = RegCreateKeyExW (HKEY_LOCAL_MACHINE,
552 L"Software\\test4reactos\\test",
553 0,
554 NULL,
555 REG_OPTION_NON_VOLATILE,
556 KEY_ALL_ACCESS,
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: ");
583 dwError = RegCreateKeyExW (HKEY_LOCAL_MACHINE,
584 L"software\\Test",
585 0,
586 NULL,
587 REG_OPTION_VOLATILE,
588 KEY_ALL_ACCESS,
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;
626 OBJECT_ATTRIBUTES ObjectAttributes;
627 UNICODE_STRING KeyName;
628 NTSTATUS Status;
629
630 dprintf("NtOpenKey : \n");
631 dprintf(" \\Registry\\Machine\\Software\\reactos : ");
632 RtlRosInitUnicodeStringFromLiteral(&KeyName,L"\\Registry\\Machine\\Software\\reactos");
633 InitializeObjectAttributes(&ObjectAttributes, &KeyName, OBJ_CASE_INSENSITIVE
634 , NULL, NULL);
635 Status=NtOpenKey( &hKey, KEY_ALL_ACCESS, &ObjectAttributes);
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;
649 OBJECT_ATTRIBUTES ObjectAttributes;
650 UNICODE_STRING KeyName,ValueName;
651 NTSTATUS Status;
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");
658 InitializeObjectAttributes(&ObjectAttributes, &KeyName, OBJ_CASE_INSENSITIVE
659 , NULL, NULL);
660 Status = NtCreateKey(&hKey, KEY_ALL_ACCESS , &ObjectAttributes
661 ,0,NULL, REG_OPTION_VOLATILE,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");
668 RtlRosInitUnicodeStringFromLiteral(&ValueName, L"TestValue");
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");
681 InitializeObjectAttributes(&ObjectAttributes,
682 &KeyName,
683 OBJ_CASE_INSENSITIVE | OBJ_OPENLINK,
684 NULL,
685 NULL);
686 Status = NtCreateKey(&hKey,
687 KEY_ALL_ACCESS | KEY_CREATE_LINK,
688 &ObjectAttributes,
689 0,
690 NULL,
691 REG_OPTION_VOLATILE | REG_OPTION_CREATE_LINK,
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");
715 InitializeObjectAttributes(&ObjectAttributes, &KeyName, OBJ_CASE_INSENSITIVE | OBJ_OPENIF
716 , NULL, NULL);
717 Status = NtCreateKey(&hKey, KEY_ALL_ACCESS , &ObjectAttributes
718 ,0,NULL, REG_OPTION_VOLATILE, 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");
725 RtlRosInitUnicodeStringFromLiteral(&ValueName, L"TestValue");
726 Status=NtQueryValueKey(hKey,
727 &ValueName,
728 KeyValueFullInformation,
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;
758 OBJECT_ATTRIBUTES ObjectAttributes;
759 UNICODE_STRING KeyName,ValueName;
760 NTSTATUS Status;
761
762 dprintf("Open link key\n");
763 dprintf(" Key: \\Registry\\Machine\\SOFTWARE\\Test\n");
764 RtlRosInitUnicodeStringFromLiteral(&KeyName, L"\\Registry\\Machine\\SOFTWARE\\Test");
765 InitializeObjectAttributes(&ObjectAttributes,
766 &KeyName,
767 OBJ_CASE_INSENSITIVE | OBJ_OPENIF | OBJ_OPENLINK,
768 NULL,
769 NULL);
770 Status = NtCreateKey(&hKey,
771 KEY_ALL_ACCESS,
772 &ObjectAttributes,
773 0,
774 NULL,
775 REG_OPTION_VOLATILE | REG_OPTION_OPEN_LINK,
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 {
801 OBJECT_ATTRIBUTES ObjectAttributes;
802 UNICODE_STRING KeyName;
803 NTSTATUS Status;
804 LONG dwError;
805 TOKEN_PRIVILEGES NewPrivileges;
806 HANDLE Token,hKey;
807 LUID Luid;
808 BOOLEAN bRes;
809 Status=NtOpenProcessToken(GetCurrentProcess()
810 ,TOKEN_ADJUST_PRIVILEGES,&Token);
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
836 RtlRosInitUnicodeStringFromLiteral(&KeyName,L"test5");
837 InitializeObjectAttributes(&ObjectAttributes, &KeyName, OBJ_CASE_INSENSITIVE
838 , NULL, NULL);
839 Status = NtLoadKey((HANDLE)HKEY_LOCAL_MACHINE,&ObjectAttributes);
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");
847 InitializeObjectAttributes(&ObjectAttributes,
848 &KeyName,
849 OBJ_CASE_INSENSITIVE,
850 NULL,
851 NULL);
852 Status=NtOpenKey( &hKey, MAXIMUM_ALLOWED, &ObjectAttributes);
853 dprintf("\t\t\tStatus =%x\n",Status);
854 RtlRosInitUnicodeStringFromLiteral(&KeyName,L"test5");
855 InitializeObjectAttributes(&ObjectAttributes, &KeyName, OBJ_CASE_INSENSITIVE
856 , NULL, NULL);
857 Status = NtLoadKey(hKey,&ObjectAttributes);
858 dprintf("\t\t\t\tStatus =%x\n",Status);
859 }
860
861 void test9(void)
862 {
863 HANDLE hKey = NULL, hKey1;
864 OBJECT_ATTRIBUTES ObjectAttributes;
865 NTSTATUS Status;
866 UNICODE_STRING KeyName = RTL_CONSTANT_STRING(L"\\Registry");
867 ULONG Index,Length,i;
868 KEY_BASIC_INFORMATION KeyInformation[5];
869 KEY_VALUE_FULL_INFORMATION KeyValueInformation[5];
870
871 dprintf("NtOpenKey \\Registry : ");
872 InitializeObjectAttributes(&ObjectAttributes,
873 &KeyName,
874 OBJ_CASE_INSENSITIVE,
875 NULL,
876 NULL);
877 Status=NtOpenKey( &hKey1, MAXIMUM_ALLOWED, &ObjectAttributes);
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");
909 InitializeObjectAttributes(&ObjectAttributes,
910 &KeyName,
911 OBJ_CASE_INSENSITIVE,
912 NULL,
913 NULL);
914 Status = NtOpenKey(&hKey1, MAXIMUM_ALLOWED, &ObjectAttributes);
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
928 InitializeObjectAttributes(&ObjectAttributes, &KeyName, OBJ_CASE_INSENSITIVE, hKey1 , NULL);
929 Status = NtOpenKey(&hKey, KEY_READ , &ObjectAttributes);
930 dprintf("\t\t\tStatus =%x\n",Status);
931 if (Status == 0) {
932 dprintf("NtQueryValueKey : ");
933 RtlRosInitUnicodeStringFromLiteral(&KeyName, L"NameServer");
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();
981 InputHandle = GetStdHandle(STD_INPUT_HANDLE);
982 OutputHandle = GetStdHandle(STD_OUTPUT_HANDLE);
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");
994 ReadConsoleA(InputHandle, Buffer, 3, &Result, NULL) ;
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':
1025 EnumerateValueTest();
1026 break;
1027 }
1028 }
1029 return(0);
1030 }
1031