scroll mode for very long start menus
[reactos.git] / reactos / apps / tests / regtest / regtest.c
1 #include <stdarg.h>
2 #include <string.h>
3 #include <stdio.h>
4 #include <windows.h>
5 #include <ddk/ntddk.h>
6 #include <rosrtl/string.h>
7
8 HANDLE OutputHandle;
9 HANDLE InputHandle;
10
11 void dprintf(char* fmt, ...)
12 {
13 va_list args;
14 char buffer[255];
15
16 va_start(args,fmt);
17 vsprintf(buffer,fmt,args);
18 WriteConsoleA(OutputHandle, buffer, strlen(buffer), NULL, NULL);
19 va_end(args);
20 }
21
22 void do_enumeratekey(PWSTR Name)
23 {
24 ULONG Index,Length,i;
25 KEY_BASIC_INFORMATION KeyInformation[5];
26 NTSTATUS Status;
27 OBJECT_ATTRIBUTES ObjectAttributes;
28 HANDLE hKey1;
29 UNICODE_STRING KeyName;
30
31 RtlInitUnicodeString(&KeyName, Name);
32 InitializeObjectAttributes(&ObjectAttributes, &KeyName, OBJ_CASE_INSENSITIVE
33 , NULL, NULL);
34 Status=NtOpenKey( &hKey1, MAXIMUM_ALLOWED, &ObjectAttributes);
35 dprintf("NtEnumerateKey : \n");
36 Index=0;
37 while(Status == STATUS_SUCCESS)
38 {
39 Status=NtEnumerateKey(hKey1,Index++,KeyBasicInformation
40 ,&KeyInformation[0], sizeof(KeyInformation)
41 ,&Length);
42 if(Status== STATUS_SUCCESS)
43 {
44 dprintf("\tSubKey Name = ");
45 for (i=0;i<KeyInformation[0].NameLength/2;i++)
46 dprintf("%C",KeyInformation[0].Name[i]);
47 dprintf("\n");
48 }
49 }
50 NtClose(hKey1);
51 }
52
53 void test1(void)
54 {
55 HKEY hKey = NULL, hKey1;
56 OBJECT_ATTRIBUTES ObjectAttributes;
57 NTSTATUS Status;
58 UNICODE_STRING KeyName = ROS_STRING_INITIALIZER(L"\\Registry");
59 ULONG Index,Length,i;
60 KEY_BASIC_INFORMATION KeyInformation[5];
61 KEY_VALUE_FULL_INFORMATION KeyValueInformation[5];
62
63 dprintf("NtOpenKey \\Registry : ");
64 InitializeObjectAttributes(&ObjectAttributes,
65 &KeyName,
66 OBJ_CASE_INSENSITIVE,
67 NULL,
68 NULL);
69 Status=NtOpenKey( &hKey1, MAXIMUM_ALLOWED, &ObjectAttributes);
70 dprintf("\t\t\t\tStatus =%x\n",Status);
71 if(Status==0)
72 {
73 dprintf("NtQueryKey : ");
74 Status=NtQueryKey(hKey1,KeyBasicInformation
75 ,&KeyInformation[0], sizeof(KeyInformation)
76 ,&Length);
77 dprintf("\t\t\t\t\tStatus =%x\n",Status);
78 if (Status == STATUS_SUCCESS)
79 {
80 dprintf("\tKey Name = ");
81 for (i=0;i<KeyInformation[0].NameLength/2;i++)
82 dprintf("%C",KeyInformation[0].Name[i]);
83 dprintf("\n");
84 }
85 dprintf("NtEnumerateKey : \n");
86 Index=0;
87 while(Status == STATUS_SUCCESS)
88 {
89 Status=NtEnumerateKey(hKey1,Index++,KeyBasicInformation
90 ,&KeyInformation[0], sizeof(KeyInformation)
91 ,&Length);
92 if(Status== STATUS_SUCCESS)
93 {
94 dprintf("\tSubKey Name = ");
95 for (i=0;i<KeyInformation[0].NameLength/2;i++)
96 dprintf("%C",KeyInformation[0].Name[i]);
97 dprintf("\n");
98 }
99 }
100 dprintf("NtClose : ");
101 Status = NtClose( hKey1 );
102 dprintf("\t\t\t\t\tStatus =%x\n",Status);
103 }
104 NtClose(hKey);
105
106 dprintf("NtOpenKey \\Registry\\Machine : ");
107 RtlRosInitUnicodeStringFromLiteral(&KeyName, L"\\Registry\\Machine");
108 InitializeObjectAttributes(&ObjectAttributes,
109 &KeyName,
110 OBJ_CASE_INSENSITIVE,
111 NULL,
112 NULL);
113 Status=NtOpenKey( &hKey1, MAXIMUM_ALLOWED, &ObjectAttributes);
114 dprintf("\t\t\tStatus =%x\n",Status);
115
116 dprintf("NtOpenKey System\\Setup : ");
117 RtlRosInitUnicodeStringFromLiteral(&KeyName, L"System\\Setup");
118 InitializeObjectAttributes(&ObjectAttributes, &KeyName, OBJ_CASE_INSENSITIVE
119 , hKey1 , NULL);
120 Status = NtOpenKey ( &hKey, KEY_READ , &ObjectAttributes);
121 dprintf("\t\t\tStatus =%x\n",Status);
122 if(Status==0)
123 {
124 dprintf("NtQueryValueKey : ");
125 RtlRosInitUnicodeStringFromLiteral(&KeyName, L"CmdLine");
126 Status=NtQueryValueKey(hKey,&KeyName,KeyValueFullInformation
127 ,&KeyValueInformation[0], sizeof(KeyValueInformation)
128 ,&Length);
129 dprintf("\t\t\t\tStatus =%x\n",Status);
130 if (Status == STATUS_SUCCESS)
131 {
132 dprintf("\tValue:DO=%d, DL=%d, NL=%d, Name = "
133 ,KeyValueInformation[0].DataOffset
134 ,KeyValueInformation[0].DataLength
135 ,KeyValueInformation[0].NameLength);
136 for (i=0;i<10 && i<KeyValueInformation[0].NameLength/2;i++)
137 dprintf("%C",KeyValueInformation[0].Name[i]);
138 dprintf("\n");
139 dprintf("\t\tType = %d\n",KeyValueInformation[0].Type);
140 if (KeyValueInformation[0].Type == REG_SZ)
141 dprintf("\t\tValue = %S\n",
142 (PWCHAR)((PCHAR)&KeyValueInformation[0] + KeyValueInformation[0].DataOffset));
143 }
144 dprintf("NtEnumerateValueKey : \n");
145 Index=0;
146 while(Status == STATUS_SUCCESS)
147 {
148 Status=NtEnumerateValueKey(hKey,Index++,KeyValueFullInformation
149 ,&KeyValueInformation[0], sizeof(KeyValueInformation)
150 ,&Length);
151 if(Status== STATUS_SUCCESS)
152 {
153 dprintf("\tValue:DO=%d, DL=%d, NL=%d, Name = "
154 ,KeyValueInformation[0].DataOffset
155 ,KeyValueInformation[0].DataLength
156 ,KeyValueInformation[0].NameLength);
157 for (i=0;i<KeyValueInformation[0].NameLength/2;i++)
158 dprintf("%C",KeyValueInformation[0].Name[i]);
159 dprintf(", Type = %d\n",KeyValueInformation[0].Type);
160 if (KeyValueInformation[0].Type == REG_SZ)
161 dprintf("\t\tValue = %S\n",((char*)&KeyValueInformation[0]
162 +KeyValueInformation[0].DataOffset));
163 }
164 }
165 dprintf("NtClose : ");
166 Status = NtClose( hKey );
167 dprintf("\t\t\t\t\tStatus =%x\n",Status);
168 }
169 NtClose( hKey1 );
170 }
171
172
173 void test2(void)
174 {
175 HKEY hKey,hKey1;
176 OBJECT_ATTRIBUTES ObjectAttributes;
177 UNICODE_STRING KeyName,ValueName;
178 NTSTATUS Status;
179 KEY_VALUE_FULL_INFORMATION KeyValueInformation[5];
180 ULONG Index,Length,i;
181 char Buffer[10];
182 DWORD Result;
183 dprintf("NtCreateKey volatile: \n");
184 dprintf(" \\Registry\\Machine\\Software\\test2reactos: ");
185 RtlRosInitUnicodeStringFromLiteral(&KeyName, L"\\Registry\\Machine\\Software\\test2reactos");
186 InitializeObjectAttributes(&ObjectAttributes, &KeyName, OBJ_CASE_INSENSITIVE
187 , NULL, NULL);
188 Status = NtCreateKey ( &hKey, KEY_ALL_ACCESS , &ObjectAttributes
189 ,0,NULL,REG_OPTION_VOLATILE,NULL);
190 dprintf("\t\tStatus=%x\n",Status);
191 NtClose(hKey);
192 do_enumeratekey(L"\\Registry\\Machine\\Software");
193 dprintf(" ...\\test2 :");
194 RtlRosInitUnicodeStringFromLiteral(&KeyName, L"\\Registry\\Machine\\Software\\test2reactos\\test2");
195 InitializeObjectAttributes(&ObjectAttributes, &KeyName, OBJ_CASE_INSENSITIVE
196 , NULL, NULL);
197 Status = NtCreateKey ( &hKey1, KEY_ALL_ACCESS , &ObjectAttributes
198 ,0,NULL,REG_OPTION_VOLATILE,NULL);
199 dprintf("\t\t\t\t\tStatus=%x\n",Status);
200 dprintf(" ...\\TestVolatile :");
201 RtlRosInitUnicodeStringFromLiteral(&KeyName, L"TestVolatile");
202 InitializeObjectAttributes(&ObjectAttributes, &KeyName, OBJ_CASE_INSENSITIVE
203 , hKey1, NULL);
204 Status = NtCreateKey ( &hKey, KEY_ALL_ACCESS , &ObjectAttributes
205 ,0,NULL,REG_OPTION_VOLATILE,NULL);
206 dprintf("\t\t\t\tStatus=%x\n",Status);
207 NtClose(hKey1);
208 RtlRosInitUnicodeStringFromLiteral(&ValueName, L"TestREG_SZ");
209 dprintf("NtSetValueKey reg_sz: ");
210 Status=NtSetValueKey(hKey,&ValueName,0,REG_SZ,(PVOID)L"Test Reg_sz",24);
211 dprintf("\t\t\t\tStatus=%x\n",Status);
212 RtlRosInitUnicodeStringFromLiteral(&ValueName, L"TestDWORD");
213 dprintf("NtSetValueKey reg_dword: ");
214 Status=NtSetValueKey(hKey,&ValueName,0,REG_DWORD,(PVOID)"reac",4);
215 dprintf("\t\t\tStatus=%x\n",Status);
216 NtClose(hKey);
217 dprintf("NtOpenKey \\Registry\\Machine\\Software\\test2reactos\\test2\\TestVolatile : ");
218 RtlRosInitUnicodeStringFromLiteral(&KeyName, L"\\Registry\\Machine\\Software\\test2reactos\\test2\\TestVolatile");
219 InitializeObjectAttributes(&ObjectAttributes,
220 &KeyName,
221 OBJ_CASE_INSENSITIVE,
222 NULL,
223 NULL);
224 Status=NtOpenKey( &hKey, MAXIMUM_ALLOWED, &ObjectAttributes);
225 dprintf("\t\t\t\tStatus =%x\n",Status);
226 if(Status==0)
227 {
228 dprintf("NtEnumerateValueKey : \n");
229 Index=0;
230 while(Status == STATUS_SUCCESS)
231 {
232 Status=NtEnumerateValueKey(hKey,Index++,KeyValueFullInformation
233 ,&KeyValueInformation[0], sizeof(KeyValueInformation)
234 ,&Length);
235 if(Status== STATUS_SUCCESS)
236 {
237 dprintf("\tValue:DO=%d, DL=%d, NL=%d, Name = "
238 ,KeyValueInformation[0].DataOffset
239 ,KeyValueInformation[0].DataLength
240 ,KeyValueInformation[0].NameLength);
241 for (i=0;i<KeyValueInformation[0].NameLength/2;i++)
242 dprintf("%C",KeyValueInformation[0].Name[i]);
243 dprintf(", Type = %d\n",KeyValueInformation[0].Type);
244 if (KeyValueInformation[0].Type == REG_SZ)
245 dprintf("\t\tValue = %S\n",((char*)&KeyValueInformation[0]
246 +KeyValueInformation[0].DataOffset));
247 }
248 }
249 }
250 NtClose(hKey);
251 dprintf("delete \\Registry\\Machine\\software\\test2reactos ?");
252 ReadConsoleA(InputHandle, Buffer, 3, &Result, NULL) ;
253 if (Buffer[0] != 'y' && Buffer[0] != 'Y') return;
254 RtlRosInitUnicodeStringFromLiteral(&KeyName, L"\\Registry\\Machine\\Software\\test2reactos\\test2\\TestVolatile");
255 InitializeObjectAttributes(&ObjectAttributes,
256 &KeyName,
257 OBJ_CASE_INSENSITIVE,
258 NULL,
259 NULL);
260 dprintf("NtOpenKey : ");
261 Status=NtOpenKey( &hKey, KEY_ALL_ACCESS, &ObjectAttributes);
262 dprintf("\t\t\t\tStatus =%x\n",Status);
263 dprintf("NtDeleteKey : ");
264 Status=NtDeleteKey(hKey);
265 dprintf("\t\t\t\tStatus =%x\n",Status);
266 NtClose(hKey);
267 RtlRosInitUnicodeStringFromLiteral(&KeyName, L"\\Registry\\Machine\\Software\\test2reactos\\test2");
268 InitializeObjectAttributes(&ObjectAttributes,
269 &KeyName,
270 OBJ_CASE_INSENSITIVE,
271 NULL,
272 NULL);
273 dprintf("NtOpenKey : ");
274 Status=NtOpenKey( &hKey, KEY_ALL_ACCESS, &ObjectAttributes);
275 dprintf("\t\t\t\tStatus =%x\n",Status);
276 dprintf("NtDeleteKey : ");
277 Status=NtDeleteKey(hKey);
278 dprintf("\t\t\t\tStatus =%x\n",Status);
279 NtClose(hKey);
280 RtlRosInitUnicodeStringFromLiteral(&KeyName, L"\\Registry\\Machine\\Software\\test2reactos");
281 InitializeObjectAttributes(&ObjectAttributes,
282 &KeyName,
283 OBJ_CASE_INSENSITIVE,
284 NULL,
285 NULL);
286 dprintf("NtOpenKey : ");
287 Status=NtOpenKey( &hKey, KEY_ALL_ACCESS, &ObjectAttributes);
288 dprintf("\t\t\t\tStatus =%x\n",Status);
289 dprintf("NtDeleteKey : ");
290 Status=NtDeleteKey(hKey);
291 dprintf("\t\t\t\tStatus =%x\n",Status);
292 NtClose(hKey);
293 }
294
295 void test3(void)
296 {
297 HKEY hKey,hKey1;
298 OBJECT_ATTRIBUTES ObjectAttributes;
299 UNICODE_STRING KeyName,ValueName;
300 NTSTATUS Status;
301 KEY_VALUE_FULL_INFORMATION KeyValueInformation[5];
302 ULONG Index,Length,i;
303 char Buffer[10];
304 DWORD Result;
305 dprintf("NtCreateKey non volatile: \n");
306 dprintf(" \\Registry\\Machine\\Software\\test3reactos: ");
307 RtlRosInitUnicodeStringFromLiteral(&KeyName, L"\\Registry\\Machine\\Software\\test3reactos");
308 InitializeObjectAttributes(&ObjectAttributes, &KeyName, OBJ_CASE_INSENSITIVE
309 , NULL, NULL);
310 Status = NtCreateKey ( &hKey, KEY_ALL_ACCESS , &ObjectAttributes
311 ,0,NULL,REG_OPTION_NON_VOLATILE,NULL);
312 dprintf("\t\tStatus=%x\n",Status);
313 NtClose(hKey);
314 do_enumeratekey(L"\\Registry\\Machine\\Software");
315 dprintf("NtOpenKey: ");
316 Status=NtOpenKey( &hKey, MAXIMUM_ALLOWED, &ObjectAttributes);
317 dprintf("\t\tStatus=%x\n",Status);
318 NtClose(hKey);
319 dprintf(" ...\\test3 :");
320 RtlRosInitUnicodeStringFromLiteral(&KeyName, L"\\Registry\\Machine\\Software\\test3reactos\\test3");
321 InitializeObjectAttributes(&ObjectAttributes, &KeyName, OBJ_CASE_INSENSITIVE
322 , NULL, NULL);
323 Status = NtCreateKey ( &hKey, KEY_ALL_ACCESS , &ObjectAttributes
324 ,0,NULL,REG_OPTION_NON_VOLATILE,NULL);
325 dprintf("\t\t\t\t\tStatus=%x\n",Status);
326 dprintf("NtOpenKey: ");
327 Status=NtOpenKey( &hKey1, MAXIMUM_ALLOWED, &ObjectAttributes);
328 dprintf("\t\tStatus=%x\n",Status);
329 NtClose(hKey);
330 dprintf(" ...\\testNonVolatile :");
331 RtlRosInitUnicodeStringFromLiteral(&KeyName, L"TestNonVolatile");
332 InitializeObjectAttributes(&ObjectAttributes, &KeyName, OBJ_CASE_INSENSITIVE
333 , hKey1, NULL);
334 Status = NtCreateKey ( &hKey, KEY_ALL_ACCESS , &ObjectAttributes
335 ,0,NULL,REG_OPTION_NON_VOLATILE,NULL);
336 dprintf("\t\t\t\tStatus=%x\n",Status);
337 NtClose(hKey1);
338 RtlRosInitUnicodeStringFromLiteral(&ValueName, L"TestREG_SZ");
339 dprintf("NtSetValueKey reg_sz: ");
340 Status=NtSetValueKey(hKey,&ValueName,0,REG_SZ,(PVOID)L"Test Reg_sz",24);
341 dprintf("\t\t\t\tStatus=%x\n",Status);
342 RtlRosInitUnicodeStringFromLiteral(&ValueName, L"TestDWORD");
343 dprintf("NtSetValueKey reg_dword: ");
344 Status=NtSetValueKey(hKey,&ValueName,0,REG_DWORD,(PVOID)"reac",4);
345 dprintf("\t\t\tStatus=%x\n",Status);
346 NtClose(hKey);
347 dprintf("NtOpenKey \\Registry\\Machine\\Software\\test3reactos\\test3\\testNonVolatile : ");
348 RtlRosInitUnicodeStringFromLiteral(&KeyName, L"\\Registry\\Machine\\Software\\test3reactos\\test3\\testNonVolatile");
349 InitializeObjectAttributes(&ObjectAttributes,
350 &KeyName,
351 OBJ_CASE_INSENSITIVE,
352 NULL,
353 NULL);
354 Status=NtOpenKey( &hKey, MAXIMUM_ALLOWED, &ObjectAttributes);
355 dprintf("\t\t\t\tStatus =%x\n",Status);
356 if(Status==0)
357 {
358 dprintf("NtEnumerateValueKey : \n");
359 Index=0;
360 while(Status == STATUS_SUCCESS)
361 {
362 Status=NtEnumerateValueKey(hKey,Index++,KeyValueFullInformation
363 ,&KeyValueInformation[0], sizeof(KeyValueInformation)
364 ,&Length);
365 if(Status== STATUS_SUCCESS)
366 {
367 dprintf("\tValue:DO=%d, DL=%d, NL=%d, Name = "
368 ,KeyValueInformation[0].DataOffset
369 ,KeyValueInformation[0].DataLength
370 ,KeyValueInformation[0].NameLength);
371 for (i=0;i<KeyValueInformation[0].NameLength/2;i++)
372 dprintf("%C",KeyValueInformation[0].Name[i]);
373 dprintf(", Type = %d\n",KeyValueInformation[0].Type);
374 if (KeyValueInformation[0].Type == REG_SZ)
375 dprintf("\t\tValue = %S\n",((char*)&KeyValueInformation[0]
376 +KeyValueInformation[0].DataOffset));
377 }
378 }
379 }
380 NtClose(hKey);
381 dprintf("delete \\Registry\\Machine\\software\\test3reactos ?");
382 ReadConsoleA(InputHandle, Buffer, 3, &Result, NULL) ;
383 if (Buffer[0] != 'y' && Buffer[0] != 'Y') return;
384 RtlRosInitUnicodeStringFromLiteral(&KeyName, L"\\Registry\\Machine\\Software\\test3reactos\\test3\\testNonvolatile");
385 InitializeObjectAttributes(&ObjectAttributes,
386 &KeyName,
387 OBJ_CASE_INSENSITIVE,
388 NULL,
389 NULL);
390 dprintf("NtOpenKey : ");
391 Status=NtOpenKey( &hKey, KEY_ALL_ACCESS, &ObjectAttributes);
392 dprintf("\t\t\t\tStatus =%x\n",Status);
393 dprintf("NtDeleteKey : ");
394 Status=NtDeleteKey(hKey);
395 dprintf("\t\t\t\tStatus =%x\n",Status);
396 RtlRosInitUnicodeStringFromLiteral(&KeyName, L"\\Registry\\Machine\\Software\\test3reactos\\test3");
397 InitializeObjectAttributes(&ObjectAttributes,
398 &KeyName,
399 OBJ_CASE_INSENSITIVE,
400 NULL,
401 NULL);
402 dprintf("NtOpenKey : ");
403 Status=NtOpenKey( &hKey, KEY_ALL_ACCESS, &ObjectAttributes);
404 dprintf("\t\t\t\tStatus =%x\n",Status);
405 dprintf("NtDeleteKey : ");
406 Status=NtDeleteKey(hKey);
407 dprintf("\t\t\t\tStatus =%x\n",Status);
408 NtClose(hKey);
409 RtlRosInitUnicodeStringFromLiteral(&KeyName, L"\\Registry\\Machine\\Software\\test3reactos");
410 InitializeObjectAttributes(&ObjectAttributes,
411 &KeyName,
412 OBJ_CASE_INSENSITIVE,
413 NULL,
414 NULL);
415 dprintf("NtOpenKey : ");
416 Status=NtOpenKey( &hKey, KEY_ALL_ACCESS, &ObjectAttributes);
417 dprintf("\t\t\t\tStatus =%x\n",Status);
418 dprintf("NtDeleteKey : ");
419 Status=NtDeleteKey(hKey);
420 dprintf("\t\t\t\tStatus =%x\n",Status);
421 NtClose(hKey);
422 }
423
424 void test4(void)
425 {
426 HKEY hKey = NULL,hKey1;
427 DWORD dwDisposition;
428 DWORD dwError;
429 DWORD RegDataType, RegDataSize;
430 BOOL GlobalFifoEnable;
431 HKEY hPortKey;
432 DWORD RegDisposition;
433 WCHAR szClass[260];
434 DWORD cchClass;
435 DWORD cSubKeys;
436 DWORD cchMaxSubkey;
437 DWORD cchMaxClass;
438 DWORD cValues;
439 DWORD cchMaxValueName;
440 DWORD cbMaxValueData;
441 DWORD cbSecurityDescriptor;
442 FILETIME ftLastWriteTime;
443 SYSTEMTIME LastWriteTime;
444
445 dprintf ("RegOpenKeyExW HKLM\\System\\Setup: ");
446 dwError = RegOpenKeyExW(HKEY_LOCAL_MACHINE,
447 L"System\\Setup",
448 0,
449 KEY_ALL_ACCESS,
450 &hKey1);
451 dprintf("\t\tdwError =%x\n",dwError);
452 if (dwError == ERROR_SUCCESS)
453 {
454 dprintf("RegQueryInfoKeyW: ");
455 cchClass=260;
456 dwError = RegQueryInfoKeyW(hKey1
457 , szClass, &cchClass, NULL, &cSubKeys
458 , &cchMaxSubkey, &cchMaxClass, &cValues, &cchMaxValueName
459 , &cbMaxValueData, &cbSecurityDescriptor, &ftLastWriteTime);
460 dprintf ("\t\t\t\tdwError %x\n", dwError);
461 FileTimeToSystemTime(&ftLastWriteTime,&LastWriteTime);
462 dprintf ("\tnb of subkeys=%d,last write : %d/%d/%d %d:%02.2d'%02.2d''%03.3d\n",cSubKeys
463 ,LastWriteTime.wMonth
464 ,LastWriteTime.wDay
465 ,LastWriteTime.wYear
466 ,LastWriteTime.wHour
467 ,LastWriteTime.wMinute
468 ,LastWriteTime.wSecond
469 ,LastWriteTime.wMilliseconds
470 );
471 }
472
473
474 dprintf ("RegOpenKeyExW: ");
475 dwError = RegOpenKeyExW(HKEY_LOCAL_MACHINE,
476 L"System\\ControlSet001\\Services\\Serial",
477 0,
478 KEY_ALL_ACCESS,
479 &hKey);
480 dprintf ("\t\t\t\t\tdwError %x\n", dwError);
481 RegDataSize = sizeof(GlobalFifoEnable);
482 if (dwError == ERROR_SUCCESS)
483 {
484 dprintf ("RegQueryValueExW: ");
485 dwError = RegQueryValueExW(hKey,
486 L"ForceFifoEnable",
487 NULL,
488 &RegDataType,
489 (PBYTE)&GlobalFifoEnable,
490 &RegDataSize);
491 dprintf("\t\t\t\tdwError =%x\n",dwError);
492 if (dwError == 0)
493 {
494 dprintf("\tValue:DT=%d, DS=%d, Value=%d\n"
495 ,RegDataType
496 ,RegDataSize
497 ,GlobalFifoEnable);
498 }
499 }
500 dprintf ("RegCreateKeyExW: ");
501 dwError = RegCreateKeyExW(hKey,
502 L"Parameters\\Serial001",
503 0,
504 NULL,
505 0,
506 KEY_ALL_ACCESS,
507 NULL,
508 &hPortKey,
509 &RegDisposition
510 );
511 dprintf ("\t\t\t\tdwError %x\n", dwError);
512
513 dprintf ("RegCreateKeyExW: ");
514 dwError = RegCreateKeyExW (HKEY_LOCAL_MACHINE,
515 L"Software\\test4reactos\\test",
516 0,
517 NULL,
518 REG_OPTION_NON_VOLATILE,
519 KEY_ALL_ACCESS,
520 NULL,
521 &hKey,
522 &dwDisposition);
523
524 dprintf ("\t\t\t\tdwError %x ", dwError);
525 dprintf ("dwDisposition %x\n", dwDisposition);
526 if (dwError == ERROR_SUCCESS)
527 {
528 dprintf ("RegSetValueExW: ");
529 dwError = RegSetValueExW (hKey,
530 L"TestValue",
531 0,
532 REG_SZ,
533 (BYTE*)L"TestString",
534 20);
535
536 dprintf ("\t\t\t\tdwError %x\n", dwError);
537 dprintf ("RegCloseKey: ");
538 dwError = RegCloseKey (hKey);
539 dprintf ("\t\t\t\t\tdwError %x\n", dwError);
540 }
541 dprintf ("\n\n");
542
543 hKey = NULL;
544
545 dprintf ("RegCreateKeyExW: ");
546 dwError = RegCreateKeyExW (HKEY_LOCAL_MACHINE,
547 L"software\\Test",
548 0,
549 NULL,
550 REG_OPTION_VOLATILE,
551 KEY_ALL_ACCESS,
552 NULL,
553 &hKey,
554 &dwDisposition);
555
556 dprintf ("\t\t\t\tdwError %x ", dwError);
557 dprintf ("dwDisposition %x\n", dwDisposition);
558
559
560 if (dwError == ERROR_SUCCESS)
561 {
562 dprintf("RegQueryInfoKeyW: ");
563 cchClass=260;
564 dwError = RegQueryInfoKeyW(hKey
565 , szClass, &cchClass, NULL, &cSubKeys
566 , &cchMaxSubkey, &cchMaxClass, &cValues, &cchMaxValueName
567 , &cbMaxValueData, &cbSecurityDescriptor, &ftLastWriteTime);
568 dprintf ("\t\t\t\tdwError %x\n", dwError);
569 FileTimeToSystemTime(&ftLastWriteTime,&LastWriteTime);
570 dprintf ("\tnb of subkeys=%d,last write : %d/%d/%d %d:%02.2d'%02.2d''%03.3d\n",cSubKeys
571 ,LastWriteTime.wMonth
572 ,LastWriteTime.wDay
573 ,LastWriteTime.wYear
574 ,LastWriteTime.wHour
575 ,LastWriteTime.wMinute
576 ,LastWriteTime.wSecond
577 ,LastWriteTime.wMilliseconds
578 );
579 dprintf ("RegCloseKey: ");
580 dwError = RegCloseKey (hKey);
581 dprintf ("\t\t\t\t\tdwError %x\n", dwError);
582 }
583 dprintf ("\nTests done...\n");
584 }
585
586 void test5(void)
587 {
588 HKEY hKey;
589 OBJECT_ATTRIBUTES ObjectAttributes;
590 UNICODE_STRING KeyName;
591 NTSTATUS Status;
592
593 dprintf("NtOpenKey : \n");
594 dprintf(" \\Registry\\Machine\\Software\\reactos : ");
595 RtlRosInitUnicodeStringFromLiteral(&KeyName,L"\\Registry\\Machine\\Software\\reactos");
596 InitializeObjectAttributes(&ObjectAttributes, &KeyName, OBJ_CASE_INSENSITIVE
597 , NULL, NULL);
598 Status=NtOpenKey( &hKey, KEY_ALL_ACCESS, &ObjectAttributes);
599 dprintf("\t\tStatus=%x\n",Status);
600 dprintf("NtFlushKey : \n");
601 Status = NtFlushKey(hKey);
602 dprintf("\t\tStatus=%x\n",Status);
603 dprintf("NtCloseKey : \n");
604 Status=NtClose(hKey);
605 dprintf("\t\tStatus=%x\n",Status);
606 }
607
608 /* registry link create test */
609 void test6(void)
610 {
611 HKEY hKey;
612 OBJECT_ATTRIBUTES ObjectAttributes;
613 UNICODE_STRING KeyName,ValueName;
614 NTSTATUS Status;
615 KEY_VALUE_FULL_INFORMATION KeyValueInformation[5];
616 ULONG Length,i;
617
618 dprintf("Create target key\n");
619 dprintf(" Key: \\Registry\\Machine\\SOFTWARE\\Reactos\n");
620 RtlRosInitUnicodeStringFromLiteral(&KeyName, L"\\Registry\\Machine\\SOFTWARE\\Reactos");
621 InitializeObjectAttributes(&ObjectAttributes, &KeyName, OBJ_CASE_INSENSITIVE
622 , NULL, NULL);
623 Status = NtCreateKey(&hKey, KEY_ALL_ACCESS , &ObjectAttributes
624 ,0,NULL, REG_OPTION_VOLATILE,NULL);
625 dprintf(" NtCreateKey() called (Status %lx)\n",Status);
626 if (!NT_SUCCESS(Status))
627 return;
628
629 dprintf("Create target value\n");
630 dprintf(" Value: TestValue = 'Test String'\n");
631 RtlRosInitUnicodeStringFromLiteral(&ValueName, L"TestValue");
632 Status=NtSetValueKey(hKey,&ValueName,0,REG_SZ,(PVOID)L"TestString",22);
633 dprintf(" NtSetValueKey() called (Status %lx)\n",Status);
634 if (!NT_SUCCESS(Status))
635 return;
636
637 dprintf("Close target key\n");
638 NtClose(hKey);
639
640
641 dprintf("Create link key\n");
642 dprintf(" Key: \\Registry\\Machine\\SOFTWARE\\Test\n");
643 RtlRosInitUnicodeStringFromLiteral(&KeyName, L"\\Registry\\Machine\\SOFTWARE\\Test");
644 InitializeObjectAttributes(&ObjectAttributes,
645 &KeyName,
646 OBJ_CASE_INSENSITIVE | OBJ_OPENLINK,
647 NULL,
648 NULL);
649 Status = NtCreateKey(&hKey,
650 KEY_ALL_ACCESS | KEY_CREATE_LINK,
651 &ObjectAttributes,
652 0,
653 NULL,
654 REG_OPTION_VOLATILE | REG_OPTION_CREATE_LINK,
655 NULL);
656 dprintf(" NtCreateKey() called (Status %lx)\n",Status);
657 if (!NT_SUCCESS(Status))
658 return;
659
660 dprintf("Create link value\n");
661 dprintf(" Value: SymbolicLinkValue = '\\Registry\\Machine\\SOFTWARE\\Reactos'\n");
662 RtlRosInitUnicodeStringFromLiteral(&ValueName, L"SymbolicLinkValue");
663 Status=NtSetValueKey(hKey,&ValueName,0,REG_LINK,(PVOID)L"\\Registry\\Machine\\SOFTWARE\\Reactos",68);
664 dprintf(" NtSetValueKey() called (Status %lx)\n",Status);
665 if (!NT_SUCCESS(Status))
666 {
667 dprintf("Creating link value failed! Test failed!\n");
668 NtClose(hKey);
669 return;
670 }
671
672 dprintf("Close link key\n");
673 NtClose(hKey);
674
675 dprintf("Open link key\n");
676 dprintf(" Key: \\Registry\\Machine\\SOFTWARE\\Test\n");
677 RtlRosInitUnicodeStringFromLiteral(&KeyName, L"\\Registry\\Machine\\SOFTWARE\\Test");
678 InitializeObjectAttributes(&ObjectAttributes, &KeyName, OBJ_CASE_INSENSITIVE | OBJ_OPENIF
679 , NULL, NULL);
680 Status = NtCreateKey(&hKey, KEY_ALL_ACCESS , &ObjectAttributes
681 ,0,NULL, REG_OPTION_VOLATILE, NULL);
682 dprintf(" NtCreateKey() called (Status %lx)\n",Status);
683 if (!NT_SUCCESS(Status))
684 return;
685
686 dprintf("Query value\n");
687 dprintf(" Value: TestValue\n");
688 RtlRosInitUnicodeStringFromLiteral(&ValueName, L"TestValue");
689 Status=NtQueryValueKey(hKey,
690 &ValueName,
691 KeyValueFullInformation,
692 &KeyValueInformation[0],
693 sizeof(KeyValueInformation),
694 &Length);
695 dprintf(" NtQueryValueKey() called (Status %lx)\n",Status);
696 if (Status == STATUS_SUCCESS)
697 {
698 dprintf(" Value: Type %d DataLength %d NameLength %d Name '",
699 KeyValueInformation[0].Type,
700 KeyValueInformation[0].DataLength,
701 KeyValueInformation[0].NameLength);
702 for (i=0; i < KeyValueInformation[0].NameLength / sizeof(WCHAR); i++)
703 dprintf("%C",KeyValueInformation[0].Name[i]);
704 dprintf("'\n");
705 if (KeyValueInformation[0].Type == REG_SZ)
706 dprintf(" Value '%S'\n",
707 KeyValueInformation[0].Name+1
708 +KeyValueInformation[0].NameLength/2);
709 }
710
711 dprintf("Close link key\n");
712 NtClose(hKey);
713
714 dprintf("Test successful!\n");
715 }
716
717 /* registry link delete test */
718 void test7(void)
719 {
720 HKEY hKey;
721 OBJECT_ATTRIBUTES ObjectAttributes;
722 UNICODE_STRING KeyName,ValueName;
723 NTSTATUS Status;
724
725 dprintf("Open link key\n");
726 dprintf(" Key: \\Registry\\Machine\\SOFTWARE\\Test\n");
727 RtlRosInitUnicodeStringFromLiteral(&KeyName, L"\\Registry\\Machine\\SOFTWARE\\Test");
728 InitializeObjectAttributes(&ObjectAttributes,
729 &KeyName,
730 OBJ_CASE_INSENSITIVE | OBJ_OPENIF | OBJ_OPENLINK,
731 NULL,
732 NULL);
733 Status = NtCreateKey(&hKey,
734 KEY_ALL_ACCESS,
735 &ObjectAttributes,
736 0,
737 NULL,
738 REG_OPTION_VOLATILE | REG_OPTION_OPEN_LINK,
739 NULL);
740 dprintf(" NtCreateKey() called (Status %lx)\n",Status);
741 if (!NT_SUCCESS(Status))
742 {
743 dprintf("Could not open the link key. Please run the link create test first!\n");
744 return;
745 }
746
747 dprintf("Delete link value\n");
748 RtlRosInitUnicodeStringFromLiteral(&ValueName, L"SymbolicLinkValue");
749 Status = NtDeleteValueKey(hKey,
750 &ValueName);
751 dprintf(" NtDeleteValueKey() called (Status %lx)\n",Status);
752
753 dprintf("Delete link key\n");
754 Status=NtDeleteKey(hKey);
755 dprintf(" NtDeleteKey() called (Status %lx)\n",Status);
756
757 dprintf("Close link key\n");
758 NtClose(hKey);
759 }
760
761
762 void test8(void)
763 {
764 OBJECT_ATTRIBUTES ObjectAttributes;
765 UNICODE_STRING KeyName;
766 NTSTATUS Status;
767 LONG dwError;
768 TOKEN_PRIVILEGES NewPrivileges;
769 HANDLE Token,hKey;
770 LUID Luid;
771 BOOLEAN bRes;
772 Status=NtOpenProcessToken(GetCurrentProcess()
773 ,TOKEN_ADJUST_PRIVILEGES,&Token);
774 // ,TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,&Token);
775 dprintf("\t\t\t\tStatus =%x\n",Status);
776 // bRes=LookupPrivilegeValueA(NULL,SE_RESTORE_NAME,&Luid);
777 // dprintf("\t\t\t\tbRes =%x\n",bRes);
778 NewPrivileges.PrivilegeCount = 1;
779 NewPrivileges.Privileges[0].Luid = Luid;
780 // NewPrivileges.Privileges[0].Luid.u.LowPart=18;
781 // NewPrivileges.Privileges[0].Luid.u.HighPart=0;
782 NewPrivileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
783
784 // Status = NtAdjustPrivilegesToken(
785 bRes = AdjustTokenPrivileges(
786 Token,
787 FALSE,
788 &NewPrivileges,
789 0,
790 NULL,
791 NULL
792 );
793 dprintf("\t\t\t\tbRes =%x\n",bRes);
794
795 // Status=NtClose(Token);
796 // dprintf("\t\t\t\tStatus =%x\n",Status);
797
798
799 RtlRosInitUnicodeStringFromLiteral(&KeyName,L"test5");
800 InitializeObjectAttributes(&ObjectAttributes, &KeyName, OBJ_CASE_INSENSITIVE
801 , NULL, NULL);
802 Status = NtLoadKey(HKEY_LOCAL_MACHINE,&ObjectAttributes);
803 dprintf("\t\t\t\tStatus =%x\n",Status);
804 dwError=RegLoadKey(HKEY_LOCAL_MACHINE,"def"
805 ,"test5");
806 dprintf("\t\t\t\tdwError =%x\n",dwError);
807
808 dprintf("NtOpenKey \\Registry\\Machine : ");
809 RtlRosInitUnicodeStringFromLiteral(&KeyName, L"\\Registry\\Machine");
810 InitializeObjectAttributes(&ObjectAttributes,
811 &KeyName,
812 OBJ_CASE_INSENSITIVE,
813 NULL,
814 NULL);
815 Status=NtOpenKey( &hKey, MAXIMUM_ALLOWED, &ObjectAttributes);
816 dprintf("\t\t\tStatus =%x\n",Status);
817 RtlRosInitUnicodeStringFromLiteral(&KeyName,L"test5");
818 InitializeObjectAttributes(&ObjectAttributes, &KeyName, OBJ_CASE_INSENSITIVE
819 , NULL, NULL);
820 Status = NtLoadKey(hKey,&ObjectAttributes);
821 dprintf("\t\t\t\tStatus =%x\n",Status);
822 }
823
824 void test9(void)
825 {
826 HKEY hKey = NULL, hKey1;
827 OBJECT_ATTRIBUTES ObjectAttributes;
828 NTSTATUS Status;
829 UNICODE_STRING KeyName = ROS_STRING_INITIALIZER(L"\\Registry");
830 ULONG Index,Length,i;
831 KEY_BASIC_INFORMATION KeyInformation[5];
832 KEY_VALUE_FULL_INFORMATION KeyValueInformation[5];
833
834 dprintf("NtOpenKey \\Registry : ");
835 InitializeObjectAttributes(&ObjectAttributes,
836 &KeyName,
837 OBJ_CASE_INSENSITIVE,
838 NULL,
839 NULL);
840 Status=NtOpenKey( &hKey1, MAXIMUM_ALLOWED, &ObjectAttributes);
841 dprintf("\t\t\t\tStatus =%x\n",Status);
842 if (Status == 0) {
843 dprintf("NtQueryKey : ");
844 Status = NtQueryKey(hKey1, KeyBasicInformation, &KeyInformation[0], sizeof(KeyInformation), &Length);
845 dprintf("\t\t\t\t\tStatus =%x\n",Status);
846 if (Status == STATUS_SUCCESS) {
847 dprintf("\tKey Name = ");
848 for (i=0;i<KeyInformation[0].NameLength/2;i++)
849 dprintf("%C",KeyInformation[0].Name[i]);
850 dprintf("\n");
851 }
852 dprintf("NtEnumerateKey : \n");
853 Index = 0;
854 while (Status == STATUS_SUCCESS) {
855 Status = NtEnumerateKey(hKey1,Index++,KeyBasicInformation,&KeyInformation[0], sizeof(KeyInformation),&Length);
856 if (Status == STATUS_SUCCESS) {
857 dprintf("\tSubKey Name = ");
858 for (i = 0; i < KeyInformation[0].NameLength / 2; i++)
859 dprintf("%C",KeyInformation[0].Name[i]);
860 dprintf("\n");
861 }
862 }
863 dprintf("NtClose : ");
864 Status = NtClose( hKey1 );
865 dprintf("\t\t\t\t\tStatus =%x\n",Status);
866 }
867 NtClose(hKey); // RobD - hKey unused so-far, should this have been hKey1 ???
868
869 dprintf("NtOpenKey \\Registry\\Machine : ");
870 RtlRosInitUnicodeStringFromLiteral(&KeyName, L"\\Registry\\Machine");
871 InitializeObjectAttributes(&ObjectAttributes,
872 &KeyName,
873 OBJ_CASE_INSENSITIVE,
874 NULL,
875 NULL);
876 Status = NtOpenKey(&hKey1, MAXIMUM_ALLOWED, &ObjectAttributes);
877 dprintf("\t\t\tStatus =%x\n",Status);
878
879 //Status of c0000001 opening \Registry\Machine\System\CurrentControlSet\Services\Tcpip\Linkage
880
881 // dprintf("NtOpenKey System\\CurrentControlSet\\Services\\Tcpip : ");
882 // RtlRosInitUnicodeStringFromLiteral(&KeyName, L"System\\CurrentControlSet\\Services\\Tcpip");
883 #if 1
884 dprintf("NtOpenKey System\\ControlSet001\\Services\\Tcpip\\Parameters : ");
885 RtlRosInitUnicodeStringFromLiteral(&KeyName, L"System\\ControlSet001\\Services\\Tcpip\\Parameters");
886 #else
887 dprintf("NtOpenKey System\\CurrentControlSet\\Services\\Tcpip : ");
888 RtlRosInitUnicodeStringFromLiteral(&KeyName, L"System\\CurrentControlSet\\Services\\Tcpip");
889 #endif
890 InitializeObjectAttributes(&ObjectAttributes, &KeyName, OBJ_CASE_INSENSITIVE, hKey1 , NULL);
891 Status = NtOpenKey(&hKey, KEY_READ , &ObjectAttributes);
892 dprintf("\t\t\tStatus =%x\n",Status);
893 if (Status == 0) {
894 dprintf("NtQueryValueKey : ");
895 RtlRosInitUnicodeStringFromLiteral(&KeyName, L"NameServer");
896 Status = NtQueryValueKey(hKey, &KeyName, KeyValueFullInformation, &KeyValueInformation[0], sizeof(KeyValueInformation), &Length);
897 dprintf("\t\t\t\tStatus =%x\n",Status);
898 if (Status == STATUS_SUCCESS) {
899 dprintf("\tValue:DO=%d, DL=%d, NL=%d, Name = "
900 ,KeyValueInformation[0].DataOffset
901 ,KeyValueInformation[0].DataLength
902 ,KeyValueInformation[0].NameLength);
903 for (i = 0; i < 10 && i < KeyValueInformation[0].NameLength / 2; i++)
904 dprintf("%C", KeyValueInformation[0].Name[i]);
905 dprintf("\n");
906 dprintf("\t\tType = %d\n", KeyValueInformation[0].Type);
907 if (KeyValueInformation[0].Type == REG_SZ)
908 //dprintf("\t\tValue = %S\n", KeyValueInformation[0].Name + 1 + KeyValueInformation[0].NameLength / 2);
909 dprintf("\t\tValue = %S\n", KeyValueInformation[0].Name + KeyValueInformation[0].NameLength / 2);
910 }
911 dprintf("NtEnumerateValueKey : \n");
912 Index = 0;
913 while (Status == STATUS_SUCCESS) {
914 Status = NtEnumerateValueKey(hKey, Index++, KeyValueFullInformation, &KeyValueInformation[0], sizeof(KeyValueInformation), &Length);
915 if (Status == STATUS_SUCCESS) {
916 dprintf("\tValue:DO=%d, DL=%d, NL=%d, Name = "
917 ,KeyValueInformation[0].DataOffset
918 ,KeyValueInformation[0].DataLength
919 ,KeyValueInformation[0].NameLength);
920 for (i = 0; i < KeyValueInformation[0].NameLength / 2; i++)
921 dprintf("%C", KeyValueInformation[0].Name[i]);
922 dprintf(", Type = %d\n", KeyValueInformation[0].Type);
923 if (KeyValueInformation[0].Type == REG_SZ)
924 dprintf("\t\tValue = %S\n", ((char*)&KeyValueInformation[0]+KeyValueInformation[0].DataOffset));
925 if (KeyValueInformation[0].Type == REG_DWORD)
926 dprintf("\t\tValue = %X\n", *((DWORD*)((char*)&KeyValueInformation[0]+KeyValueInformation[0].DataOffset)));
927 }
928 }
929 dprintf("NtClose : ");
930 Status = NtClose(hKey);
931 dprintf("\t\t\t\t\tStatus =%x\n", Status);
932 }
933 NtClose(hKey1);
934 }
935
936
937 int main(int argc, char* argv[])
938 {
939 char Buffer[10];
940 DWORD Result;
941
942 AllocConsole();
943 InputHandle = GetStdHandle(STD_INPUT_HANDLE);
944 OutputHandle = GetStdHandle(STD_OUTPUT_HANDLE);
945 while(1)
946 {
947 dprintf("choose test :\n");
948 dprintf(" 0=Exit\n");
949 dprintf(" 1=Ntxxx read functions\n");
950 dprintf(" 2=Ntxxx write functions : volatile keys\n");
951 dprintf(" 3=Ntxxx write functions : non volatile keys\n");
952 dprintf(" 4=Regxxx functions\n");
953 dprintf(" 5=FlushKey \n");
954 dprintf(" 6=Registry link create test\n");
955 dprintf(" 7=Registry link delete test\n");
956 dprintf(" 8=Not available\n");
957 dprintf(" 9=Ntxx read tcp/ip key test\n");
958 ReadConsoleA(InputHandle, Buffer, 3, &Result, NULL) ;
959 switch (Buffer[0])
960 {
961 case '0':
962 return(0);
963 case '1':
964 test1();
965 break;
966 case '2':
967 test2();
968 break;
969 case '3':
970 test3();
971 break;
972 case '4':
973 test4();
974 break;
975 case '5':
976 test5();
977 break;
978 case '6':
979 test6();
980 break;
981 case '7':
982 test7();
983 break;
984 #if 0
985 case '8':
986 test8();
987 break;
988 #endif
989 case '9':
990 test9();
991 break;
992 }
993 }
994 return 0;
995 }