1 /* $Id: comm.c,v 1.5 2002/10/03 18:26:53 robd Exp $
3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS system libraries
5 * FILE: lib/kernel32/misc/comm.c
6 * PURPOSE: Comm functions
7 * PROGRAMMER: Ariadne ( ariadne@xs4all.nl)
8 * modified from WINE [ Onno Hovers, (onno@stack.urc.tue.nl) ]
9 * Robert Dickenson (robd@mok.lvcom.com)
12 * RDD (30/09/2002) implemented many function bodies to call serial driver.
15 #include <ddk/ntddk.h>
16 #include <ddk/ntddser.h>
17 #include <kernel32/proc.h>
18 #include <kernel32/thread.h>
24 #include <kernel32/kernel32.h>
25 #include <kernel32/error.h>
30 BuildCommDCBA(LPCSTR lpDef
, LPDCB lpDCB
)
33 DPRINT("ERROR: BuildCommDCBA() - NULL DCB pointer\n");
36 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
42 BuildCommDCBW(LPCWSTR lpDef
, LPDCB lpDCB
)
45 DPRINT("ERROR: BuildCommDCBW() - NULL DCB pointer\n");
48 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
54 BuildCommDCBAndTimeoutsA(LPCSTR lpDef
, LPDCB lpDCB
, LPCOMMTIMEOUTS lpCommTimeouts
)
57 DPRINT("ERROR: BuildCommDCBAndTimeoutsA() - NULL DCB pointer\n");
60 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
66 BuildCommDCBAndTimeoutsW(LPCWSTR lpDef
, LPDCB lpDCB
, LPCOMMTIMEOUTS lpCommTimeouts
)
69 DPRINT("ERROR: BuildCommDCBAndTimeoutsW() - NULL DCB pointer\n");
72 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
78 ClearCommBreak(HANDLE hFile
)
80 WINBOOL result
= FALSE
;
81 DWORD dwBytesReturned
;
83 if (hFile
== INVALID_HANDLE_VALUE
) {
86 result
= DeviceIoControl(hFile
, IOCTL_SERIAL_SET_BREAK_OFF
, NULL
, 0, NULL
, 0, &dwBytesReturned
, NULL
);
92 ClearCommError(HANDLE hFile
, LPDWORD lpErrors
, LPCOMSTAT lpStat
)
94 WINBOOL result
= FALSE
;
95 DWORD dwBytesReturned
;
97 if (hFile
== INVALID_HANDLE_VALUE
) {
98 //SetLastError(CE_MODE);
101 if (lpErrors
== NULL
) {
102 DPRINT("ERROR: GetCommState() - NULL Errors pointer\n");
105 // *lpErrors = CE_BREAK;
106 // *lpErrors = CE_FRAME;
107 // *lpErrors = CE_IOE;
108 // *lpErrors = CE_MODE;
109 // *lpErrors = CE_OVERRUN;
110 // *lpErrors = CE_RXOVER;
111 // *lpErrors = CE_RXPARITY;
112 // *lpErrors = CE_TXFULL;
114 CE_BREAK The hardware detected a break condition.
115 CE_FRAME The hardware detected a framing error.
116 CE_IOE An I/O error occurred during communications with the device.
117 CE_MODE The requested mode is not supported, or the hFile parameter is invalid. If this value is specified, it is the only valid error.
118 CE_OVERRUN A character-buffer overrun has occurred. The next character is lost.
119 CE_RXOVER An input buffer overflow has occurred. There is either no room in the input buffer, or a character was received after the end-of-file (EOF) character.
120 CE_RXPARITY The hardware detected a parity error.
121 CE_TXFULL The application tried to transmit a character, but the output buffer was full.
123 result
= DeviceIoControl(hFile
, IOCTL_SERIAL_RESET_DEVICE
, NULL
, 0, NULL
, 0, &dwBytesReturned
, NULL
);
125 if (lpStat
!= NULL
) {
126 lpStat
->fCtsHold
= 0;
127 lpStat
->fDsrHold
= 0;
128 lpStat
->fRlsdHold
= 0;
129 lpStat
->fXoffHold
= 0;
130 lpStat
->fXoffSent
= 0;
134 lpStat
->cbOutQue
= 0;
141 CommConfigDialogA(LPCSTR lpszName
, HWND hWnd
, LPCOMMCONFIG lpCC
)
143 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
149 CommConfigDialogW(LPCWSTR lpszName
, HWND hWnd
, LPCOMMCONFIG lpCC
)
151 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
157 EscapeCommFunction(HANDLE hFile
, DWORD dwFunc
)
159 WINBOOL result
= FALSE
;
160 DWORD dwBytesReturned
;
162 if (hFile
== INVALID_HANDLE_VALUE
) {
166 case CLRDTR
: // Clears the DTR (data-terminal-ready) signal.
167 result
= DeviceIoControl(hFile
, IOCTL_SERIAL_CLR_DTR
, NULL
, 0, NULL
, 0, &dwBytesReturned
, NULL
);
169 case CLRRTS
: // Clears the RTS (request-to-send) signal.
170 result
= DeviceIoControl(hFile
, IOCTL_SERIAL_CLR_RTS
, NULL
, 0, NULL
, 0, &dwBytesReturned
, NULL
);
172 case SETDTR
: // Sends the DTR (data-terminal-ready) signal.
173 result
= DeviceIoControl(hFile
, IOCTL_SERIAL_SET_DTR
, NULL
, 0, NULL
, 0, &dwBytesReturned
, NULL
);
175 case SETRTS
: // Sends the RTS (request-to-send) signal.
176 result
= DeviceIoControl(hFile
, IOCTL_SERIAL_SET_RTS
, NULL
, 0, NULL
, 0, &dwBytesReturned
, NULL
);
178 case SETXOFF
: // Causes transmission to act as if an XOFF character has been received.
179 result
= DeviceIoControl(hFile
, IOCTL_SERIAL_SET_XOFF
, NULL
, 0, NULL
, 0, &dwBytesReturned
, NULL
);
181 case SETXON
: // Causes transmission to act as if an XON character has been received.
182 result
= DeviceIoControl(hFile
, IOCTL_SERIAL_SET_XON
, NULL
, 0, NULL
, 0, &dwBytesReturned
, NULL
);
184 case SETBREAK
: // Suspends character transmission and places the transmission line in a break state until the ClearCommBreak function is called (or EscapeCommFunction is called with the CLRBREAK extended function code). The SETBREAK extended function code is identical to the SetCommBreak function. Note that this extended function does not flush data that has not been transmitted.
185 result
= DeviceIoControl(hFile
, IOCTL_SERIAL_SET_BREAK_ON
, NULL
, 0, NULL
, 0, &dwBytesReturned
, NULL
);
187 case CLRBREAK
: // Restores character transmission and places the transmission line in a nonbreak state. The CLRBREAK extended function code is identical to the ClearCommBreak function.
188 result
= DeviceIoControl(hFile
, IOCTL_SERIAL_SET_BREAK_OFF
, NULL
, 0, NULL
, 0, &dwBytesReturned
, NULL
);
191 DPRINT("EscapeCommFunction() WARNING: unknown function code\n");
192 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
200 GetCommConfig(HANDLE hCommDev
, LPCOMMCONFIG lpCC
, LPDWORD lpdwSize
)
202 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
208 GetCommMask(HANDLE hFile
, LPDWORD lpEvtMask
)
210 WINBOOL result
= FALSE
;
211 DWORD dwBytesReturned
;
213 if (hFile
== INVALID_HANDLE_VALUE
) {
216 result
= DeviceIoControl(hFile
, IOCTL_SERIAL_GET_WAIT_MASK
,
217 NULL
, 0, lpEvtMask
, sizeof(DWORD
), &dwBytesReturned
, NULL
);
223 GetCommModemStatus(HANDLE hFile
, LPDWORD lpModemStat
)
225 WINBOOL result
= FALSE
;
226 DWORD dwBytesReturned
;
228 if (hFile
== INVALID_HANDLE_VALUE
) {
231 result
= DeviceIoControl(hFile
, IOCTL_SERIAL_GET_MODEMSTATUS
,
232 NULL
, 0, lpModemStat
, sizeof(DWORD
), &dwBytesReturned
, NULL
);
238 GetCommProperties(HANDLE hFile
, LPCOMMPROP lpCommProp
)
240 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
246 GetCommState(HANDLE hFile
, LPDCB lpDCB
)
248 WINBOOL result
= FALSE
;
249 DWORD dwBytesReturned
;
251 SERIAL_BAUD_RATE BaudRate
;
252 SERIAL_HANDFLOW HandFlow
;
253 SERIAL_CHARS SpecialChars
;
254 SERIAL_LINE_CONTROL LineControl
;
256 DPRINT("GetCommState(%d, %p)\n", hFile
, lpDCB
);
258 if (hFile
== INVALID_HANDLE_VALUE
) {
259 DPRINT("ERROR: GetCommState() - INVALID_HANDLE_VALUE\n");
263 DPRINT("ERROR: GetCommState() - NULL DCB pointer\n");
266 if (lpDCB
->DCBlength
!= sizeof(DCB
)) {
267 DPRINT("ERROR: GetCommState() - Invalid DCB size\n");
271 // DPRINT(" GetCommState() CALLING DeviceIoControl\n");
272 // result = DeviceIoControl(hFile, IOCTL_SERIAL_GET_COMMSTATUS, NULL, 0, NULL, 0, &dwBytesReturned, NULL);
273 // DPRINT(" GetCommState() DeviceIoControl returned %d\n", result);
275 result
= DeviceIoControl(hFile
, IOCTL_SERIAL_GET_BAUD_RATE
,
276 NULL
, 0, &BaudRate
, sizeof(BaudRate
),&dwBytesReturned
, NULL
);
277 if (!NT_SUCCESS(result
)) {
278 DPRINT("ERROR: GetCommState() - DeviceIoControl(IOCTL_SERIAL_GET_BAUD_RATE) Failed.\n");
281 lpDCB
->BaudRate
= BaudRate
.BaudRate
;
283 result
= DeviceIoControl(hFile
, IOCTL_SERIAL_GET_HANDFLOW
,
284 NULL
, 0, &HandFlow
, sizeof(HandFlow
), &dwBytesReturned
, NULL
);
285 if (!NT_SUCCESS(result
)) {
286 DPRINT("ERROR: GetCommState() - DeviceIoControl(IOCTL_SERIAL_GET_HANDFLOW) Failed.\n");
289 if (HandFlow
.ControlHandShake
& SERIAL_CTS_HANDSHAKE
) {
290 lpDCB
->fOutxCtsFlow
= 1;
292 if (HandFlow
.ControlHandShake
& SERIAL_DSR_HANDSHAKE
) {
293 lpDCB
->fOutxDsrFlow
= 1;
295 if (HandFlow
.ControlHandShake
& SERIAL_DTR_CONTROL
) {
296 lpDCB
->fDtrControl
= 1;
298 if (HandFlow
.ControlHandShake
& SERIAL_DTR_HANDSHAKE
) {
299 lpDCB
->fDtrControl
= 2;
301 if (HandFlow
.ControlHandShake
& SERIAL_RTS_CONTROL
) {
302 lpDCB
->fRtsControl
= 1;
304 if (HandFlow
.ControlHandShake
& SERIAL_RTS_HANDSHAKE
) {
305 lpDCB
->fRtsControl
= 2;
307 if (HandFlow
.ControlHandShake
& SERIAL_DSR_SENSITIVITY
) {
308 lpDCB
->fDsrSensitivity
= 1;
310 if (HandFlow
.ControlHandShake
& SERIAL_ERROR_ABORT
) {
311 lpDCB
->fAbortOnError
= 1;
314 if (HandFlow
.FlowReplace
& SERIAL_ERROR_CHAR
) {
315 lpDCB
->fErrorChar
= 1;
317 if (HandFlow
.FlowReplace
& SERIAL_NULL_STRIPPING
) {
320 if (HandFlow
.FlowReplace
& SERIAL_XOFF_CONTINUE
) {
321 lpDCB
->fTXContinueOnXoff
= 1;
323 lpDCB
->XonLim
= HandFlow
.XonLimit
;
324 lpDCB
->XoffLim
= HandFlow
.XoffLimit
;
326 result
= DeviceIoControl(hFile
, IOCTL_SERIAL_GET_CHARS
,
327 NULL
, 0, &SpecialChars
, sizeof(SpecialChars
), &dwBytesReturned
, NULL
);
328 if (!NT_SUCCESS(result
)) {
329 DPRINT("ERROR: GetCommState() - DeviceIoControl(IOCTL_SERIAL_GET_CHARS) Failed.\n");
333 lpDCB
->EofChar
= SpecialChars
.EofChar
;
334 lpDCB
->ErrorChar
= SpecialChars
.ErrorChar
;
335 // = SpecialChars.BreakChar;
336 lpDCB
->EvtChar
= SpecialChars
.EventChar
;
337 lpDCB
->XonChar
= SpecialChars
.XonChar
;
338 lpDCB
->XoffChar
= SpecialChars
.XoffChar
;
340 result
= DeviceIoControl(hFile
, IOCTL_SERIAL_GET_LINE_CONTROL
,
341 NULL
, 0, &LineControl
, sizeof(LineControl
), &dwBytesReturned
, NULL
);
342 if (!NT_SUCCESS(result
)) {
343 DPRINT("ERROR: GetCommState() - DeviceIoControl(IOCTL_SERIAL_GET_LINE_CONTROL) Failed.\n");
346 lpDCB
->StopBits
= LineControl
.StopBits
;
347 lpDCB
->Parity
= LineControl
.Parity
;
348 lpDCB
->ByteSize
= LineControl
.WordLength
;
349 DPRINT("GetCommState() - COMPLETED SUCCESSFULLY\n");
355 GetCommTimeouts(HANDLE hFile
, LPCOMMTIMEOUTS lpCommTimeouts
)
357 WINBOOL result
= FALSE
;
358 DWORD dwBytesReturned
;
360 if (hFile
== INVALID_HANDLE_VALUE
) {
363 if (lpCommTimeouts
== NULL
) {
366 result
= DeviceIoControl(hFile
, IOCTL_SERIAL_GET_TIMEOUTS
,
368 lpCommTimeouts
, sizeof(COMMTIMEOUTS
),
369 &dwBytesReturned
, NULL
);
375 GetDefaultCommConfigW(LPCWSTR lpszName
, LPCOMMCONFIG lpCC
, LPDWORD lpdwSize
)
377 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
383 GetDefaultCommConfigA(LPCSTR lpszName
, LPCOMMCONFIG lpCC
, LPDWORD lpdwSize
)
385 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
391 PurgeComm(HANDLE hFile
, DWORD dwFlags
)
393 WINBOOL result
= FALSE
;
394 DWORD dwBytesReturned
;
396 if (hFile
== INVALID_HANDLE_VALUE
) {
399 result
= DeviceIoControl(hFile
, IOCTL_SERIAL_PURGE
,
400 &dwFlags
, sizeof(DWORD
), NULL
, 0, &dwBytesReturned
, NULL
);
406 SetCommBreak(HANDLE hFile
)
408 WINBOOL result
= FALSE
;
409 DWORD dwBytesReturned
;
411 if (hFile
== INVALID_HANDLE_VALUE
) {
414 result
= DeviceIoControl(hFile
, IOCTL_SERIAL_SET_BREAK_ON
, NULL
, 0, NULL
, 0, &dwBytesReturned
, NULL
);
420 SetCommConfig(HANDLE hCommDev
, LPCOMMCONFIG lpCC
, DWORD dwSize
)
422 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
428 SetCommMask(HANDLE hFile
, DWORD dwEvtMask
)
430 WINBOOL result
= FALSE
;
431 DWORD dwBytesReturned
;
433 if (hFile
== INVALID_HANDLE_VALUE
) {
436 result
= DeviceIoControl(hFile
, IOCTL_SERIAL_SET_WAIT_MASK
,
437 &dwEvtMask
, sizeof(DWORD
), NULL
, 0, &dwBytesReturned
, NULL
);
443 SetCommState(HANDLE hFile
, LPDCB lpDCB
)
445 WINBOOL result
= FALSE
;
446 DWORD dwBytesReturned
;
448 SERIAL_BAUD_RATE BaudRate
;
449 SERIAL_HANDFLOW HandFlow
;
450 SERIAL_CHARS SpecialChars
;
451 SERIAL_LINE_CONTROL LineControl
;
453 DPRINT("SetCommState(%d, %p) - ENTERED\n", hFile
, lpDCB
);
455 if (hFile
== INVALID_HANDLE_VALUE
) {
456 DPRINT("SetCommState() - ERROR: INVALID_HANDLE_VALUE\n");
460 DPRINT("SetCommState() - ERROR: NULL DCB pointer passed\n");
464 BaudRate
.BaudRate
= lpDCB
->BaudRate
;
465 result
= DeviceIoControl(hFile
, IOCTL_SERIAL_SET_BAUD_RATE
,
466 &BaudRate
, sizeof(BaudRate
), NULL
, 0, &dwBytesReturned
, NULL
);
467 if (!NT_SUCCESS(result
)) {
468 DPRINT("ERROR: SetCommState() - DeviceIoControl(IOCTL_SERIAL_SET_BAUD_RATE) Failed.\n");
472 #define SERIAL_DTR_MASK ((ULONG)0x03)
473 #define SERIAL_DTR_CONTROL ((ULONG)0x01)
474 #define SERIAL_DTR_HANDSHAKE ((ULONG)0x02)
475 #define SERIAL_CTS_HANDSHAKE ((ULONG)0x08)
476 #define SERIAL_DSR_HANDSHAKE ((ULONG)0x10)
477 #define SERIAL_DCD_HANDSHAKE ((ULONG)0x20)
478 #define SERIAL_OUT_HANDSHAKEMASK ((ULONG)0x38)
479 #define SERIAL_DSR_SENSITIVITY ((ULONG)0x40)
480 #define SERIAL_ERROR_ABORT ((ULONG)0x80000000)
481 #define SERIAL_CONTROL_INVALID ((ULONG)0x7fffff84)
483 HandFlow
.ControlHandShake
= 0;
485 if (lpDCB
->fOutxCtsFlow
) {
486 HandFlow
.ControlHandShake
|= SERIAL_CTS_HANDSHAKE
;
488 if (lpDCB
->fOutxDsrFlow
) {
489 HandFlow
.ControlHandShake
|= SERIAL_DSR_HANDSHAKE
;
491 if (lpDCB
->fDtrControl
) {
492 HandFlow
.ControlHandShake
|= SERIAL_DTR_CONTROL
;
494 if (lpDCB
->fDtrControl
) {
495 HandFlow
.ControlHandShake
|= SERIAL_DTR_HANDSHAKE
;
497 if (lpDCB
->fRtsControl
) {
498 HandFlow
.ControlHandShake
|= SERIAL_RTS_CONTROL
;
500 if (lpDCB
->fRtsControl
) {
501 HandFlow
.ControlHandShake
|= SERIAL_RTS_HANDSHAKE
;
503 if (lpDCB
->fDsrSensitivity
) {
504 HandFlow
.ControlHandShake
|= SERIAL_DSR_SENSITIVITY
;
506 if (lpDCB
->fAbortOnError
) {
507 HandFlow
.ControlHandShake
|= SERIAL_ERROR_ABORT
;
510 #define SERIAL_AUTO_TRANSMIT ((ULONG)0x01)
511 #define SERIAL_AUTO_RECEIVE ((ULONG)0x02)
512 #define SERIAL_ERROR_CHAR ((ULONG)0x04)
513 #define SERIAL_NULL_STRIPPING ((ULONG)0x08)
514 #define SERIAL_BREAK_CHAR ((ULONG)0x10)
515 #define SERIAL_RTS_MASK ((ULONG)0xc0)
516 #define SERIAL_RTS_CONTROL ((ULONG)0x40)
517 #define SERIAL_RTS_HANDSHAKE ((ULONG)0x80)
518 #define SERIAL_TRANSMIT_TOGGLE ((ULONG)0xc0)
519 #define SERIAL_XOFF_CONTINUE ((ULONG)0x80000000)
520 #define SERIAL_FLOW_INVALID ((ULONG)0x7fffff20)
522 HandFlow
.FlowReplace
= 0;
523 if (lpDCB
->fErrorChar
) {
524 HandFlow
.FlowReplace
|= SERIAL_ERROR_CHAR
;
527 HandFlow
.FlowReplace
|= SERIAL_NULL_STRIPPING
;
529 if (lpDCB
->fTXContinueOnXoff
) {
530 HandFlow
.FlowReplace
|= SERIAL_XOFF_CONTINUE
;
532 HandFlow
.XonLimit
= lpDCB
->XonLim
;
533 HandFlow
.XoffLimit
= lpDCB
->XoffLim
;
534 result
= DeviceIoControl(hFile
, IOCTL_SERIAL_SET_HANDFLOW
,
535 &HandFlow
, sizeof(HandFlow
), NULL
, 0, &dwBytesReturned
, NULL
);
536 if (!NT_SUCCESS(result
)) {
537 DPRINT("ERROR: SetCommState() - DeviceIoControl(IOCTL_SERIAL_SET_HANDFLOW) Failed.\n");
541 SpecialChars
.EofChar
= lpDCB
->EofChar
;
542 SpecialChars
.ErrorChar
= lpDCB
->ErrorChar
;
543 SpecialChars
.BreakChar
= 0;
544 SpecialChars
.EventChar
= lpDCB
->EvtChar
;
545 SpecialChars
.XonChar
= lpDCB
->XonChar
;
546 SpecialChars
.XoffChar
= lpDCB
->XoffChar
;
547 result
= DeviceIoControl(hFile
, IOCTL_SERIAL_SET_CHARS
,
548 &SpecialChars
, sizeof(SpecialChars
), NULL
, 0, &dwBytesReturned
, NULL
);
549 if (!NT_SUCCESS(result
)) {
550 DPRINT("ERROR: SetCommState() - DeviceIoControl(IOCTL_SERIAL_SET_CHARS) Failed.\n");
554 LineControl
.StopBits
= lpDCB
->StopBits
;
555 LineControl
.Parity
= lpDCB
->Parity
;
556 LineControl
.WordLength
= lpDCB
->ByteSize
;
557 result
= DeviceIoControl(hFile
, IOCTL_SERIAL_SET_LINE_CONTROL
,
558 &LineControl
, sizeof(LineControl
), NULL
, 0, &dwBytesReturned
, NULL
);
559 if (!NT_SUCCESS(result
)) {
560 DPRINT("ERROR: SetCommState() - DeviceIoControl(IOCTL_SERIAL_SET_LINE_CONTROL) Failed.\n");
564 DPRINT("SetCommState() - COMPLETED SUCCESSFULLY\n");
570 SetCommTimeouts(HANDLE hFile
, LPCOMMTIMEOUTS lpCommTimeouts
)
572 WINBOOL result
= FALSE
;
573 DWORD dwBytesReturned
;
574 SERIAL_TIMEOUTS Timeouts
;
576 if (hFile
== INVALID_HANDLE_VALUE
) {
579 if (lpCommTimeouts
== NULL
) {
582 Timeouts
.ReadIntervalTimeout
= lpCommTimeouts
->ReadIntervalTimeout
;
583 Timeouts
.ReadTotalTimeoutMultiplier
= lpCommTimeouts
->ReadTotalTimeoutMultiplier
;
584 Timeouts
.ReadTotalTimeoutConstant
= lpCommTimeouts
->ReadTotalTimeoutConstant
;
585 Timeouts
.WriteTotalTimeoutMultiplier
= lpCommTimeouts
->WriteTotalTimeoutMultiplier
;
586 Timeouts
.WriteTotalTimeoutConstant
= lpCommTimeouts
->WriteTotalTimeoutConstant
;
587 result
= DeviceIoControl(hFile
, IOCTL_SERIAL_SET_TIMEOUTS
,
588 &Timeouts
, sizeof(Timeouts
), NULL
, 0, &dwBytesReturned
, NULL
);
594 SetDefaultCommConfigA(LPCSTR lpszName
, LPCOMMCONFIG lpCC
, DWORD dwSize
)
596 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
602 SetDefaultCommConfigW(LPCWSTR lpszName
, LPCOMMCONFIG lpCC
, DWORD dwSize
)
604 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
610 SetupComm(HANDLE hFile
, DWORD dwInQueue
, DWORD dwOutQueue
)
612 WINBOOL result
= FALSE
;
613 DWORD dwBytesReturned
;
614 SERIAL_QUEUE_SIZE QueueSize
;
616 if (hFile
== INVALID_HANDLE_VALUE
) {
619 QueueSize
.InSize
= dwInQueue
;
620 QueueSize
.OutSize
= dwOutQueue
;
621 result
= DeviceIoControl(hFile
, IOCTL_SERIAL_SET_QUEUE_SIZE
,
622 &QueueSize
, sizeof(QueueSize
), NULL
, 0, &dwBytesReturned
, NULL
);
628 TransmitCommChar(HANDLE hFile
, char cChar
)
630 WINBOOL result
= FALSE
;
631 DWORD dwBytesReturned
;
633 if (hFile
== INVALID_HANDLE_VALUE
) {
636 result
= DeviceIoControl(hFile
, IOCTL_SERIAL_IMMEDIATE_CHAR
,
637 &cChar
, sizeof(cChar
), NULL
, 0, &dwBytesReturned
, NULL
);
643 WaitCommEvent(HANDLE hFile
, LPDWORD lpEvtMask
, LPOVERLAPPED lpOverlapped
)
645 WINBOOL result
= FALSE
;
646 DWORD dwBytesReturned
;
648 if (hFile
== INVALID_HANDLE_VALUE
) {
651 if (lpEvtMask
== NULL
) {
654 result
= DeviceIoControl(hFile
, IOCTL_SERIAL_WAIT_ON_MASK
,
655 NULL
, 0, lpEvtMask
, sizeof(DWORD
), &dwBytesReturned
, lpOverlapped
);