#include #include #include #include "windows.h" #define FAILURE printf("FAIL: %d\n",__LINE__);exit(1) int __cdecl main(int argc,char *argv[]) { HANDLE hFile; char *myPort = "COM1"; COMMCONFIG myConf,spareConf; DWORD sizeOfConf; DCB myDcb,spareDcb; if (argc > 1) { myPort = argv[1]; } if ((hFile = CreateFile( myPort, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL )) == ((HANDLE)-1)) { FAILURE; } if (!GetCommConfig( hFile, NULL, &sizeOfConf )) { FAILURE; } if (!sizeOfConf) { FAILURE; } if (sizeOfConf != sizeof(COMMCONFIG)) { FAILURE; } if (!GetCommState( hFile, &myDcb )) { FAILURE; } RtlZeroMemory( &myConf, sizeOfConf ); myConf.dwSize = sizeOfConf; if (!GetCommConfig( hFile, &myConf, &sizeOfConf )) { FAILURE; } if (memcmp(&myConf.dcb,&myDcb,sizeof(DCB))) { FAILURE; } if (myConf.dwSize != sizeof(COMMCONFIG)) { FAILURE; } if (myConf.wVersion != 0) { FAILURE; } if (myConf.pProviderSubType != 0) { FAILURE; } if (myConf.dwProviderOffset != 0) { FAILURE; } if (myConf.dwProviderSize != 0) { FAILURE; } if (myConf.wcProviderData[1]) { FAILURE; } // // Make sure the commconfig has not changed after a call to set // and that the comm state is also the same. // spareConf = myConf; spareDcb = myDcb; if (!SetCommConfig( hFile, (PVOID)&myConf, sizeOfConf )) { FAILURE; } if (memcmp(&spareConf,&myConf,sizeof(COMMCONFIG))) { FAILURE; } if (!GetCommState( hFile, &myDcb )) { FAILURE; } if (memcmp(&spareDcb,&myDcb,sizeof(DCB))) { FAILURE; } return 1; }