Removed references to advapi32 registry functions from some of the
kernel functions.

diff --git a/files/file.c b/files/file.c
index 3faecf3..4ebcf2b 100644
--- a/files/file.c
+++ b/files/file.c
@@ -58,7 +58,6 @@
 #include "winerror.h"
 #include "windef.h"
 #include "winbase.h"
-#include "winreg.h"
 #include "winternl.h"
 #include "wine/winbase16.h"
 #include "wine/server.h"
@@ -947,7 +946,7 @@
 BOOL WINAPI SetFileAttributesA(LPCSTR lpFileName, DWORD attributes)
 {
     UNICODE_STRING filenameW;
-    HANDLE ret = FALSE;
+    BOOL ret = FALSE;
 
     if (!lpFileName)
     {
@@ -2495,15 +2494,32 @@
     static const WCHAR ValueName[] = {'P','e','n','d','i','n','g',
                                       'F','i','l','e','R','e','n','a','m','e',
                                       'O','p','e','r','a','t','i','o','n','s',0};
+    static const WCHAR SessionW[] = {'M','a','c','h','i','n','e','\\',
+                                     'S','y','s','t','e','m','\\',
+                                     'C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\',
+                                     'C','o','n','t','r','o','l','\\',
+                                     'S','e','s','s','i','o','n',' ','M','a','n','a','g','e','r',0};
+    static const int info_size = FIELD_OFFSET( KEY_VALUE_PARTIAL_INFORMATION, Data );
+
+    OBJECT_ATTRIBUTES attr;
+    UNICODE_STRING nameW;
+    KEY_VALUE_PARTIAL_INFORMATION *info;
     BOOL rc = FALSE;
     HKEY Reboot = 0;
-    DWORD Type, len0, len1, len2;
+    DWORD len0, len1, len2;
     DWORD DataSize = 0;
     BYTE *Buffer = NULL;
     WCHAR *p;
 
-    if(RegCreateKeyA(HKEY_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Control\\Session Manager",
-                     &Reboot) != ERROR_SUCCESS)
+    attr.Length = sizeof(attr);
+    attr.RootDirectory = 0;
+    attr.ObjectName = &nameW;
+    attr.Attributes = 0;
+    attr.SecurityDescriptor = NULL;
+    attr.SecurityQualityOfService = NULL;
+    RtlInitUnicodeString( &nameW, SessionW );
+
+    if (NtCreateKey( &Reboot, KEY_ALL_ACCESS, &attr, 0, NULL, 0, NULL ) != STATUS_SUCCESS)
     {
         WARN("Error creating key for reboot managment [%s]\n",
              "SYSTEM\\CurrentControlSet\\Control\\Session Manager");
@@ -2524,19 +2540,25 @@
     len1 *= sizeof(WCHAR);
     len2 *= sizeof(WCHAR);
 
+    RtlInitUnicodeString( &nameW, ValueName );
+
     /* First we check if the key exists and if so how many bytes it already contains. */
-    if (RegQueryValueExW(Reboot, ValueName, NULL, &Type, NULL, &DataSize) == ERROR_SUCCESS)
+    if (NtQueryValueKey( Reboot, &nameW, KeyValuePartialInformation,
+                         NULL, 0, &DataSize ) == STATUS_BUFFER_OVERFLOW)
     {
-        if (Type != REG_MULTI_SZ) goto Quit;
-        if (!(Buffer = HeapAlloc( GetProcessHeap(), 0, DataSize + len1 + len2 + sizeof(WCHAR) ))) goto Quit;
-        if (RegQueryValueExW(Reboot, ValueName, NULL, &Type, Buffer, &DataSize) != ERROR_SUCCESS)
+        if (!(Buffer = HeapAlloc( GetProcessHeap(), 0, DataSize + len1 + len2 + sizeof(WCHAR) )))
             goto Quit;
-        if (DataSize) DataSize -= sizeof(WCHAR);  /* remove terminating null (will be added back later) */
+        if (NtQueryValueKey( Reboot, &nameW, KeyValuePartialInformation,
+                             Buffer, DataSize, &DataSize )) goto Quit;
+        info = (KEY_VALUE_PARTIAL_INFORMATION *)Buffer;
+        if (info->Type != REG_MULTI_SZ) goto Quit;
+        if (DataSize > sizeof(info)) DataSize -= sizeof(WCHAR);  /* remove terminating null (will be added back later) */
     }
     else
     {
-        if (!(Buffer = HeapAlloc( GetProcessHeap(), 0, len1 + len2 + sizeof(WCHAR) ))) goto Quit;
-        DataSize = 0;
+        DataSize = info_size;
+        if (!(Buffer = HeapAlloc( GetProcessHeap(), 0, DataSize + len1 + len2 + sizeof(WCHAR) )))
+            goto Quit;
     }
 
     p = (WCHAR *)(Buffer + DataSize);
@@ -2563,10 +2585,11 @@
     p = (WCHAR *)(Buffer + DataSize);
     *p = 0;
     DataSize += sizeof(WCHAR);
-    rc = !RegSetValueExW( Reboot, ValueName, 0, REG_MULTI_SZ, Buffer, DataSize );
+
+    rc = !NtSetValueKey(Reboot, &nameW, 0, REG_MULTI_SZ, Buffer + info_size, DataSize - info_size);
 
  Quit:
-    if (Reboot) RegCloseKey(Reboot);
+    if (Reboot) NtClose(Reboot);
     if (Buffer) HeapFree( GetProcessHeap(), 0, Buffer );
     return(rc);
 }
diff --git a/files/profile.c b/files/profile.c
index e5a1ecf..1ade178 100644
--- a/files/profile.c
+++ b/files/profile.c
@@ -40,7 +40,6 @@
 #include "winerror.h"
 #include "winternl.h"
 #include "wine/winbase16.h"
-#include "winreg.h"
 #include "drive.h"
 #include "file.h"
 #include "heap.h"
@@ -972,19 +971,34 @@
 int PROFILE_GetWineIniString( LPCWSTR section, LPCWSTR key_name,
                               LPCWSTR def, LPWSTR buffer, int len )
 {
-    WCHAR tmp[PROFILE_MAX_LINE_LEN];
     HKEY hkey;
-    DWORD err;
+    NTSTATUS err;
+    OBJECT_ATTRIBUTES attr;
+    UNICODE_STRING nameW;
 
-    if (!(err = RegOpenKeyW( wine_profile_key, section, &hkey )))
+    attr.Length = sizeof(attr);
+    attr.RootDirectory = wine_profile_key;
+    attr.ObjectName = &nameW;
+    attr.Attributes = 0;
+    attr.SecurityDescriptor = NULL;
+    attr.SecurityQualityOfService = NULL;
+    RtlInitUnicodeString( &nameW, section );
+    if (!(err = NtOpenKey( &hkey, KEY_ALL_ACCESS, &attr )))
     {
-        DWORD type;
-        DWORD count = sizeof(tmp);
-        err = RegQueryValueExW( hkey, key_name, 0, &type, (LPBYTE)tmp, &count );
-        RegCloseKey( hkey );
+        char tmp[PROFILE_MAX_LINE_LEN*sizeof(WCHAR) + sizeof(KEY_VALUE_PARTIAL_INFORMATION)];
+        DWORD count;
+
+        RtlInitUnicodeString( &nameW, key_name );
+        if (!(err = NtQueryValueKey( hkey, &nameW, KeyValuePartialInformation,
+                                     tmp, sizeof(tmp), &count )))
+        {
+            WCHAR *str = (WCHAR *)((KEY_VALUE_PARTIAL_INFORMATION *)tmp)->Data;
+            PROFILE_CopyEntry( buffer, str, len, TRUE, TRUE );
+        }
+        NtClose( hkey );
     }
 
-    PROFILE_CopyEntry( buffer, err ? def : tmp, len, TRUE, TRUE );
+    if (err) PROFILE_CopyEntry( buffer, def, len, TRUE, TRUE );
     TRACE( "(%s,%s,%s): returning %s\n", debugstr_w(section),
            debugstr_w(key_name), debugstr_w(def), debugstr_w(buffer) );
     return strlenW(buffer);
diff --git a/loader/loadorder.c b/loader/loadorder.c
index 61586b1..0e587a9 100644
--- a/loader/loadorder.c
+++ b/loader/loadorder.c
@@ -26,8 +26,8 @@
 #include <assert.h>
 
 #include "windef.h"
-#include "winreg.h"
 #include "winerror.h"
+#include "winternl.h"
 #include "file.h"
 #include "module.h"
 #include "wine/debug.h"
@@ -379,8 +379,16 @@
  */
 static HKEY open_app_key( const char *module )
 {
+    OBJECT_ATTRIBUTES attr;
+    UNICODE_STRING nameW;
     HKEY hkey, appkey;
     char buffer[MAX_PATH+16], *appname;
+    static const WCHAR AppDefaultsW[] = {'M','a','c','h','i','n','e','\\',
+                                         'S','o','f','t','w','a','r','e','\\',
+                                         'W','i','n','e','\\',
+                                         'W','i','n','e','\\',
+                                         'C','o','n','f','i','g','\\',
+                                         'A','p','p','D','e','f','a','u','l','t','s',0};
 
     if (!GetModuleFileNameA( 0, buffer, MAX_PATH ))
     {
@@ -391,13 +399,23 @@
 
     TRACE( "searching '%s' in AppDefaults\\%s\\DllOverrides\n", module, appname );
 
-    if (RegOpenKeyA( HKEY_LOCAL_MACHINE, "Software\\Wine\\Wine\\Config\\AppDefaults", &hkey ))
-        return 0;
+    attr.Length = sizeof(attr);
+    attr.RootDirectory = 0;
+    attr.ObjectName = &nameW;
+    attr.Attributes = 0;
+    attr.SecurityDescriptor = NULL;
+    attr.SecurityQualityOfService = NULL;
+    RtlInitUnicodeString( &nameW, AppDefaultsW );
+
+    if (NtOpenKey( &hkey, KEY_ALL_ACCESS, &attr )) return 0;
+    attr.RootDirectory = hkey;
 
     /* open AppDefaults\\appname\\DllOverrides key */
     strcat( appname, "\\DllOverrides" );
-    if (RegOpenKeyA( hkey, appname, &appkey )) appkey = 0;
-    RegCloseKey( hkey );
+    RtlCreateUnicodeStringFromAsciiz( &nameW, appname );
+    if (NtOpenKey( &appkey, KEY_ALL_ACCESS, &attr )) appkey = 0;
+    RtlFreeUnicodeString( &nameW );
+    NtClose( hkey );
     return appkey;
 }
 
@@ -409,12 +427,47 @@
  */
 static BOOL get_registry_value( HKEY hkey, const char *module, enum loadorder_type lo[] )
 {
+    UNICODE_STRING valueW;
     char buffer[80];
-    DWORD count, type;
+    DWORD count;
+    BOOL ret;
 
-    count = sizeof(buffer);
-    if (RegQueryValueExA( hkey, module, NULL, &type, buffer, &count )) return FALSE;
-    return ParseLoadOrder( buffer, lo );
+    RtlCreateUnicodeStringFromAsciiz( &valueW, module );
+
+    if ((ret = !NtQueryValueKey( hkey, &valueW, KeyValuePartialInformation,
+                                 buffer, sizeof(buffer), &count )))
+    {
+        int i, n = 0;
+        WCHAR *str = (WCHAR *)((KEY_VALUE_PARTIAL_INFORMATION *)buffer)->Data;
+
+        while (*str)
+        {
+            enum loadorder_type type = LOADORDER_INVALID;
+
+            while (*str == ',' || isspaceW(*str)) str++;
+            if (!*str) break;
+
+            switch(tolowerW(*str))
+            {
+            case 'n': type = LOADORDER_DLL; break;
+            case 's': type = LOADORDER_SO; break;
+            case 'b': type = LOADORDER_BI; break;
+            case 0:   break;  /* end of string */
+            default:
+                ERR("Invalid load order module-type %s, ignored\n", debugstr_w(str));
+                break;
+            }
+            if (type != LOADORDER_INVALID)
+            {
+                for (i = 0; i < n; i++) if (lo[i] == type) break;  /* already specified */
+                if (i == n) lo[n++] = type;
+            }
+            while (*str && *str != ',' && !isspaceW(*str)) str++;
+        }
+        lo[n] = LOADORDER_INVALID;
+    }
+    RtlFreeUnicodeString( &valueW );
+    return ret;
 }
 
 
@@ -484,6 +537,13 @@
  */
 void MODULE_GetLoadOrder( enum loadorder_type loadorder[], const char *path, BOOL win32 )
 {
+    static const WCHAR DllOverridesW[] = {'M','a','c','h','i','n','e','\\',
+                                          'S','o','f','t','w','a','r','e','\\',
+                                          'W','i','n','e','\\',
+                                          'W','i','n','e','\\',
+                                          'C','o','n','f','i','g','\\',
+                                          'D','l','l','O','v','e','r','r','i','d','e','s',0};
+
     static HKEY std_key = (HKEY)-1;  /* key to standard section, cached */
     HKEY app_key = 0;
     char *module, *basename;
@@ -547,7 +607,20 @@
 
     /* then explicit module name in standard section */
     if (std_key == (HKEY)-1)
-        RegOpenKeyA( HKEY_LOCAL_MACHINE, "Software\\Wine\\Wine\\Config\\DllOverrides", &std_key );
+    {
+        OBJECT_ATTRIBUTES attr;
+        UNICODE_STRING nameW;
+
+        attr.Length = sizeof(attr);
+        attr.RootDirectory = 0;
+        attr.ObjectName = &nameW;
+        attr.Attributes = 0;
+        attr.SecurityDescriptor = NULL;
+        attr.SecurityQualityOfService = NULL;
+        RtlInitUnicodeString( &nameW, DllOverridesW );
+
+        if (NtOpenKey( &std_key, KEY_ALL_ACCESS, &attr )) std_key = 0;
+    }
 
     if (std_key && get_registry_value( std_key, module+1, loadorder ))
     {
@@ -608,6 +681,6 @@
 
 
  done:
-    if (app_key) RegCloseKey( app_key );
+    if (app_key) NtClose( app_key );
     HeapFree( GetProcessHeap(), 0, module );
 }
diff --git a/misc/version.c b/misc/version.c
index 9691749..cac9b7f 100644
--- a/misc/version.c
+++ b/misc/version.c
@@ -29,14 +29,14 @@
 #include <stdio.h>
 #include "windef.h"
 #include "winbase.h"
-#include "winreg.h"
 #include "wingdi.h"
 #include "winuser.h"
 #include "winternl.h"
+#include "winerror.h"
 #include "wine/winbase16.h"
 #include "module.h"
+#include "wine/unicode.h"
 #include "wine/debug.h"
-#include "winerror.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(ver);
 
@@ -271,76 +271,114 @@
 
 
 /**********************************************************************
+ *         VERSION_ParseVersion
+ *
+ * Parse the contents of the Version key.
+ */
+static void VERSION_ParseVersion( HKEY hkey, BOOL *got_win_ver, BOOL *got_dos_ver )
+{
+    static const WCHAR WindowsW[] = {'W','i','n','d','o','w','s',0};
+    static const WCHAR DosW[] = {'D','O','S',0};
+
+    UNICODE_STRING valueW;
+    char tmp[64], buffer[50];
+    KEY_VALUE_PARTIAL_INFORMATION *info = (KEY_VALUE_PARTIAL_INFORMATION *)tmp;
+    DWORD count, len;
+
+    if (!*got_win_ver)
+    {
+        RtlInitUnicodeString( &valueW, WindowsW );
+        if (!NtQueryValueKey( hkey, &valueW, KeyValuePartialInformation, tmp, sizeof(tmp), &count ))
+        {
+            RtlUnicodeToMultiByteN( buffer, sizeof(buffer)-1, &len,
+                                    (WCHAR *)info->Data, info->DataLength );
+            buffer[len] = 0;
+            VERSION_ParseWinVersion( buffer );
+            TRACE( "got win version %s\n", WinVersionNames[forcedWinVersion] );
+            *got_win_ver = TRUE;
+        }
+    }
+    if (!*got_dos_ver)
+    {
+        RtlInitUnicodeString( &valueW, DosW );
+        if (!NtQueryValueKey( hkey, &valueW, KeyValuePartialInformation, tmp, sizeof(tmp), &count ))
+        {
+            RtlUnicodeToMultiByteN( buffer, sizeof(buffer)-1, &len,
+                                    (WCHAR *)info->Data, info->DataLength );
+            buffer[len] = 0;
+            VERSION_ParseDosVersion( buffer );
+            TRACE( "got dos version %lx\n", VersionData[WIN31].getVersion16 );
+            *got_dos_ver = TRUE;
+        }
+    }
+}
+
+
+/**********************************************************************
  *         VERSION_Init
  */
 static void VERSION_Init(void)
 {
-    HKEY hkey, appkey;
-    DWORD count, type;
+    OBJECT_ATTRIBUTES attr;
+    UNICODE_STRING nameW;
+    HKEY hkey, config_key;
     BOOL got_win_ver = FALSE, got_dos_ver = FALSE;
-    char buffer[MAX_PATH+16], *appname, *p;
+    WCHAR buffer[MAX_PATH], appversion[MAX_PATH+20], *appname, *p;
     static BOOL init_done;
+    static const WCHAR configW[] = {'M','a','c','h','i','n','e','\\',
+                                    'S','o','f','t','w','a','r','e','\\',
+                                    'W','i','n','e','\\',
+                                    'W','i','n','e','\\',
+                                    'C','o','n','f','i','g',0};
+    static const WCHAR appdefaultsW[] = {'A','p','p','D','e','f','a','u','l','t','s','\\',0};
+    static const WCHAR versionW[] = {'\\','V','e','r','s','i','o','n',0};
 
     if (init_done) return;
-    if (!GetModuleFileNameA( 0, buffer, MAX_PATH ))
+    if (!GetModuleFileNameW( 0, buffer, MAX_PATH ))
     {
         WARN( "could not get module file name\n" );
         return;
     }
     init_done = TRUE;
     appname = buffer;
-    if ((p = strrchr( appname, '/' ))) appname = p + 1;
-    if ((p = strrchr( appname, '\\' ))) appname = p + 1;
+    if ((p = strrchrW( appname, '/' ))) appname = p + 1;
+    if ((p = strrchrW( appname, '\\' ))) appname = p + 1;
 
-    if (!RegOpenKeyA( HKEY_LOCAL_MACHINE, "Software\\Wine\\Wine\\Config\\AppDefaults", &hkey ))
+    attr.Length = sizeof(attr);
+    attr.RootDirectory = 0;
+    attr.ObjectName = &nameW;
+    attr.Attributes = 0;
+    attr.SecurityDescriptor = NULL;
+    attr.SecurityQualityOfService = NULL;
+    RtlInitUnicodeString( &nameW, configW );
+
+    if (NtOpenKey( &config_key, KEY_ALL_ACCESS, &attr )) return;
+    attr.RootDirectory = config_key;
+
+    /* open AppDefaults\\appname\\Version key */
+
+    strcpyW( appversion, appdefaultsW );
+    strcatW( appversion, appname );
+    strcatW( appversion, versionW );
+    RtlInitUnicodeString( &nameW, appversion );
+
+    if (!NtOpenKey( &hkey, KEY_ALL_ACCESS, &attr ))
     {
-        /* open AppDefaults\\appname\\Version key */
-        strcat( appname, "\\Version" );
-        if (!RegOpenKeyA( hkey, appname, &appkey ))
-        {
-            count = sizeof(buffer);
-            if (!RegQueryValueExA( appkey, "Windows", NULL, &type, buffer, &count ))
-            {
-                VERSION_ParseWinVersion( buffer );
-                TRACE( "got app win version %s\n", WinVersionNames[forcedWinVersion] );
-                got_win_ver = TRUE;
-            }
-            count = sizeof(buffer);
-            if (!RegQueryValueExA( appkey, "DOS", NULL, &type, buffer, &count ))
-            {
-                VERSION_ParseDosVersion( buffer );
-                TRACE( "got app dos version %lx\n", VersionData[WIN31].getVersion16 );
-                got_dos_ver = TRUE;
-            }
-            RegCloseKey( appkey );
-        }
-        RegCloseKey( hkey );
+        VERSION_ParseVersion( hkey, &got_win_ver, &got_dos_ver );
+        NtClose( hkey );
     }
 
-    if (got_win_ver && got_dos_ver) return;
+    if (got_win_ver && got_dos_ver) goto done;
 
-    if (!RegOpenKeyA( HKEY_LOCAL_MACHINE, "Software\\Wine\\Wine\\Config\\Version", &hkey ))
+    RtlInitUnicodeString( &nameW, versionW + 1 );
+    if (!NtOpenKey( &hkey, KEY_ALL_ACCESS, &attr ))
     {
-        if (!got_win_ver)
-        {
-            count = sizeof(buffer);
-            if (!RegQueryValueExA( hkey, "Windows", NULL, &type, buffer, &count ))
-            {
-                VERSION_ParseWinVersion( buffer );
-                TRACE( "got default win version %s\n", WinVersionNames[forcedWinVersion] );
-            }
-        }
-        if (!got_dos_ver)
-        {
-            count = sizeof(buffer);
-            if (!RegQueryValueExA( hkey, "DOS", NULL, &type, buffer, &count ))
-            {
-                VERSION_ParseDosVersion( buffer );
-                TRACE( "got default dos version %lx\n", VersionData[WIN31].getVersion16 );
-            }
-        }
-        RegCloseKey( hkey );
+        VERSION_ParseVersion( hkey, &got_win_ver, &got_dos_ver );
+        NtClose( hkey );
     }
+
+ done:
+    NtClose( config_key );
 }
 
 
diff --git a/msdos/ppdev.c b/msdos/ppdev.c
index ac33337..d3ad3a5 100644
--- a/msdos/ppdev.c
+++ b/msdos/ppdev.c
@@ -33,8 +33,7 @@
 #include <linux/ppdev.h>
 
 #include "winerror.h"
-#include "winreg.h"
-
+#include "winternl.h"
 #include "miscemu.h"
 
 #include "wine/debug.h"
@@ -66,24 +65,49 @@
 char IO_pp_init(void)
 {
     char name[80];
-    char buffer[1024];
+    char buffer[256];
     HKEY hkey;
-    char temp[256];
     int i,idx=0,fd,res,userbase,nports=0;
     char * timeout;
     char ret=1;
     int lasterror;
+    OBJECT_ATTRIBUTES attr;
+    UNICODE_STRING nameW;
+
+    static const WCHAR configW[] = {'M','a','c','h','i','n','e','\\',
+                                    'S','o','f','t','w','a','r','e','\\',
+                                    'W','i','n','e','\\',
+                                    'W','i','n','e','\\',
+                                    'C','o','n','f','i','g','\\',
+                                    'p','p','d','e','v',0};
 
     TRACE("\n");
-    if (RegOpenKeyA( HKEY_LOCAL_MACHINE, "Software\\Wine\\Wine\\Config\\ppdev", &hkey ) != ERROR_SUCCESS)
-      return 1;
+
+    attr.Length = sizeof(attr);
+    attr.RootDirectory = 0;
+    attr.ObjectName = &nameW;
+    attr.Attributes = 0;
+    attr.SecurityDescriptor = NULL;
+    attr.SecurityQualityOfService = NULL;
+    RtlInitUnicodeString( &nameW, configW );
+
+    if (NtOpenKey( &hkey, KEY_ALL_ACCESS, &attr )) return 1;
 
     for (;;)
     {
-        DWORD type, count = sizeof(buffer), name_len = sizeof(name);
+        DWORD total_size, len;
+        char temp[256];
+        KEY_VALUE_FULL_INFORMATION *info = (KEY_VALUE_FULL_INFORMATION *)temp;
 
-        if (RegEnumValueA( hkey, idx, name, &name_len, NULL, &type, buffer, &count )!= ERROR_SUCCESS)
-	  break;
+        if (NtEnumerateValueKey( hkey, idx, KeyValueFullInformation,
+                                 temp, sizeof(temp), &total_size )) break;
+        if (info->Type != REG_SZ) break;
+
+        RtlUnicodeToMultiByteN( name, sizeof(name)-1, &len, info->Name, info->NameLength );
+        name[len] = 0;
+        RtlUnicodeToMultiByteN( buffer, sizeof(buffer)-1, &len,
+                                (WCHAR *)(temp + info->DataOffset), total_size-info->DataOffset );
+        buffer[len] = 0;
 
 	idx++;
 	if(nports >4)
@@ -138,7 +162,7 @@
 	    (ioctl(fd,PPRCONTROL,&res))||
 	    (ioctl(fd,PPRCONTROL,&res)))
 	  {
-	    ERR("PPUSER IOCTL not available for parport device %s\n",temp);
+	    ERR("PPUSER IOCTL not available for parport device %s\n",buffer);
 	    continue;
 	  }
 	if (ioctl (fd,PPRELEASE,0))
@@ -172,7 +196,7 @@
 	nports++;
     }
     TRACE("found %d ports\n",nports);
-    RegCloseKey( hkey );
+    NtClose( hkey );
 
     PPDeviceNum= nports;
     if (nports > 1)
diff --git a/relay32/relay386.c b/relay32/relay386.c
index 407a27b..92d4b56 100644
--- a/relay32/relay386.c
+++ b/relay32/relay386.c
@@ -27,9 +27,9 @@
 
 #include "winnt.h"
 #include "winternl.h"
-#include "winreg.h"
 #include "stackframe.h"
 #include "module.h"
+#include "wine/unicode.h"
 #include "wine/debug.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(relay);
@@ -45,12 +45,16 @@
  *
  * Build a function list from a ';'-separated string.
  */
-static const char **build_list( const char *buffer )
+static const char **build_list( const WCHAR *bufferW )
 {
     int count = 1;
+    char buffer[1024];
     const char *p = buffer;
     const char **ret;
 
+    RtlUnicodeToMultiByteN( buffer, sizeof(buffer), NULL,
+                            bufferW, (strlenW(bufferW)+1) * sizeof(WCHAR) );
+
     while ((p = strchr( p, ';' )))
     {
         count++;
@@ -83,41 +87,63 @@
  */
 void RELAY_InitDebugLists(void)
 {
+    OBJECT_ATTRIBUTES attr;
+    UNICODE_STRING name;
     char buffer[1024];
     HKEY hkey;
-    DWORD count, type;
+    DWORD count;
+    WCHAR *str;
+    static const WCHAR configW[] = {'M','a','c','h','i','n','e','\\',
+                                    'S','o','f','t','w','a','r','e','\\',
+                                    'W','i','n','e','\\',
+                                    'W','i','n','e','\\',
+                                    'C','o','n','f','i','g','\\',
+                                    'D','e','b','u','g',0};
+    static const WCHAR RelayIncludeW[] = {'R','e','l','a','y','I','n','c','l','u','d','e',0};
+    static const WCHAR RelayExcludeW[] = {'R','e','l','a','y','E','x','c','l','u','d','e',0};
+    static const WCHAR SnoopIncludeW[] = {'S','n','o','o','p','I','n','c','l','u','d','e',0};
+    static const WCHAR SnoopExcludeW[] = {'S','n','o','o','p','E','x','c','l','u','d','e',0};
 
-    if (RegOpenKeyA( HKEY_LOCAL_MACHINE, "Software\\Wine\\Wine\\Config\\Debug", &hkey )) return;
+    attr.Length = sizeof(attr);
+    attr.RootDirectory = 0;
+    attr.ObjectName = &name;
+    attr.Attributes = 0;
+    attr.SecurityDescriptor = NULL;
+    attr.SecurityQualityOfService = NULL;
+    RtlInitUnicodeString( &name, configW );
 
-    count = sizeof(buffer);
-    if (!RegQueryValueExA( hkey, "RelayInclude", NULL, &type, buffer, &count ))
+    if (NtOpenKey( &hkey, KEY_ALL_ACCESS, &attr )) return;
+
+    str = (WCHAR *)((KEY_VALUE_PARTIAL_INFORMATION *)buffer)->Data;
+    RtlInitUnicodeString( &name, RelayIncludeW );
+    if (!NtQueryValueKey( hkey, &name, KeyValuePartialInformation, buffer, sizeof(buffer), &count ))
     {
-        TRACE("RelayInclude = %s\n", buffer );
-        debug_relay_includelist = build_list( buffer );
+        TRACE("RelayInclude = %s\n", debugstr_w(str) );
+        debug_relay_includelist = build_list( str );
     }
 
-    count = sizeof(buffer);
-    if (!RegQueryValueExA( hkey, "RelayExclude", NULL, &type, buffer, &count ))
+    RtlInitUnicodeString( &name, RelayExcludeW );
+    if (!NtQueryValueKey( hkey, &name, KeyValuePartialInformation, buffer, sizeof(buffer), &count ))
     {
-        TRACE( "RelayExclude = %s\n", buffer );
-        debug_relay_excludelist = build_list( buffer );
+        TRACE( "RelayExclude = %s\n", debugstr_w(str) );
+        debug_relay_excludelist = build_list( str );
     }
 
-    count = sizeof(buffer);
-    if (!RegQueryValueExA( hkey, "SnoopInclude", NULL, &type, buffer, &count ))
+    RtlInitUnicodeString( &name, SnoopIncludeW );
+    if (!NtQueryValueKey( hkey, &name, KeyValuePartialInformation, buffer, sizeof(buffer), &count ))
     {
-        TRACE_(snoop)( "SnoopInclude = %s\n", buffer );
-        debug_snoop_includelist = build_list( buffer );
+        TRACE_(snoop)( "SnoopInclude = %s\n", debugstr_w(str) );
+        debug_snoop_includelist = build_list( str );
     }
 
-    count = sizeof(buffer);
-    if (!RegQueryValueExA( hkey, "SnoopExclude", NULL, &type, buffer, &count ))
+    RtlInitUnicodeString( &name, SnoopExcludeW );
+    if (!NtQueryValueKey( hkey, &name, KeyValuePartialInformation, buffer, sizeof(buffer), &count ))
     {
-        TRACE_(snoop)( "SnoopExclude = %s\n", buffer );
-        debug_snoop_excludelist = build_list( buffer );
+        TRACE_(snoop)( "SnoopExclude = %s\n", debugstr_w(str) );
+        debug_snoop_excludelist = build_list( str );
     }
 
-    RegCloseKey( hkey );
+    NtClose( hkey );
 }