ntdll: Implemented IOCTL for char transmission: IMMEDIATE_CHAR.

This commit is contained in:
Eric Pouech 2006-02-06 11:38:53 +01:00 committed by Alexandre Julliard
parent 5973955e4e
commit 3c2abaf45e
2 changed files with 22 additions and 10 deletions

View file

@ -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);
}

View file

@ -211,6 +211,15 @@ static NTSTATUS set_wait_mask(HANDLE hDevice, DWORD mask)
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 hDevice,
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);