source: trunk/src/kernel32/comm.cpp@ 4285

Last change on this file since 4285 was 4285, checked in by hugh, 25 years ago

Implemented Serial APIs

File size: 19.9 KB
Line 
1/* $Id: comm.cpp,v 1.5 2000-09-20 21:32:49 hugh Exp $ */
2
3/*
4 * Comport functions
5 *
6 * Copyright 1998 Patrick Haller (?)
7 * Copyright 1998 Felix Maschek (?)
8 * Copyright 2000 Markus Montkowski
9 *
10 * Project Odin Software License can be found in LICENSE.TXT
11 *
12 */
13#include <os2win.h>
14#include <odinwrap.h>
15#include <ctype.h>
16#include <string.h>
17#include <stdio.h>
18#include "winreg.h"
19#include "global.h"
20#include "winnt.h"
21#include "winerror.h"
22#include "winreg.h"
23
24#include "unicode.h"
25#include "handlemanager.h"
26
27#define DBG_LOCALLOG DBG_comm
28#include "dbglocal.h"
29ODINDEBUGCHANNEL(KERNEL32-COMM)
30
31/*****************************************************************************
32 * @returns True on success and fills the COMMCONFIG structure
33 * @param lpDef Pointer to device-control string
34 * @param lpDCB Pointer to device-control buffer
35 * @remark
36 * @status untested
37 * @author Markus Montkowski
38 *****************************************************************************/
39
40BOOL WIN32API BuildCommDCBA( LPCSTR lpDef, LPDCB lpDCB )
41{
42 return BuildCommDCBAndTimeoutsA(lpDef,lpDCB,NULL);
43}
44
45//------------------------------------------------------------------------------
46
47BOOL WIN32API BuildCommDCBW( LPCWSTR lpDef, LPDCB lpDCB )
48{
49 char *asciiname;
50 BOOL rc;
51
52 asciiname = UnicodeToAsciiString((LPWSTR)lpDef);
53 rc = BuildCommDCBAndTimeoutsA(asciiname, lpDCB, NULL);
54 FreeAsciiString(asciiname);
55 return(rc);
56}
57
58//------------------------------------------------------------------------------
59
60BOOL ValidCOMPort(int Port)
61{
62 // @@@ Todo check in the handlemanager for a registered COM DeviceHandle for this number
63 // We currently only do static add COM1-COM8 so we simply check for 8
64 return (Port <=8);
65}
66
67/*****************************************************************************
68 * @returns True on success and fills the COMMCONFIG structure
69 * @param lpDef Pointer to device-control string
70 * @param lpDCB Pointer to device-control buffer
71 * @param lpCommTimeouts Pointer to COMMTIMEOUTS
72 * @remark
73 * @status partly implemented
74 * @author Markus Montkowski
75 *****************************************************************************/
76
77
78BOOL WIN32API BuildCommDCBAndTimeoutsA( LPCSTR lpDef, LPDCB lpDCB, LPCOMMTIMEOUTS lpCommTimeouts )
79{
80 int port,i;
81 char szNumber[4];
82 char *ptr,*temp;
83
84 dprintf(("(%s,%p,%p)\n",lpDef,lpDCB,lpCommTimeouts));
85
86 port = -1;
87
88 if (!strnicmp(lpDef,"COM",3))
89 {
90
91 for(i=0;((lpDef[3+i]!=':') && (i<3));i++)
92 szNumber[i] = lpDef[3+i];
93 szNumber[i] = 0;
94
95 port = atoi(szNumber);
96 if (port==0 || lpDef[i]!=':')
97 {
98 SetLastError(ERROR_INVALID_PARAMETER);
99 return FALSE;
100 }
101
102 if (!ValidCOMPort(port))
103 {
104 SetLastError(ERROR_FILE_NOT_FOUND);
105 return FALSE;
106 }
107 temp=(LPSTR)(lpDef+4+i);
108 }
109 else
110 temp=(LPSTR)lpDef;
111
112 lpDCB->DCBlength = sizeof(DCB);
113 if (strchr(temp,','))
114 {
115 // old style
116
117 char last=temp[strlen(temp)-1];
118
119 ptr = strtok(temp, ", ");
120
121
122 lpDCB->BaudRate = atoi(ptr);
123 dprintf(("baudrate (%d)\n", lpDCB->BaudRate));
124
125 ptr = strtok(NULL, ", ");
126 if (islower(*ptr))
127 *ptr = toupper(*ptr);
128
129 dprintf(("parity (%c)\n", *ptr));
130 lpDCB->fParity = TRUE;
131 switch (*ptr)
132 {
133 case 'N':
134 lpDCB->Parity = NOPARITY;
135 lpDCB->fParity = FALSE;
136 break;
137 case 'E':
138 lpDCB->Parity = EVENPARITY;
139 break;
140 case 'M':
141 lpDCB->Parity = MARKPARITY;
142 break;
143 case 'O':
144 lpDCB->Parity = ODDPARITY;
145 break;
146 default:
147 SetLastError(ERROR_INVALID_PARAMETER);
148 dprintf(("Unknown parity `%c'!\n", *ptr));
149 return FALSE;
150 }
151
152 ptr = strtok(NULL, ", ");
153 dprintf(("charsize (%c)\n", *ptr));
154 lpDCB->ByteSize = *ptr - '0';
155
156 if((lpDCB->ByteSize<5) ||
157 (lpDCB->ByteSize>8))
158 {
159 SetLastError(ERROR_INVALID_PARAMETER);
160 dprintf(("Unsupported bytesize `%d'!\n", lpDCB->ByteSize));
161 return FALSE;
162 }
163
164 ptr = strtok(NULL, ", ");
165 dprintf(("stopbits (%c%c%c)\n", *ptr,*(ptr+1)=='.'?'.':' ',*(ptr+1)=='.'?*(ptr+2):' '));
166 switch (*ptr)
167 {
168 case '1':
169 if(*(ptr+1)=='.')
170 {
171 if(*(ptr+2)=='5')
172 lpDCB->StopBits = ONE5STOPBITS;
173 else
174 {
175 SetLastError(ERROR_INVALID_PARAMETER);
176 dprintf(("Unsupported # of stopbits !\n"));
177 return FALSE;
178 }
179 }
180 else
181 lpDCB->StopBits = ONESTOPBIT;
182 break;
183 case '2':
184 lpDCB->StopBits = TWOSTOPBITS;
185 break;
186 default:
187 SetLastError(ERROR_INVALID_PARAMETER);
188 dprintf(("Unknown # of stopbits `%c'!\n", *ptr));
189 return FALSE;
190 }
191
192 if(lpDCB->BaudRate==110)
193 lpDCB->StopBits =2;
194
195 if(((lpDCB->ByteSize==5)&&(lpDCB->StopBits==TWOSTOPBITS))||
196 ((lpDCB->ByteSize!=5)&&(lpDCB->StopBits==ONE5STOPBITS)) )
197 {
198 dprintf(("Unsupported Combination of Bytesize `%d' and StopBits %s!\n",
199 lpDCB->ByteSize,lpDCB->StopBits==ONE5STOPBITS?"1.5":"2"));
200 SetLastError(ERROR_INVALID_PARAMETER);
201 return FALSE;
202 }
203
204 lpDCB->fBinary = TRUE;
205 lpDCB->fNull = FALSE;
206
207 if (last == 'x')
208 {
209 lpDCB->fInX = TRUE;
210 lpDCB->fOutX = TRUE;
211 lpDCB->fOutxCtsFlow = FALSE;
212 lpDCB->fOutxDsrFlow = FALSE;
213 lpDCB->fDtrControl = DTR_CONTROL_ENABLE;
214 lpDCB->fRtsControl = RTS_CONTROL_ENABLE;
215 }
216 else
217 if (last=='p')
218 {
219 lpDCB->fInX = FALSE;
220 lpDCB->fOutX = FALSE;
221 lpDCB->fOutxCtsFlow = TRUE;
222 lpDCB->fOutxDsrFlow = TRUE;
223 lpDCB->fDtrControl = DTR_CONTROL_HANDSHAKE;
224 lpDCB->fRtsControl = RTS_CONTROL_HANDSHAKE;
225 }
226 else
227 {
228 lpDCB->fInX = FALSE;
229 lpDCB->fOutX = FALSE;
230 lpDCB->fOutxCtsFlow = FALSE;
231 lpDCB->fOutxDsrFlow = FALSE;
232 lpDCB->fDtrControl = DTR_CONTROL_ENABLE;
233 lpDCB->fRtsControl = RTS_CONTROL_ENABLE;
234 }
235 lpDCB->XonChar = 0;
236 lpDCB->XoffChar = 0;
237 lpDCB->ErrorChar = 0;
238 lpDCB->fErrorChar = 0;
239 lpDCB->EofChar = 0;
240 lpDCB->EvtChar = 0;
241 lpDCB->XonLim = 0;
242 lpDCB->XoffLim = 0;
243 return TRUE;
244 }
245
246 ptr=strtok(temp," ");
247 while (ptr)
248 {
249 DWORD flag,x;
250
251 flag=0;
252 if (!strnicmp("baud=",ptr,5))
253 {
254 if (!sscanf(ptr+5,"%ld",&x))
255 {
256 dprintf(("Couldn't parse %s\n",ptr));
257 SetLastError(ERROR_INVALID_PARAMETER);
258 return FALSE;
259 }
260 lpDCB->BaudRate = x;
261 flag=1;
262 }
263 if (!strnicmp("stop=",ptr,5))
264 {
265 if (!sscanf(ptr+5,"%ld",&x))
266 {
267 dprintf(("Couldn't parse %s\n",ptr));
268 SetLastError(ERROR_INVALID_PARAMETER);
269 return FALSE;
270 }
271 lpDCB->StopBits = x;
272 flag=1;
273 }
274 if (!strnicmp("data=",ptr,5))
275 {
276 if (!sscanf(ptr+5,"%ld",&x))
277 {
278 dprintf(("Couldn't parse %s\n",ptr));
279 SetLastError(ERROR_INVALID_PARAMETER);
280 return FALSE;
281 }
282 lpDCB->ByteSize = x;
283 flag=1;
284 }
285 if (!strnicmp("parity=",ptr,7))
286 {
287 lpDCB->fParity = TRUE;
288 switch (ptr[8])
289 {
290 case 'N':case 'n':
291 lpDCB->fParity = FALSE;
292 lpDCB->Parity = NOPARITY;
293 break;
294 case 'E':case 'e':
295 lpDCB->Parity = EVENPARITY;
296 break;
297 case 'O':case 'o':
298 lpDCB->Parity = ODDPARITY;
299 break;
300 case 'M':case 'm':
301 lpDCB->Parity = MARKPARITY;
302 break;
303 }
304 flag=1;
305 }
306 if (!strnicmp("to=",ptr,3))
307 {
308 if (!strnicmp("on",ptr+3,2))
309 {
310 if(NULL==lpCommTimeouts)
311 {
312 dprintf(("TO=ON and no lpCommTimeout"));
313 SetLastError(ERROR_INVALID_PARAMETER);
314 return FALSE;
315 }
316 else
317 {
318 // @@@ Todo Implement timout handling
319 flag=1;
320 }
321 }
322 if (!strnicmp("off",ptr+3,3))
323 {
324 flag=1;
325 }
326 }
327
328 if (!flag)
329 {
330 dprintf(("Unhandled specifier '%s', please report.\n",ptr));
331 SetLastError(ERROR_INVALID_PARAMETER);
332 return FALSE;
333 }
334 ptr=strtok(NULL," ");
335 }
336
337 if (lpDCB->BaudRate==110)
338 lpDCB->StopBits = 2;
339 return TRUE;
340}
341
342//------------------------------------------------------------------------------
343
344BOOL WIN32API BuildCommDCBAndTimeoutsW( LPCWSTR lpDef, LPDCB lpDCB, LPCOMMTIMEOUTS lpCommTimeouts )
345{
346 char *asciiname;
347 BOOL rc;
348
349 asciiname = UnicodeToAsciiString((LPWSTR)lpDef);
350 rc = BuildCommDCBAndTimeoutsA(asciiname, lpDCB, lpCommTimeouts);
351 FreeAsciiString(asciiname);
352 return(rc);
353}
354
355//------------------------------------------------------------------------------
356
357typedef BOOL (* WIN32API COMMDLGFUNC)(LPCSTR, HWND, LPCOMMCONFIG );
358
359BOOL WIN32API CommConfigDialogA( LPCSTR lpszName, HWND hWnd, LPCOMMCONFIG lpCC )
360{
361 COMMDLGFUNC lpfnCommDialog;
362 HMODULE hConfigModule;
363 char szSerialUI[MAX_PATH+1];
364 char szKeyname[5];
365 BOOL r;
366 HKEY hkPorts, hkName;
367 LONG rc;
368 DWORD dwType,dwSize;
369 int port;
370
371 dprintf(("CommConfigDialogA (%p %x %p)\n",lpszName, hWnd, lpCC));
372
373 if( strnicmp(lpszName,"com",3) ||
374 strlen(lpszName)<4 ||
375 strlen(lpszName)>7)
376 {
377 SetLastError(ERROR_INVALID_PARAMETER);
378 return FALSE;
379 }
380 port = atoi(lpszName+3);
381 if( (0==port) ||(port>9999))
382 {
383 SetLastError(ERROR_INVALID_PARAMETER);
384 return FALSE;
385 }
386 port--;
387
388 sprintf(szKeyname,"%04d",port);
389 dprintf(("CommConfigDialogA look in reg for port %s",szKeyname));
390 rc = RegOpenKeyExA( HKEY_LOCAL_MACHINE,
391 "System\\CurrentControlSet\\Services\\Class\\Ports",
392 0,
393 KEY_READ,
394 &hkPorts);
395
396 if(rc!=ERROR_SUCCESS)
397 {
398 SetLastError(ERROR_DEV_NOT_EXIST);
399 return FALSE;
400 }
401
402 rc = RegOpenKeyExA( hkPorts,
403 szKeyname,
404 0,
405 KEY_READ,
406 &hkName);
407
408 if(rc!=ERROR_SUCCESS)
409 {
410 SetLastError(ERROR_DEV_NOT_EXIST);
411 RegCloseKey(hkPorts);
412 return FALSE;
413 }
414
415 dwSize = sizeof(szSerialUI);
416
417 rc = RegQueryValueExA( hkName,
418 "ConfigDialog",
419 NULL,
420 &dwType,
421 (LPBYTE)szSerialUI,
422 &dwSize);
423
424 RegCloseKey(hkName);
425 RegCloseKey(hkPorts);
426 if( (rc!=ERROR_SUCCESS) && (dwType!=REG_SZ) )
427 {
428 SetLastError(ERROR_DEV_NOT_EXIST);
429 return FALSE;
430 }
431
432 hConfigModule = LoadLibraryA(szSerialUI);
433 if(!hConfigModule)
434 return FALSE;
435
436 lpfnCommDialog = (COMMDLGFUNC)GetProcAddress(hConfigModule, (LPCSTR)3L);
437
438 if(!lpfnCommDialog)
439 return FALSE;
440
441 SetLastError(ERROR_SUCCESS);
442
443 r = lpfnCommDialog(lpszName,hWnd,lpCC);
444
445 FreeLibrary(hConfigModule);
446
447 return r;
448}
449
450//------------------------------------------------------------------------------
451
452BOOL WIN32API CommConfigDialogW( LPCWSTR lpszName, HWND hWnd, LPCOMMCONFIG lpCC )
453{
454 char *asciiname;
455 BOOL rc;
456
457 asciiname = UnicodeToAsciiString((LPWSTR)lpszName);
458 rc = CommConfigDialogA(asciiname,hWnd,lpCC);
459 FreeAsciiString(asciiname);
460 return rc;
461}
462
463/*****************************************************************************
464 * @returns True on success and fills the COMMCONFIG structure
465 * @param lpszName Pointer to devicename
466 * @param lpCC Pointer to COMMCONFIG buffer.
467 * @param lpdwSize [in] Pointer to size of Buffer pointed to by lpCC
468 * [out] Number of bytes copied to the buffer
469 * [error] If buffer to small Number of bytes needed
470 * @remark
471 * @status untested
472 * @author Markus Montkowski
473 *****************************************************************************/
474
475ODINFUNCTION3(BOOL,GetDefaultCommConfigA,
476 LPCSTR, lpszName,
477 LPCOMMCONFIG, lpCC,
478 LPDWORD, lpdwSize )
479{
480 HFILE hCOM;
481 BOOL rc;
482
483 dprintf(("GetDefaultCommConfigA untested stub \n"));
484 SetLastError(ERROR_SUCCESS);
485
486 if(IsBadReadPtr(lpszName,5) ||
487 IsBadWritePtr(lpdwSize,sizeof(DWORD)) ||
488 IsBadWritePtr(lpCC,*lpdwSize) )
489 {
490 SetLastError(ERROR_INVALID_PARAMETER); /* set win32 error information */
491 return(FALSE);
492 }
493
494 if(strnicmp(lpszName,"COM",3) &&
495 strnicmp(lpszName,"\\COM",4) &&
496 strnicmp(lpszName,"\\dev\\COM",8) )
497 {
498 SetLastError(ERROR_FILE_NOT_FOUND); /* set win32 error information */
499 return(FALSE);
500 }
501
502 hCOM = HMCreateFile( lpszName,
503 GENERIC_READ | GENERIC_WRITE,
504 0,
505 NULL,
506 OPEN_EXISTING,
507 FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,
508 NULL);
509 if(0!=hCOM)
510 {
511 rc = HMCommGetDefaultCommConfig(hCOM, lpCC, lpdwSize);
512 HMCloseHandle(hCOM);
513 return(rc);
514 }
515 return(FALSE);
516}
517
518//------------------------------------------------------------------------------
519
520BOOL WIN32API GetDefaultCommConfigW( LPCWSTR lpszName, LPCOMMCONFIG lpCC, LPDWORD lpdwSize )
521{
522 char *asciiname;
523 BOOL rc;
524
525 asciiname = UnicodeToAsciiString((LPWSTR)lpszName);
526 rc = GetDefaultCommConfigA(asciiname, lpCC, lpdwSize);
527 FreeAsciiString(asciiname);
528 return(rc);
529}
530
531/*****************************************************************************
532 * @returns True on Success
533 * @param lpszName Pointer to devicename
534 * @param lpCC Pointer to COMMCONFIG buffer.
535 * @param dwSize Size of Buffer pointed to by lpCC
536 * @remark
537 * @status untested
538 * @author Markus Montkowski
539 *****************************************************************************/
540
541ODINFUNCTION3(BOOL, SetDefaultCommConfigA,
542 LPCSTR, lpszName,
543 LPCOMMCONFIG, lpCC,
544 DWORD, dwSize )
545{
546 HFILE hCOM;
547 BOOL rc;
548
549 dprintf(("SetDefaultCommConfigA untested stub \n"));
550 SetLastError(ERROR_INVALID_PARAMETER); /* set win32 error information */
551 rc = FALSE;
552
553 if(!IsBadReadPtr(lpszName,5) &&
554 !IsBadWritePtr(lpCC,dwSize)&&
555 lpCC->dwSize== dwSize )
556 {
557 switch(lpCC->dwProviderSubType)
558 {
559 case PST_RS232:
560 if(strnicmp(lpszName,"COM",3) &&
561 strnicmp(lpszName,"\\COM",4) &&
562 strnicmp(lpszName,"\\dev\\COM",8) )
563 {
564 SetLastError(ERROR_FILE_NOT_FOUND); /* set win32 error information */
565 return(FALSE);
566 }
567
568 SetLastError(ERROR_SUCCESS);
569
570 hCOM = HMCreateFile( lpszName,
571 GENERIC_READ | GENERIC_WRITE,
572 0,
573 NULL,
574 OPEN_EXISTING,
575 FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,
576 NULL);
577 if(0!=hCOM)
578 {
579 rc = HMCommSetDefaultCommConfig(hCOM, lpCC, dwSize);
580 HMCloseHandle(hCOM);
581 return(rc);
582 }
583 break;
584 case PST_PARALLELPORT:
585 case PST_MODEM:
586 default:
587 SetLastError(ERROR_FILE_NOT_FOUND);
588 dprintf(("SetDefaultCommConfigA: ProviderSubType &d Not implemented (FALSE)\n",lpCC->dwProviderSubType));
589 break;
590 }
591 }
592 return(rc);
593}
594
595//------------------------------------------------------------------------------
596
597BOOL WIN32API SetDefaultCommConfigW( LPCWSTR lpszName, LPCOMMCONFIG lpCC, DWORD dwSize )
598{
599 char *asciiname;
600 BOOL rc;
601
602 asciiname = UnicodeToAsciiString((LPWSTR)lpszName);
603 rc = SetDefaultCommConfigA(asciiname, lpCC, dwSize);
604 FreeAsciiString(asciiname);
605 return(rc);
606}
607
608/*****************************************************************************
609 * @returns
610 * @param hFile Comport handle
611 * @remark
612 * @status untested
613 * @author Markus Montkowski
614 *****************************************************************************/
615
616ODINFUNCTION1(BOOL, ClearCommBreak, HANDLE, hFile )
617{
618 return HMCommClearCommBreak(hFile);
619}
620
621/*****************************************************************************
622 * @returns
623 * @param hFile Comport handle
624 * @param dwInQueue recommended internal buffer size in bytes
625 * @param dwOutQueue recommended internal buffer size in bytes
626 * @remark
627 * @status untested
628 * @author Markus Montkowski
629 *****************************************************************************/
630
631ODINFUNCTION3(BOOL, SetupComm,
632 HANDLE, hFile,
633 DWORD, dwInQueue,
634 DWORD, dwOutQueue )
635{
636 return HMCommSetupComm(hFile, dwInQueue, dwOutQueue);
637}
638
639/*****************************************************************************
640 * @returns
641 * @param hFile Comport handle
642 * @param dwFunc extended function to perform
643 * @remark
644 * @status untested
645 * @author Markus Montkowski
646 *****************************************************************************/
647
648ODINFUNCTION2 (BOOL, EscapeCommFunction,
649 HANDLE, hFile,
650 UINT, dwFunc )
651{
652 return HMCommEscapeCommFunction(hFile, dwFunc);
653}
654
655//------------------------------------------------------------------------------
656
657BOOL WIN32API GetCommConfig( HANDLE hCommDev, LPCOMMCONFIG lpCC, LPDWORD lpdwSize )
658{
659 return HMCommGetCommConfig(hCommDev,lpCC, lpdwSize);
660}
661
662//------------------------------------------------------------------------------
663
664BOOL WIN32API GetCommModemStatus( HANDLE hFile, LPDWORD lpModemStat )
665{
666 return HMCommGetCommModemStatus(hFile,lpModemStat);
667}
668
669//------------------------------------------------------------------------------
670
671BOOL WIN32API SetCommBreak( HANDLE hFile )
672{
673 return HMCommSetCommBreak(hFile);
674}
675
676//------------------------------------------------------------------------------
677
678BOOL WIN32API SetCommConfig( HANDLE hCommDev, LPCOMMCONFIG lpCC, DWORD dwSize )
679{
680 return HMCommSetCommConfig(hCommDev,lpCC, dwSize);
681}
682
683//------------------------------------------------------------------------------
684
685BOOL WIN32API TransmitCommChar( HANDLE hFile, CHAR cChar )
686{
687 return HMCommTransmitCommChar(hFile,cChar);
688}
689
690//------------------------------------------------------------------------------
691
692BOOL WIN32API SetCommTimeouts( HANDLE hCommDev, LPCOMMTIMEOUTS lpctmo)
693{
694 return HMCommSetCommTimeouts(hCommDev, lpctmo);
695}
696
697//------------------------------------------------------------------------------
698
699BOOL WIN32API GetCommTimeouts(HANDLE hCommDev, LPCOMMTIMEOUTS lpctmo)
700{
701 return HMCommGetCommTimeouts(hCommDev, lpctmo);
702}
703
704//------------------------------------------------------------------------------
705
706BOOL WIN32API GetCommState(HANDLE hCommDev, LPDCB lpDCB)
707{
708 return HMCommGetCommState(hCommDev, lpDCB);
709}
710
711//------------------------------------------------------------------------------
712
713BOOL WIN32API SetCommState(HANDLE hCommDev, LPDCB lpDCB)
714{
715 return HMCommSetCommState(hCommDev, lpDCB);
716}
717
718//------------------------------------------------------------------------------
719
720BOOL WIN32API ClearCommError(HANDLE hCommDev, LPDWORD lpdwErrors, LPCOMSTAT lpcst)
721{
722 return HMCommClearCommError(hCommDev, lpdwErrors, lpcst);
723}
724
725//------------------------------------------------------------------------------
726
727BOOL WIN32API PurgeComm(HANDLE hCommDev, DWORD fdwAction)
728{
729 return HMCommPurgeComm(hCommDev,fdwAction);
730}
731
732//------------------------------------------------------------------------------
733
734BOOL WIN32API SetCommMask(HANDLE hCommDev, DWORD fdwEvtMask)
735{
736 return HMCommSetCommMask( hCommDev,fdwEvtMask);
737}
738
739//------------------------------------------------------------------------------
740
741BOOL WIN32API GetCommMask(HANDLE hCommDev, LPDWORD lpfdwEvtMask)
742{
743 return HMCommGetCommMask( hCommDev,lpfdwEvtMask);
744}
745
746//------------------------------------------------------------------------------
747
748BOOL WIN32API GetCommProperties(HANDLE hCommDev, LPCOMMPROP lpcmmp)
749{
750 return HMCommGetCommProperties(hCommDev, lpcmmp);
751}
752
753//------------------------------------------------------------------------------
754
755BOOL WIN32API WaitCommEvent( HANDLE hCommDev,
756 LPDWORD lpfdwEvtMask,
757 LPOVERLAPPED lpo)
758{
759 return HMCommWaitCommEvent(hCommDev, lpfdwEvtMask, lpo);
760}
761
762//------------------------------------------------------------------------------
763
Note: See TracBrowser for help on using the repository browser.