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) */