Eric Pouech : ntdll: Implemented IOCTL for char transmission: IMMEDIATE_CHAR.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Feb 6 05:10:28 CST 2006


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

Author: Eric Pouech <eric.pouech at wanadoo.fr>
Date:   Mon Feb  6 11:38:53 2006 +0100

ntdll: Implemented IOCTL for char transmission: IMMEDIATE_CHAR.

---

 dlls/kernel/comm.c  |   17 +++++++----------
 dlls/ntdll/serial.c |   15 +++++++++++++++
 2 files changed, 22 insertions(+), 10 deletions(-)

diff --git a/dlls/kernel/comm.c b/dlls/kernel/comm.c
index 75ee11c..326ef47 100644
--- a/dlls/kernel/comm.c
+++ b/dlls/kernel/comm.c
@@ -1652,23 +1652,20 @@ BOOL WINAPI GetCommState(
  *  Transmits a single character in front of any pending characters in the
  *  output buffer.  Usually used to send an interrupt character to a host.
  *
+ * PARAMS
+ *      hComm           [in]    The communication device in need of a command character
+ *      chTransmit      [in]    The character to transmit
+ *
  * RETURNS
  *
  *  True if the call succeeded, false if the previous command character to the
  *  same device has not been sent yet the handle is bad etc.
  *
- * BUGS
- *
- *  Stub.
  */
-BOOL WINAPI TransmitCommChar(
-    HANDLE hComm,      /* [in] The communication device in need of a command character. */
-    CHAR   chTransmit) /* [in] The character to transmit. */
+BOOL WINAPI TransmitCommChar(HANDLE hComm, CHAR chTransmit)
 {
-    DWORD w;
-    WARN("(%p,'%c') not perfect!\n",hComm,chTransmit);
-
-    return WriteFile( hComm, &chTransmit, 1, &w, NULL );
+    return DeviceIoControl(hComm, IOCTL_SERIAL_IMMEDIATE_CHAR,
+                           &chTransmit, sizeof(chTransmit), NULL, 0, NULL, NULL);
 }
 
 
diff --git a/dlls/ntdll/serial.c b/dlls/ntdll/serial.c
index 115d981..04f9534 100644
--- a/dlls/ntdll/serial.c
+++ b/dlls/ntdll/serial.c
@@ -211,6 +211,15 @@ static NTSTATUS set_wait_mask(HANDLE hDe
     return status;
 }
 
+static NTSTATUS xmit_immediate(HANDLE hDevice, int fd, char* ptr)
+{
+    /* FIXME: not perfect as it should bypass the in-queue */
+    WARN("(%p,'%c') not perfect!\n", hDevice, *ptr);
+    if (write(fd, ptr, 1) != 1)
+        return FILE_GetNtStatus();
+    return STATUS_SUCCESS;
+}
+
 /******************************************************************
  *		COMM_DeviceIoControl
  *
@@ -255,6 +264,12 @@ NTSTATUS COMM_DeviceIoControl(HANDLE hDe
         else
             status = STATUS_INVALID_PARAMETER;
         break;
+    case IOCTL_SERIAL_IMMEDIATE_CHAR:
+        if (lpInBuffer && nInBufferSize == sizeof(CHAR))
+            status = xmit_immediate(hDevice, fd, lpInBuffer);
+        else
+            status = STATUS_INVALID_PARAMETER;
+        break;
     case IOCTL_SERIAL_PURGE:
         if (lpInBuffer && nInBufferSize == sizeof(DWORD))
             status = purge(fd, *(DWORD*)lpInBuffer);




More information about the wine-cvs mailing list