Changed the server to return STATUS_* error codes.

diff --git a/dlls/advapi32/registry.c b/dlls/advapi32/registry.c
index 462d8dd..3e49411 100644
--- a/dlls/advapi32/registry.c
+++ b/dlls/advapi32/registry.c
@@ -127,6 +127,13 @@
     return ERROR_SUCCESS;
 }
 
+/* do a server call without setting the last error code */
+static inline int reg_server_call( enum request req )
+{
+    unsigned int res = server_call_noerr( req );
+    if (res) res = RtlNtStatusToDosError(res);
+    return res;
+}
 
 /******************************************************************************
  *           RegCreateKeyExW   [ADVAPI32.131]
@@ -166,7 +173,7 @@
     if (req->name[0] == '\\') return ERROR_BAD_PATHNAME;
     lstrcpynW( req->class, class ? class : (LPWSTR)"\0\0",
                server_remaining(req->class) / sizeof(WCHAR) );
-    if ((ret = server_call_noerr( REQ_CREATE_KEY )) == ERROR_SUCCESS)
+    if ((ret = reg_server_call( REQ_CREATE_KEY )) == ERROR_SUCCESS)
     {
         *retkey = req->hkey;
         if (dispos) *dispos = req->created ? REG_CREATED_NEW_KEY : REG_OPENED_EXISTING_KEY;
@@ -199,7 +206,7 @@
     if (req->name[0] == '\\') return ERROR_BAD_PATHNAME;
     lstrcpynAtoW( req->class, class ? class : "",
                   server_remaining(req->class) / sizeof(WCHAR) );
-    if ((ret = server_call_noerr( REQ_CREATE_KEY )) == ERROR_SUCCESS)
+    if ((ret = reg_server_call( REQ_CREATE_KEY )) == ERROR_SUCCESS)
     {
         *retkey = req->hkey;
         if (dispos) *dispos = req->created ? REG_CREATED_NEW_KEY : REG_OPENED_EXISTING_KEY;
@@ -266,7 +273,7 @@
     req->access = access;
     if ((ret = copy_nameW( req->name, name )) != ERROR_SUCCESS) return ret;
     if (req->name[0] == '\\') return ERROR_BAD_PATHNAME;
-    if ((ret = server_call_noerr( REQ_OPEN_KEY )) == ERROR_SUCCESS) *retkey = req->hkey;
+    if ((ret = reg_server_call( REQ_OPEN_KEY )) == ERROR_SUCCESS) *retkey = req->hkey;
     return ret;
 }
 
@@ -288,7 +295,7 @@
     req->access = access;
     if ((ret = copy_nameAtoW( req->name, name )) != ERROR_SUCCESS) return ret;
     if (req->name[0] == '\\') return ERROR_BAD_PATHNAME;
-    if ((ret = server_call_noerr( REQ_OPEN_KEY )) == ERROR_SUCCESS) *retkey = req->hkey;
+    if ((ret = reg_server_call( REQ_OPEN_KEY )) == ERROR_SUCCESS) *retkey = req->hkey;
     return ret;
 }
 
@@ -350,7 +357,7 @@
 
     req->hkey = hkey;
     req->index = index;
-    if ((ret = server_call_noerr( REQ_ENUM_KEY )) != ERROR_SUCCESS) return ret;
+    if ((ret = reg_server_call( REQ_ENUM_KEY )) != ERROR_SUCCESS) return ret;
 
     len = lstrlenW( req->name ) + 1;
     cls_len = lstrlenW( req->class ) + 1;
@@ -385,7 +392,7 @@
 
     req->hkey = hkey;
     req->index = index;
-    if ((ret = server_call_noerr( REQ_ENUM_KEY )) != ERROR_SUCCESS) return ret;
+    if ((ret = reg_server_call( REQ_ENUM_KEY )) != ERROR_SUCCESS) return ret;
 
     len = lstrlenW( req->name ) + 1;
     cls_len = lstrlenW( req->class ) + 1;
@@ -460,7 +467,7 @@
         return ERROR_INVALID_PARAMETER;
 
     req->hkey = hkey;
-    if ((ret = server_call_noerr( REQ_QUERY_KEY_INFO )) != ERROR_SUCCESS) return ret;
+    if ((ret = reg_server_call( REQ_QUERY_KEY_INFO )) != ERROR_SUCCESS) return ret;
 
     if (class)
     {
@@ -502,7 +509,7 @@
         return ERROR_INVALID_PARAMETER;
 
     req->hkey = hkey;
-    if ((ret = server_call_noerr( REQ_QUERY_KEY_INFO )) != ERROR_SUCCESS) return ret;
+    if ((ret = reg_server_call( REQ_QUERY_KEY_INFO )) != ERROR_SUCCESS) return ret;
 
     if (class)
     {
@@ -542,7 +549,7 @@
     struct close_key_request *req = get_req_buffer();
     TRACE( "(0x%x)\n", hkey );
     req->hkey = hkey;
-    return server_call_noerr( REQ_CLOSE_KEY );
+    return reg_server_call( REQ_CLOSE_KEY );
 }
 
 
@@ -567,7 +574,7 @@
     req->hkey = hkey;
     if ((ret = copy_nameW( req->name, name )) != ERROR_SUCCESS) return ret;
     if (req->name[0] == '\\') return ERROR_BAD_PATHNAME;
-    return server_call_noerr( REQ_DELETE_KEY );
+    return reg_server_call( REQ_DELETE_KEY );
 }
 
 
@@ -584,7 +591,7 @@
     req->hkey = hkey;
     if ((ret = copy_nameAtoW( req->name, name )) != ERROR_SUCCESS) return ret;
     if (req->name[0] == '\\') return ERROR_BAD_PATHNAME;
-    return server_call_noerr( REQ_DELETE_KEY );
+    return reg_server_call( REQ_DELETE_KEY );
 }
 
 
@@ -633,7 +640,7 @@
     req->len = count;
     if ((ret = copy_nameW( req->name, name )) != ERROR_SUCCESS) return ret;
     memcpy( req->data, data, count );
-    return server_call_noerr( REQ_SET_KEY_VALUE );
+    return reg_server_call( REQ_SET_KEY_VALUE );
 }
 
 
@@ -671,7 +678,7 @@
     req->type = type;
     req->len = count;
     if ((ret = copy_nameAtoW( req->name, name )) != ERROR_SUCCESS) return ret;
-    return server_call_noerr( REQ_SET_KEY_VALUE );
+    return reg_server_call( REQ_SET_KEY_VALUE );
 }
 
 
@@ -755,7 +762,7 @@
 
     req->hkey = hkey;
     if ((ret = copy_nameW( req->name, name )) != ERROR_SUCCESS) return ret;
-    if ((ret = server_call_noerr( REQ_GET_KEY_VALUE )) == ERROR_SUCCESS)
+    if ((ret = reg_server_call( REQ_GET_KEY_VALUE )) == ERROR_SUCCESS)
     {
         if (type) *type = req->type;
         ret = copy_data( data, req->data, req->len, count, req->type );
@@ -783,7 +790,7 @@
 
     req->hkey = hkey;
     if ((ret = copy_nameAtoW( req->name, name )) != ERROR_SUCCESS) return ret;
-    if ((ret = server_call_noerr( REQ_GET_KEY_VALUE )) == ERROR_SUCCESS)
+    if ((ret = reg_server_call( REQ_GET_KEY_VALUE )) == ERROR_SUCCESS)
     {
         if (type) *type = req->type;
         ret = copy_data_WtoA( data, req->data, req->len, count, req->type );
@@ -874,7 +881,7 @@
 
     req->hkey = hkey;
     req->index = index;
-    if ((ret = server_call_noerr( REQ_ENUM_KEY_VALUE )) != ERROR_SUCCESS) return ret;
+    if ((ret = reg_server_call( REQ_ENUM_KEY_VALUE )) != ERROR_SUCCESS) return ret;
 
     len = lstrlenW( req->name ) + 1;
     if (len > *val_count) return ERROR_MORE_DATA;
@@ -903,7 +910,7 @@
 
     req->hkey = hkey;
     req->index = index;
-    if ((ret = server_call_noerr( REQ_ENUM_KEY_VALUE )) != ERROR_SUCCESS) return ret;
+    if ((ret = reg_server_call( REQ_ENUM_KEY_VALUE )) != ERROR_SUCCESS) return ret;
 
     len = lstrlenW( req->name ) + 1;
     if (len > *val_count) return ERROR_MORE_DATA;
@@ -935,7 +942,7 @@
 
     req->hkey = hkey;
     if ((ret = copy_nameW( req->name, name )) != ERROR_SUCCESS) return ret;
-    return server_call_noerr( REQ_DELETE_KEY_VALUE );
+    return reg_server_call( REQ_DELETE_KEY_VALUE );
 }
 
 
@@ -951,7 +958,7 @@
 
     req->hkey = hkey;
     if ((ret = copy_nameAtoW( req->name, name )) != ERROR_SUCCESS) return ret;
-    return server_call_noerr( REQ_DELETE_KEY_VALUE );
+    return reg_server_call( REQ_DELETE_KEY_VALUE );
 }
 
 
@@ -983,7 +990,7 @@
     req->hkey  = hkey;
     req->file  = file;
     if ((ret = copy_nameW( req->name, subkey )) != ERROR_SUCCESS) goto done;
-    ret = server_call_noerr( REQ_LOAD_REGISTRY );
+    ret = reg_server_call( REQ_LOAD_REGISTRY );
     CloseHandle( file );
 
  done:
@@ -1015,7 +1022,7 @@
     req->hkey  = hkey;
     req->file  = file;
     if ((ret = copy_nameAtoW( req->name, subkey )) != ERROR_SUCCESS) goto done;
-    ret = server_call_noerr( REQ_LOAD_REGISTRY );
+    ret = reg_server_call( REQ_LOAD_REGISTRY );
     CloseHandle( file );
 
  done:
@@ -1058,7 +1065,7 @@
 
     req->hkey = hkey;
     req->file = handle;
-    ret = server_call_noerr( REQ_SAVE_REGISTRY );
+    ret = reg_server_call( REQ_SAVE_REGISTRY );
     CloseHandle( handle );
     if (!ret)
     {
diff --git a/dlls/ntdll/reg.c b/dlls/ntdll/reg.c
index 3aa6287..6df1f32 100644
--- a/dlls/ntdll/reg.c
+++ b/dlls/ntdll/reg.c
@@ -17,38 +17,7 @@
 #include "crtdll.h"
 #include "ntdll_misc.h"
 
-DEFAULT_DEBUG_CHANNEL(ntdll)
-
-
-/* helper to make the server functions return STATUS_ codes */
-static NTSTATUS ErrorCodeToStatus (DWORD Error)
-{
-	TRACE("err=%lu\n", Error);
-	switch (Error)
-	{
-	  case NO_ERROR:			return STATUS_SUCCESS;
-
-	  case ERROR_INSUFFICIENT_BUFFER:	return STATUS_BUFFER_TOO_SMALL;
-	  case ERROR_FILE_NOT_FOUND:		return STATUS_OBJECT_NAME_NOT_FOUND;
-	  case ERROR_NO_MORE_ITEMS:		return STATUS_NO_MORE_ENTRIES;
-/*
-	return STATUS_INVALID_PARAMETER;
-	return STATUS_INVALID_HANDLE 
-	return STATUS_ACCESS_DENIED
-*/
-/*	  case ERROR_MORE_DATA:			return STATUS_BUFFER_OVERFLOW;
-	  case ERROR_KEY_DELETED:		return STATUS_KEY_DELETED;
-	  case ERROR_CHILD_MUST_BE_VOLATILE:	return STATUS_CHILD_MUST_BE_VOLATILE;
-	  case ERROR_ACCESS_DENIED:		return STATUS_ACCESS_DENIED;
-	  case ERROR_NOT_REGISTRY_FILE:		return STATUS_NOT_REGISTRY_FILE;
-*/
-	  default:
-	    FIXME("Error code %lu not implemented\n", Error);
-	}
-	return STATUS_UNSUCCESSFUL;
-}
-
-#define nt_server_call(kind) (ret=ErrorCodeToStatus(server_call_noerr(kind)))
+DEFAULT_DEBUG_CHANNEL(ntdll);
 
 /* copy a key name into the request buffer */
 static inline NTSTATUS copy_nameU( LPWSTR Dest, PUNICODE_STRING Name, UINT Offset )
@@ -163,7 +132,7 @@
 	else
 	  req->class[0] = 0x0000;
 
-	if (nt_server_call(REQ_CREATE_KEY) == STATUS_SUCCESS)
+	if (!(ret = server_call_noerr(REQ_CREATE_KEY)))
 	{
 	  *KeyHandle = req->hkey;
 	  if (Disposition) *Disposition = req->created ? REG_CREATED_NEW_KEY : REG_OPENED_EXISTING_KEY;
@@ -202,7 +171,7 @@
 	if (copy_nameU( req->name, ObjectAttributes->ObjectName, ObjectNameOffset ) != STATUS_SUCCESS) 
 	  return STATUS_INVALID_PARAMETER;
 
-	if (nt_server_call(REQ_OPEN_KEY) == STATUS_SUCCESS)
+	if (!(ret = server_call_noerr(REQ_OPEN_KEY)))
 	{
 	  *KeyHandle = req->hkey;
 	}
@@ -256,7 +225,7 @@
 
 	req->hkey = KeyHandle;
 	req->index = Index;
-	if (nt_server_call(REQ_ENUM_KEY) != STATUS_SUCCESS) return ret;
+	if ((ret = server_call_noerr(REQ_ENUM_KEY)) != STATUS_SUCCESS) return ret;
 
 	switch (KeyInformationClass)
 	{
@@ -338,7 +307,7 @@
 	KeyHandle, KeyInformationClass, KeyInformation, Length, ResultLength);
 	
 	req->hkey = KeyHandle;
-	if ((ret=nt_server_call(REQ_QUERY_KEY_INFO)) != STATUS_SUCCESS) return ret;
+	if ((ret = server_call_noerr(REQ_QUERY_KEY_INFO)) != STATUS_SUCCESS) return ret;
 	
 	switch (KeyInformationClass)
 	{
@@ -421,7 +390,7 @@
 
 	req->hkey = KeyHandle;
 	req->index = Index;
-	if (nt_server_call(REQ_ENUM_KEY_VALUE) != STATUS_SUCCESS) return ret;
+	if ((ret = server_call_noerr(REQ_ENUM_KEY_VALUE)) != STATUS_SUCCESS) return ret;
 
  	switch (KeyInformationClass)
 	{
@@ -567,7 +536,7 @@
 
 	req->hkey = KeyHandle;
 	if (copy_nameU(req->name, ValueName, 0) != STATUS_SUCCESS) return STATUS_BUFFER_OVERFLOW;
-	if (nt_server_call(REQ_GET_KEY_VALUE) != STATUS_SUCCESS) return ret;
+	if ((ret = server_call_noerr(REQ_GET_KEY_VALUE)) != STATUS_SUCCESS) return ret;
 
 	switch(KeyValueInformationClass)
 	{
diff --git a/dlls/ntdll/sync.c b/dlls/ntdll/sync.c
index 4fb7f8b..14d15f8 100644
--- a/dlls/ntdll/sync.c
+++ b/dlls/ntdll/sync.c
@@ -14,22 +14,7 @@
 #include "ntddk.h"
 #include "ntdll_misc.h"
 
-DEFAULT_DEBUG_CHANNEL(ntdll)
-
-#define nt_server_call(kind) (ret=ErrorCodeToStatus(server_call_noerr(kind)))
-
-/* helper to make the server functions return STATUS_ codes */
-static NTSTATUS ErrorCodeToStatus (DWORD Error)
-{
-        TRACE("err=%lu\n", Error);
-        switch (Error)
-        {
-          case NO_ERROR:                        return STATUS_SUCCESS;
-          default:
-            FIXME("Error code %lu not implemented\n", Error);
-        }
-        return STATUS_UNSUCCESSFUL;
-}
+DEFAULT_DEBUG_CHANNEL(ntdll);
 
 /* copy a key name into the request buffer */
 static inline NTSTATUS copy_nameU( LPWSTR Dest, PUNICODE_STRING Name )
@@ -72,8 +57,8 @@
 	req->max     = MaximumCount;
 	req->inherit = ObjectAttributes->Attributes & OBJ_INHERIT;
 	copy_nameU( req->name, ObjectAttributes->ObjectName );
-	if (nt_server_call( REQ_CREATE_SEMAPHORE ) != STATUS_SUCCESS) return ret;
-	*SemaphoreHandle = req->handle;
+	if (!(ret = server_call_noerr( REQ_CREATE_SEMAPHORE )))
+            *SemaphoreHandle = req->handle;
 	return ret;
 }
 
@@ -97,7 +82,7 @@
 	req->access  = DesiredAcces;
 	req->inherit = ObjectAttributes->Attributes & OBJ_INHERIT;
 	copy_nameU( req->name, ObjectAttributes->ObjectName );
-	if (nt_server_call( REQ_OPEN_SEMAPHORE ) != STATUS_SUCCESS) return -1;
+	if ((ret = server_call_noerr( REQ_OPEN_SEMAPHORE )) != STATUS_SUCCESS) return -1;
 	return req->handle;
 }
 
@@ -133,7 +118,7 @@
 
 	req->handle = SemaphoreHandle;
 	req->count  = ReleaseCount;
-	if (nt_server_call( REQ_RELEASE_SEMAPHORE ) == STATUS_SUCCESS)
+	if (!(ret = server_call_noerr( REQ_RELEASE_SEMAPHORE )))
 	{
 	  if (PreviousCount) *PreviousCount = req->prev_count;
 	}
@@ -166,9 +151,8 @@
 	req->initial_state = InitialState;
 	req->inherit = ObjectAttributes->Attributes & OBJ_INHERIT;
 	copy_nameU( req->name, ObjectAttributes->ObjectName );
-	if (nt_server_call( REQ_CREATE_EVENT ) != STATUS_SUCCESS) return ret;
-	*EventHandle = req->handle;
-	return STATUS_SUCCESS;
+	if (!(ret = server_call_noerr( REQ_CREATE_EVENT ))) *EventHandle = req->handle;
+	return ret;
 }
 
 /******************************************************************************
@@ -190,8 +174,7 @@
 	req->access  = DesiredAccess;
 	req->inherit = ObjectAttributes->Attributes & OBJ_INHERIT;
 	copy_nameU( req->name, ObjectAttributes->ObjectName );
-	if (nt_server_call( REQ_OPEN_EVENT ) != STATUS_SUCCESS) return ret;
-	*EventHandle = req->handle;
+	if (!(ret = server_call_noerr( REQ_OPEN_EVENT ))) *EventHandle = req->handle;
 	return ret;
 }
 
@@ -206,12 +189,9 @@
 	enum event_op op )
 {
 	struct event_op_request *req = get_req_buffer();
-	HRESULT ret;
-
 	req->handle = handle;
 	req->op     = op;
-	nt_server_call( REQ_EVENT_OP );
-	return ret;
+	return server_call_noerr( REQ_EVENT_OP );
 }
 
 /******************************************************************************
diff --git a/dlls/winsock/socket.c b/dlls/winsock/socket.c
index 69bdb2f..4ba80e5 100644
--- a/dlls/winsock/socket.c
+++ b/dlls/winsock/socket.c
@@ -180,6 +180,19 @@
 	0
 };
 
+/* we need a special routine to handle WSA* errors */
+static inline int sock_server_call( enum request req )
+{
+    unsigned int res = server_call_noerr( req );
+    if (res)
+    {
+        /* do not map WSA errors */
+        if ((res < WSABASEERR) || (res >= 0x10000000)) res = RtlNtStatusToDosError(res);
+        SetLastError( res );
+    }
+    return res;
+}
+
 static int   _check_ws(LPWSINFO pwsi, SOCKET s);
 static char* _check_buffer(LPWSINFO pwsi, int size);
 
@@ -204,7 +217,7 @@
     req->mask   = event;
     req->sstate = sstate;
     req->cstate = cstate;
-    server_call( REQ_ENABLE_SOCKET_EVENT );
+    sock_server_call( REQ_ENABLE_SOCKET_EVENT );
 }
 
 static int _is_blocking(SOCKET s)
@@ -214,7 +227,7 @@
     req->handle  = s;
     req->service = FALSE;
     req->s_event = 0;
-    server_call( REQ_GET_SOCKET_EVENT );
+    sock_server_call( REQ_GET_SOCKET_EVENT );
     return (req->state & WS_FD_NONBLOCKING) == 0;
 }
 
@@ -225,7 +238,7 @@
     req->handle  = s;
     req->service = FALSE;
     req->s_event = 0;
-    server_call( REQ_GET_SOCKET_EVENT );
+    sock_server_call( REQ_GET_SOCKET_EVENT );
     return req->mask;
 }
 
@@ -243,7 +256,7 @@
     req->handle  = s;
     req->service = FALSE;
     req->s_event = 0;
-    server_call( REQ_GET_SOCKET_EVENT );
+    sock_server_call( REQ_GET_SOCKET_EVENT );
     return req->errors[bit];
 }
 
@@ -705,7 +718,7 @@
 	req->lhandle = s;
 	req->access  = GENERIC_READ|GENERIC_WRITE|SYNCHRONIZE;
 	req->inherit = TRUE;
-	server_call( REQ_ACCEPT_SOCKET );
+	sock_server_call( REQ_ACCEPT_SOCKET );
 	if( req->handle >= 0 )
 	{
 	    int fd = _get_sock_fd( s = req->handle );
@@ -1770,7 +1783,7 @@
     req->protocol = protocol;
     req->access   = GENERIC_READ|GENERIC_WRITE|SYNCHRONIZE;
     req->inherit  = TRUE;
-    server_call( REQ_CREATE_SOCKET );
+    sock_server_call( REQ_CREATE_SOCKET );
     if ( req->handle >= 0)
     {
 	TRACE("\tcreated %04x\n", req->handle);
@@ -2073,7 +2086,7 @@
 	req->handle  = s;
 	req->service = TRUE;
 	req->s_event = 0;
-	server_call( REQ_GET_SOCKET_EVENT );
+	sock_server_call( REQ_GET_SOCKET_EVENT );
 	lpEvent->lNetworkEvents = req->pmask;
 	memcpy(lpEvent->iErrorCode, req->errors, sizeof(lpEvent->iErrorCode));
 	if (hEvent)
@@ -2096,7 +2109,7 @@
 	req->handle = s;
 	req->mask   = lEvent;
 	req->event  = hEvent;
-	server_call( REQ_SET_SOCKET_EVENT );
+	sock_server_call( REQ_SET_SOCKET_EVENT );
 	return 0;
     }
     else SetLastError(WSAEINVAL);
@@ -2120,7 +2133,7 @@
     req->handle  = info->sock;
     req->service = TRUE;
     req->s_event = info->event; /* <== avoid race conditions */
-    server_call( REQ_GET_SOCKET_EVENT );
+    sock_server_call( REQ_GET_SOCKET_EVENT );
     if ( GetLastError() == WSAEINVAL )
     {
 	/* orphaned event (socket closed or something) */