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