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.
27 #define MAX_PORTNAME_LEN 20
28 #define MAX_COMPORT_NUM 10
29 #define MAX_COMPARAM_LEN 20
31 #define NUM_ELEMENTS(a) (sizeof(a)/sizeof(a[0]))
34 const char* usage_strings
[] = {
35 "Device Status: MODE [device] [/STATUS]",
36 "Select code page: MODE CON[:] CP SELECT=yyy",
37 "Code page status: MODE CON[:] CP [/STATUS]",
38 "Display mode: MODE CON[:] [COLS=c] [LINES=n]",
39 "Typematic rate: MODE CON[:] [RATE=r DELAY=d]",
40 "Redirect printing: MODE LPTn[:]=COMm[:]",
41 "Serial port: MODE COMm[:] [BAUD=b] [PARITY=p] [DATA=d] [STOP=s]\n" \
42 " [to=on|off] [xon=on|off] [odsr=on|off]\n" \
43 " [octs=on|off] [dtr=on|off|hs]\n" \
44 " [rts=on|off|hs|tg] [idsr=on|off]",
47 const char* parity_strings
[] = {
48 _T("None"), // default
49 _T("Odd"), // only symbol in this set to have a 'd' in it
50 _T("Even"), // ... 'v' in it
51 _T("Mark"), // ... 'm' in it
52 _T("Space") // ... 's' and/or a 'c' in it
55 const char* control_strings
[] = { "OFF", "ON", "HANDSHAKE", "TOGGLE" };
57 const char* stopbit_strings
[] = { _T("1"), _T("1.5"), _T("2") };
64 printf("\nConfigures system devices.\n\n");
65 for (i
= 0; i
< NUM_ELEMENTS(usage_strings
); i
++) {
66 printf("%s\n", usage_strings
[i
]);
79 if (QueryDosDevice(NULL
, buffer
, NUM_ELEMENTS(buffer
))) {
80 while (*ptr
!= '\0') {
82 if (strstr(ptr
, "COM")) {
83 printf(" Found serial device - %s\n", ptr
);
84 } else if (strstr(ptr
, "PRN")) {
85 printf(" Found printer device - %s\n", ptr
);
86 } else if (strstr(ptr
, "LPT")) {
87 printf(" Found parallel device - %s\n", ptr
);
89 printf(" Found other device - %s\n", ptr
);
94 printf(" ERROR: QueryDosDevice(...) failed.\n");
99 int ShowParrallelStatus(int nPortNum
)
102 char szPortName
[MAX_PORTNAME_LEN
];
104 sprintf(szPortName
, "LPT%d", nPortNum
);
105 printf("\nStatus for device LPT%d:\n", nPortNum
);
106 printf("-----------------------\n");
107 if (QueryDosDevice(szPortName
, buffer
, NUM_ELEMENTS(buffer
))) {
108 char* ptr
= strrchr(buffer
, '\\');
110 if (0 == strcmp(szPortName
, ++ptr
)) {
111 printf(" Printer output is not being rerouted.\n");
113 printf(" Printer output is being rerouted to serial port %s\n", ptr
);
117 printf(" QueryDosDevice(%s) returned unrecogised form %s.\n", szPortName
, buffer
);
120 printf(" ERROR: QueryDosDevice(%s) failed.\n", szPortName
);
125 int ShowConsoleStatus()
129 CONSOLE_SCREEN_BUFFER_INFO ConsoleScreenBufferInfo
;
130 HANDLE hConsoleOutput
= GetStdHandle(STD_OUTPUT_HANDLE
);
132 printf("\nStatus for device CON:\n");
133 printf("-----------------------\n");
134 if (GetConsoleScreenBufferInfo(hConsoleOutput
, &ConsoleScreenBufferInfo
)) {
135 printf(" Lines: %d\n", ConsoleScreenBufferInfo
.dwSize
.Y
);
136 printf(" Columns: %d\n", ConsoleScreenBufferInfo
.dwSize
.X
);
138 if (SystemParametersInfo(SPI_GETKEYBOARDDELAY
, 0, &dwKbdDelay
, 0)) {
139 printf(" Keyboard delay: %d\n", dwKbdDelay
);
141 if (SystemParametersInfo(SPI_GETKEYBOARDSPEED
, 0, &dwKbdSpeed
, 0)) {
142 printf(" Keyboard rate: %d\n", dwKbdSpeed
);
144 printf(" Code page: %d\n", GetConsoleOutputCP());
149 BOOL
SerialPortQuery(int nPortNum
, LPDCB pDCB
, LPCOMMTIMEOUTS pCommTimeouts
, BOOL bWrite
)
153 char szPortName
[MAX_PORTNAME_LEN
];
156 ASSERT(pCommTimeouts
);
158 sprintf(szPortName
, _T("COM%d"), nPortNum
);
159 hPort
= CreateFile(szPortName
,
160 GENERIC_READ
|GENERIC_WRITE
,
165 NULL
); // no template
167 if (hPort
== (HANDLE
)-1) {
168 printf("Illegal device name - %s\n", szPortName
);
172 result
= SetCommState(hPort
, pDCB
);
174 result
= GetCommState(hPort
, pDCB
);
177 printf("Failed to %s the status for device COM%d:\n", bWrite
? "set" : "get", nPortNum
);
182 result
= SetCommTimeouts(hPort
, pCommTimeouts
);
184 result
= GetCommTimeouts(hPort
, pCommTimeouts
);
187 printf("Failed to %s Timeout status for device COM%d:\n", bWrite
? "set" : "get", nPortNum
);
196 int ShowSerialStatus(int nPortNum
)
200 COMMTIMEOUTS CommTimeouts
;
201 char szPortName
[MAX_PORTNAME_LEN
];
203 if (!SerialPortQuery(nPortNum
, &dcb
, &CommTimeouts
, FALSE
)) {
206 if (dcb
.Parity
> NUM_ELEMENTS(parity_strings
)) {
207 printf("ERROR: Invalid value for Parity Bits %d:\n", dcb
.Parity
);
210 if (dcb
.StopBits
> NUM_ELEMENTS(stopbit_strings
)) {
211 printf("ERROR: Invalid value for Stop Bits %d:\n", dcb
.StopBits
);
214 printf("\nStatus for device COM%d:\n", nPortNum
);
215 printf("-----------------------\n");
216 printf(" Baud: %d\n", dcb
.BaudRate
);
217 printf(" Parity: %s\n", parity_strings
[dcb
.Parity
]);
218 printf(" Data Bits: %d\n", dcb
.ByteSize
);
219 printf(" Stop Bits: %s\n", stopbit_strings
[dcb
.StopBits
]);
220 printf(" Timeout: %s\n", CommTimeouts
.ReadIntervalTimeout
? "ON" : "OFF");
221 printf(" XON/XOFF: %s\n", dcb
.fOutX
? "ON" : "OFF");
222 printf(" CTS handshaking: %s\n", dcb
.fOutxCtsFlow
? "ON" : "OFF");
223 printf(" DSR handshaking: %s\n", dcb
.fOutxDsrFlow
? "ON" : "OFF");
224 printf(" DSR sensitivity: %s\n", dcb
.fDsrSensitivity
? "ON" : "OFF");
225 printf(" DTR circuit: %s\n", control_strings
[dcb
.fDtrControl
]);
226 printf(" RTS circuit: %s\n", control_strings
[dcb
.fRtsControl
]);
230 int SetParrallelState(int nPortNum
)
232 char szPortName
[MAX_PORTNAME_LEN
];
233 char szTargetPath
[MAX_PORTNAME_LEN
];
235 sprintf(szPortName
, _T("LPT%d"), nPortNum
);
236 sprintf(szTargetPath
, _T("COM%d"), nPortNum
);
237 if (!DefineDosDevice(DDD_REMOVE_DEFINITION
, szPortName
, szTargetPath
)) {
238 DWORD error
= GetLastError();
240 printf("SetParrallelState(%d) - DefineDosDevice(%s) failed: %x\n", nPortNum
, error
);
247 \Device\NamedPipe\Spooler\LPT1
248 BOOL DefineDosDevice(
249 DWORD dwFlags, // options
250 LPCTSTR lpDeviceName, // device name
251 LPCTSTR lpTargetPath // path string
253 DWORD QueryDosDevice(
254 LPCTSTR lpDeviceName, // MS-DOS device name string
255 LPTSTR lpTargetPath, // query results buffer
256 DWORD ucchMax // maximum size of buffer
260 int SetConsoleState()
263 "Select code page: MODE CON[:] CP SELECT=yyy",
264 "Code page status: MODE CON[:] CP [/STATUS]",
265 "Display mode: MODE CON[:] [COLS=c] [LINES=n]",
266 "Typematic rate: MODE CON[:] [RATE=r DELAY=d]",
272 int ExtractModeSerialParams(const char* param
)
274 if ( strstr(param
, "OFF")) {
276 } else if (strstr(param
, "ON")) {
278 } else if (strstr(param
, "HS")) {
280 } else if (strstr(param
, "TG")) {
286 int SetSerialState(int nPortNum
, int args
, char *argv
[])
291 COMMTIMEOUTS CommTimeouts
;
292 char buf
[MAX_COMPARAM_LEN
+1];
294 if (SerialPortQuery(nPortNum
, &dcb
, &CommTimeouts
, FALSE
)) {
295 for (arg
= 2; arg
< args
; arg
++) {
296 if (strlen(argv
[arg
]) > MAX_COMPARAM_LEN
) {
297 printf("Invalid parameter (too long) - %s\n", argv
[arg
]);
300 strcpy(buf
, argv
[arg
]);
302 if (strstr(buf
, "BAUD=")) {
303 dcb
.BaudRate
= atol(buf
+5);
304 } else if (strstr(buf
, "PARITY=")) {
305 if (strchr(buf
, 'D')) {
307 } else if (strchr(buf
, 'V')) {
309 } else if (strchr(buf
, 'M')) {
311 } else if (strchr(buf
, 'S')) {
316 } else if (strstr(buf
, "DATA=")) {
317 dcb
.ByteSize
= atol(buf
+5);
318 } else if (strstr(buf
, "STOP=")) {
319 if (strchr(buf
, '5')) {
321 } else if (strchr(buf
, '2')) {
326 } else if (strstr(buf
, "TO=")) { // to=on|off
327 value
= ExtractModeSerialParams(buf
);
330 goto invalid_serial_parameter
;
332 } else if (strstr(buf
, "XON=")) { // xon=on|off
333 value
= ExtractModeSerialParams(buf
);
338 goto invalid_serial_parameter
;
340 } else if (strstr(buf
, "ODSR=")) { // odsr=on|off
341 value
= ExtractModeSerialParams(buf
);
343 dcb
.fOutxDsrFlow
= value
;
345 goto invalid_serial_parameter
;
347 } else if (strstr(buf
, "OCTS=")) { // octs=on|off
348 value
= ExtractModeSerialParams(buf
);
350 dcb
.fOutxCtsFlow
= value
;
352 goto invalid_serial_parameter
;
354 } else if (strstr(buf
, "DTR=")) { // dtr=on|off|hs
355 value
= ExtractModeSerialParams(buf
);
357 dcb
.fDtrControl
= value
;
359 goto invalid_serial_parameter
;
361 } else if (strstr(buf
, "RTS=")) { // rts=on|off|hs|tg
362 value
= ExtractModeSerialParams(buf
);
364 dcb
.fRtsControl
= value
;
366 goto invalid_serial_parameter
;
368 } else if (strstr(buf
, "IDSR=")) { // idsr=on|off
369 value
= ExtractModeSerialParams(buf
);
371 dcb
.fDsrSensitivity
= value
;
373 goto invalid_serial_parameter
;
376 invalid_serial_parameter
:;
377 printf("Invalid parameter - %s\n", buf
);
381 SerialPortQuery(nPortNum
, &dcb
, &CommTimeouts
, TRUE
);
386 int find_portnum(const char* cmdverb
)
390 if ((char)*(cmdverb
+ 3) >= '0' && (char)*(cmdverb
+ 3) <= '9') {
391 portnum
= ((char)*(cmdverb
+ 3)) - '0';
392 if ((char)*(cmdverb
+ 4) >= '0' && (char)*(cmdverb
+ 4) <= '9') {
394 portnum
+= ((char)*(cmdverb
+ 4)) - '0';
400 int main(int argc
, char *argv
[])
403 char param1
[MAX_COMPARAM_LEN
+1];
404 char param2
[MAX_COMPARAM_LEN
+1];
407 if (strlen(argv
[1]) > MAX_COMPARAM_LEN
) {
408 printf("Invalid parameter (too long) - %s\n", argv
[1]);
411 strcpy(param1
, argv
[1]);
414 if (strlen(argv
[2]) > MAX_COMPARAM_LEN
) {
415 printf("Invalid parameter (too long) - %s\n", argv
[2]);
418 strcpy(param2
, argv
[2]);
423 if (strstr(param1
, "/?") || strstr(param1
, "-?")) {
425 } else if (strstr(param1
, "/STA")) {
427 } else if (strstr(param1
, "LPT")) {
428 nPortNum
= find_portnum(param1
);
430 return ShowParrallelStatus(nPortNum
);
431 } else if (strstr(param1
, "CON")) {
432 return ShowConsoleStatus();
433 } else if (strstr(param1
, "COM")) {
434 nPortNum
= find_portnum(param1
);
435 if (nPortNum
!= -1) {
436 if (param2
[0] == '\0' || strstr(param2
, "/STA")) {
437 return ShowSerialStatus(nPortNum
);
439 return SetSerialState(nPortNum
, argc
, argv
);
443 printf("Invalid parameter - %s\n", param1
);
450 ShowParrallelStatus(1);
451 for (nPortNum = 0; nPortNum < MAX_COMPORT_NUM; nPortNum++) {
452 ShowSerialStatus(nPortNum + 1);