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 }
996