Introduction
During testing we uncovered a bug in the standard serial driver of Windows 2000.
If you do a ReadFile() with a certain timeout value and you set the date/time backwards while this timeout has not yet occurred then you can wait a until the specified date/time is reached again before the call returns.
This means that the serial driver uses an absolute date/time instead of a relative time for its timeout. This is a serious problem for everyone doing serial communication especially in daylight saving areas.
This problem was found in Windows 2000 / SP1 with the standard serial port driver.
Just run the following code and change the date/time backwards to see the problem:
#include <windows.h>
#include <stdio.h>
#include <conio.h>
int main(void)
{
COMMTIMEOUTS timeouts;
HANDLE handle;
DCB dcb;
char buffer[1000] = "abcdefghijklmnopqrstuvwxyz";
DWORD dwLen;
handle = CreateFile("\\\\.\\COM1", GENERIC_READ | GENERIC_WRITE,
0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (handle == INVALID_HANDLE_VALUE)
{
printf("CreateFile() Failed\n");
return 1;
}
timeouts.ReadIntervalTimeout = 300;
timeouts.ReadTotalTimeoutMultiplier = 0;
timeouts.ReadTotalTimeoutConstant = 0;
timeouts.WriteTotalTimeoutMultiplier= 0;
timeouts.WriteTotalTimeoutConstant = 0;
if (!SetCommTimeouts(handle, &timeouts))
{
printf("SetCommTimeouts() Failed\n");
return 2;
}
ZeroMemory(&dcb, sizeof(dcb));
dcb.DCBlength = sizeof(dcb);
dcb.BaudRate = 19200;
dcb.fParity = TRUE;
dcb.fOutxCtsFlow = false;
dcb.fOutxDsrFlow = false;
dcb.fDtrControl = DTR_CONTROL_ENABLE;
dcb.fDsrSensitivity = FALSE;
dcb.fTXContinueOnXoff = FALSE;
dcb.fOutX = false;
dcb.fInX = false;
dcb.fNull = FALSE;
dcb.fRtsControl = RTS_CONTROL_ENABLE;
dcb.fAbortOnError = false;
dcb.ByteSize = 8;
dcb.Parity = ODDPARITY;
dcb.StopBits = ONESTOPBIT;
if (!SetCommState(handle, &dcb))
{
printf("SetCommState() Failed\n");
return 1;
}
while (! _kbhit() )
{
printf("W");
if (!WriteFile(handle, buffer, 40, &dwLen, 0))
printf("\rWriteFile() returned %d\n", GetLastError());
printf("R");
if ( !ReadFile(handle, buffer, 100, &dwLen, 0) )
printf("\rReadFile() returned %d\n", GetLastError());
}
printf("\nDone!\n");
CloseHandle(handle);
return 0;
}
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.