Converted a few more server requests to the new mechanism.
diff --git a/dlls/advapi32/registry.c b/dlls/advapi32/registry.c
index 26aa450..24560e2 100644
--- a/dlls/advapi32/registry.c
+++ b/dlls/advapi32/registry.c
@@ -43,30 +43,6 @@
return (type == REG_SZ) || (type == REG_EXPAND_SZ) || (type == REG_MULTI_SZ);
}
-/* copy a key name into the request buffer */
-static inline DWORD copy_nameW( LPWSTR dest, LPCWSTR name )
-{
- if (name)
- {
- if (strlenW(name) > MAX_PATH) return ERROR_MORE_DATA;
- strcpyW( dest, name );
- }
- else dest[0] = 0;
- return ERROR_SUCCESS;
-}
-
-/* copy a key name into the request buffer */
-static inline DWORD copy_nameAtoW( LPWSTR dest, LPCSTR name )
-{
- if (name)
- {
- if (strlen(name) > MAX_PATH) return ERROR_MORE_DATA;
- lstrcpyAtoW( dest, name );
- }
- else dest[0] = 0;
- return ERROR_SUCCESS;
-}
-
/* do a server call without setting the last error code */
static inline int reg_server_call( enum request req )
{
@@ -856,7 +832,7 @@
* RegQueryValueExA [ADVAPI32.157]
*
* NOTES:
- * the documentation is wrong: if the buffer is to small it remains untouched
+ * the documentation is wrong: if the buffer is too small it remains untouched
*/
DWORD WINAPI RegQueryValueExA( HKEY hkey, LPCSTR name, LPDWORD reserved, LPDWORD type,
LPBYTE data, LPDWORD count )
@@ -923,7 +899,11 @@
}
total_size = len + info_size;
}
- else if (data) memcpy( data, buf_ptr + info_size, total_size - info_size );
+ else if (data)
+ {
+ if (total_size - info_size > *count) status = STATUS_BUFFER_OVERFLOW;
+ else memcpy( data, buf_ptr + info_size, total_size - info_size );
+ }
}
else if (status != STATUS_BUFFER_OVERFLOW) goto done;
}
@@ -1164,25 +1144,33 @@
*/
LONG WINAPI RegLoadKeyW( HKEY hkey, LPCWSTR subkey, LPCWSTR filename )
{
- struct load_registry_request *req = get_req_buffer();
HANDLE file;
- DWORD ret, err = GetLastError();
+ DWORD ret, len, err = GetLastError();
TRACE( "(%x,%s,%s)\n", hkey, debugstr_w(subkey), debugstr_w(filename) );
if (!filename || !*filename) return ERROR_INVALID_PARAMETER;
if (!subkey || !*subkey) return ERROR_INVALID_PARAMETER;
+ len = strlenW( subkey ) * sizeof(WCHAR);
+ if (len > MAX_PATH*sizeof(WCHAR)) return ERROR_INVALID_PARAMETER;
+
if ((file = CreateFileW( filename, GENERIC_READ, 0, NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, -1 )) == INVALID_HANDLE_VALUE)
{
ret = GetLastError();
goto done;
}
- req->hkey = hkey;
- req->file = file;
- if ((ret = copy_nameW( req->name, subkey )) != ERROR_SUCCESS) goto done;
- ret = reg_server_call( REQ_LOAD_REGISTRY );
+
+ SERVER_START_REQ
+ {
+ struct load_registry_request *req = server_alloc_req( sizeof(*req), len );
+ req->hkey = hkey;
+ req->file = file;
+ memcpy( server_data_ptr(req), subkey, len );
+ ret = reg_server_call( REQ_LOAD_REGISTRY );
+ }
+ SERVER_END_REQ;
CloseHandle( file );
done:
@@ -1196,25 +1184,34 @@
*/
LONG WINAPI RegLoadKeyA( HKEY hkey, LPCSTR subkey, LPCSTR filename )
{
- struct load_registry_request *req = get_req_buffer();
HANDLE file;
- DWORD ret, err = GetLastError();
+ DWORD ret, len, err = GetLastError();
TRACE( "(%x,%s,%s)\n", hkey, debugstr_a(subkey), debugstr_a(filename) );
if (!filename || !*filename) return ERROR_INVALID_PARAMETER;
if (!subkey || !*subkey) return ERROR_INVALID_PARAMETER;
+ len = MultiByteToWideChar( CP_ACP, 0, subkey, strlen(subkey), NULL, 0 ) * sizeof(WCHAR);
+ if (len > MAX_PATH*sizeof(WCHAR)) return ERROR_INVALID_PARAMETER;
+
if ((file = CreateFileA( filename, GENERIC_READ, 0, NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, -1 )) == INVALID_HANDLE_VALUE)
{
ret = GetLastError();
goto done;
}
- req->hkey = hkey;
- req->file = file;
- if ((ret = copy_nameAtoW( req->name, subkey )) != ERROR_SUCCESS) goto done;
- ret = reg_server_call( REQ_LOAD_REGISTRY );
+
+ SERVER_START_REQ
+ {
+ struct load_registry_request *req = server_alloc_req( sizeof(*req), len );
+ req->hkey = hkey;
+ req->file = file;
+ MultiByteToWideChar( CP_ACP, 0, subkey, strlen(subkey),
+ server_data_ptr(req), len/sizeof(WCHAR) );
+ ret = reg_server_call( REQ_LOAD_REGISTRY );
+ }
+ SERVER_END_REQ;
CloseHandle( file );
done:
@@ -1233,7 +1230,6 @@
*/
LONG WINAPI RegSaveKeyA( HKEY hkey, LPCSTR file, LPSECURITY_ATTRIBUTES sa )
{
- struct save_registry_request *req = get_req_buffer();
char buffer[1024];
int count = 0;
LPSTR name;
@@ -1259,9 +1255,15 @@
MESSAGE("Wow, we are already fiddling with a temp file %s with an ordinal as high as %d !\nYou might want to delete all corresponding temp files in that directory.\n", buffer, count);
}
- req->hkey = hkey;
- req->file = handle;
- ret = reg_server_call( REQ_SAVE_REGISTRY );
+ SERVER_START_REQ
+ {
+ struct save_registry_request *req = server_alloc_req( sizeof(*req), 0 );
+ req->hkey = hkey;
+ req->file = handle;
+ ret = reg_server_call( REQ_SAVE_REGISTRY );
+ }
+ SERVER_END_REQ;
+
CloseHandle( handle );
if (!ret)
{
diff --git a/dlls/kernel/comm.c b/dlls/kernel/comm.c
index 5b77d41..defa7e0 100644
--- a/dlls/kernel/comm.c
+++ b/dlls/kernel/comm.c
@@ -1906,19 +1906,21 @@
*/
BOOL WINAPI GetCommMask(HANDLE handle,LPDWORD evtmask)
{
- struct get_serial_info_request *req = get_req_buffer();
+ BOOL ret;
TRACE("handle %d, mask %p\n", handle, evtmask);
- req->handle = handle;
-
- if(server_call( REQ_GET_SERIAL_INFO ))
- return FALSE;
-
- if(evtmask)
- *evtmask = req->eventmask;
-
- return TRUE;
+ SERVER_START_REQ
+ {
+ struct get_serial_info_request *req = server_alloc_req( sizeof(*req), 0 );
+ req->handle = handle;
+ if ((ret = !server_call( REQ_GET_SERIAL_INFO )))
+ {
+ if (evtmask) *evtmask = req->eventmask;
+ }
+ }
+ SERVER_END_REQ;
+ return ret;
}
/*****************************************************************************
@@ -1926,18 +1928,20 @@
*/
BOOL WINAPI SetCommMask(HANDLE handle,DWORD evtmask)
{
- struct set_serial_info_request *req = get_req_buffer();
+ BOOL ret;
TRACE("handle %d, mask %lx\n", handle, evtmask);
-
- req->handle = handle;
- req->flags = SERIALINFO_SET_MASK;
- req->eventmask = evtmask;
- if(server_call( REQ_SET_SERIAL_INFO ))
- return FALSE;
-
- return TRUE;
+ SERVER_START_REQ
+ {
+ struct set_serial_info_request *req = server_alloc_req( sizeof(*req), 0 );
+ req->handle = handle;
+ req->flags = SERIALINFO_SET_MASK;
+ req->eventmask = evtmask;
+ ret = !server_call( REQ_SET_SERIAL_INFO );
+ }
+ SERVER_END_REQ;
+ return ret;
}
/*****************************************************************************
@@ -2447,7 +2451,7 @@
*/
BOOL WINAPI GetCommTimeouts(HANDLE hComm,LPCOMMTIMEOUTS lptimeouts)
{
- struct get_serial_info_request *req = get_req_buffer();
+ BOOL ret;
TRACE("(%x,%p)\n",hComm,lptimeouts);
@@ -2457,18 +2461,21 @@
return FALSE;
}
- req->handle = hComm;
-
- if(server_call( REQ_GET_SERIAL_INFO ))
- return FALSE;
-
- lptimeouts->ReadIntervalTimeout = req->readinterval;
- lptimeouts->ReadTotalTimeoutMultiplier = req->readmult;
- lptimeouts->ReadTotalTimeoutConstant = req->readconst;
- lptimeouts->WriteTotalTimeoutMultiplier = req->writemult;
- lptimeouts->WriteTotalTimeoutConstant = req->writeconst;
-
- return TRUE;
+ SERVER_START_REQ
+ {
+ struct get_serial_info_request *req = server_alloc_req( sizeof(*req), 0 );
+ req->handle = hComm;
+ if ((ret = !server_call( REQ_GET_SERIAL_INFO )))
+ {
+ lptimeouts->ReadIntervalTimeout = req->readinterval;
+ lptimeouts->ReadTotalTimeoutMultiplier = req->readmult;
+ lptimeouts->ReadTotalTimeoutConstant = req->readconst;
+ lptimeouts->WriteTotalTimeoutMultiplier = req->writemult;
+ lptimeouts->WriteTotalTimeoutConstant = req->writeconst;
+ }
+ }
+ SERVER_END_REQ;
+ return ret;
}
/*****************************************************************************
@@ -2487,8 +2494,8 @@
HANDLE hComm, /* [I] handle of COMM device */
LPCOMMTIMEOUTS lptimeouts /* [I] pointer to COMMTIMEOUTS structure */
) {
- struct set_serial_info_request *req = get_req_buffer();
- int fd;
+ BOOL ret;
+ int fd;
struct termios tios;
TRACE("(%x,%p)\n",hComm,lptimeouts);
@@ -2496,20 +2503,23 @@
if(!lptimeouts)
{
SetLastError(ERROR_INVALID_PARAMETER);
- return FALSE;
- }
-
- req->handle = hComm;
- req->flags = SERIALINFO_SET_TIMEOUTS;
-
- req->readinterval = lptimeouts->ReadIntervalTimeout ;
- req->readmult = lptimeouts->ReadTotalTimeoutMultiplier ;
- req->readconst = lptimeouts->ReadTotalTimeoutConstant ;
- req->writemult = lptimeouts->WriteTotalTimeoutMultiplier ;
- req->writeconst = lptimeouts->WriteTotalTimeoutConstant ;
-
- if(server_call( REQ_SET_SERIAL_INFO ))
return FALSE;
+ }
+
+ SERVER_START_REQ
+ {
+ struct set_serial_info_request *req = server_alloc_req( sizeof(*req), 0 );
+ req->handle = hComm;
+ req->flags = SERIALINFO_SET_TIMEOUTS;
+ req->readinterval = lptimeouts->ReadIntervalTimeout ;
+ req->readmult = lptimeouts->ReadTotalTimeoutMultiplier ;
+ req->readconst = lptimeouts->ReadTotalTimeoutConstant ;
+ req->writemult = lptimeouts->WriteTotalTimeoutMultiplier ;
+ req->writeconst = lptimeouts->WriteTotalTimeoutConstant ;
+ ret = !server_call( REQ_SET_SERIAL_INFO );
+ }
+ SERVER_END_REQ;
+ if (!ret) return FALSE;
/* FIXME: move this stuff to the server */
fd = FILE_GetUnixHandle( hComm, GENERIC_WRITE );
@@ -2518,18 +2528,18 @@
return FALSE;
}
- if (-1==tcgetattr(fd,&tios)) {
- FIXME("tcgetattr on fd %d failed!\n",fd);
- return FALSE;
- }
- /* VTIME is in 1/10 seconds */
- tios.c_cc[VTIME]= (lptimeouts->ReadIntervalTimeout+99)/100;
- if (-1==tcsetattr(fd,0,&tios)) {
- FIXME("tcsetattr on fd %d failed!\n",fd);
- return FALSE;
- }
+ if (-1==tcgetattr(fd,&tios)) {
+ FIXME("tcgetattr on fd %d failed!\n",fd);
+ return FALSE;
+ }
+ /* VTIME is in 1/10 seconds */
+ tios.c_cc[VTIME]= (lptimeouts->ReadIntervalTimeout+99)/100;
+ if (-1==tcsetattr(fd,0,&tios)) {
+ FIXME("tcsetattr on fd %d failed!\n",fd);
+ return FALSE;
+ }
close(fd);
- return TRUE;
+ return TRUE;
}
/***********************************************************************