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.
29 #define MAX_PORTNAME_LEN 20
30 #define MAX_COMPORT_NUM 10
31 #define MAX_COMPARAM_LEN 20
35 const WCHAR
* const usage_strings
[] =
37 L
"Device Status: MODE [device] [/STATUS]",
38 L
"Select code page: MODE CON[:] CP SELECT=yyy",
39 L
"Code page status: MODE CON[:] CP [/STATUS]",
40 L
"Display mode: MODE CON[:] [COLS=c] [LINES=n]",
41 L
"Typematic rate: MODE CON[:] [RATE=r DELAY=d]",
42 L
"Redirect printing: MODE LPTn[:]=COMm[:]",
43 L
"Serial port: MODE COMm[:] [BAUD=b] [PARITY=p] [DATA=d] [STOP=s]\n" \
44 L
" [to=on|off] [xon=on|off] [odsr=on|off]\n" \
45 L
" [octs=on|off] [dtr=on|off|hs]\n" \
46 L
" [rts=on|off|hs|tg] [idsr=on|off]",
49 const WCHAR
* const parity_strings
[] =
52 L
"Odd", // only symbol in this set to have a 'd' in it
53 L
"Even", // ... 'v' in it
54 L
"Mark", // ... 'm' in it
55 L
"Space" // ... 's' and/or a 'c' in it
58 const WCHAR
* const control_strings
[] = { L
"OFF", L
"ON", L
"HANDSHAKE", L
"TOGGLE" };
60 const WCHAR
* const stopbit_strings
[] = { L
"1", L
"1.5", L
"2" };
67 wprintf(L
"\nConfigures system devices.\n\n");
68 for (i
= 0; i
< ARRAYSIZE(usage_strings
); i
++)
70 wprintf(L
"%s\n", usage_strings
[i
]);
83 if (QueryDosDeviceW(NULL
, buffer
, ARRAYSIZE(buffer
)))
88 if (wcsstr(ptr
, L
"COM"))
90 wprintf(L
" Found serial device - %s\n", ptr
);
92 else if (wcsstr(ptr
, L
"PRN"))
94 wprintf(L
" Found printer device - %s\n", ptr
);
96 else if (wcsstr(ptr
, L
"LPT"))
98 wprintf(L
" Found parallel device - %s\n", ptr
);
102 // wprintf(L" Found other device - %s\n", ptr);
109 wprintf(L
" ERROR: QueryDosDeviceW(...) failed: 0x%lx\n", GetLastError());
114 int ShowParallelStatus(int nPortNum
)
117 WCHAR szPortName
[MAX_PORTNAME_LEN
];
119 swprintf(szPortName
, L
"LPT%d", nPortNum
);
120 wprintf(L
"\nStatus for device LPT%d:\n", nPortNum
);
121 wprintf(L
"-----------------------\n");
122 if (QueryDosDeviceW(szPortName
, buffer
, ARRAYSIZE(buffer
)))
124 WCHAR
* ptr
= wcsrchr(buffer
, L
'\\');
127 if (0 == wcscmp(szPortName
, ++ptr
))
129 wprintf(L
" Printer output is not being rerouted.\n");
133 wprintf(L
" Printer output is being rerouted to serial port %s\n", ptr
);
139 wprintf(L
" QueryDosDeviceW(%s) returned unrecognised form %s.\n", szPortName
, buffer
);
144 wprintf(L
" ERROR: QueryDosDeviceW(%s) failed: 0x%lx\n", szPortName
, GetLastError());
149 int ShowConsoleStatus()
153 CONSOLE_SCREEN_BUFFER_INFO ConsoleScreenBufferInfo
;
154 HANDLE hConsoleOutput
= GetStdHandle(STD_OUTPUT_HANDLE
);
156 wprintf(L
"\nStatus for device CON:\n");
157 wprintf(L
"-----------------------\n");
158 if (GetConsoleScreenBufferInfo(hConsoleOutput
, &ConsoleScreenBufferInfo
))
160 wprintf(L
" Lines: %d\n", ConsoleScreenBufferInfo
.dwSize
.Y
);
161 wprintf(L
" Columns: %d\n", ConsoleScreenBufferInfo
.dwSize
.X
);
163 if (SystemParametersInfo(SPI_GETKEYBOARDDELAY
, 0, &dwKbdDelay
, 0))
165 wprintf(L
" Keyboard delay: %ld\n", dwKbdDelay
);
167 if (SystemParametersInfo(SPI_GETKEYBOARDSPEED
, 0, &dwKbdSpeed
, 0))
169 wprintf(L
" Keyboard rate: %ld\n", dwKbdSpeed
);
171 wprintf(L
" Code page: %d\n", GetConsoleOutputCP());
176 BOOL
SerialPortQuery(int nPortNum
, LPDCB pDCB
, LPCOMMTIMEOUTS pCommTimeouts
, BOOL bWrite
)
180 WCHAR szPortName
[MAX_PORTNAME_LEN
];
183 ASSERT(pCommTimeouts
);
185 swprintf(szPortName
, L
"COM%d", nPortNum
);
186 hPort
= CreateFileW(szPortName
,
187 GENERIC_READ
| GENERIC_WRITE
,
192 NULL
); // no template
194 if (hPort
== INVALID_HANDLE_VALUE
)
196 wprintf(L
"Illegal device name - %s\n", szPortName
);
197 wprintf(L
"Last error = 0x%lx\n", GetLastError());
201 result
= bWrite
? SetCommState(hPort
, pDCB
)
202 : GetCommState(hPort
, pDCB
);
205 wprintf(L
"Failed to %s the status for device COM%d:\n", bWrite
? L
"set" : L
"get", nPortNum
);
210 result
= bWrite
? SetCommTimeouts(hPort
, pCommTimeouts
)
211 : GetCommTimeouts(hPort
, pCommTimeouts
);
214 wprintf(L
"Failed to %s Timeout status for device COM%d:\n", bWrite
? L
"set" : L
"get", nPortNum
);
222 int ShowSerialStatus(int nPortNum
)
225 COMMTIMEOUTS CommTimeouts
;
227 if (!SerialPortQuery(nPortNum
, &dcb
, &CommTimeouts
, FALSE
))
231 if (dcb
.Parity
>= ARRAYSIZE(parity_strings
))
233 wprintf(L
"ERROR: Invalid value for Parity Bits %d:\n", dcb
.Parity
);
236 if (dcb
.StopBits
>= ARRAYSIZE(stopbit_strings
))
238 wprintf(L
"ERROR: Invalid value for Stop Bits %d:\n", dcb
.StopBits
);
241 wprintf(L
"\nStatus for device COM%d:\n", nPortNum
);
242 wprintf(L
"-----------------------\n");
243 wprintf(L
" Baud: %ld\n", dcb
.BaudRate
);
244 wprintf(L
" Parity: %s\n", parity_strings
[dcb
.Parity
]);
245 wprintf(L
" Data Bits: %d\n", dcb
.ByteSize
);
246 wprintf(L
" Stop Bits: %s\n", stopbit_strings
[dcb
.StopBits
]);
247 wprintf(L
" Timeout: %s\n", CommTimeouts
.ReadIntervalTimeout
? L
"ON" : L
"OFF");
248 wprintf(L
" XON/XOFF: %s\n", dcb
.fOutX
? L
"ON" : L
"OFF");
249 wprintf(L
" CTS handshaking: %s\n", dcb
.fOutxCtsFlow
? L
"ON" : L
"OFF");
250 wprintf(L
" DSR handshaking: %s\n", dcb
.fOutxDsrFlow
? L
"ON" : L
"OFF");
251 wprintf(L
" DSR sensitivity: %s\n", dcb
.fDsrSensitivity
? L
"ON" : L
"OFF");
252 wprintf(L
" DTR circuit: %s\n", control_strings
[dcb
.fDtrControl
]);
253 wprintf(L
" RTS circuit: %s\n", control_strings
[dcb
.fRtsControl
]);
257 int SetParallelState(int nPortNum
)
259 WCHAR szPortName
[MAX_PORTNAME_LEN
];
260 WCHAR szTargetPath
[MAX_PORTNAME_LEN
];
262 swprintf(szPortName
, L
"LPT%d", nPortNum
);
263 swprintf(szTargetPath
, L
"COM%d", nPortNum
);
264 if (!DefineDosDeviceW(DDD_REMOVE_DEFINITION
, szPortName
, szTargetPath
))
266 wprintf(L
"SetParallelState(%d) - DefineDosDevice(%s) failed: 0x%lx\n", nPortNum
, szPortName
, GetLastError());
273 \Device\NamedPipe\Spooler\LPT1
274 BOOL DefineDosDevice(
275 DWORD dwFlags, // options
276 LPCTSTR lpDeviceName, // device name
277 LPCTSTR lpTargetPath // path string
279 DWORD QueryDosDevice(
280 LPCTSTR lpDeviceName, // MS-DOS device name string
281 LPTSTR lpTargetPath, // query results buffer
282 DWORD ucchMax // maximum size of buffer
286 int SetConsoleState()
289 "Select code page: MODE CON[:] CP SELECT=yyy",
290 "Code page status: MODE CON[:] CP [/STATUS]",
291 "Display mode: MODE CON[:] [COLS=c] [LINES=n]",
292 "Typematic rate: MODE CON[:] [RATE=r DELAY=d]",
298 int ExtractModeSerialParams(const WCHAR
* param
)
300 if (wcsstr(param
, L
"OFF"))
302 else if (wcsstr(param
, L
"ON"))
304 else if (wcsstr(param
, L
"HS"))
306 else if (wcsstr(param
, L
"TG"))
312 int SetSerialState(int nPortNum
, int args
, WCHAR
*argv
[])
317 COMMTIMEOUTS CommTimeouts
;
318 WCHAR buf
[MAX_COMPARAM_LEN
+1];
320 if (SerialPortQuery(nPortNum
, &dcb
, &CommTimeouts
, FALSE
))
322 for (arg
= 2; arg
< args
; arg
++)
324 if (wcslen(argv
[arg
]) > MAX_COMPARAM_LEN
)
326 wprintf(L
"Invalid parameter (too long) - %s\n", argv
[arg
]);
329 wcscpy(buf
, argv
[arg
]);
331 if (wcsstr(buf
, L
"baud="))
333 wscanf(buf
+5, L
"%lu", &dcb
.BaudRate
);
335 else if (wcsstr(buf
, L
"parity="))
337 if (wcschr(buf
, L
'D'))
339 else if (wcschr(buf
, L
'V'))
341 else if (wcschr(buf
, L
'M'))
343 else if (wcschr(buf
, L
'S'))
348 else if (wcsstr(buf
, L
"data="))
350 wscanf(buf
+5, L
"%lu", &dcb
.ByteSize
);
352 else if (wcsstr(buf
, L
"stop="))
354 if (wcschr(buf
, L
'5'))
356 else if (wcschr(buf
, L
'2'))
361 else if (wcsstr(buf
, L
"to=")) // to=on|off
363 value
= ExtractModeSerialParams(buf
);
369 goto invalid_serial_parameter
;
372 else if (wcsstr(buf
, L
"xon=")) // xon=on|off
374 value
= ExtractModeSerialParams(buf
);
382 goto invalid_serial_parameter
;
385 else if (wcsstr(buf
, L
"odsr=")) // odsr=on|off
387 value
= ExtractModeSerialParams(buf
);
390 dcb
.fOutxDsrFlow
= value
;
394 goto invalid_serial_parameter
;
397 else if (wcsstr(buf
, L
"octs=")) // octs=on|off
399 value
= ExtractModeSerialParams(buf
);
402 dcb
.fOutxCtsFlow
= value
;
406 goto invalid_serial_parameter
;
409 else if (wcsstr(buf
, L
"dtr=")) // dtr=on|off|hs
411 value
= ExtractModeSerialParams(buf
);
414 dcb
.fDtrControl
= value
;
418 goto invalid_serial_parameter
;
421 else if (wcsstr(buf
, L
"rts=")) // rts=on|off|hs|tg
423 value
= ExtractModeSerialParams(buf
);
426 dcb
.fRtsControl
= value
;
430 goto invalid_serial_parameter
;
433 else if (wcsstr(buf
, L
"idsr=")) // idsr=on|off
435 value
= ExtractModeSerialParams(buf
);
438 dcb
.fDsrSensitivity
= value
;
442 goto invalid_serial_parameter
;
447 invalid_serial_parameter
:;
448 wprintf(L
"Invalid parameter - %s\n", buf
);
452 SerialPortQuery(nPortNum
, &dcb
, &CommTimeouts
, TRUE
);
457 int find_portnum(const WCHAR
* cmdverb
)
461 if (cmdverb
[3] >= L
'0' && cmdverb
[3] <= L
'9')
463 portnum
= cmdverb
[3] - L
'0';
464 if (cmdverb
[4] >= L
'0' && cmdverb
[4] <= L
'9')
467 portnum
+= cmdverb
[4] - L
'0';
473 int wmain(int argc
, WCHAR
* argv
[])
476 WCHAR param1
[MAX_COMPARAM_LEN
+1];
477 WCHAR param2
[MAX_COMPARAM_LEN
+1];
481 if (wcslen(argv
[1]) > MAX_COMPARAM_LEN
)
483 wprintf(L
"Invalid parameter (too long) - %s\n", argv
[1]);
486 wcscpy(param1
, argv
[1]);
490 if (wcslen(argv
[2]) > MAX_COMPARAM_LEN
)
492 wprintf(L
"Invalid parameter (too long) - %s\n", argv
[2]);
495 wcscpy(param2
, argv
[2]);
502 if (wcsstr(param1
, L
"/?") || wcsstr(param1
, L
"-?"))
506 else if (wcsstr(param1
, L
"/status"))
510 else if (wcsstr(param1
, L
"lpt"))
512 nPortNum
= find_portnum(param1
);
514 return ShowParallelStatus(nPortNum
);
516 else if (wcsstr(param1
, L
"con"))
518 return ShowConsoleStatus();
520 else if (wcsstr(param1
, L
"com"))
522 nPortNum
= find_portnum(param1
);
525 if (param2
[0] == L
'\0' || wcsstr(param2
, L
"/status"))
527 return ShowSerialStatus(nPortNum
);
531 return SetSerialState(nPortNum
, argc
, argv
);
535 wprintf(L
"Invalid parameter - %s\n", param1
);
544 ShowParallelStatus(1);
545 for (nPortNum = 0; nPortNum < MAX_COMPORT_NUM; nPortNum++)
547 ShowSerialStatus(nPortNum + 1);