Hook serialui dll into existing comm functions.
diff --git a/dlls/kernel/kernel32.spec b/dlls/kernel/kernel32.spec
index 8f6108a..6799d1f 100644
--- a/dlls/kernel/kernel32.spec
+++ b/dlls/kernel/kernel32.spec
@@ -156,8 +156,8 @@
137 stdcall CloseHandle(long) CloseHandle
138 stdcall CloseProfileUserMapping() CloseProfileUserMapping
139 stub CloseSystemHandle
-140 stub CommConfigDialogA
-141 stub CommConfigDialogW
+140 stdcall CommConfigDialogA(str long ptr) CommConfigDialogA
+141 stdcall CommConfigDialogW(wstr long ptr) CommConfigDialogW
142 stdcall CompareFileTime(ptr ptr) CompareFileTime
143 stdcall CompareStringA(long long str long str long) CompareStringA
144 stdcall CompareStringW(long long wstr long wstr long) CompareStringW
@@ -299,7 +299,7 @@
280 stdcall GetBinaryTypeA(ptr ptr) GetBinaryTypeA
281 stdcall GetBinaryTypeW(ptr ptr) GetBinaryTypeW
282 stdcall GetCPInfo(long ptr) GetCPInfo
-283 stub GetCommConfig
+283 stdcall GetCommConfig(long ptr) GetCommConfig
284 stdcall GetCommMask(long ptr) GetCommMask
285 stdcall GetCommModemStatus(long ptr) GetCommModemStatus
286 stdcall GetCommProperties(long ptr) GetCommProperties
@@ -633,7 +633,7 @@
614 stdcall SearchPathA(str str str long ptr ptr) SearchPathA
615 stdcall SearchPathW(wstr wstr wstr long ptr ptr) SearchPathW
616 stdcall SetCommBreak(long) SetCommBreak
-617 stub SetCommConfig
+617 stdcall SetCommConfig(long ptr) SetCommConfig
618 stdcall SetCommMask(long ptr) SetCommMask
619 stdcall SetCommState(long ptr) SetCommState
620 stdcall SetCommTimeouts(long ptr) SetCommTimeouts
@@ -654,8 +654,8 @@
635 stdcall SetCurrentDirectoryA(str) SetCurrentDirectoryA
636 stdcall SetCurrentDirectoryW(wstr) SetCurrentDirectoryW
637 stub SetDaylightFlag
-638 stub SetDefaultCommConfigA
-639 stub SetDefaultCommConfigW
+638 stdcall SetDefaultCommConfigA(str ptr long) SetDefaultCommConfigA
+639 stdcall SetDefaultCommConfigW(wstr ptr long) SetDefaultCommConfigW
640 stdcall SetEndOfFile(long) SetEndOfFile
641 stdcall SetEnvironmentVariableA(str str) SetEnvironmentVariableA
642 stdcall SetEnvironmentVariableW(wstr wstr) SetEnvironmentVariableW
diff --git a/misc/comm.c b/misc/comm.c
index 4df8fce..be01019 100644
--- a/misc/comm.c
+++ b/misc/comm.c
@@ -2581,15 +2581,238 @@
}
/***********************************************************************
- * GetCommProperties (KERNEL32.???)
+ * GetCommProperties (KERNEL32.286)
+ *
+ * This function fills in a structure with the capabilities of the
+ * communications port driver.
+ *
+ * RETURNS
+ *
+ * TRUE on success, FALSE on failure
+ * If successful, the lpCommProp structure be filled in with
+ * properties of the comm port.
*/
-BOOL WINAPI GetCommProperties(HANDLE hFile, LPCOMMPROP lpCommProp)
-{
+BOOL WINAPI GetCommProperties(
+ HANDLE hFile, /* handle of the comm port */
+ LPCOMMPROP lpCommProp /* pointer to struct to be filled */
+) {
FIXME("(%d %p )\n",hFile,lpCommProp);
+ if(!lpCommProp)
+ return FALSE;
+
+ /*
+ * These values should be valid for LINUX's serial driver
+ * FIXME: Perhaps they deserve an #ifdef LINUX
+ */
+ memset(lpCommProp,0,sizeof(COMMPROP));
+ lpCommProp->wPacketLength = 1;
+ lpCommProp->wPacketVersion = 1;
+ lpCommProp->dwServiceMask = SP_SERIALCOMM;
+ lpCommProp->dwReserved1 = 0;
+ lpCommProp->dwMaxTxQueue = 4096;
+ lpCommProp->dwMaxRxQueue = 4096;
+ lpCommProp->dwMaxBaud = BAUD_115200;
+ lpCommProp->dwProvSubType = PST_RS232;
+ lpCommProp->dwProvCapabilities = PCF_DTRDSR | PCF_PARITY_CHECK | PCF_RTSCTS ;
+ lpCommProp->dwSettableParams = SP_BAUD | SP_DATABITS | SP_HANDSHAKING |
+ SP_PARITY | SP_PARITY_CHECK | SP_STOPBITS ;
+ lpCommProp->dwSettableBaud = BAUD_075 | BAUD_110 | BAUD_134_5 | BAUD_150 |
+ BAUD_300 | BAUD_600 | BAUD_1200 | BAUD_1800 | BAUD_2400 | BAUD_4800 |
+ BAUD_9600 | BAUD_19200 | BAUD_38400 | BAUD_57600 | BAUD_115200 ;
+ lpCommProp->wSettableData = DATABITS_5 | DATABITS_6 | DATABITS_7 | DATABITS_8 ;
+ lpCommProp->wSettableStopParity = STOPBITS_10 | STOPBITS_15 | STOPBITS_20 |
+ PARITY_NONE | PARITY_ODD |PARITY_EVEN | PARITY_MARK | PARITY_SPACE;
+ lpCommProp->dwCurrentTxQueue = lpCommProp->dwMaxTxQueue;
+ lpCommProp->dwCurrentRxQueue = lpCommProp->dwMaxRxQueue;
+
return TRUE;
}
/***********************************************************************
+ * FIXME:
+ * The functionality of CommConfigDialogA, GetDefaultCommConfig and
+ * SetDefaultCommConfig is implemented in a DLL (usually SERIALUI.DLL).
+ * This is dependent on the type of COMM port, but since it is doubtful
+ * anybody will get around to implementing support for fancy serial
+ * ports in WINE, this is hardcoded for the time being. The name of
+ * this DLL should be stored in and read from the system registry in
+ * the hive HKEY_LOCAL_MACHINE, key
+ * System\\CurrentControlSet\\Services\\Class\\Ports\\????
+ * where ???? is the port number... that is determined by PNP
+ * The DLL should be loaded when the COMM port is opened, and closed
+ * when the COMM port is closed. - MJM 20 June 2000
+ ***********************************************************************/
+static CHAR lpszSerialUI[] = "serialui.dll";
+
+
+/***********************************************************************
+ * CommConfigDialogA (KERNEL32.140)
+ *
+ * Raises a dialog that allows the user to configure a comm port.
+ * Fills the COMMCONFIG struct with information specified by the user.
+ * This function should call a similar routine in the COMM driver...
+ *
+ * RETURNS
+ *
+ * TRUE on success, FALSE on failure
+ * If successful, the lpCommConfig structure will contain a new
+ * configuration for the comm port, as specified by the user.
+ *
+ * BUGS
+ * The library with the CommConfigDialog code is never unloaded.
+ * Perhaps this should be done when the comm port is closed?
+ */
+BOOL WINAPI CommConfigDialogA(
+ LPCSTR lpszDevice, /* name of communications device */
+ HANDLE hWnd, /* parent window for the dialog */
+ LPCOMMCONFIG lpCommConfig /* pointer to struct to fill */
+) {
+ FARPROC lpfnCommDialog;
+ HMODULE hConfigModule;
+ BOOL r;
+
+ TRACE("(%p %x %p)\n",lpszDevice, hWnd, lpCommConfig);
+
+ hConfigModule = LoadLibraryA(lpszSerialUI);
+ if(!hConfigModule)
+ return FALSE;
+
+ lpfnCommDialog = GetProcAddress(hConfigModule, (LPCSTR)3L);
+
+ if(!lpfnCommDialog)
+ return FALSE;
+
+ r = lpfnCommDialog(lpszDevice,hWnd,lpCommConfig);
+
+ /* UnloadLibrary(hConfigModule); */
+
+ return r;
+}
+
+/***********************************************************************
+ * CommConfigDialogW (KERNEL32.141)
+ *
+ * see CommConfigDialogA for more info
+ */
+BOOL WINAPI CommConfigDialogW(
+ LPCWSTR lpszDevice, /* name of communications device */
+ HANDLE hWnd, /* parent window for the dialog */
+ LPCOMMCONFIG lpCommConfig /* pointer to struct to fill */
+) {
+ BOOL r;
+ LPSTR lpDeviceA;
+
+ lpDeviceA = HEAP_strdupWtoA( GetProcessHeap(), 0, lpszDevice );
+ if(lpDeviceA)
+ return FALSE;
+ r = CommConfigDialogA(lpDeviceA,hWnd,lpCommConfig);
+ HeapFree( GetProcessHeap(), 0, lpDeviceA );
+ return r;
+}
+
+/***********************************************************************
+ * GetCommConfig (KERNEL32.283)
+ *
+ * Fill in the COMMCONFIG structure for the comm port hFile
+ *
+ * RETURNS
+ *
+ * TRUE on success, FALSE on failure
+ * If successful, lpCommConfig contains the comm port configuration.
+ */
+BOOL WINAPI GetCommConfig(
+ HFILE hFile,
+ LPCOMMCONFIG lpCommConfig
+) {
+ BOOL r;
+
+ TRACE("(%x %p)\n",hFile,lpCommConfig);
+
+ if(lpCommConfig == NULL)
+ return FALSE;
+
+ lpCommConfig->dwSize = sizeof(COMMCONFIG);
+ lpCommConfig->wVersion = 1;
+ lpCommConfig->wReserved = 0;
+ r = GetCommState(hFile,&lpCommConfig->dcb);
+ lpCommConfig->dwProviderSubType = PST_RS232;
+ lpCommConfig->dwProviderOffset = 0;
+ lpCommConfig->dwProviderSize = 0;
+
+ return r;
+}
+
+/***********************************************************************
+ * SetCommConfig (KERNEL32.617)
+ *
+ */
+BOOL WINAPI SetCommConfig(
+ HFILE hFile,
+ LPCOMMCONFIG lpCommConfig
+) {
+ BOOL r;
+
+ TRACE("(%x %p)\n",hFile,lpCommConfig);
+
+ r = SetCommState(hFile,&lpCommConfig->dcb);
+ return r;
+}
+
+/***********************************************************************
+ * GetCommProperties (KERNEL32.286)
+ */
+BOOL WINAPI SetDefaultCommConfigA(
+ LPCSTR lpszDevice,
+ LPCOMMCONFIG lpCommConfig,
+ DWORD dwSize
+) {
+ FARPROC lpfnSetDefaultCommConfig;
+ HMODULE hConfigModule;
+ BOOL r;
+
+ TRACE("(%p %p %lx)\n",lpszDevice, lpCommConfig, dwSize);
+
+ hConfigModule = LoadLibraryA(lpszSerialUI);
+ if(!hConfigModule)
+ return FALSE;
+
+ lpfnSetDefaultCommConfig = GetProcAddress(hConfigModule, (LPCSTR)4L);
+
+ if(! lpfnSetDefaultCommConfig)
+ return TRUE;
+
+ r = lpfnSetDefaultCommConfig(lpszDevice, lpCommConfig, dwSize);
+
+ /* UnloadLibrary(hConfigModule); */
+
+ return r;
+}
+
+
+/***********************************************************************
+ * SetDefaultCommConfigW (KERNEL32.639)
+ *
+ */
+BOOL WINAPI SetDefaultCommConfigW(
+ LPCWSTR lpszDevice,
+ LPCOMMCONFIG lpCommConfig,
+ DWORD dwSize
+) {
+ BOOL r;
+ LPSTR lpDeviceA;
+
+ TRACE("(%s %p %lx)\n",debugstr_w(lpszDevice),lpCommConfig,dwSize);
+
+ lpDeviceA = HEAP_strdupWtoA( GetProcessHeap(), 0, lpszDevice );
+ if(lpDeviceA)
+ return FALSE;
+ r = SetDefaultCommConfigA(lpDeviceA,lpCommConfig,dwSize);
+ HeapFree( GetProcessHeap(), 0, lpDeviceA );
+ return r;
+}
+
+
+/***********************************************************************
* GetDefaultCommConfigA (KERNEL32.313)
*/
BOOL WINAPI GetDefaultCommConfigA(LPCSTR lpszName,LPCOMMCONFIG lpCC,