2 * ReactOS mode console command
6 * Copyright (C) 2002 Robert Dickenson <robd@reactos.org>
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
26 #define MAX_PORTNAME_LEN 20
27 #define MAX_COMPORT_NUM 10
28 #define MAX_COMPARAM_LEN 20
30 #define NUM_ELEMENTS(a) (sizeof(a)/sizeof(a[0]))
33 const WCHAR
* const usage_strings
[] =
35 L
"Device Status: MODE [device] [/STATUS]",
36 L
"Select code page: MODE CON[:] CP SELECT=yyy",
37 L
"Code page status: MODE CON[:] CP [/STATUS]",
38 L
"Display mode: MODE CON[:] [COLS=c] [LINES=n]",
39 L
"Typematic rate: MODE CON[:] [RATE=r DELAY=d]",
40 L
"Redirect printing: MODE LPTn[:]=COMm[:]",
41 L
"Serial port: MODE COMm[:] [BAUD=b] [PARITY=p] [DATA=d] [STOP=s]\n" \
42 L
" [to=on|off] [xon=on|off] [odsr=on|off]\n" \
43 L
" [octs=on|off] [dtr=on|off|hs]\n" \
44 L
" [rts=on|off|hs|tg] [idsr=on|off]",
47 const WCHAR
* const parity_strings
[] =
50 L
"Odd", // only symbol in this set to have a 'd' in it
51 L
"Even", // ... 'v' in it
52 L
"Mark", // ... 'm' in it
53 L
"Space" // ... 's' and/or a 'c' in it
56 const WCHAR
* const control_strings
[] = { L
"OFF", L
"ON", L
"HANDSHAKE", L
"TOGGLE" };
58 const WCHAR
* const stopbit_strings
[] = { L
"1", L
"1.5", L
"2" };
65 wprintf(L
"\nConfigures system devices.\n\n");
66 for (i
= 0; i
< NUM_ELEMENTS(usage_strings
); i
++)
68 wprintf(L
"%s\n", usage_strings
[i
]);
81 if (QueryDosDeviceW(NULL
, buffer
, NUM_ELEMENTS(buffer
)))
86 if (wcsstr(ptr
, L
"COM"))
88 wprintf(L
" Found serial device - %s\n", ptr
);
90 else if (wcsstr(ptr
, L
"PRN"))
92 wprintf(L
" Found printer device - %s\n", ptr
);
94 else if (wcsstr(ptr
, L
"LPT"))
96 wprintf(L
" Found parallel device - %s\n", ptr
);
100 // wprintf(L" Found other device - %s\n", ptr);
107 wprintf(L
" ERROR: QueryDosDeviceW(...) failed: 0x%lx\n", GetLastError());
112 int ShowParallelStatus(int nPortNum
)
115 WCHAR szPortName
[MAX_PORTNAME_LEN
];
117 swprintf(szPortName
, L
"LPT%d", nPortNum
);
118 wprintf(L
"\nStatus for device LPT%d:\n", nPortNum
);
119 wprintf(L
"-----------------------\n");
120 if (QueryDosDeviceW(szPortName
, buffer
, NUM_ELEMENTS(buffer
)))
122 WCHAR
* ptr
= wcsrchr(buffer
, L
'\\');
125 if (0 == wcscmp(szPortName
, ++ptr
))
127 wprintf(L
" Printer output is not being rerouted.\n");
131 wprintf(L
" Printer output is being rerouted to serial port %s\n", ptr
);
137 wprintf(L
" QueryDosDeviceW(%s) returned unrecognised form %s.\n", szPortName
, buffer
);
142 wprintf(L
" ERROR: QueryDosDeviceW(%s) failed: 0x%lx\n", szPortName
, GetLastError());
147 int ShowConsoleStatus()
151 CONSOLE_SCREEN_BUFFER_INFO ConsoleScreenBufferInfo
;
152 HANDLE hConsoleOutput
= GetStdHandle(STD_OUTPUT_HANDLE
);
154 wprintf(L
"\nStatus for device CON:\n");
155 wprintf(L
"-----------------------\n");
156 if (GetConsoleScreenBufferInfo(hConsoleOutput
, &ConsoleScreenBufferInfo
))
158 wprintf(L
" Lines: %d\n", ConsoleScreenBufferInfo
.dwSize
.Y
);
159 wprintf(L
" Columns: %d\n", ConsoleScreenBufferInfo
.dwSize
.X
);
161 if (SystemParametersInfo(SPI_GETKEYBOARDDELAY
, 0, &dwKbdDelay
, 0))
163 wprintf(L
" Keyboard delay: %ld\n", dwKbdDelay
);
165 if (SystemParametersInfo(SPI_GETKEYBOARDSPEED
, 0, &dwKbdSpeed
, 0))
167 wprintf(L
" Keyboard rate: %ld\n", dwKbdSpeed
);
169 wprintf(L
" Code page: %d\n", GetConsoleOutputCP());
174 BOOL
SerialPortQuery(int nPortNum
, LPDCB pDCB
, LPCOMMTIMEOUTS pCommTimeouts
, BOOL bWrite
)
178 WCHAR szPortName
[MAX_PORTNAME_LEN
];
181 ASSERT(pCommTimeouts
);
183 swprintf(szPortName
, L
"COM%d", nPortNum
);
184 hPort
= CreateFileW(szPortName
,
185 GENERIC_READ
| GENERIC_WRITE
,
190 NULL
); // no template
192 if (hPort
== INVALID_HANDLE_VALUE
)
194 wprintf(L
"Illegal device name - %s\n", szPortName
);
195 wprintf(L
"Last error = 0x%lx\n", GetLastError());
199 result
= bWrite
? SetCommState(hPort
, pDCB
)
200 : GetCommState(hPort
, pDCB
);
203 wprintf(L
"Failed to %s the status for device COM%d:\n", bWrite
? L
"set" : L
"get", nPortNum
);
208 result
= bWrite
? SetCommTimeouts(hPort
, pCommTimeouts
)
209 : GetCommTimeouts(hPort
, pCommTimeouts
);
212 wprintf(L
"Failed to %s Timeout status for device COM%d:\n", bWrite
? L
"set" : L
"get", nPortNum
);
220 int ShowSerialStatus(int nPortNum
)
223 COMMTIMEOUTS CommTimeouts
;
225 if (!SerialPortQuery(nPortNum
, &dcb
, &CommTimeouts
, FALSE
))
229 if (dcb
.Parity
> NUM_ELEMENTS(parity_strings
))
231 wprintf(L
"ERROR: Invalid value for Parity Bits %d:\n", dcb
.Parity
);
234 if (dcb
.StopBits
> NUM_ELEMENTS(stopbit_strings
))
236 wprintf(L
"ERROR: Invalid value for Stop Bits %d:\n", dcb
.StopBits
);
239 wprintf(L
"\nStatus for device COM%d:\n", nPortNum
);
240 wprintf(L
"-----------------------\n");
241 wprintf(L
" Baud: %ld\n", dcb
.BaudRate
);
242 wprintf(L
" Parity: %s\n", parity_strings
[dcb
.Parity
]);
243 wprintf(L
" Data Bits: %d\n", dcb
.ByteSize
);
244 wprintf(L
" Stop Bits: %s\n", stopbit_strings
[dcb
.StopBits
]);
245 wprintf(L
" Timeout: %s\n", CommTimeouts
.ReadIntervalTimeout
? L
"ON" : L
"OFF");
246 wprintf(L
" XON/XOFF: %s\n", dcb
.fOutX
? L
"ON" : L
"OFF");
247 wprintf(L
" CTS handshaking: %s\n", dcb
.fOutxCtsFlow
? L
"ON" : L
"OFF");
248 wprintf(L
" DSR handshaking: %s\n", dcb
.fOutxDsrFlow
? L
"ON" : L
"OFF");
249 wprintf(L
" DSR sensitivity: %s\n", dcb
.fDsrSensitivity
? L
"ON" : L
"OFF");
250 wprintf(L
" DTR circuit: %s\n", control_strings
[dcb
.fDtrControl
]);
251 wprintf(L
" RTS circuit: %s\n", control_strings
[dcb
.fRtsControl
]);
255 int SetParallelState(int nPortNum
)
257 WCHAR szPortName
[MAX_PORTNAME_LEN
];
258 WCHAR szTargetPath
[MAX_PORTNAME_LEN
];
260 swprintf(szPortName
, L
"LPT%d", nPortNum
);
261 swprintf(szTargetPath
, L
"COM%d", nPortNum
);
262 if (!DefineDosDeviceW(DDD_REMOVE_DEFINITION
, szPortName
, szTargetPath
))
264 wprintf(L
"SetParallelState(%d) - DefineDosDevice(%s) failed: 0x%lx\n", nPortNum
, szPortName
, GetLastError());
271 \Device\NamedPipe\Spooler\LPT1
272 BOOL DefineDosDevice(
273 DWORD dwFlags, // options
274 LPCTSTR lpDeviceName, // device name
275 LPCTSTR lpTargetPath // path string
277 DWORD QueryDosDevice(
278 LPCTSTR lpDeviceName, // MS-DOS device name string
279 LPTSTR lpTargetPath, // query results buffer
280 DWORD ucchMax // maximum size of buffer
284 int SetConsoleState()
287 "Select code page: MODE CON[:] CP SELECT=yyy",
288 "Code page status: MODE CON[:] CP [/STATUS]",
289 "Display mode: MODE CON[:] [COLS=c] [LINES=n]",
290 "Typematic rate: MODE CON[:] [RATE=r DELAY=d]",
296 int ExtractModeSerialParams(const WCHAR
* param
)
298 if (wcsstr(param
, L
"OFF"))
300 else if (wcsstr(param
, L
"ON"))
302 else if (wcsstr(param
, L
"HS"))
304 else if (wcsstr(param
, L
"TG"))
310 int SetSerialState(int nPortNum
, int args
, WCHAR
*argv
[])
315 COMMTIMEOUTS CommTimeouts
;
316 WCHAR buf
[MAX_COMPARAM_LEN
+1];
318 if (SerialPortQuery(nPortNum
, &dcb
, &CommTimeouts
, FALSE
))
320 for (arg
= 2; arg
< args
; arg
++)
322 if (wcslen(argv
[arg
]) > MAX_COMPARAM_LEN
)
324 wprintf(L
"Invalid parameter (too long) - %s\n", argv
[arg
]);
327 wcscpy(buf
, argv
[arg
]);
329 if (wcsstr(buf
, L
"baud="))
331 wscanf(buf
+5, L
"%lu", &dcb
.BaudRate
);
333 else if (wcsstr(buf
, L
"parity="))
335 if (wcschr(buf
, L
'D'))
337 else if (wcschr(buf
, L
'V'))
339 else if (wcschr(buf
, L
'M'))
341 else if (wcschr(buf
, L
'S'))
346 else if (wcsstr(buf
, L
"data="))
348 wscanf(buf
+5, L
"%lu", &dcb
.ByteSize
);
350 else if (wcsstr(buf
, L
"stop="))
352 if (wcschr(buf
, L
'5'))
354 else if (wcschr(buf
, L
'2'))
359 else if (wcsstr(buf
, L
"to=")) // to=on|off
361 value
= ExtractModeSerialParams(buf
);
367 goto invalid_serial_parameter
;
370 else if (wcsstr(buf
, L
"xon=")) // xon=on|off
372 value
= ExtractModeSerialParams(buf
);
380 goto invalid_serial_parameter
;
383 else if (wcsstr(buf
, L
"odsr=")) // odsr=on|off
385 value
= ExtractModeSerialParams(buf
);
388 dcb
.fOutxDsrFlow
= value
;
392 goto invalid_serial_parameter
;
395 else if (wcsstr(buf
, L
"octs=")) // octs=on|off
397 value
= ExtractModeSerialParams(buf
);
400 dcb
.fOutxCtsFlow
= value
;
404 goto invalid_serial_parameter
;
407 else if (wcsstr(buf
, L
"dtr=")) // dtr=on|off|hs
409 value
= ExtractModeSerialParams(buf
);
412 dcb
.fDtrControl
= value
;
416 goto invalid_serial_parameter
;
419 else if (wcsstr(buf
, L
"rts=")) // rts=on|off|hs|tg
421 value
= ExtractModeSerialParams(buf
);
424 dcb
.fRtsControl
= value
;
428 goto invalid_serial_parameter
;
431 else if (wcsstr(buf
, L
"idsr=")) // idsr=on|off
433 value
= ExtractModeSerialParams(buf
);
436 dcb
.fDsrSensitivity
= value
;
440 goto invalid_serial_parameter
;
445 invalid_serial_parameter
:;
446 wprintf(L
"Invalid parameter - %s\n", buf
);
450 SerialPortQuery(nPortNum
, &dcb
, &CommTimeouts
, TRUE
);
455 int find_portnum(const WCHAR
* cmdverb
)
459 if (cmdverb
[3] >= L
'0' && cmdverb
[3] <= L
'9')
461 portnum
= cmdverb
[3] - L
'0';
462 if (cmdverb
[4] >= L
'0' && cmdverb
[4] <= L
'9')
465 portnum
+= cmdverb
[4] - L
'0';
471 int wmain(int argc
, WCHAR
* argv
[])
474 WCHAR param1
[MAX_COMPARAM_LEN
+1];
475 WCHAR param2
[MAX_COMPARAM_LEN
+1];
479 if (wcslen(argv
[1]) > MAX_COMPARAM_LEN
)
481 wprintf(L
"Invalid parameter (too long) - %s\n", argv
[1]);
484 wcscpy(param1
, argv
[1]);
488 if (wcslen(argv
[2]) > MAX_COMPARAM_LEN
)
490 wprintf(L
"Invalid parameter (too long) - %s\n", argv
[2]);
493 wcscpy(param2
, argv
[2]);
500 if (wcsstr(param1
, L
"/?") || wcsstr(param1
, L
"-?"))
504 else if (wcsstr(param1
, L
"/status"))
508 else if (wcsstr(param1
, L
"lpt"))
510 nPortNum
= find_portnum(param1
);
512 return ShowParallelStatus(nPortNum
);
514 else if (wcsstr(param1
, L
"con"))
516 return ShowConsoleStatus();
518 else if (wcsstr(param1
, L
"com"))
520 nPortNum
= find_portnum(param1
);
523 if (param2
[0] == L
'\0' || wcsstr(param2
, L
"/status"))
525 return ShowSerialStatus(nPortNum
);
529 return SetSerialState(nPortNum
, argc
, argv
);
533 wprintf(L
"Invalid parameter - %s\n", param1
);
542 ShowParallelStatus(1);
543 for (nPortNum = 0; nPortNum < MAX_COMPORT_NUM; nPortNum++)
545 ShowSerialStatus(nPortNum + 1);