// // This test the line status and modem status insertion. // #include #include #include #include "nt.h" #include "ntrtl.h" #include "nturtl.h" #include "ntddser.h" #include "windows.h" #define SIZEOFBUF 1000000 UCHAR readBuff[SIZEOFBUF]; int __cdecl main(int argc,char *argv[]) { HANDLE hFile; DCB myDcb; char *myPort = "COM1"; unsigned char escapeChar = 0xff; DWORD numberToRead; DWORD numberActuallyRead; DWORD useBaud = 1200; COMMTIMEOUTS to = {0}; int j; IO_STATUS_BLOCK Iosb1; NTSTATUS Status1; if (argc > 1) { sscanf(argv[1],"%d",&numberToRead); if (argc > 2) { sscanf(argv[2],"%d",&useBaud); if (argc > 3) { myPort = argv[3]; } } } if ((hFile = CreateFile( myPort, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL )) == ((HANDLE)-1)) { printf("Couldn't open the comm port\n"); exit(1); } to.ReadIntervalTimeout = 1000; to.ReadTotalTimeoutConstant = 20000; if (!SetCommTimeouts( hFile, &to )) { printf("Couldn't set the timeouts\n"); exit(1); } // // We've successfully opened the file. Set the state of // the comm device. First we get the old values and // adjust to our own. // if (!GetCommState( hFile, &myDcb )) { printf("Couldn't get the comm state: %d\n",GetLastError()); exit(1); } myDcb.BaudRate = useBaud; myDcb.ByteSize = 8; myDcb.Parity = NOPARITY; myDcb.StopBits = ONESTOPBIT; // // Make sure that no flow control is turned on. // myDcb.fOutxDsrFlow = FALSE; myDcb.fOutxCtsFlow = FALSE; myDcb.fDsrSensitivity = FALSE; myDcb.fOutX = FALSE; myDcb.fInX = FALSE; myDcb.fDtrControl = DTR_CONTROL_DISABLE; myDcb.fRtsControl = RTS_CONTROL_DISABLE; if (!SetCommState( hFile, &myDcb )) { printf("Couldn't set the comm state.\n"); exit(1); } // // Start up the insert ioctl. // Status1 = NtDeviceIoControlFile( hFile, NULL, NULL, NULL, &Iosb1, IOCTL_SERIAL_LSRMST_INSERT, &escapeChar, sizeof(unsigned char), NULL, 0 ); if (!NT_SUCCESS(Status1)) { printf("1: Non pending status: %x\n",Status1); exit(1); } if (!ReadFile( hFile, &readBuff[0], 64000, &numberActuallyRead, NULL )) { printf("bad status on read: %d\n",GetLastError()); exit(1); } printf("We actually read %d characters\n",numberActuallyRead); // // We got the characters back. Dump each character to the stdout. // for ( j = 0; j < numberActuallyRead; ) { if (readBuff[j] != escapeChar) { printf("Normal Char: %x\n",readBuff[j]); j++; } else { if (j+1 == numberActuallyRead) { printf("Terminated with the escape char!!!\n"); exit(1); } // // We have the escape char. interpret it. // if (readBuff[j+1] == SERIAL_LSRMST_ESCAPE) { printf("Escaped escape char: %x\n",escapeChar); j += 2; } else if (readBuff[j+1] == SERIAL_LSRMST_LSR_DATA) { printf("LSR reg: %x AND data: %x\n",readBuff[j+2],readBuff[j+3]); j += 4; } else if (readBuff[j+1] == SERIAL_LSRMST_LSR_NODATA) { printf("LSR reg: %x NO DATA\n",readBuff[j+2]); j += 3; } else if (readBuff[j+1] == SERIAL_LSRMST_MST) { printf("MST reg: %x\n",readBuff[j+2]); j += 3; } else { printf("Unknown escape code: %d\n",readBuff[j+1]); j++; } } } }