Module: wine Branch: refs/heads/master Commit: 3c2abaf45ee3a14b58be9adb8b3c8d9f371ca2ec URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=3c2abaf45ee3a14b58be9adb...
Author: Eric Pouech eric.pouech@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);