Changeset 7471 for trunk/src/kernel32/hmcomm.cpp
- Timestamp:
- Nov 28, 2001, 4:35:15 PM (24 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/kernel32/hmcomm.cpp
r7463 r7471 1 /* $Id: hmcomm.cpp,v 1.1 6 2001-11-27 12:33:23sandervl Exp $ */1 /* $Id: hmcomm.cpp,v 1.17 2001-11-28 15:35:15 sandervl Exp $ */ 2 2 3 3 /* … … 27 27 #include "dbglocal.h" 28 28 29 #undef dprintf 30 #define dprintf(a) WriteLog a 31 #undef dprintf2 32 #define dprintf2(a) WriteLog a 29 33 30 34 BAUDTABLEENTRY BaudTable[] = … … 104 108 BOOL HMDeviceCommClass::FindDevice(LPCSTR lpClassDevName, LPCSTR lpDeviceName, int namelength) 105 109 { 106 dprintf (("HMDeviceCommClass::FindDevice %s %s", lpClassDevName, lpDeviceName));110 dprintf2(("HMDeviceCommClass::FindDevice %s %s", lpClassDevName, lpDeviceName)); 107 111 108 112 if(namelength > 5) { 109 if( lstrncmpA(lpDeviceName, "\\\\.\\", 4) != 0) {113 if(namelength != 9 || lstrncmpA(lpDeviceName, "\\\\.\\", 4) != 0) { 110 114 return FALSE; //can't be com name 111 115 } … … 156 160 157 161 //AH: TODO parse Win32 security handles 158 ULONG oldmode = SetErrorMode(SEM_FAILCRITICALERRORS);162 ULONG oldmode = ::SetErrorMode(SEM_FAILCRITICALERRORS); 159 163 pHMHandleData->hHMHandle = OSLibDosOpen(comname, 160 164 OSLIB_ACCESS_READWRITE | 161 165 OSLIB_ACCESS_SHAREDENYREAD | 162 166 OSLIB_ACCESS_SHAREDENYWRITE); 163 SetErrorMode(oldmode);167 ::SetErrorMode(oldmode); 164 168 if (pHMHandleData->hHMHandle != 0) 165 169 { … … 288 292 if((pHMHandleData->dwFlags & FILE_FLAG_OVERLAPPED) && !lpOverlapped) { 289 293 dprintf(("FILE_FLAG_OVERLAPPED flag set, but lpOverlapped NULL!!")); 290 SetLastError(ERROR_INVALID_PARAMETER);294 ::SetLastError(ERROR_INVALID_PARAMETER); 291 295 return FALSE; 292 296 } … … 300 304 if(lpNumberOfBytesWritten) { 301 305 *lpNumberOfBytesWritten = (ret) ? ulBytesWritten : 0; 306 dprintf2(("KERNEL32:HMDeviceCommClass::WriteFile %d bytes written", ulBytesWritten)); 302 307 } 303 308 if(ret == FALSE) { … … 344 349 if(!(pHMHandleData->dwFlags & FILE_FLAG_OVERLAPPED)) { 345 350 dprintf(("!WARNING!: Handle not created with FILE_FLAG_OVERLAPPED!")); 346 SetLastError(ERROR_ACCESS_DENIED); //todo: right error?351 ::SetLastError(ERROR_ACCESS_DENIED); //todo: right error? 347 352 return FALSE; 348 353 } 349 354 350 SetLastError(ERROR_INVALID_FUNCTION);355 ::SetLastError(ERROR_INVALID_FUNCTION); 351 356 return FALSE; 352 357 } … … 386 391 if((pHMHandleData->dwFlags & FILE_FLAG_OVERLAPPED) && !lpOverlapped) { 387 392 dprintf(("FILE_FLAG_OVERLAPPED flag set, but lpOverlapped NULL!!")); 388 SetLastError(ERROR_INVALID_PARAMETER);393 ::SetLastError(ERROR_INVALID_PARAMETER); 389 394 return FALSE; 390 395 } … … 398 403 if(lpNumberOfBytesRead) { 399 404 *lpNumberOfBytesRead = (ret) ? ulBytesRead : 0; 405 dprintf2(("KERNEL32:HMDeviceCommClass::ReadFile %d bytes read", ulBytesRead)); 400 406 } 401 407 if(ret == FALSE) { … … 443 449 if(!(pHMHandleData->dwFlags & FILE_FLAG_OVERLAPPED)) { 444 450 dprintf(("!WARNING!: Handle not created with FILE_FLAG_OVERLAPPED!")); 445 SetLastError(ERROR_ACCESS_DENIED); //todo: right error?451 ::SetLastError(ERROR_ACCESS_DENIED); //todo: right error? 446 452 return FALSE; 447 453 } 448 454 449 SetLastError(ERROR_INVALID_FUNCTION);455 ::SetLastError(ERROR_INVALID_FUNCTION); 450 456 return FALSE; 451 457 } … … 469 475 if((NULL==pDevData) || (pDevData->ulMagic != MAGIC_COM) ) 470 476 { 471 SetLastError(ERROR_INVALID_HANDLE);477 ::SetLastError(ERROR_INVALID_HANDLE); 472 478 return FALSE; 473 479 } … … 491 497 DWORD dwEvent,dwMask; 492 498 493 dprintf(("SerialCommThread %x entered", hComm));494 499 pHMHandleData = HMQueryHandleData(hComm); 495 500 if(!pHMHandleData) { … … 500 505 pDevData = (PHMDEVCOMDATA)pHMHandleData->lpHandlerData; 501 506 if(!pDevData) { 507 dprintf(("!ERROR! SerialCommThread !pDevData")); 502 508 DebugInt3(); 503 509 return 0; … … 506 512 HANDLE hCommOS2 = pHMHandleData->hHMHandle; 507 513 if(!hCommOS2 || !hEvent) { 514 dprintf(("!ERROR! SerialCommThread !hCommOS2 || !hEvent")); 508 515 DebugInt3(); 509 516 return 0; 510 517 } 518 dprintf(("SerialCommThread %x entered", hComm)); 511 519 512 520 while(TRUE) … … 598 606 pDevData->overlapped.Internal |= (rc==0) ? (dwEvent & dwMask) : 0; 599 607 pDevData->dwLastError = rc; 608 609 //We're also supposed to write the result to the address supplied 610 //by the call to WaitCommEvent 611 if(pDevData->lpfdwEvtMask) *pDevData->lpfdwEvtMask = (rc==0) ? (dwEvent & dwMask) : 0; 600 612 dprintf(("Overlapped: WaitCommEvent returned %x", pDevData->overlapped.Internal)); 601 613 … … 619 631 PHMDEVCOMDATA pDevData = (PHMDEVCOMDATA)pHMHandleData->lpHandlerData; 620 632 621 dprintf 2(("HMDeviceCommClass::WaitCommEvent %x", pHMHandleData->hHMHandle));633 dprintf(("HMDeviceCommClass::WaitCommEvent %x %x %x", pHMHandleData->hHMHandle, lpfdwEvtMask, lpo)); 622 634 623 635 if((pHMHandleData->dwFlags & FILE_FLAG_OVERLAPPED) && !lpo) { 624 636 dprintf(("!WARNING! pHMHandleData->dwFlags & FILE_FLAG_OVERLAPPED) && !lpo")); 625 SetLastError(ERROR_INVALID_PARAMETER);637 ::SetLastError(ERROR_INVALID_PARAMETER); 626 638 return FALSE; 627 639 } … … 664 676 pDevData->overlapped.Offset = 0; 665 677 pDevData->overlapped.OffsetHigh = 0; 678 //We're also supposed to write the result to the address supplied 679 //by this call 680 pDevData->lpfdwEvtMask = lpfdwEvtMask; 681 //Set app event semaphore to non-signalled state 682 ::ResetEvent(lpo->hEvent); 683 666 684 //signal async comm thread to start polling comm status 667 685 ::SetEvent(pDevData->hEventSem); 668 SetLastError(ERROR_IO_PENDING);686 ::SetLastError(ERROR_IO_PENDING); 669 687 return FALSE; 670 688 } … … 677 695 else *lpfdwEvtMask = 0; 678 696 679 SetLastError(rc);697 ::SetLastError(rc); 680 698 return (rc==0); 681 699 } … … 696 714 dprintf(("HMDeviceCommClass::CancelIo")); 697 715 if(pDevData == NULL || !(pHMHandleData->dwFlags & FILE_FLAG_OVERLAPPED)) { 698 SetLastError(ERROR_ACCESS_DENIED); //todo: wrong error?716 ::SetLastError(ERROR_ACCESS_DENIED); //todo: wrong error? 699 717 return FALSE; 700 718 } … … 704 722 ::SetEvent(pDevData->hEventSem); 705 723 706 SetLastError(ERROR_SUCCESS);724 ::SetLastError(ERROR_SUCCESS); 707 725 return(TRUE); 708 726 } … … 728 746 PHMDEVCOMDATA pDevData = (PHMDEVCOMDATA)pHMHandleData->lpHandlerData; 729 747 730 dprintf(("KERNEL32-WARNING: HMDeviceCommClass::GetOverlappedResult(%08xh,%08xh,%08xh,%08xh) STUB!!",748 dprintf(("KERNEL32-WARNING: HMDeviceCommClass::GetOverlappedResult(%08xh,%08xh,%08xh,%08xh) partly implemented", 731 749 pHMHandleData->hHMHandle, 732 750 lpoOverlapped, … … 735 753 736 754 if(pDevData == NULL || !(pHMHandleData->dwFlags & FILE_FLAG_OVERLAPPED)) { 737 SetLastError(ERROR_ACCESS_DENIED); //todo: wrong error?755 ::SetLastError(ERROR_ACCESS_DENIED); //todo: wrong error? 738 756 return FALSE; 739 757 } 740 758 if(!lpoOverlapped) { 741 SetLastError(ERROR_INVALID_PARAMETER);759 ::SetLastError(ERROR_INVALID_PARAMETER); 742 760 return FALSE; 743 761 } 744 762 if(lpoOverlapped->hEvent != pDevData->overlapped.hEvent) { 745 763 dprintf(("!WARNING!: GetOverlappedResult called for unknown operation")); 746 SetLastError(ERROR_ACCESS_DENIED); //todo: wrong error?764 ::SetLastError(ERROR_ACCESS_DENIED); //todo: wrong error? 747 765 return FALSE; 748 766 } … … 751 769 pDevData->overlapped.Internal = 0; //not entirely safe 752 770 pDevData->dwLastError = 0; 753 SetLastError(pDevData->dwLastError);771 ::SetLastError(pDevData->dwLastError); 754 772 return lpoOverlapped->Internal; 755 773 } … … 759 777 lpoOverlapped->Internal = pDevData->overlapped.Internal; 760 778 pDevData->overlapped.Internal = 0; //not entirely safe 761 SetLastError(ERROR_SUCCESS);779 ::SetLastError(ERROR_SUCCESS); 762 780 return lpoOverlapped->Internal; 763 781 } 764 782 else { 765 SetLastError(ERROR_IO_PENDING);783 ::SetLastError(ERROR_IO_PENDING); 766 784 return FALSE; 767 785 } … … 927 945 928 946 rc = 0; 929 if(pCurDCB->BaudRate != lpDCB->BaudRate) 930 rc = SetBaud( pHMHandleData, 931 lpDCB->BaudRate); 947 if(pCurDCB->BaudRate != lpDCB->BaudRate) { 948 dprintf(("SetCommState: change baud rate from %d to %d", pCurDCB->BaudRate, lpDCB->BaudRate)); 949 rc = SetBaud( pHMHandleData, 950 lpDCB->BaudRate); 951 } 932 952 933 953 if(!rc) … … 936 956 (pCurDCB->Parity != lpDCB->Parity) || 937 957 (pCurDCB->StopBits != lpDCB->StopBits)) 958 { 959 dprintf(("SetCommState: change line %d %d %d", lpDCB->ByteSize, lpDCB->Parity, lpDCB->StopBits)); 938 960 rc = SetLine( pHMHandleData, 939 961 lpDCB->ByteSize, 940 962 lpDCB->Parity, 941 963 lpDCB->StopBits); 964 } 942 965 } 943 966 … … 958 981 (pCurDCB->XoffChar != lpDCB->XoffChar) || 959 982 (pCurDCB->ErrorChar != lpDCB->ErrorChar)) 983 { 984 dprintf(("SetCommState: change flags cts %d dsr %d dtr %d dsr %d tx %d out %d in %d ferror %d null %d rts %d abort %d xon %d xoff %d error %d", lpDCB->fOutxCtsFlow, lpDCB->fOutxDsrFlow,lpDCB->fDtrControl,lpDCB->fDsrSensitivity,lpDCB->fDsrSensitivity,lpDCB->fTXContinueOnXoff,lpDCB->fOutX, lpDCB->fInX,lpDCB->fErrorChar,lpDCB->fNull,lpDCB->fRtsControl,lpDCB->fAbortOnError,lpDCB->XonChar,lpDCB->XoffChar,lpDCB->ErrorChar)); 960 985 SetOS2DCB( pHMHandleData, 961 986 lpDCB->fOutxCtsFlow, lpDCB->fOutxDsrFlow, … … 966 991 lpDCB->fAbortOnError, lpDCB->XonChar, 967 992 lpDCB->XoffChar,lpDCB->ErrorChar); 993 } 968 994 } 969 995 … … 977 1003 PHMDEVCOMDATA pDevData = (PHMDEVCOMDATA)pHMHandleData->lpHandlerData; 978 1004 979 dprintf(("HMDeviceCommClass::GetCommState")); 1005 dprintf(("HMDeviceCommClass::GetCommState %x", lpdcb)); 1006 1007 if(lpdcb == NULL) { 1008 ::SetLastError(ERROR_INVALID_PARAMETER); 1009 return FALSE; 1010 } 1011 980 1012 memcpy(lpdcb,&pDevData->CommCfg.dcb,sizeof(DCB)); 981 982 1013 return(TRUE); 983 1014 } … … 993 1024 994 1025 dprintf(("HMDeviceCommClass::GetCommModemStatus %x", lpModemStat)); 1026 if(lpModemStat == NULL) { 1027 ::SetLastError(ERROR_INVALID_PARAMETER); 1028 return FALSE; 1029 } 1030 995 1031 ulLen = sizeof(CHAR); 996 1032 … … 1011 1047 } 1012 1048 1049 dprintf2(("HMDeviceCommClass::GetCommModemStatus -> %x rc=%d", *lpModemStat, rc)); 1013 1050 return(rc==0); 1014 1051 } … … 1020 1057 PHMDEVCOMDATA pDevData = (PHMDEVCOMDATA)pHMHandleData->lpHandlerData; 1021 1058 1022 dprintf(("HMDeviceCommClass::GetCommTimeouts stub")); 1059 dprintf(("HMDeviceCommClass::GetCommTimeouts %x stub", lpctmo)); 1060 1061 if(lpctmo == NULL) { 1062 ::SetLastError(ERROR_INVALID_PARAMETER); 1063 return FALSE; 1064 } 1065 1023 1066 memcpy( lpctmo, 1024 1067 &pDevData->CommTOuts, … … 1036 1079 APIRET rc; 1037 1080 UCHAR fbTimeOut; 1081 1082 if(lpctmo == NULL) { 1083 dprintf(("!WARNING! HMDeviceCommClass::SetCommTimeouts %x -> invalid parameter", lpctmo)); 1084 ::SetLastError(ERROR_INVALID_PARAMETER); 1085 return FALSE; 1086 } 1087 1038 1088 dprintf(("HMDeviceCommClass::SetCommTimeouts\n" 1039 1089 " ReadIntervalTimeout : 0x%x\n" … … 1187 1237 *lpdwSize< sizeof(COMMCONFIG) ) 1188 1238 { 1189 SetLastError(ERROR_INSUFFICIENT_BUFFER);1239 ::SetLastError(ERROR_INSUFFICIENT_BUFFER); 1190 1240 *lpdwSize= sizeof(COMMCONFIG); 1191 1241 return FALSE; … … 1194 1244 if((NULL==pDevData) || (pDevData->ulMagic != MAGIC_COM) ) 1195 1245 { 1196 SetLastError(ERROR_INVALID_HANDLE);1246 ::SetLastError(ERROR_INVALID_HANDLE); 1197 1247 return FALSE; 1198 1248 } … … 1287 1337 default: 1288 1338 dprintf(("!ERROR!: EscapeCommFunction: unknown function")); 1289 SetLastError(ERROR_INVALID_PARAMETER);1339 ::SetLastError(ERROR_INVALID_PARAMETER); 1290 1340 return(FALSE); 1291 1341 } … … 1302 1352 if((NULL==pDevData) || (pDevData->ulMagic != MAGIC_COM) ) 1303 1353 { 1304 SetLastError(ERROR_INVALID_HANDLE);1354 ::SetLastError(ERROR_INVALID_HANDLE); 1305 1355 return FALSE; 1306 1356 } 1357 1358 dprintf(("SetDefaultCommConfig %x %d", lpCC, dwSize)); 1307 1359 memset(&pDevData->CommCfg,0, sizeof(COMMCONFIG)); 1308 1360 memcpy(&pDevData->CommCfg,lpCC,dwSize>sizeof(COMMCONFIG)?sizeof(COMMCONFIG):dwSize); … … 1321 1373 *lpdwSize< sizeof(COMMCONFIG) ) 1322 1374 { 1323 SetLastError(ERROR_INSUFFICIENT_BUFFER);1375 ::SetLastError(ERROR_INSUFFICIENT_BUFFER); 1324 1376 *lpdwSize= sizeof(COMMCONFIG); 1325 1377 return FALSE; … … 1328 1380 if((NULL==pDevData) || (pDevData->ulMagic != MAGIC_COM) ) 1329 1381 { 1330 SetLastError(ERROR_INVALID_HANDLE);1382 ::SetLastError(ERROR_INVALID_HANDLE); 1331 1383 return FALSE; 1332 1384 } 1385 dprintf(("GetDefaultCommConfig %x %x", lpCC, lpdwSize)); 1333 1386 1334 1387 memcpy(lpCC,&pDevData->CommCfg,sizeof(COMMCONFIG)); … … 1372 1425 pCurDCB->StopBits = ucStop; 1373 1426 } 1374 1427 else { 1428 dprintf(("!ERROR! SetLine: OSLibDosDevIOCtl failed with rc %d", rc)); 1429 } 1375 1430 return rc; 1376 1431 } … … 1466 1521 EXTBAUDSET SetBaud; 1467 1522 EXTBAUDGET GetBaud; 1523 PHMDEVCOMDATA pDevData = (PHMDEVCOMDATA)pHMHandleData->lpHandlerData; 1524 1468 1525 ulLen = sizeof(SetBaud); 1469 1526 SetBaud.ulBaud = dwNewBaud; 1527 SetBaud.ucFrac = 0; 1470 1528 rc = OSLibDosDevIOCtl( pHMHandleData->hHMHandle, 1471 1529 IOCTL_ASYNC, … … 1483 1541 if(0==rc) 1484 1542 { 1485 if(dwNewBaud !=GetBaud.ulCurrBaud) 1543 if(dwNewBaud != GetBaud.ulCurrBaud) { 1544 dprintf(("!WARNING! dwNewBaud (%d) != GetBaud.ulCurrBaud (%d)", dwNewBaud, GetBaud.ulCurrBaud)); 1486 1545 rc = 1; // ToDo set a proper Errorhandling 1546 } 1487 1547 else 1488 1548 { 1489 ((PHMDEVCOMDATA)pHMHandleData->lpDeviceData)->CommCfg.dcb.BaudRate = dwNewBaud; 1490 ((PHMDEVCOMDATA)pHMHandleData->lpDeviceData)->CommCfg.dcb.BaudRate = dwNewBaud; 1549 pDevData->CommCfg.dcb.BaudRate = dwNewBaud; 1491 1550 } 1492 1551 } 1552 else { 1553 dprintf(("!WARNING! SetBaud: (get) OSLibDosDevIOCtl failed with rc %d", rc)); 1554 } 1555 } 1556 else { 1557 dprintf(("!WARNING! SetBaud: (set) OSLibDosDevIOCtl failed with rc %d", rc)); 1493 1558 } 1494 1559 return rc;
Note:
See TracChangeset
for help on using the changeset viewer.