221 lines
4.3 KiB
C
221 lines
4.3 KiB
C
//
|
|
// This test the line status and modem status insertion.
|
|
//
|
|
|
|
#include <string.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#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++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|