New macros InitializeUnicodeString(), RtlInitUnicodeStringFromLiteral() and UNICODE_S...
[reactos.git] / reactos / apps / tests / regtest / regtest.c
index ed2fa02..88e11b2 100644 (file)
@@ -2,6 +2,7 @@
 #include <string.h>
 #include <stdio.h>
 #include <windows.h>
+#include <ddk/ntddk.h>
 
 HANDLE OutputHandle;
 HANDLE InputHandle;
@@ -17,30 +18,865 @@ void dprintf(char* fmt, ...)
    va_end(args);
 }
 
+void do_enumeratekey(PWSTR Name)
+{
+ ULONG Index,Length,i;
+ KEY_BASIC_INFORMATION KeyInformation[5];
+ NTSTATUS Status;
+ OBJECT_ATTRIBUTES ObjectAttributes;
+ HANDLE hKey1;
+ UNICODE_STRING KeyName;
 
-int main(int argc, char* argv[])
+  RtlInitUnicodeString(&KeyName, Name);
+  InitializeObjectAttributes(&ObjectAttributes, &KeyName, OBJ_CASE_INSENSITIVE
+                               , NULL, NULL);
+  Status=NtOpenKey( &hKey1, MAXIMUM_ALLOWED, &ObjectAttributes);
+    dprintf("NtEnumerateKey : \n");
+    Index=0;
+    while(Status == STATUS_SUCCESS)
+    {
+      Status=NtEnumerateKey(hKey1,Index++,KeyBasicInformation
+               ,&KeyInformation[0], sizeof(KeyInformation)
+               ,&Length);
+      if(Status== STATUS_SUCCESS)
+       {
+        dprintf("\tSubKey Name = ");
+         for (i=0;i<KeyInformation[0].NameLength/2;i++)
+               dprintf("%C",KeyInformation[0].Name[i]);
+        dprintf("\n");
+       }
+    }
+  NtClose(hKey1);
+}
+
+void test1(void)
+{
+ HKEY hKey = NULL,hKey1;
+ OBJECT_ATTRIBUTES ObjectAttributes; 
+ NTSTATUS Status; 
+ UNICODE_STRING KeyName = UNICODE_STRING_INITIALIZER(L"\\Registry");
+ ULONG Index,Length,i;
+ KEY_BASIC_INFORMATION KeyInformation[5];
+ KEY_VALUE_FULL_INFORMATION KeyValueInformation[5];
+
+  dprintf("NtOpenKey \\Registry : ");
+  InitializeObjectAttributes(&ObjectAttributes,
+                               &KeyName,
+                               OBJ_CASE_INSENSITIVE,
+                               NULL,
+                               NULL);
+  Status=NtOpenKey( &hKey1, MAXIMUM_ALLOWED, &ObjectAttributes);
+  dprintf("\t\t\t\tStatus =%x\n",Status);
+  if(Status==0)
+  {
+    dprintf("NtQueryKey : ");
+    Status=NtQueryKey(hKey1,KeyBasicInformation
+               ,&KeyInformation[0], sizeof(KeyInformation)
+               ,&Length);
+    dprintf("\t\t\t\t\tStatus =%x\n",Status);
+    if (Status == STATUS_SUCCESS)
+    {
+        dprintf("\tKey Name = ");
+         for (i=0;i<KeyInformation[0].NameLength/2;i++)
+               dprintf("%C",KeyInformation[0].Name[i]);
+        dprintf("\n");
+    }
+    dprintf("NtEnumerateKey : \n");
+    Index=0;
+    while(Status == STATUS_SUCCESS)
+    {
+      Status=NtEnumerateKey(hKey1,Index++,KeyBasicInformation
+               ,&KeyInformation[0], sizeof(KeyInformation)
+               ,&Length);
+      if(Status== STATUS_SUCCESS)
+       {
+        dprintf("\tSubKey Name = ");
+         for (i=0;i<KeyInformation[0].NameLength/2;i++)
+               dprintf("%C",KeyInformation[0].Name[i]);
+        dprintf("\n");
+       }
+    }
+    dprintf("NtClose : ");
+    Status = NtClose( hKey1 );
+    dprintf("\t\t\t\t\tStatus =%x\n",Status);
+  }
+  NtClose(hKey);
+
+  dprintf("NtOpenKey \\Registry\\Machine : ");
+  RtlInitUnicodeStringFromLiteral(&KeyName, L"\\Registry\\Machine");
+  InitializeObjectAttributes(&ObjectAttributes,
+                               &KeyName,
+                               OBJ_CASE_INSENSITIVE,
+                               NULL,
+                               NULL);
+  Status=NtOpenKey( &hKey1, MAXIMUM_ALLOWED, &ObjectAttributes);
+  dprintf("\t\t\tStatus =%x\n",Status);
+
+  dprintf("NtOpenKey System\\Setup : ");
+  RtlInitUnicodeStringFromLiteral(&KeyName, L"System\\Setup");
+  InitializeObjectAttributes(&ObjectAttributes, &KeyName, OBJ_CASE_INSENSITIVE
+                               , hKey1 , NULL);
+  Status = NtOpenKey ( &hKey, KEY_READ , &ObjectAttributes);
+  dprintf("\t\t\tStatus =%x\n",Status);
+  if(Status==0)
+  {
+    dprintf("NtQueryValueKey : ");
+    RtlInitUnicodeStringFromLiteral(&KeyName, L"CmdLine");
+    Status=NtQueryValueKey(hKey,&KeyName,KeyValueFullInformation
+               ,&KeyValueInformation[0], sizeof(KeyValueInformation)
+               ,&Length);
+    dprintf("\t\t\t\tStatus =%x\n",Status);
+    if (Status == STATUS_SUCCESS)
+    {
+        dprintf("\tValue:DO=%d, DL=%d, NL=%d, Name = "
+               ,KeyValueInformation[0].DataOffset
+               ,KeyValueInformation[0].DataLength
+               ,KeyValueInformation[0].NameLength);
+         for (i=0;i<10 && i<KeyValueInformation[0].NameLength/2;i++)
+               dprintf("%C",KeyValueInformation[0].Name[i]);
+        dprintf("\n");
+        dprintf("\t\tType = %d\n",KeyValueInformation[0].Type);
+         if (KeyValueInformation[0].Type == REG_SZ)
+          dprintf("\t\tValue = %S\n",KeyValueInformation[0].Name+1
+                                       +KeyValueInformation[0].NameLength/2);
+    }
+    dprintf("NtEnumerateValueKey : \n");
+    Index=0;
+    while(Status == STATUS_SUCCESS)
+    {
+      Status=NtEnumerateValueKey(hKey,Index++,KeyValueFullInformation
+               ,&KeyValueInformation[0], sizeof(KeyValueInformation)
+               ,&Length);
+      if(Status== STATUS_SUCCESS)
+       {
+        dprintf("\tValue:DO=%d, DL=%d, NL=%d, Name = "
+               ,KeyValueInformation[0].DataOffset
+               ,KeyValueInformation[0].DataLength
+               ,KeyValueInformation[0].NameLength);
+         for (i=0;i<KeyValueInformation[0].NameLength/2;i++)
+               dprintf("%C",KeyValueInformation[0].Name[i]);
+        dprintf(", Type = %d\n",KeyValueInformation[0].Type);
+         if (KeyValueInformation[0].Type == REG_SZ)
+          dprintf("\t\tValue = %S\n",((char*)&KeyValueInformation[0]
+                                       +KeyValueInformation[0].DataOffset));
+       }
+    }
+    dprintf("NtClose : ");
+    Status = NtClose( hKey );
+    dprintf("\t\t\t\t\tStatus =%x\n",Status);
+  }
+  NtClose( hKey1 );
+}
+
+
+void test2(void)
+{
+ HKEY hKey,hKey1;
+ OBJECT_ATTRIBUTES ObjectAttributes; 
+ UNICODE_STRING KeyName,ValueName;
+ NTSTATUS Status; 
+ KEY_VALUE_FULL_INFORMATION KeyValueInformation[5];
+ ULONG Index,Length,i;
+ char Buffer[10];
+ DWORD Result;
+  dprintf("NtCreateKey volatile: \n");
+  dprintf("  \\Registry\\Machine\\Software\\test2reactos: ");
+  RtlInitUnicodeStringFromLiteral(&KeyName, L"\\Registry\\Machine\\Software\\test2reactos");
+  InitializeObjectAttributes(&ObjectAttributes, &KeyName, OBJ_CASE_INSENSITIVE
+                               , NULL, NULL);
+  Status = NtCreateKey ( &hKey, KEY_ALL_ACCESS , &ObjectAttributes
+               ,0,NULL,REG_OPTION_VOLATILE,NULL);
+  dprintf("\t\tStatus=%x\n",Status);
+  NtClose(hKey);
+  do_enumeratekey(L"\\Registry\\Machine\\Software");
+  dprintf("  ...\\test2 :");
+  RtlInitUnicodeStringFromLiteral(&KeyName, L"\\Registry\\Machine\\Software\\test2reactos\\test2");
+  InitializeObjectAttributes(&ObjectAttributes, &KeyName, OBJ_CASE_INSENSITIVE
+                               , NULL, NULL);
+  Status = NtCreateKey ( &hKey1, KEY_ALL_ACCESS , &ObjectAttributes
+               ,0,NULL,REG_OPTION_VOLATILE,NULL);
+  dprintf("\t\t\t\t\tStatus=%x\n",Status);
+  dprintf("  ...\\TestVolatile :");
+  RtlInitUnicodeStringFromLiteral(&KeyName, L"TestVolatile");
+  InitializeObjectAttributes(&ObjectAttributes, &KeyName, OBJ_CASE_INSENSITIVE
+                               , hKey1, NULL);
+  Status = NtCreateKey ( &hKey, KEY_ALL_ACCESS , &ObjectAttributes
+               ,0,NULL,REG_OPTION_VOLATILE,NULL);
+  dprintf("\t\t\t\tStatus=%x\n",Status);
+  NtClose(hKey1);
+  RtlInitUnicodeStringFromLiteral(&ValueName, L"TestREG_SZ");
+  dprintf("NtSetValueKey reg_sz: ");
+  Status=NtSetValueKey(hKey,&ValueName,0,REG_SZ,(PVOID)L"Test Reg_sz",24);
+  dprintf("\t\t\t\tStatus=%x\n",Status);
+  RtlInitUnicodeStringFromLiteral(&ValueName, L"TestDWORD");
+  dprintf("NtSetValueKey reg_dword: ");
+  Status=NtSetValueKey(hKey,&ValueName,0,REG_DWORD,(PVOID)"reac",4);
+  dprintf("\t\t\tStatus=%x\n",Status);
+  NtClose(hKey);
+  dprintf("NtOpenKey \\Registry\\Machine\\Software\\test2reactos\\test2\\TestVolatile : ");
+  RtlInitUnicodeStringFromLiteral(&KeyName, L"\\Registry\\Machine\\Software\\test2reactos\\test2\\TestVolatile");
+  InitializeObjectAttributes(&ObjectAttributes,
+                               &KeyName,
+                               OBJ_CASE_INSENSITIVE,
+                               NULL,
+                               NULL);
+  Status=NtOpenKey( &hKey, MAXIMUM_ALLOWED, &ObjectAttributes);
+  dprintf("\t\t\t\tStatus =%x\n",Status);
+  if(Status==0)
+  {
+    dprintf("NtEnumerateValueKey : \n");
+    Index=0;
+    while(Status == STATUS_SUCCESS)
+    {
+      Status=NtEnumerateValueKey(hKey,Index++,KeyValueFullInformation
+               ,&KeyValueInformation[0], sizeof(KeyValueInformation)
+               ,&Length);
+      if(Status== STATUS_SUCCESS)
+       {
+        dprintf("\tValue:DO=%d, DL=%d, NL=%d, Name = "
+               ,KeyValueInformation[0].DataOffset
+               ,KeyValueInformation[0].DataLength
+               ,KeyValueInformation[0].NameLength);
+         for (i=0;i<KeyValueInformation[0].NameLength/2;i++)
+               dprintf("%C",KeyValueInformation[0].Name[i]);
+        dprintf(", Type = %d\n",KeyValueInformation[0].Type);
+         if (KeyValueInformation[0].Type == REG_SZ)
+          dprintf("\t\tValue = %S\n",((char*)&KeyValueInformation[0]
+                                       +KeyValueInformation[0].DataOffset));
+       }
+    }
+  }
+  NtClose(hKey);
+  dprintf("delete \\Registry\\Machine\\software\\test2reactos ?");
+  ReadConsoleA(InputHandle, Buffer, 3, &Result, NULL) ;
+  if (Buffer[0] != 'y' && Buffer[0] != 'Y') return;
+  RtlInitUnicodeStringFromLiteral(&KeyName, L"\\Registry\\Machine\\Software\\test2reactos\\test2\\TestVolatile");
+  InitializeObjectAttributes(&ObjectAttributes,
+                               &KeyName,
+                               OBJ_CASE_INSENSITIVE,
+                               NULL,
+                               NULL);
+  dprintf("NtOpenKey : ");
+  Status=NtOpenKey( &hKey, KEY_ALL_ACCESS, &ObjectAttributes);
+  dprintf("\t\t\t\tStatus =%x\n",Status);
+  dprintf("NtDeleteKey : ");
+  Status=NtDeleteKey(hKey);
+  dprintf("\t\t\t\tStatus =%x\n",Status);
+  NtClose(hKey);
+  RtlInitUnicodeStringFromLiteral(&KeyName, L"\\Registry\\Machine\\Software\\test2reactos\\test2");
+  InitializeObjectAttributes(&ObjectAttributes,
+                               &KeyName,
+                               OBJ_CASE_INSENSITIVE,
+                               NULL,
+                               NULL);
+  dprintf("NtOpenKey : ");
+  Status=NtOpenKey( &hKey, KEY_ALL_ACCESS, &ObjectAttributes);
+  dprintf("\t\t\t\tStatus =%x\n",Status);
+  dprintf("NtDeleteKey : ");
+  Status=NtDeleteKey(hKey);
+  dprintf("\t\t\t\tStatus =%x\n",Status);
+  NtClose(hKey);
+  RtlInitUnicodeStringFromLiteral(&KeyName, L"\\Registry\\Machine\\Software\\test2reactos");
+  InitializeObjectAttributes(&ObjectAttributes,
+                               &KeyName,
+                               OBJ_CASE_INSENSITIVE,
+                               NULL,
+                               NULL);
+  dprintf("NtOpenKey : ");
+  Status=NtOpenKey( &hKey, KEY_ALL_ACCESS, &ObjectAttributes);
+  dprintf("\t\t\t\tStatus =%x\n",Status);
+  dprintf("NtDeleteKey : ");
+  Status=NtDeleteKey(hKey);
+  dprintf("\t\t\t\tStatus =%x\n",Status);
+  NtClose(hKey);
+}
+
+void test3(void)
+{
+ HKEY hKey,hKey1;
+ OBJECT_ATTRIBUTES ObjectAttributes; 
+ UNICODE_STRING KeyName,ValueName;
+ NTSTATUS Status; 
+ KEY_VALUE_FULL_INFORMATION KeyValueInformation[5];
+ ULONG Index,Length,i;
+ char Buffer[10];
+ DWORD Result;
+  dprintf("NtCreateKey non volatile: \n");
+  dprintf("  \\Registry\\Machine\\Software\\test3reactos: ");
+  RtlInitUnicodeStringFromLiteral(&KeyName, L"\\Registry\\Machine\\Software\\test3reactos");
+  InitializeObjectAttributes(&ObjectAttributes, &KeyName, OBJ_CASE_INSENSITIVE
+                               , NULL, NULL);
+  Status = NtCreateKey ( &hKey, KEY_ALL_ACCESS , &ObjectAttributes
+               ,0,NULL,REG_OPTION_NON_VOLATILE,NULL);
+  dprintf("\t\tStatus=%x\n",Status);
+  NtClose(hKey);
+  do_enumeratekey(L"\\Registry\\Machine\\Software");
+  dprintf("NtOpenKey: ");
+  Status=NtOpenKey( &hKey, MAXIMUM_ALLOWED, &ObjectAttributes);
+  dprintf("\t\tStatus=%x\n",Status);
+  NtClose(hKey);
+  dprintf("  ...\\test3 :");
+  RtlInitUnicodeStringFromLiteral(&KeyName, L"\\Registry\\Machine\\Software\\test3reactos\\test3");
+  InitializeObjectAttributes(&ObjectAttributes, &KeyName, OBJ_CASE_INSENSITIVE
+                               , NULL, NULL);
+  Status = NtCreateKey ( &hKey, KEY_ALL_ACCESS , &ObjectAttributes
+               ,0,NULL,REG_OPTION_NON_VOLATILE,NULL);
+  dprintf("\t\t\t\t\tStatus=%x\n",Status);
+  dprintf("NtOpenKey: ");
+  Status=NtOpenKey( &hKey1, MAXIMUM_ALLOWED, &ObjectAttributes);
+  dprintf("\t\tStatus=%x\n",Status);
+  NtClose(hKey);
+  dprintf("  ...\\testNonVolatile :");
+  RtlInitUnicodeStringFromLiteral(&KeyName, L"TestNonVolatile");
+  InitializeObjectAttributes(&ObjectAttributes, &KeyName, OBJ_CASE_INSENSITIVE
+                               , hKey1, NULL);
+  Status = NtCreateKey ( &hKey, KEY_ALL_ACCESS , &ObjectAttributes
+               ,0,NULL,REG_OPTION_NON_VOLATILE,NULL);
+  dprintf("\t\t\t\tStatus=%x\n",Status);
+  NtClose(hKey1);
+  RtlInitUnicodeStringFromLiteral(&ValueName, L"TestREG_SZ");
+  dprintf("NtSetValueKey reg_sz: ");
+  Status=NtSetValueKey(hKey,&ValueName,0,REG_SZ,(PVOID)L"Test Reg_sz",24);
+  dprintf("\t\t\t\tStatus=%x\n",Status);
+  RtlInitUnicodeStringFromLiteral(&ValueName, L"TestDWORD");
+  dprintf("NtSetValueKey reg_dword: ");
+  Status=NtSetValueKey(hKey,&ValueName,0,REG_DWORD,(PVOID)"reac",4);
+  dprintf("\t\t\tStatus=%x\n",Status);
+  NtClose(hKey);
+  dprintf("NtOpenKey \\Registry\\Machine\\Software\\test3reactos\\test3\\testNonVolatile : ");
+  RtlInitUnicodeStringFromLiteral(&KeyName, L"\\Registry\\Machine\\Software\\test3reactos\\test3\\testNonVolatile");
+  InitializeObjectAttributes(&ObjectAttributes,
+                               &KeyName,
+                               OBJ_CASE_INSENSITIVE,
+                               NULL,
+                               NULL);
+  Status=NtOpenKey( &hKey, MAXIMUM_ALLOWED, &ObjectAttributes);
+  dprintf("\t\t\t\tStatus =%x\n",Status);
+  if(Status==0)
+  {
+    dprintf("NtEnumerateValueKey : \n");
+    Index=0;
+    while(Status == STATUS_SUCCESS)
+    {
+      Status=NtEnumerateValueKey(hKey,Index++,KeyValueFullInformation
+               ,&KeyValueInformation[0], sizeof(KeyValueInformation)
+               ,&Length);
+      if(Status== STATUS_SUCCESS)
+       {
+        dprintf("\tValue:DO=%d, DL=%d, NL=%d, Name = "
+               ,KeyValueInformation[0].DataOffset
+               ,KeyValueInformation[0].DataLength
+               ,KeyValueInformation[0].NameLength);
+         for (i=0;i<KeyValueInformation[0].NameLength/2;i++)
+               dprintf("%C",KeyValueInformation[0].Name[i]);
+        dprintf(", Type = %d\n",KeyValueInformation[0].Type);
+         if (KeyValueInformation[0].Type == REG_SZ)
+          dprintf("\t\tValue = %S\n",((char*)&KeyValueInformation[0]
+                                       +KeyValueInformation[0].DataOffset));
+       }
+    }
+  }
+  NtClose(hKey);
+  dprintf("delete \\Registry\\Machine\\software\\test3reactos ?");
+  ReadConsoleA(InputHandle, Buffer, 3, &Result, NULL) ;
+  if (Buffer[0] != 'y' && Buffer[0] != 'Y') return;
+  RtlInitUnicodeStringFromLiteral(&KeyName, L"\\Registry\\Machine\\Software\\test3reactos\\test3\\testNonvolatile");
+  InitializeObjectAttributes(&ObjectAttributes,
+                               &KeyName,
+                               OBJ_CASE_INSENSITIVE,
+                               NULL,
+                               NULL);
+  dprintf("NtOpenKey : ");
+  Status=NtOpenKey( &hKey, KEY_ALL_ACCESS, &ObjectAttributes);
+  dprintf("\t\t\t\tStatus =%x\n",Status);
+  dprintf("NtDeleteKey : ");
+  Status=NtDeleteKey(hKey);
+  dprintf("\t\t\t\tStatus =%x\n",Status);
+  RtlInitUnicodeStringFromLiteral(&KeyName, L"\\Registry\\Machine\\Software\\test3reactos\\test3");
+  InitializeObjectAttributes(&ObjectAttributes,
+                               &KeyName,
+                               OBJ_CASE_INSENSITIVE,
+                               NULL,
+                               NULL);
+  dprintf("NtOpenKey : ");
+  Status=NtOpenKey( &hKey, KEY_ALL_ACCESS, &ObjectAttributes);
+  dprintf("\t\t\t\tStatus =%x\n",Status);
+  dprintf("NtDeleteKey : ");
+  Status=NtDeleteKey(hKey);
+  dprintf("\t\t\t\tStatus =%x\n",Status);
+  NtClose(hKey);
+  RtlInitUnicodeStringFromLiteral(&KeyName, L"\\Registry\\Machine\\Software\\test3reactos");
+  InitializeObjectAttributes(&ObjectAttributes,
+                               &KeyName,
+                               OBJ_CASE_INSENSITIVE,
+                               NULL,
+                               NULL);
+  dprintf("NtOpenKey : ");
+  Status=NtOpenKey( &hKey, KEY_ALL_ACCESS, &ObjectAttributes);
+  dprintf("\t\t\t\tStatus =%x\n",Status);
+  dprintf("NtDeleteKey : ");
+  Status=NtDeleteKey(hKey);
+  dprintf("\t\t\t\tStatus =%x\n",Status);
+  NtClose(hKey);
+}
+
+void test4(void)
 {
-   HKEY hKey = NULL;
-   DWORD dwDisposition;
+  HKEY hKey = NULL,hKey1;
+  DWORD dwDisposition;
+  DWORD dwError;
+  DWORD  RegDataType, RegDataSize;
+  BOOL GlobalFifoEnable;
+  HKEY hPortKey;
+  DWORD RegDisposition;
+  WCHAR szClass[260];
+  DWORD cchClass;
+  DWORD cSubKeys;
+  DWORD cchMaxSubkey;
+  DWORD cchMaxClass;
+  DWORD cValues;
+  DWORD cchMaxValueName;
+  DWORD cbMaxValueData;
+  DWORD cbSecurityDescriptor;
+  FILETIME ftLastWriteTime;
+  SYSTEMTIME LastWriteTime;
+
+  dprintf ("RegOpenKeyExW HKLM\\System\\Setup: ");
+  dwError = RegOpenKeyExW(HKEY_LOCAL_MACHINE,
+                           L"System\\Setup",
+                           0,
+                           KEY_ALL_ACCESS,
+                           &hKey1); 
+  dprintf("\t\tdwError =%x\n",dwError);
+  if (dwError == ERROR_SUCCESS)
+    {
+      dprintf("RegQueryInfoKeyW: ");
+      cchClass=260;
+      dwError = RegQueryInfoKeyW(hKey1
+       , szClass, &cchClass, NULL, &cSubKeys
+       , &cchMaxSubkey, &cchMaxClass, &cValues, &cchMaxValueName
+       , &cbMaxValueData, &cbSecurityDescriptor, &ftLastWriteTime);
+      dprintf ("\t\t\t\tdwError %x\n", dwError);
+      FileTimeToSystemTime(&ftLastWriteTime,&LastWriteTime);
+      dprintf ("\tnb of subkeys=%d,last write : %d/%d/%d %d:%02.2d'%02.2d''%03.3d\n",cSubKeys
+               ,LastWriteTime.wMonth
+               ,LastWriteTime.wDay
+               ,LastWriteTime.wYear
+               ,LastWriteTime.wHour
+               ,LastWriteTime.wMinute
+               ,LastWriteTime.wSecond
+               ,LastWriteTime.wMilliseconds
+               );
+    }
+
+
+   dprintf ("RegOpenKeyExW: ");
+   dwError = RegOpenKeyExW(HKEY_LOCAL_MACHINE,
+                           L"System\\ControlSet001\\Services\\Serial",
+                           0,
+                           KEY_ALL_ACCESS,
+                           &hKey); 
+   dprintf ("\t\t\t\t\tdwError %x\n", dwError);
+   RegDataSize = sizeof(GlobalFifoEnable);
+   if (dwError == ERROR_SUCCESS)
+   {
+     dprintf ("RegQueryValueExW: ");
+     dwError = RegQueryValueExW(hKey,
+                        L"ForceFifoEnable",
+                        NULL,
+                        &RegDataType,
+                        (PBYTE)&GlobalFifoEnable,
+                        &RegDataSize);
+    dprintf("\t\t\t\tdwError =%x\n",dwError);
+    if (dwError == 0)
+    {
+        dprintf("\tValue:DT=%d, DS=%d, Value=%d\n"
+               ,RegDataType
+               ,RegDataSize
+               ,GlobalFifoEnable);
+    }
+   }
+   dprintf ("RegCreateKeyExW: ");
+   dwError = RegCreateKeyExW(hKey,
+                         L"Parameters\\Serial001",
+                         0,
+                         NULL,
+                         0,
+                         KEY_ALL_ACCESS,
+                         NULL,
+                         &hPortKey,
+                         &RegDisposition
+                        );
+   dprintf ("\t\t\t\tdwError %x\n", dwError);
+
+   dprintf ("RegCreateKeyExW: ");
+   dwError = RegCreateKeyExW (HKEY_LOCAL_MACHINE,
+                              L"Software\\test4reactos\\test",
+                              0,
+                              NULL,
+                              REG_OPTION_NON_VOLATILE,
+                              KEY_ALL_ACCESS,
+                              NULL,
+                              &hKey,
+                              &dwDisposition);
+
+   dprintf ("\t\t\t\tdwError %x ", dwError);
+   dprintf ("dwDisposition %x\n", dwDisposition);
+   if (dwError == ERROR_SUCCESS)
+   {
+     dprintf ("RegSetValueExW: ");
+     dwError = RegSetValueExW (hKey,
+                             L"TestValue",
+                             0,
+                             REG_SZ,
+                             (BYTE*)L"TestString",
+                             20);
+
+     dprintf ("\t\t\t\tdwError %x\n", dwError);
+     dprintf ("RegCloseKey: ");
+     dwError = RegCloseKey (hKey);
+     dprintf ("\t\t\t\t\tdwError %x\n", dwError);
+   }
+   dprintf ("\n\n");
 
-   AllocConsole();
-   InputHandle = GetStdHandle(STD_INPUT_HANDLE);
-   OutputHandle =  GetStdHandle(STD_OUTPUT_HANDLE);
+   hKey = NULL;
 
-   dprintf ("RegCreateKeyExW:\n");
-   RegCreateKeyExW (HKEY_LOCAL_MACHINE,
-                    L"Test",
-                    0,
-                    L"",
-                    REG_OPTION_VOLATILE,
-                    KEY_ALL_ACCESS,
-                    NULL,
-                    &hKey,
-                    &dwDisposition);
+   dprintf ("RegCreateKeyExW: ");
+   dwError = RegCreateKeyExW (HKEY_LOCAL_MACHINE,
+                              L"software\\Test",
+                              0,
+                              NULL,
+                              REG_OPTION_VOLATILE,
+                              KEY_ALL_ACCESS,
+                              NULL,
+                              &hKey,
+                              &dwDisposition);
 
+   dprintf ("\t\t\t\tdwError %x ", dwError);
+   dprintf ("dwDisposition %x\n", dwDisposition);
 
+
+   if (dwError == ERROR_SUCCESS)
+   {
+     dprintf("RegQueryInfoKeyW: ");
+     cchClass=260;
+     dwError = RegQueryInfoKeyW(hKey
+       , szClass, &cchClass, NULL, &cSubKeys
+       , &cchMaxSubkey, &cchMaxClass, &cValues, &cchMaxValueName
+       , &cbMaxValueData, &cbSecurityDescriptor, &ftLastWriteTime);
+     dprintf ("\t\t\t\tdwError %x\n", dwError);
+     FileTimeToSystemTime(&ftLastWriteTime,&LastWriteTime);
+     dprintf ("\tnb of subkeys=%d,last write : %d/%d/%d %d:%02.2d'%02.2d''%03.3d\n",cSubKeys
+               ,LastWriteTime.wMonth
+               ,LastWriteTime.wDay
+               ,LastWriteTime.wYear
+               ,LastWriteTime.wHour
+               ,LastWriteTime.wMinute
+               ,LastWriteTime.wSecond
+               ,LastWriteTime.wMilliseconds
+               );
+     dprintf ("RegCloseKey: ");
+     dwError = RegCloseKey (hKey);
+     dprintf ("\t\t\t\t\tdwError %x\n", dwError);
+   }
    dprintf ("\nTests done...\n");
+}
+
+void test5(void)
+{
+  HKEY hKey,hKey1;
+  OBJECT_ATTRIBUTES ObjectAttributes;
+  UNICODE_STRING KeyName,ValueName;
+  NTSTATUS Status;
+  KEY_VALUE_FULL_INFORMATION KeyValueInformation[5];
+  ULONG Index,Length,i;
+  char Buffer[10];
+  DWORD Result;
 
-   return 0;
+  dprintf("NtOpenKey : \n");
+  dprintf("  \\Registry\\Machine\\Software\\reactos : ");
+  RtlInitUnicodeStringFromLiteral(&KeyName,L"\\Registry\\Machine\\Software\\reactos");
+  InitializeObjectAttributes(&ObjectAttributes, &KeyName, OBJ_CASE_INSENSITIVE
+                               , NULL, NULL);
+  Status=NtOpenKey( &hKey, KEY_ALL_ACCESS, &ObjectAttributes);
+  dprintf("\t\tStatus=%x\n",Status);
+  dprintf("NtFlushKey : \n");
+  Status = NtFlushKey(hKey);
+  dprintf("\t\tStatus=%x\n",Status);
+  dprintf("NtCloseKey : \n");
+  Status=NtClose(hKey);
+  dprintf("\t\tStatus=%x\n",Status);
 }
 
+/* registry link create test */
+void test6(void)
+{
+  HKEY hKey;
+  OBJECT_ATTRIBUTES ObjectAttributes;
+  UNICODE_STRING KeyName,ValueName;
+  NTSTATUS Status; 
+  KEY_VALUE_FULL_INFORMATION KeyValueInformation[5];
+  ULONG Index,Length,i;
+  char Buffer[10];
+  DWORD Result;
+
+  dprintf("Create target key\n");
+  dprintf("  Key: \\Registry\\Machine\\SOFTWARE\\Reactos\n");
+  RtlInitUnicodeStringFromLiteral(&KeyName, L"\\Registry\\Machine\\SOFTWARE\\Reactos");
+  InitializeObjectAttributes(&ObjectAttributes, &KeyName, OBJ_CASE_INSENSITIVE
+                               , NULL, NULL);
+  Status = NtCreateKey(&hKey, KEY_ALL_ACCESS , &ObjectAttributes
+               ,0,NULL, REG_OPTION_VOLATILE,NULL);
+  dprintf("  NtCreateKey() called (Status %lx)\n",Status);
+  if (!NT_SUCCESS(Status))
+    return;
+
+  dprintf("Create target value\n");
+  dprintf("  Value: TestValue = 'Test String'\n");
+  RtlInitUnicodeStringFromLiteral(&ValueName, L"TestValue");
+  Status=NtSetValueKey(hKey,&ValueName,0,REG_SZ,(PVOID)L"TestString",22);
+  dprintf("  NtSetValueKey() called (Status %lx)\n",Status);
+  if (!NT_SUCCESS(Status))
+    return;
+
+  dprintf("Close target key\n");
+  NtClose(hKey);
+
+
+  dprintf("Create link key\n");
+  dprintf("  Key: \\Registry\\Machine\\SOFTWARE\\Test\n");
+  RtlInitUnicodeStringFromLiteral(&KeyName, L"\\Registry\\Machine\\SOFTWARE\\Test");
+  InitializeObjectAttributes(&ObjectAttributes,
+                            &KeyName,
+                            OBJ_CASE_INSENSITIVE | OBJ_OPENLINK,
+                            NULL,
+                            NULL);
+  Status = NtCreateKey(&hKey,
+                      KEY_ALL_ACCESS | KEY_CREATE_LINK,
+                      &ObjectAttributes,
+                      0,
+                      NULL,
+                      REG_OPTION_VOLATILE | REG_OPTION_CREATE_LINK,
+                      NULL);
+  dprintf("  NtCreateKey() called (Status %lx)\n",Status);
+  if (!NT_SUCCESS(Status))
+    return;
+
+  dprintf("Create link value\n");
+  dprintf("  Value: SymbolicLinkValue = '\\Registry\\Machine\\SOFTWARE\\Reactos'\n");
+  RtlInitUnicodeStringFromLiteral(&ValueName, L"SymbolicLinkValue");
+  Status=NtSetValueKey(hKey,&ValueName,0,REG_LINK,(PVOID)L"\\Registry\\Machine\\SOFTWARE\\Reactos",68);
+  dprintf("  NtSetValueKey() called (Status %lx)\n",Status);
+  if (!NT_SUCCESS(Status))
+    {
+      dprintf("Creating link value failed! Test failed!\n");
+      NtClose(hKey);
+      return;
+    }
+
+  dprintf("Close link key\n");
+  NtClose(hKey);
+
+  dprintf("Open link key\n");
+  dprintf("  Key: \\Registry\\Machine\\SOFTWARE\\Test\n");
+  RtlInitUnicodeStringFromLiteral(&KeyName, L"\\Registry\\Machine\\SOFTWARE\\Test");
+  InitializeObjectAttributes(&ObjectAttributes, &KeyName, OBJ_CASE_INSENSITIVE | OBJ_OPENIF
+                               , NULL, NULL);
+  Status = NtCreateKey(&hKey, KEY_ALL_ACCESS , &ObjectAttributes
+               ,0,NULL, REG_OPTION_VOLATILE, NULL);
+  dprintf("  NtCreateKey() called (Status %lx)\n",Status);
+  if (!NT_SUCCESS(Status))
+    return;
+
+  dprintf("Query value\n");
+  dprintf("  Value: TestValue\n");
+  RtlInitUnicodeStringFromLiteral(&ValueName, L"TestValue");
+  Status=NtQueryValueKey(hKey,
+                        &ValueName,
+                        KeyValueFullInformation,
+                        &KeyValueInformation[0],
+                        sizeof(KeyValueInformation),
+                        &Length);
+  dprintf("  NtQueryValueKey() called (Status %lx)\n",Status);
+  if (Status == STATUS_SUCCESS)
+    {
+      dprintf("  Value: Type %d  DataLength %d NameLength %d  Name '",
+             KeyValueInformation[0].Type,
+             KeyValueInformation[0].DataLength,
+             KeyValueInformation[0].NameLength);
+      for (i=0; i < KeyValueInformation[0].NameLength / sizeof(WCHAR); i++)
+       dprintf("%C",KeyValueInformation[0].Name[i]);
+      dprintf("'\n");
+      if (KeyValueInformation[0].Type == REG_SZ)
+       dprintf("  Value '%S'\n",
+               KeyValueInformation[0].Name+1
+               +KeyValueInformation[0].NameLength/2);
+    }
+
+  dprintf("Close link key\n");
+  NtClose(hKey);
+
+  dprintf("Test successful!\n");
+}
+
+/* registry link delete test */
+void test7(void)
+{
+  HKEY hKey;
+  OBJECT_ATTRIBUTES ObjectAttributes;
+  UNICODE_STRING KeyName,ValueName;
+  NTSTATUS Status; 
+
+  dprintf("Open link key\n");
+  dprintf("  Key: \\Registry\\Machine\\SOFTWARE\\Test\n");
+  RtlInitUnicodeStringFromLiteral(&KeyName, L"\\Registry\\Machine\\SOFTWARE\\Test");
+  InitializeObjectAttributes(&ObjectAttributes,
+                            &KeyName,
+                            OBJ_CASE_INSENSITIVE | OBJ_OPENIF | OBJ_OPENLINK,
+                            NULL,
+                            NULL);
+  Status = NtCreateKey(&hKey,
+                      KEY_ALL_ACCESS,
+                      &ObjectAttributes,
+                      0,
+                      NULL,
+                      REG_OPTION_VOLATILE | REG_OPTION_OPEN_LINK,
+                      NULL);
+  dprintf("  NtCreateKey() called (Status %lx)\n",Status);
+  if (!NT_SUCCESS(Status))
+    {
+      dprintf("Could not open the link key. Please run the link create test first!\n");
+      return;
+    }
+
+  dprintf("Delete link value\n");
+  RtlInitUnicodeStringFromLiteral(&ValueName, L"SymbolicLinkValue");
+  Status = NtDeleteValueKey(hKey,
+                           &ValueName);
+  dprintf("  NtDeleteValueKey() called (Status %lx)\n",Status);
+
+  dprintf("Delete link key\n");
+  Status=NtDeleteKey(hKey);
+  dprintf("  NtDeleteKey() called (Status %lx)\n",Status);
+
+  dprintf("Close link key\n");
+  NtClose(hKey);
+}
+
+
+void test8(void)
+{
+ OBJECT_ATTRIBUTES ObjectAttributes;
+ UNICODE_STRING KeyName;
+ NTSTATUS Status;
+ LONG dwError;
+ TOKEN_PRIVILEGES NewPrivileges; 
+ HANDLE Token,hKey;
+ LUID Luid; 
+ BOOLEAN bRes;
+  Status=NtOpenProcessToken(GetCurrentProcess()
+       ,TOKEN_ADJUST_PRIVILEGES,&Token);
+//     ,TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,&Token);
+  dprintf("\t\t\t\tStatus =%x\n",Status);
+//  bRes=LookupPrivilegeValueA(NULL,SE_RESTORE_NAME,&Luid);
+//  dprintf("\t\t\t\tbRes =%x\n",bRes);
+  NewPrivileges.PrivilegeCount = 1; 
+  NewPrivileges.Privileges[0].Luid = Luid; 
+//  NewPrivileges.Privileges[0].Luid.u.LowPart=18;
+//  NewPrivileges.Privileges[0].Luid.u.HighPart=0;
+  NewPrivileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; 
+//  Status = NtAdjustPrivilegesToken( 
+  bRes = AdjustTokenPrivileges( 
+            Token, 
+            FALSE, 
+            &NewPrivileges, 
+            0, 
+            NULL, 
+            NULL 
+            ); 
+  dprintf("\t\t\t\tbRes =%x\n",bRes);
+//  Status=NtClose(Token); 
+//  dprintf("\t\t\t\tStatus =%x\n",Status);
+
+
+  RtlInitUnicodeStringFromLiteral(&KeyName,L"test5");
+  InitializeObjectAttributes(&ObjectAttributes, &KeyName, OBJ_CASE_INSENSITIVE
+                               , NULL, NULL);
+  Status = NtLoadKey(HKEY_LOCAL_MACHINE,&ObjectAttributes);
+  dprintf("\t\t\t\tStatus =%x\n",Status);
+  dwError=RegLoadKey(HKEY_LOCAL_MACHINE,"def"
+               ,"test5");
+  dprintf("\t\t\t\tdwError =%x\n",dwError);
+
+  dprintf("NtOpenKey \\Registry\\Machine : ");
+  RtlInitUnicodeStringFromLiteral(&KeyName, L"\\Registry\\Machine");
+  InitializeObjectAttributes(&ObjectAttributes,
+                               &KeyName,
+                               OBJ_CASE_INSENSITIVE,
+                               NULL,
+                               NULL);
+  Status=NtOpenKey( &hKey, MAXIMUM_ALLOWED, &ObjectAttributes);
+  dprintf("\t\t\tStatus =%x\n",Status);
+  RtlInitUnicodeStringFromLiteral(&KeyName,L"test5");
+  InitializeObjectAttributes(&ObjectAttributes, &KeyName, OBJ_CASE_INSENSITIVE
+                               , NULL, NULL);
+  Status = NtLoadKey(hKey,&ObjectAttributes);
+  dprintf("\t\t\t\tStatus =%x\n",Status);
+}
+
+int main(int argc, char* argv[])
+{
+ char Buffer[10];
+ DWORD Result;
+
+  AllocConsole();
+  InputHandle = GetStdHandle(STD_INPUT_HANDLE);
+  OutputHandle =  GetStdHandle(STD_OUTPUT_HANDLE);
+  while(1)
+  {
+    dprintf("choose test :\n");
+    dprintf("  0=Exit\n");
+    dprintf("  1=Ntxxx read functions\n");
+    dprintf("  2=Ntxxx write functions : volatile keys\n");
+    dprintf("  3=Ntxxx write functions : non volatile keys\n");
+    dprintf("  4=Regxxx functions\n");
+    dprintf("  5=FlushKey \n");
+    dprintf("  6=Registry link create test\n");
+    dprintf("  7=Registry link delete test\n");
+    ReadConsoleA(InputHandle, Buffer, 3, &Result, NULL) ;
+    switch (Buffer[0])
+    {
+     case '0':
+      return(0);
+     case '1':
+      test1();
+      break;
+     case '2':
+      test2();
+      break;
+     case '3':
+      test3();
+      break;
+     case '4':
+      test4();
+      break;
+     case '5':
+      test5();
+      break;
+     case '6':
+      test6();
+      break;
+     case '7':
+      test7();
+      break;
+#if 0
+     case '8':
+      test8();
+      break;
+#endif
+    }
+  }
+  return 0;
+}