1 /** 2 * WinPR: Windows Portable Runtime 3 * Serial Communication API 4 * 5 * Copyright 2011 O.S. Systems Software Ltda. 6 * Copyright 2011 Eduardo Fiss Beloni <beloni@ossystems.com.br> 7 * Copyright 2014 Marc-Andre Moreau <marcandre.moreau@gmail.com> 8 * Copyright 2014 Hewlett-Packard Development Company, L.P. 9 * 10 * Licensed under the Apache License, Version 2.0 (the "License"); 11 * you may not use this file except in compliance with the License. 12 * You may obtain a copy of the License at 13 * 14 * http://www.apache.org/licenses/LICENSE-2.0 15 * 16 * Unless required by applicable law or agreed to in writing, software 17 * distributed under the License is distributed on an "AS IS" BASIS, 18 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 19 * See the License for the specific language governing permissions and 20 * limitations under the License. 21 */ 22 23 #ifndef WINPR_COMM_H 24 #define WINPR_COMM_H 25 26 #include <winpr/collections.h> 27 #include <winpr/file.h> 28 #include <winpr/winpr.h> 29 #include <winpr/wtypes.h> 30 31 #if defined __linux__ && !defined ANDROID 32 33 #define NOPARITY 0 34 #define ODDPARITY 1 35 #define EVENPARITY 2 36 #define MARKPARITY 3 37 #define SPACEPARITY 4 38 39 #define ONESTOPBIT 0 40 #define ONE5STOPBITS 1 41 #define TWOSTOPBITS 2 42 43 #ifndef IGNORE 44 #define IGNORE 0 45 #endif 46 47 #define CBR_110 110 48 #define CBR_300 300 49 #define CBR_600 600 50 #define CBR_1200 1200 51 #define CBR_2400 2400 52 #define CBR_4800 4800 53 #define CBR_9600 9600 54 #define CBR_14400 14400 55 #define CBR_19200 19200 56 #define CBR_38400 38400 57 #define CBR_56000 56000 58 #define CBR_57600 57600 59 #define CBR_115200 115200 60 #define CBR_128000 128000 61 #define CBR_256000 256000 62 63 #define CE_RXOVER 0x0001 64 #define CE_OVERRUN 0x0002 65 #define CE_RXPARITY 0x0004 66 #define CE_FRAME 0x0008 67 #define CE_BREAK 0x0010 68 #define CE_TXFULL 0x0100 69 #define CE_PTO 0x0200 70 #define CE_IOE 0x0400 71 #define CE_DNS 0x0800 72 #define CE_OOP 0x1000 73 #define CE_MODE 0x8000 74 75 #define IE_BADID (-1) 76 #define IE_OPEN (-2) 77 #define IE_NOPEN (-3) 78 #define IE_MEMORY (-4) 79 #define IE_DEFAULT (-5) 80 #define IE_HARDWARE (-10) 81 #define IE_BYTESIZE (-11) 82 #define IE_BAUDRATE (-12) 83 84 #define EV_RXCHAR 0x0001 85 #define EV_RXFLAG 0x0002 86 #define EV_TXEMPTY 0x0004 87 #define EV_CTS 0x0008 88 #define EV_DSR 0x0010 89 #define EV_RLSD 0x0020 90 #define EV_BREAK 0x0040 91 #define EV_ERR 0x0080 92 #define EV_RING 0x0100 93 #define EV_PERR 0x0200 94 #define EV_RX80FULL 0x0400 95 #define EV_EVENT1 0x0800 96 #define EV_EVENT2 0x1000 97 98 #define SETXOFF 1 99 #define SETXON 2 100 #define SETRTS 3 101 #define CLRRTS 4 102 #define SETDTR 5 103 #define CLRDTR 6 104 #define RESETDEV 7 105 #define SETBREAK 8 106 #define CLRBREAK 9 107 108 #define PURGE_TXABORT 0x0001 109 #define PURGE_RXABORT 0x0002 110 #define PURGE_TXCLEAR 0x0004 111 #define PURGE_RXCLEAR 0x0008 112 113 #define LPTx 0x80 114 115 #define MS_CTS_ON ((DWORD)0x0010) 116 #define MS_DSR_ON ((DWORD)0x0020) 117 #define MS_RING_ON ((DWORD)0x0040) 118 #define MS_RLSD_ON ((DWORD)0x0080) 119 120 #define SP_SERIALCOMM ((DWORD)0x00000001) 121 122 #define PST_UNSPECIFIED ((DWORD)0x00000000) 123 #define PST_RS232 ((DWORD)0x00000001) 124 #define PST_PARALLELPORT ((DWORD)0x00000002) 125 #define PST_RS422 ((DWORD)0x00000003) 126 #define PST_RS423 ((DWORD)0x00000004) 127 #define PST_RS449 ((DWORD)0x00000005) 128 #define PST_MODEM ((DWORD)0x00000006) 129 #define PST_FAX ((DWORD)0x00000021) 130 #define PST_SCANNER ((DWORD)0x00000022) 131 #define PST_NETWORK_BRIDGE ((DWORD)0x00000100) 132 #define PST_LAT ((DWORD)0x00000101) 133 #define PST_TCPIP_TELNET ((DWORD)0x00000102) 134 #define PST_X25 ((DWORD)0x00000103) 135 136 #define PCF_DTRDSR ((DWORD)0x0001) 137 #define PCF_RTSCTS ((DWORD)0x0002) 138 #define PCF_RLSD ((DWORD)0x0004) 139 #define PCF_PARITY_CHECK ((DWORD)0x0008) 140 #define PCF_XONXOFF ((DWORD)0x0010) 141 #define PCF_SETXCHAR ((DWORD)0x0020) 142 #define PCF_TOTALTIMEOUTS ((DWORD)0x0040) 143 #define PCF_INTTIMEOUTS ((DWORD)0x0080) 144 #define PCF_SPECIALCHARS ((DWORD)0x0100) 145 #define PCF_16BITMODE ((DWORD)0x0200) 146 147 #define SP_PARITY ((DWORD)0x0001) 148 #define SP_BAUD ((DWORD)0x0002) 149 #define SP_DATABITS ((DWORD)0x0004) 150 #define SP_STOPBITS ((DWORD)0x0008) 151 #define SP_HANDSHAKING ((DWORD)0x0010) 152 #define SP_PARITY_CHECK ((DWORD)0x0020) 153 #define SP_RLSD ((DWORD)0x0040) 154 155 #define BAUD_075 ((DWORD)0x00000001) 156 #define BAUD_110 ((DWORD)0x00000002) 157 #define BAUD_134_5 ((DWORD)0x00000004) 158 #define BAUD_150 ((DWORD)0x00000008) 159 #define BAUD_300 ((DWORD)0x00000010) 160 #define BAUD_600 ((DWORD)0x00000020) 161 #define BAUD_1200 ((DWORD)0x00000040) 162 #define BAUD_1800 ((DWORD)0x00000080) 163 #define BAUD_2400 ((DWORD)0x00000100) 164 #define BAUD_4800 ((DWORD)0x00000200) 165 #define BAUD_7200 ((DWORD)0x00000400) 166 #define BAUD_9600 ((DWORD)0x00000800) 167 #define BAUD_14400 ((DWORD)0x00001000) 168 #define BAUD_19200 ((DWORD)0x00002000) 169 #define BAUD_38400 ((DWORD)0x00004000) 170 #define BAUD_56K ((DWORD)0x00008000) 171 #define BAUD_128K ((DWORD)0x00010000) 172 #define BAUD_115200 ((DWORD)0x00020000) 173 #define BAUD_57600 ((DWORD)0x00040000) 174 #define BAUD_USER ((DWORD)0x10000000) 175 176 #define DATABITS_5 ((WORD)0x0001) 177 #define DATABITS_6 ((WORD)0x0002) 178 #define DATABITS_7 ((WORD)0x0004) 179 #define DATABITS_8 ((WORD)0x0008) 180 #define DATABITS_16 ((WORD)0x0010) 181 #define DATABITS_16X ((WORD)0x0020) 182 183 #define STOPBITS_10 ((WORD)0x0001) 184 #define STOPBITS_15 ((WORD)0x0002) 185 #define STOPBITS_20 ((WORD)0x0004) 186 187 #define PARITY_NONE ((WORD)0x0100) 188 #define PARITY_ODD ((WORD)0x0200) 189 #define PARITY_EVEN ((WORD)0x0400) 190 #define PARITY_MARK ((WORD)0x0800) 191 #define PARITY_SPACE ((WORD)0x1000) 192 193 #define COMMPROP_INITIALIZED ((DWORD)0xE73CF52E) 194 195 #define DTR_CONTROL_DISABLE 0x00 196 #define DTR_CONTROL_ENABLE 0x01 197 #define DTR_CONTROL_HANDSHAKE 0x02 198 199 #define RTS_CONTROL_DISABLE 0x00 200 #define RTS_CONTROL_ENABLE 0x01 201 #define RTS_CONTROL_HANDSHAKE 0x02 202 #define RTS_CONTROL_TOGGLE 0x03 203 204 // http://msdn.microsoft.com/en-us/library/windows/desktop/aa363214%28v=vs.85%29.aspx 205 typedef struct _DCB 206 { 207 DWORD DCBlength; 208 DWORD BaudRate; 209 DWORD fBinary : 1; 210 DWORD fParity : 1; 211 DWORD fOutxCtsFlow : 1; 212 DWORD fOutxDsrFlow : 1; 213 DWORD fDtrControl : 2; 214 DWORD fDsrSensitivity : 1; 215 DWORD fTXContinueOnXoff : 1; 216 DWORD fOutX : 1; 217 DWORD fInX : 1; 218 DWORD fErrorChar : 1; 219 DWORD fNull : 1; 220 DWORD fRtsControl : 2; 221 DWORD fAbortOnError : 1; 222 DWORD fDummy2 : 17; 223 WORD wReserved; 224 WORD XonLim; 225 WORD XoffLim; 226 BYTE ByteSize; 227 BYTE Parity; 228 BYTE StopBits; 229 char XonChar; 230 char XoffChar; 231 char ErrorChar; 232 char EofChar; 233 char EvtChar; 234 WORD wReserved1; 235 } DCB, *LPDCB; 236 237 typedef struct _COMM_CONFIG 238 { 239 DWORD dwSize; 240 WORD wVersion; 241 WORD wReserved; 242 DCB dcb; 243 DWORD dwProviderSubType; 244 DWORD dwProviderOffset; 245 DWORD dwProviderSize; 246 WCHAR wcProviderData[1]; 247 } COMMCONFIG, *LPCOMMCONFIG; 248 249 typedef struct _COMMPROP 250 { 251 WORD wPacketLength; 252 WORD wPacketVersion; 253 DWORD dwServiceMask; 254 DWORD dwReserved1; 255 DWORD dwMaxTxQueue; 256 DWORD dwMaxRxQueue; 257 DWORD dwMaxBaud; 258 DWORD dwProvSubType; 259 DWORD dwProvCapabilities; 260 DWORD dwSettableParams; 261 DWORD dwSettableBaud; 262 WORD wSettableData; 263 WORD wSettableStopParity; 264 DWORD dwCurrentTxQueue; 265 DWORD dwCurrentRxQueue; 266 DWORD dwProvSpec1; 267 DWORD dwProvSpec2; 268 WCHAR wcProvChar[1]; 269 } COMMPROP, *LPCOMMPROP; 270 271 typedef struct _COMMTIMEOUTS 272 { 273 DWORD ReadIntervalTimeout; 274 DWORD ReadTotalTimeoutMultiplier; 275 DWORD ReadTotalTimeoutConstant; 276 DWORD WriteTotalTimeoutMultiplier; 277 DWORD WriteTotalTimeoutConstant; 278 } COMMTIMEOUTS, *LPCOMMTIMEOUTS; 279 280 typedef struct _COMSTAT 281 { 282 DWORD fCtsHold : 1; 283 DWORD fDsrHold : 1; 284 DWORD fRlsdHold : 1; 285 DWORD fXoffHold : 1; 286 DWORD fXoffSent : 1; 287 DWORD fEof : 1; 288 DWORD fTxim : 1; 289 DWORD fReserved : 25; 290 DWORD cbInQue; 291 DWORD cbOutQue; 292 } COMSTAT, *LPCOMSTAT; 293 294 #ifdef __cplusplus 295 extern "C" 296 { 297 #endif 298 299 WINPR_API BOOL BuildCommDCBA(LPCSTR lpDef, LPDCB lpDCB); 300 WINPR_API BOOL BuildCommDCBW(LPCWSTR lpDef, LPDCB lpDCB); 301 302 WINPR_API BOOL BuildCommDCBAndTimeoutsA(LPCSTR lpDef, LPDCB lpDCB, 303 LPCOMMTIMEOUTS lpCommTimeouts); 304 WINPR_API BOOL BuildCommDCBAndTimeoutsW(LPCWSTR lpDef, LPDCB lpDCB, 305 LPCOMMTIMEOUTS lpCommTimeouts); 306 307 WINPR_API BOOL CommConfigDialogA(LPCSTR lpszName, HWND hWnd, LPCOMMCONFIG lpCC); 308 WINPR_API BOOL CommConfigDialogW(LPCWSTR lpszName, HWND hWnd, LPCOMMCONFIG lpCC); 309 310 WINPR_API BOOL GetCommConfig(HANDLE hCommDev, LPCOMMCONFIG lpCC, LPDWORD lpdwSize); 311 WINPR_API BOOL SetCommConfig(HANDLE hCommDev, LPCOMMCONFIG lpCC, DWORD dwSize); 312 313 WINPR_API BOOL GetCommMask(HANDLE hFile, PDWORD lpEvtMask); 314 WINPR_API BOOL SetCommMask(HANDLE hFile, DWORD dwEvtMask); 315 316 WINPR_API BOOL GetCommModemStatus(HANDLE hFile, PDWORD lpModemStat); 317 WINPR_API BOOL GetCommProperties(HANDLE hFile, LPCOMMPROP lpCommProp); 318 319 WINPR_API BOOL GetCommState(HANDLE hFile, LPDCB lpDCB); 320 WINPR_API BOOL SetCommState(HANDLE hFile, LPDCB lpDCB); 321 322 WINPR_API BOOL GetCommTimeouts(HANDLE hFile, LPCOMMTIMEOUTS lpCommTimeouts); 323 WINPR_API BOOL SetCommTimeouts(HANDLE hFile, LPCOMMTIMEOUTS lpCommTimeouts); 324 325 WINPR_API BOOL GetDefaultCommConfigA(LPCSTR lpszName, LPCOMMCONFIG lpCC, LPDWORD lpdwSize); 326 WINPR_API BOOL GetDefaultCommConfigW(LPCWSTR lpszName, LPCOMMCONFIG lpCC, LPDWORD lpdwSize); 327 328 WINPR_API BOOL SetDefaultCommConfigA(LPCSTR lpszName, LPCOMMCONFIG lpCC, DWORD dwSize); 329 WINPR_API BOOL SetDefaultCommConfigW(LPCWSTR lpszName, LPCOMMCONFIG lpCC, DWORD dwSize); 330 331 WINPR_API BOOL SetCommBreak(HANDLE hFile); 332 WINPR_API BOOL ClearCommBreak(HANDLE hFile); 333 WINPR_API BOOL ClearCommError(HANDLE hFile, PDWORD lpErrors, LPCOMSTAT lpStat); 334 335 WINPR_API BOOL PurgeComm(HANDLE hFile, DWORD dwFlags); 336 WINPR_API BOOL SetupComm(HANDLE hFile, DWORD dwInQueue, DWORD dwOutQueue); 337 338 WINPR_API BOOL EscapeCommFunction(HANDLE hFile, DWORD dwFunc); 339 340 WINPR_API BOOL TransmitCommChar(HANDLE hFile, char cChar); 341 342 WINPR_API BOOL WaitCommEvent(HANDLE hFile, PDWORD lpEvtMask, LPOVERLAPPED lpOverlapped); 343 344 #ifdef UNICODE 345 #define BuildCommDCB BuildCommDCBW 346 #define BuildCommDCBAndTimeouts BuildCommDCBAndTimeoutsW 347 #define CommConfigDialog CommConfigDialogW 348 #define GetDefaultCommConfig GetDefaultCommConfigW 349 #define SetDefaultCommConfig SetDefaultCommConfigW 350 #else 351 #define BuildCommDCB BuildCommDCBA 352 #define BuildCommDCBAndTimeouts BuildCommDCBAndTimeoutsA 353 #define CommConfigDialog CommConfigDialogA 354 #define GetDefaultCommConfig GetDefaultCommConfigA 355 #define SetDefaultCommConfig SetDefaultCommConfigA 356 #endif 357 358 /* Extended API */ 359 360 /* FIXME: MAXULONG should be defined arround winpr/limits.h */ 361 #ifndef MAXULONG 362 #define MAXULONG (4294967295UL) 363 #endif 364 365 /** 366 * IOCTLs table according the server's serial driver: 367 * http://msdn.microsoft.com/en-us/library/windows/hardware/dn265347%28v=vs.85%29.aspx 368 */ 369 typedef enum _SERIAL_DRIVER_ID 370 { 371 SerialDriverUnknown = 0, 372 SerialDriverSerialSys, 373 SerialDriverSerCxSys, 374 SerialDriverSerCx2Sys /* default fallback, see also CommDeviceIoControl() */ 375 } SERIAL_DRIVER_ID; 376 377 /* 378 * About DefineCommDevice() / QueryDosDevice() 379 * 380 * Did something close to QueryDosDevice() and DefineDosDevice() but with 381 * folowing constraints: 382 * - mappings are stored in a static array. 383 * - QueryCommDevice returns only the mappings that have been defined through 384 * DefineCommDevice() 385 */ 386 WINPR_API BOOL DefineCommDevice(/* DWORD dwFlags,*/ LPCTSTR lpDeviceName, LPCTSTR lpTargetPath); 387 WINPR_API DWORD QueryCommDevice(LPCTSTR lpDeviceName, LPTSTR lpTargetPath, DWORD ucchMax); 388 WINPR_API BOOL IsCommDevice(LPCTSTR lpDeviceName); 389 390 /** 391 * A handle can only be created on defined devices with DefineCommDevice(). This 392 * also ensures that CommCreateFileA() has been registered through 393 * RegisterHandleCreator(). 394 */ 395 WINPR_API HANDLE CommCreateFileA(LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, 396 LPSECURITY_ATTRIBUTES lpSecurityAttributes, 397 DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, 398 HANDLE hTemplateFile); 399 400 #define IOCTL_SERIAL_SET_BAUD_RATE 0x001B0004 401 #define IOCTL_SERIAL_GET_BAUD_RATE 0x001B0050 402 #define IOCTL_SERIAL_SET_LINE_CONTROL 0x001B000C 403 #define IOCTL_SERIAL_GET_LINE_CONTROL 0x001B0054 404 #define IOCTL_SERIAL_SET_TIMEOUTS 0x001B001C 405 #define IOCTL_SERIAL_GET_TIMEOUTS 0x001B0020 406 /* GET_CHARS and SET_CHARS are swapped in the RDP docs [MS-RDPESP] */ 407 #define IOCTL_SERIAL_GET_CHARS 0x001B0058 408 #define IOCTL_SERIAL_SET_CHARS 0x001B005C 409 410 #define IOCTL_SERIAL_SET_DTR 0x001B0024 411 #define IOCTL_SERIAL_CLR_DTR 0x001B0028 412 #define IOCTL_SERIAL_RESET_DEVICE 0x001B002C 413 #define IOCTL_SERIAL_SET_RTS 0x001B0030 414 #define IOCTL_SERIAL_CLR_RTS 0x001B0034 415 #define IOCTL_SERIAL_SET_XOFF 0x001B0038 416 #define IOCTL_SERIAL_SET_XON 0x001B003C 417 #define IOCTL_SERIAL_SET_BREAK_ON 0x001B0010 418 #define IOCTL_SERIAL_SET_BREAK_OFF 0x001B0014 419 #define IOCTL_SERIAL_SET_QUEUE_SIZE 0x001B0008 420 #define IOCTL_SERIAL_GET_WAIT_MASK 0x001B0040 421 #define IOCTL_SERIAL_SET_WAIT_MASK 0x001B0044 422 #define IOCTL_SERIAL_WAIT_ON_MASK 0x001B0048 423 #define IOCTL_SERIAL_IMMEDIATE_CHAR 0x001B0018 424 #define IOCTL_SERIAL_PURGE 0x001B004C 425 #define IOCTL_SERIAL_GET_HANDFLOW 0x001B0060 426 #define IOCTL_SERIAL_SET_HANDFLOW 0x001B0064 427 #define IOCTL_SERIAL_GET_MODEMSTATUS 0x001B0068 428 #define IOCTL_SERIAL_GET_DTRRTS 0x001B0078 429 430 /* according to [MS-RDPESP] it should be 0x001B0084, but servers send 0x001B006C */ 431 #define IOCTL_SERIAL_GET_COMMSTATUS 0x001B006C 432 433 #define IOCTL_SERIAL_GET_PROPERTIES 0x001B0074 434 /* IOCTL_SERIAL_XOFF_COUNTER 0x001B0070 */ 435 /* IOCTL_SERIAL_LSRMST_INSERT 0x001B007C */ 436 #define IOCTL_SERIAL_CONFIG_SIZE 0x001B0080 437 /* IOCTL_SERIAL_GET_STATS 0x001B008C */ 438 /* IOCTL_SERIAL_CLEAR_STATS 0x001B0090 */ 439 /* IOCTL_SERIAL_GET_MODEM_CONTROL 0x001B0094 */ 440 /* IOCTL_SERIAL_SET_MODEM_CONTROL 0x001B0098 */ 441 /* IOCTL_SERIAL_SET_FIFO_CONTROL 0x001B009C */ 442 443 /* IOCTL_PAR_QUERY_INFORMATION 0x00160004 */ 444 /* IOCTL_PAR_SET_INFORMATION 0x00160008 */ 445 /* IOCTL_PAR_QUERY_DEVICE_ID 0x0016000C */ 446 /* IOCTL_PAR_QUERY_DEVICE_ID_SIZE 0x00160010 */ 447 /* IOCTL_IEEE1284_GET_MODE 0x00160014 */ 448 /* IOCTL_IEEE1284_NEGOTIATE 0x00160018 */ 449 /* IOCTL_PAR_SET_WRITE_ADDRESS 0x0016001C */ 450 /* IOCTL_PAR_SET_READ_ADDRESS 0x00160020 */ 451 /* IOCTL_PAR_GET_DEVICE_CAPS 0x00160024 */ 452 /* IOCTL_PAR_GET_DEFAULT_MODES 0x00160028 */ 453 /* IOCTL_PAR_QUERY_RAW_DEVICE_ID 0x00160030 */ 454 /* IOCTL_PAR_IS_PORT_FREE 0x00160054 */ 455 456 /* http://msdn.microsoft.com/en-us/library/windows/hardware/ff551803(v=vs.85).aspx */ 457 #define IOCTL_USBPRINT_GET_1284_ID 0x220034 458 459 typedef struct __SERIAL_IOCTL_NAME 460 { 461 ULONG number; 462 const char* name; 463 } _SERIAL_IOCTL_NAME; 464 465 static const _SERIAL_IOCTL_NAME _SERIAL_IOCTL_NAMES[] = { 466 { IOCTL_SERIAL_SET_BAUD_RATE, "IOCTL_SERIAL_SET_BAUD_RATE" }, 467 { IOCTL_SERIAL_GET_BAUD_RATE, "IOCTL_SERIAL_GET_BAUD_RATE" }, 468 { IOCTL_SERIAL_SET_LINE_CONTROL, "IOCTL_SERIAL_SET_LINE_CONTROL" }, 469 { IOCTL_SERIAL_GET_LINE_CONTROL, "IOCTL_SERIAL_GET_LINE_CONTROL" }, 470 { IOCTL_SERIAL_SET_TIMEOUTS, "IOCTL_SERIAL_SET_TIMEOUTS" }, 471 { IOCTL_SERIAL_GET_TIMEOUTS, "IOCTL_SERIAL_GET_TIMEOUTS" }, 472 { IOCTL_SERIAL_GET_CHARS, "IOCTL_SERIAL_GET_CHARS" }, 473 { IOCTL_SERIAL_SET_CHARS, "IOCTL_SERIAL_SET_CHARS" }, 474 { IOCTL_SERIAL_SET_DTR, "IOCTL_SERIAL_SET_DTR" }, 475 { IOCTL_SERIAL_CLR_DTR, "IOCTL_SERIAL_CLR_DTR" }, 476 { IOCTL_SERIAL_RESET_DEVICE, "IOCTL_SERIAL_RESET_DEVICE" }, 477 { IOCTL_SERIAL_SET_RTS, "IOCTL_SERIAL_SET_RTS" }, 478 { IOCTL_SERIAL_CLR_RTS, "IOCTL_SERIAL_CLR_RTS" }, 479 { IOCTL_SERIAL_SET_XOFF, "IOCTL_SERIAL_SET_XOFF" }, 480 { IOCTL_SERIAL_SET_XON, "IOCTL_SERIAL_SET_XON" }, 481 { IOCTL_SERIAL_SET_BREAK_ON, "IOCTL_SERIAL_SET_BREAK_ON" }, 482 { IOCTL_SERIAL_SET_BREAK_OFF, "IOCTL_SERIAL_SET_BREAK_OFF" }, 483 { IOCTL_SERIAL_SET_QUEUE_SIZE, "IOCTL_SERIAL_SET_QUEUE_SIZE" }, 484 { IOCTL_SERIAL_GET_WAIT_MASK, "IOCTL_SERIAL_GET_WAIT_MASK" }, 485 { IOCTL_SERIAL_SET_WAIT_MASK, "IOCTL_SERIAL_SET_WAIT_MASK" }, 486 { IOCTL_SERIAL_WAIT_ON_MASK, "IOCTL_SERIAL_WAIT_ON_MASK" }, 487 { IOCTL_SERIAL_IMMEDIATE_CHAR, "IOCTL_SERIAL_IMMEDIATE_CHAR" }, 488 { IOCTL_SERIAL_PURGE, "IOCTL_SERIAL_PURGE" }, 489 { IOCTL_SERIAL_GET_HANDFLOW, "IOCTL_SERIAL_GET_HANDFLOW" }, 490 { IOCTL_SERIAL_SET_HANDFLOW, "IOCTL_SERIAL_SET_HANDFLOW" }, 491 { IOCTL_SERIAL_GET_MODEMSTATUS, "IOCTL_SERIAL_GET_MODEMSTATUS" }, 492 { IOCTL_SERIAL_GET_DTRRTS, "IOCTL_SERIAL_GET_DTRRTS" }, 493 { IOCTL_SERIAL_GET_COMMSTATUS, "IOCTL_SERIAL_GET_COMMSTATUS" }, 494 { IOCTL_SERIAL_GET_PROPERTIES, "IOCTL_SERIAL_GET_PROPERTIES" }, 495 // {IOCTL_SERIAL_XOFF_COUNTER, "IOCTL_SERIAL_XOFF_COUNTER"}, 496 // {IOCTL_SERIAL_LSRMST_INSERT, "IOCTL_SERIAL_LSRMST_INSERT"}, 497 { IOCTL_SERIAL_CONFIG_SIZE, "IOCTL_SERIAL_CONFIG_SIZE" }, 498 // {IOCTL_SERIAL_GET_STATS, "IOCTL_SERIAL_GET_STATS"}, 499 // {IOCTL_SERIAL_CLEAR_STATS, "IOCTL_SERIAL_CLEAR_STATS"}, 500 // {IOCTL_SERIAL_GET_MODEM_CONTROL,"IOCTL_SERIAL_GET_MODEM_CONTROL"}, 501 // {IOCTL_SERIAL_SET_MODEM_CONTROL,"IOCTL_SERIAL_SET_MODEM_CONTROL"}, 502 // {IOCTL_SERIAL_SET_FIFO_CONTROL, "IOCTL_SERIAL_SET_FIFO_CONTROL"}, 503 504 // {IOCTL_PAR_QUERY_INFORMATION, "IOCTL_PAR_QUERY_INFORMATION"}, 505 // {IOCTL_PAR_SET_INFORMATION, "IOCTL_PAR_SET_INFORMATION"}, 506 // {IOCTL_PAR_QUERY_DEVICE_ID, "IOCTL_PAR_QUERY_DEVICE_ID"}, 507 // {IOCTL_PAR_QUERY_DEVICE_ID_SIZE,"IOCTL_PAR_QUERY_DEVICE_ID_SIZE"}, 508 // {IOCTL_IEEE1284_GET_MODE, "IOCTL_IEEE1284_GET_MODE"}, 509 // {IOCTL_IEEE1284_NEGOTIATE, "IOCTL_IEEE1284_NEGOTIATE"}, 510 // {IOCTL_PAR_SET_WRITE_ADDRESS, "IOCTL_PAR_SET_WRITE_ADDRESS"}, 511 // {IOCTL_PAR_SET_READ_ADDRESS, "IOCTL_PAR_SET_READ_ADDRESS"}, 512 // {IOCTL_PAR_GET_DEVICE_CAPS, "IOCTL_PAR_GET_DEVICE_CAPS"}, 513 // {IOCTL_PAR_GET_DEFAULT_MODES, "IOCTL_PAR_GET_DEFAULT_MODES"}, 514 // {IOCTL_PAR_QUERY_RAW_DEVICE_ID, "IOCTL_PAR_QUERY_RAW_DEVICE_ID"}, 515 // {IOCTL_PAR_IS_PORT_FREE, "IOCTL_PAR_IS_PORT_FREE"}, 516 517 { IOCTL_USBPRINT_GET_1284_ID, "IOCTL_USBPRINT_GET_1284_ID" }, 518 519 { 0, NULL } 520 }; 521 522 /** 523 * FIXME: got a proper function name and place 524 */ 525 WINPR_API const char* _comm_serial_ioctl_name(ULONG number); 526 527 /** 528 * FIXME: got a proper function name and place 529 */ 530 WINPR_API void _comm_setServerSerialDriver(HANDLE hComm, SERIAL_DRIVER_ID); 531 532 /** 533 * FIXME: got a proper function name and place 534 * 535 * permissive mode is disabled by default. 536 */ 537 WINPR_API BOOL _comm_set_permissive(HANDLE hDevice, BOOL permissive); 538 539 /** 540 * FIXME: to be moved in comm_ioctl.h 541 */ 542 WINPR_API BOOL CommDeviceIoControl(HANDLE hDevice, DWORD dwIoControlCode, LPVOID lpInBuffer, 543 DWORD nInBufferSize, LPVOID lpOutBuffer, 544 DWORD nOutBufferSize, LPDWORD lpBytesReturned, 545 LPOVERLAPPED lpOverlapped); 546 547 /** 548 * FIXME: to be moved in comm_io.h 549 */ 550 WINPR_API BOOL CommReadFile(HANDLE hDevice, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, 551 LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped); 552 553 /** 554 * FIXME: to be moved in comm_io.h 555 */ 556 WINPR_API BOOL CommWriteFile(HANDLE hDevice, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite, 557 LPDWORD lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped); 558 559 #ifdef __cplusplus 560 } 561 #endif 562 563 #endif /* __linux__ */ 564 565 #endif /* WINPR_COMM_H */ 566