+ WINBOOL result = FALSE;
+ DWORD dwBytesReturned;
+
+ SERIAL_BAUD_RATE BaudRate;
+ SERIAL_HANDFLOW HandFlow;
+ SERIAL_CHARS SpecialChars;
+ SERIAL_LINE_CONTROL LineControl;
+
+ DPRINT("SetCommState(%d, %p) - ENTERED\n", hFile, lpDCB);
+
+ if (hFile == INVALID_HANDLE_VALUE) {
+ DPRINT("SetCommState() - ERROR: INVALID_HANDLE_VALUE\n");
+ return FALSE;
+ }
+ if (lpDCB == NULL) {
+ DPRINT("SetCommState() - ERROR: NULL DCB pointer passed\n");
+ return FALSE;
+ }
+
+ BaudRate.BaudRate = lpDCB->BaudRate;
+ result = DeviceIoControl(hFile, IOCTL_SERIAL_SET_BAUD_RATE,
+ &BaudRate, sizeof(BaudRate), NULL, 0, &dwBytesReturned, NULL);
+ if (!NT_SUCCESS(result)) {
+ DPRINT("ERROR: SetCommState() - DeviceIoControl(IOCTL_SERIAL_SET_BAUD_RATE) Failed.\n");
+ return FALSE;
+ }
+/*
+#define SERIAL_DTR_MASK ((ULONG)0x03)
+#define SERIAL_DTR_CONTROL ((ULONG)0x01)
+#define SERIAL_DTR_HANDSHAKE ((ULONG)0x02)
+#define SERIAL_CTS_HANDSHAKE ((ULONG)0x08)
+#define SERIAL_DSR_HANDSHAKE ((ULONG)0x10)
+#define SERIAL_DCD_HANDSHAKE ((ULONG)0x20)
+#define SERIAL_OUT_HANDSHAKEMASK ((ULONG)0x38)
+#define SERIAL_DSR_SENSITIVITY ((ULONG)0x40)
+#define SERIAL_ERROR_ABORT ((ULONG)0x80000000)
+#define SERIAL_CONTROL_INVALID ((ULONG)0x7fffff84)
+ */
+ HandFlow.ControlHandShake = 0;
+
+ if (lpDCB->fOutxCtsFlow) {
+ HandFlow.ControlHandShake |= SERIAL_CTS_HANDSHAKE;
+ }
+ if (lpDCB->fOutxDsrFlow) {
+ HandFlow.ControlHandShake |= SERIAL_DSR_HANDSHAKE;
+ }
+ if (lpDCB->fDtrControl) {
+ HandFlow.ControlHandShake |= SERIAL_DTR_CONTROL;
+ }
+ if (lpDCB->fDtrControl) {
+ HandFlow.ControlHandShake |= SERIAL_DTR_HANDSHAKE;
+ }
+ if (lpDCB->fRtsControl) {
+ HandFlow.ControlHandShake |= SERIAL_RTS_CONTROL;
+ }
+ if (lpDCB->fRtsControl) {
+ HandFlow.ControlHandShake |= SERIAL_RTS_HANDSHAKE;
+ }
+ if (lpDCB->fDsrSensitivity) {
+ HandFlow.ControlHandShake |= SERIAL_DSR_SENSITIVITY;
+ }
+ if (lpDCB->fAbortOnError) {
+ HandFlow.ControlHandShake |= SERIAL_ERROR_ABORT;
+ }
+/*
+#define SERIAL_AUTO_TRANSMIT ((ULONG)0x01)
+#define SERIAL_AUTO_RECEIVE ((ULONG)0x02)
+#define SERIAL_ERROR_CHAR ((ULONG)0x04)
+#define SERIAL_NULL_STRIPPING ((ULONG)0x08)
+#define SERIAL_BREAK_CHAR ((ULONG)0x10)
+#define SERIAL_RTS_MASK ((ULONG)0xc0)
+#define SERIAL_RTS_CONTROL ((ULONG)0x40)
+#define SERIAL_RTS_HANDSHAKE ((ULONG)0x80)
+#define SERIAL_TRANSMIT_TOGGLE ((ULONG)0xc0)
+#define SERIAL_XOFF_CONTINUE ((ULONG)0x80000000)
+#define SERIAL_FLOW_INVALID ((ULONG)0x7fffff20)
+ */
+ HandFlow.FlowReplace = 0;
+ if (lpDCB->fErrorChar) {
+ HandFlow.FlowReplace |= SERIAL_ERROR_CHAR;
+ }
+ if (lpDCB->fNull) {
+ HandFlow.FlowReplace |= SERIAL_NULL_STRIPPING;
+ }
+ if (lpDCB->fTXContinueOnXoff) {
+ HandFlow.FlowReplace |= SERIAL_XOFF_CONTINUE;
+ }
+ HandFlow.XonLimit = lpDCB->XonLim;
+ HandFlow.XoffLimit = lpDCB->XoffLim;
+ result = DeviceIoControl(hFile, IOCTL_SERIAL_SET_HANDFLOW,
+ &HandFlow, sizeof(HandFlow), NULL, 0, &dwBytesReturned, NULL);
+ if (!NT_SUCCESS(result)) {
+ DPRINT("ERROR: SetCommState() - DeviceIoControl(IOCTL_SERIAL_SET_HANDFLOW) Failed.\n");
+ return FALSE;
+ }
+
+ SpecialChars.EofChar = lpDCB->EofChar;
+ SpecialChars.ErrorChar = lpDCB->ErrorChar;
+ SpecialChars.BreakChar = 0;
+ SpecialChars.EventChar = lpDCB->EvtChar;
+ SpecialChars.XonChar = lpDCB->XonChar;
+ SpecialChars.XoffChar = lpDCB->XoffChar;
+ result = DeviceIoControl(hFile, IOCTL_SERIAL_SET_CHARS,
+ &SpecialChars, sizeof(SpecialChars), NULL, 0, &dwBytesReturned, NULL);
+ if (!NT_SUCCESS(result)) {
+ DPRINT("ERROR: SetCommState() - DeviceIoControl(IOCTL_SERIAL_SET_CHARS) Failed.\n");
+ return FALSE;
+ }
+
+ LineControl.StopBits = lpDCB->StopBits;
+ LineControl.Parity = lpDCB->Parity;
+ LineControl.WordLength = lpDCB->ByteSize;
+ result = DeviceIoControl(hFile, IOCTL_SERIAL_SET_LINE_CONTROL,
+ &LineControl, sizeof(LineControl), NULL, 0, &dwBytesReturned, NULL);
+ if (!NT_SUCCESS(result)) {
+ DPRINT("ERROR: SetCommState() - DeviceIoControl(IOCTL_SERIAL_SET_LINE_CONTROL) Failed.\n");
+ return FALSE;
+ }
+
+ DPRINT("SetCommState() - COMPLETED SUCCESSFULLY\n");
+ return TRUE;