Detlef Riekenberg : serialui: Fix return type for
drvGetDefaultCommConfig.
Alexandre Julliard
julliard at wine.codeweavers.com
Fri Feb 23 05:28:18 CST 2007
Module: wine
Branch: master
Commit: 59e816d82ca6aa90fcd442a61db6c384fe6ba5a4
URL: http://source.winehq.org/git/wine.git/?a=commit;h=59e816d82ca6aa90fcd442a61db6c384fe6ba5a4
Author: Detlef Riekenberg <wine.dev at web.de>
Date: Thu Feb 22 21:15:23 2007 +0100
serialui: Fix return type for drvGetDefaultCommConfig.
---
dlls/serialui/confdlg.c | 47 +++++++++++++++++++++++++++++------------------
1 files changed, 29 insertions(+), 18 deletions(-)
diff --git a/dlls/serialui/confdlg.c b/dlls/serialui/confdlg.c
index f9f306b..4be0317 100644
--- a/dlls/serialui/confdlg.c
+++ b/dlls/serialui/confdlg.c
@@ -49,6 +49,8 @@ WINE_DEFAULT_DEBUG_CHANNEL(comm);
static HMODULE SERIALUI_hModule;
+static const WCHAR comW[] = {'c','o','m',0 };
+
/***********************************************************************
* DllMain [Internal] Initializes the internal 'SERIALUI.DLL'.
*
@@ -535,7 +537,7 @@ BOOL WINAPI drvSetDefaultCommConfigA(
* FIXME: uses the wrong registry key... should use a digit, not
* the comm port name.
*/
-BOOL WINAPI drvGetDefaultCommConfigW(
+DWORD WINAPI drvGetDefaultCommConfigW(
LPCWSTR lpszDevice, LPCOMMCONFIG lpCommConfig, LPDWORD lpdwSize)
{
HKEY hKeyReg, hKeyPort;
@@ -543,16 +545,25 @@ BOOL WINAPI drvGetDefaultCommConfigW(
DWORD r,dwSize,dwType;
static const WCHAR fmt[] = {'%','s','\\','%','s',0 };
- TRACE("%p %p %p\n",lpszDevice,lpCommConfig,lpdwSize);
+ TRACE("(%s, %p, %p) *lpdwSize: %u\n", debugstr_w(lpszDevice), lpCommConfig, lpdwSize, lpdwSize ? *lpdwSize : 0);
- if(!lpCommConfig)
- return FALSE;
+ if ((!lpszDevice) || (!lpCommConfig) || (!lpdwSize)) {
+ return ERROR_INVALID_PARAMETER;
+ }
- if(!lpdwSize)
- return FALSE;
+ if (*lpdwSize < sizeof (COMMCONFIG)) {
+ *lpdwSize = sizeof (COMMCONFIG);
+ return ERROR_INSUFFICIENT_BUFFER;
+ }
- if(*lpdwSize < sizeof (COMMCONFIG))
- return FALSE;
+ /* only "com1" - "com9" is allowed */
+ r = sizeof(comW) / sizeof(WCHAR); /* len of "com\0" */
+ lstrcpynW(szKeyName, lpszDevice, r); /* simulate a lstrcmpnW */
+ r--;
+ if( lstrcmpW(szKeyName, comW) ||
+ (lpszDevice[r] < '1') || (lpszDevice[r] > '9') || lpszDevice[r+1]) {
+ return ERROR_BADKEY;
+ }
*lpdwSize = sizeof (COMMCONFIG);
memset(lpCommConfig, 0 , sizeof (COMMCONFIG));
@@ -560,8 +571,7 @@ BOOL WINAPI drvGetDefaultCommConfigW(
lpCommConfig->wVersion = 1;
r = RegConnectRegistryW(NULL, HKEY_LOCAL_MACHINE, &hKeyReg);
- if(r != ERROR_SUCCESS)
- return FALSE;
+ if(r != ERROR_SUCCESS) return r;
snprintfW(szKeyName, sizeof(szKeyName)/sizeof(WCHAR), fmt, lpszCommKey ,lpszDevice);
r = RegOpenKeyW(hKeyReg, szKeyName, &hKeyPort);
@@ -571,12 +581,13 @@ BOOL WINAPI drvGetDefaultCommConfigW(
dwType = 0;
r = RegQueryValueExW( hKeyPort, lpszDCB, NULL,
&dwType, (LPBYTE)&lpCommConfig->dcb, &dwSize);
- if ((r==ERROR_SUCCESS) && (dwType != REG_BINARY))
- r = 1;
- if ((r==ERROR_SUCCESS) && (dwSize != sizeof(DCB)))
- r = 1;
RegCloseKey(hKeyPort);
+ if ((r!=ERROR_SUCCESS) || (dwType != REG_BINARY) || (dwSize != sizeof(DCB))) {
+ RegCloseKey(hKeyReg);
+ return ERROR_INVALID_PARAMETER;
+ }
+
}
else
{
@@ -589,22 +600,22 @@ BOOL WINAPI drvGetDefaultCommConfigW(
lpCommConfig->dcb.ByteSize = 8;
lpCommConfig->dcb.Parity = NOPARITY;
lpCommConfig->dcb.StopBits = ONESTOPBIT;
- return TRUE;
+ return ERROR_SUCCESS;
}
RegCloseKey(hKeyReg);
- return (r==ERROR_SUCCESS);
+ return r;
}
/***********************************************************************
* drvGetDefaultCommConfigA (SERIALUI.@)
*/
-BOOL WINAPI drvGetDefaultCommConfigA(
+DWORD WINAPI drvGetDefaultCommConfigA(
LPCSTR lpszDevice, LPCOMMCONFIG lpCommConfig, LPDWORD lpdwSize)
{
LPWSTR strW = SERIALUI_strdup( lpszDevice );
- BOOL r = drvGetDefaultCommConfigW( strW, lpCommConfig, lpdwSize );
+ DWORD r = drvGetDefaultCommConfigW( strW, lpCommConfig, lpdwSize );
SERIALUI_strfree( strW );
return r;
}
More information about the wine-cvs
mailing list