Eric Pouech : ntdll/kernel32: GetCommState & IOCTL_GET_CHARS

Alexandre Julliard julliard at wine.codeweavers.com
Tue May 9 14:15:50 CDT 2006


Module: wine
Branch: refs/heads/master
Commit: 28cd4fae3b200a3880c9f430703cc90d8efa8c1e
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=28cd4fae3b200a3880c9f430703cc90d8efa8c1e

Author: Eric Pouech <eric.pouech at wanadoo.fr>
Date:   Sun May  7 14:10:55 2006 +0200

ntdll/kernel32: GetCommState & IOCTL_GET_CHARS

- implemented SERIAL_GET_CHARS ioctl
- made use of it in kernel32.GetCommState

---

 dlls/kernel/comm.c  |   14 +++++++++-----
 dlls/ntdll/serial.c |   28 ++++++++++++++++++++++++++++
 2 files changed, 37 insertions(+), 5 deletions(-)

diff --git a/dlls/kernel/comm.c b/dlls/kernel/comm.c
index de17f34..7d8e6da 100644
--- a/dlls/kernel/comm.c
+++ b/dlls/kernel/comm.c
@@ -1080,6 +1080,7 @@ BOOL WINAPI GetCommState(HANDLE handle, 
     SERIAL_BAUD_RATE    sbr;
     SERIAL_LINE_CONTROL slc;
     SERIAL_HANDFLOW     shf;
+    SERIAL_CHARS        sc;
 
     TRACE("handle %p, ptr %p\n", handle, lpdcb);
 
@@ -1094,7 +1095,9 @@ BOOL WINAPI GetCommState(HANDLE handle, 
         !DeviceIoControl(handle, IOCTL_SERIAL_GET_LINE_CONTROL,
                          NULL, 0, &slc, sizeof(slc), NULL, NULL) ||
         !DeviceIoControl(handle, IOCTL_SERIAL_GET_HANDFLOW,
-                         NULL, 0, &shf, sizeof(shf), NULL, NULL))
+                         NULL, 0, &shf, sizeof(shf), NULL, NULL) ||
+        !DeviceIoControl(handle, IOCTL_SERIAL_GET_CHARS,
+                         NULL, 0, &sc, sizeof(sc), NULL, NULL))
         return FALSE;
 
     memset(lpdcb, 0, sizeof(*lpdcb));
@@ -1137,10 +1140,11 @@ BOOL WINAPI GetCommState(HANDLE handle, 
     if (shf.FlowReplace & SERIAL_AUTO_TRANSMIT) lpdcb->fOutX = 1;
     if (shf.FlowReplace & SERIAL_AUTO_RECEIVE)  lpdcb->fInX = 1;
 
-/*
-	lpdcb->XonChar =
-	lpdcb->XoffChar =
- */
+    lpdcb->EofChar = sc.EofChar;
+    lpdcb->ErrorChar = sc.ErrorChar;
+    lpdcb->EvtChar = sc.EventChar;
+    lpdcb->XonChar = sc.XonChar;
+    lpdcb->XoffChar = sc.XoffChar;
 
     TRACE("OK\n");
     dump_dcb(lpdcb);
diff --git a/dlls/ntdll/serial.c b/dlls/ntdll/serial.c
index 65eafd2..9b56c6b 100644
--- a/dlls/ntdll/serial.c
+++ b/dlls/ntdll/serial.c
@@ -319,6 +319,25 @@ #endif
     return status;
 }
 
+static NTSTATUS get_special_chars(int fd, SERIAL_CHARS* sc)
+{
+    struct termios port;
+    
+    if (tcgetattr(fd, &port) == -1)
+    {
+        ERR("tcgetattr error '%s'\n", strerror(errno));
+        return FILE_GetNtStatus();
+    }
+    sc->EofChar   = port.c_cc[VEOF];
+    sc->ErrorChar = 0xFF;
+    sc->BreakChar = 0; /* FIXME */
+    sc->EventChar = 0; /* FIXME */
+    sc->XonChar   = port.c_cc[VSTART];
+    sc->XoffChar  = port.c_cc[VSTOP];
+
+    return STATUS_SUCCESS;
+}
+
 static NTSTATUS get_status(int fd, SERIAL_STATUS* ss)
 {
     NTSTATUS    status = STATUS_SUCCESS;
@@ -779,6 +798,15 @@ NTSTATUS COMM_DeviceIoControl(HANDLE hDe
         else
             status = STATUS_INVALID_PARAMETER;
         break;
+    case IOCTL_SERIAL_GET_CHARS:
+        if (lpOutBuffer && nOutBufferSize == sizeof(SERIAL_CHARS))
+        {
+            if (!(status = get_special_chars(fd, (SERIAL_CHARS*)lpOutBuffer)))
+                sz = sizeof(SERIAL_CHARS);
+        }
+        else
+            status = STATUS_INVALID_PARAMETER;
+        break;
      case IOCTL_SERIAL_GET_COMMSTATUS:
         if (lpOutBuffer && nOutBufferSize == sizeof(SERIAL_STATUS))
         {




More information about the wine-cvs mailing list