⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mode.c

📁 ReactOS是一些高手根据Windows XP的内核编写出的类XP。内核实现机理和API函数调用几乎相同。甚至可以兼容XP的程序。喜欢研究系统内核的人可以看一看。
💻 C
📖 第 1 页 / 共 2 页
字号:
{
    TCHAR szPortName[MAX_PORTNAME_LEN];
    TCHAR szTargetPath[MAX_PORTNAME_LEN];

    _stprintf(szPortName, _T("LPT%d"), nPortNum);
    _stprintf(szTargetPath, _T("COM%d"), nPortNum);
    if (!DefineDosDevice(DDD_REMOVE_DEFINITION, szPortName, szTargetPath)) {
        DWORD error = GetLastError();

        _tprintf(_T("SetParallelState(%d) - DefineDosDevice(%s) failed: 0x%lx\n"), nPortNum, szPortName, error);
    }
    return 0;
}

/*
    \??\COM1
    \Device\NamedPipe\Spooler\LPT1
BOOL DefineDosDevice(
  DWORD dwFlags,         // options
  LPCTSTR lpDeviceName,  // device name
  LPCTSTR lpTargetPath   // path string
);
DWORD QueryDosDevice(
  LPCTSTR lpDeviceName, // MS-DOS device name string
  LPTSTR lpTargetPath,  // query results buffer
  DWORD ucchMax         // maximum size of buffer
);
 */

int SetConsoleState()
{
/*
	"Select code page:  MODE CON[:] CP SELECT=yyy",
	"Code page status:  MODE CON[:] CP [/STATUS]",
	"Display mode:      MODE CON[:] [COLS=c] [LINES=n]",
	"Typematic rate:    MODE CON[:] [RATE=r DELAY=d]",
 */
	return 0;
}

static
int ExtractModeSerialParams(const TCHAR* param)
{
    if (       _tcsstr(param, _T("OFF"))) {
        return 0;
    } else if (_tcsstr(param, _T("ON"))) {
        return 1;
    } else if (_tcsstr(param, _T("HS"))) {
        return 2;
    } else if (_tcsstr(param, _T("TG"))) {
        return 3;
    }
    return -1;
}

int SetSerialState(int nPortNum, int args, TCHAR *argv[])
{
    int arg;
    int value;
    DCB dcb;
    COMMTIMEOUTS CommTimeouts;
    TCHAR buf[MAX_COMPARAM_LEN+1];

    if (SerialPortQuery(nPortNum, &dcb, &CommTimeouts, FALSE)) {
        for (arg = 2; arg < args; arg++) {
            if (_tcslen(argv[arg]) > MAX_COMPARAM_LEN) {
                _tprintf(_T("Invalid parameter (too long) - %s\n"), argv[arg]);
                return 1;
            }
            _tcscpy(buf, argv[arg]);
            _tcslwr(buf);
            if (_tcsstr(buf, _T("baud="))) {
                _tscanf(buf+5, "%lu", &dcb.BaudRate);
            } else if (_tcsstr(buf, _T("parity="))) {
                if (_tcschr(buf, 'D')) {
                    dcb.Parity = 1;
                } else if (_tcschr(buf, 'V')) {
                    dcb.Parity = 2;
                } else if (_tcschr(buf, 'M')) {
                    dcb.Parity = 3;
                } else if (_tcschr(buf, 'S')) {
                    dcb.Parity = 4;
                } else {
                    dcb.Parity = 0;
                }
            } else if (_tcsstr(buf, _T("data="))) {
                _tscanf(buf+5, "%lu", &dcb.ByteSize);
            } else if (_tcsstr(buf, _T("stop="))) {
                if (_tcschr(buf, '5')) {
                    dcb.StopBits = 1;
                } else if (_tcschr(buf, '2')) {
                    dcb.StopBits = 2;
                } else {
                    dcb.StopBits = 0;
                }
            } else if (_tcsstr(buf, _T("to="))) { // to=on|off
                value = ExtractModeSerialParams(buf);
                if (value != -1) {
                } else {
                    goto invalid_serial_parameter;
                }
            } else if (_tcsstr(buf, _T("xon="))) { // xon=on|off
                value = ExtractModeSerialParams(buf);
                if (value != -1) {
                    dcb.fOutX = value;
                    dcb.fInX = value;
                } else {
                    goto invalid_serial_parameter;
                }
            } else if (_tcsstr(buf, _T("odsr="))) { // odsr=on|off
                value = ExtractModeSerialParams(buf);
                if (value != -1) {
                    dcb.fOutxDsrFlow = value;
                } else {
                    goto invalid_serial_parameter;
                }
            } else if (_tcsstr(buf, _T("octs="))) { // octs=on|off
                value = ExtractModeSerialParams(buf);
                if (value != -1) {
                    dcb.fOutxCtsFlow = value;
                } else {
                    goto invalid_serial_parameter;
                }
            } else if (_tcsstr(buf, _T("dtr="))) { // dtr=on|off|hs
                value = ExtractModeSerialParams(buf);
                if (value != -1) {
                    dcb.fDtrControl = value;
                } else {
                    goto invalid_serial_parameter;
                }
            } else if (_tcsstr(buf, _T("rts="))) { // rts=on|off|hs|tg
                value = ExtractModeSerialParams(buf);
                if (value != -1) {
                    dcb.fRtsControl = value;
                } else {
                    goto invalid_serial_parameter;
                }
            } else if (_tcsstr(buf, _T("idsr="))) { // idsr=on|off
                value = ExtractModeSerialParams(buf);
                if (value != -1) {
                    dcb.fDsrSensitivity = value;
                } else {
                    goto invalid_serial_parameter;
                }
            } else {
invalid_serial_parameter:;
                _tprintf(_T("Invalid parameter - %s\n"), buf);
                return 1;
            }
        }
        SerialPortQuery(nPortNum, &dcb, &CommTimeouts, TRUE);
    }
    return 0;
}

int find_portnum(const TCHAR* cmdverb)
{
    int portnum = -1;

    if (cmdverb[3] >= '0' && cmdverb[3] <= '9') {
        portnum = cmdverb[3] - '0';
        if (cmdverb[4] >= '0' && cmdverb[4] <= '9') {
            portnum *= 10;
            portnum += cmdverb[4] - '0';
        }
    }
    return portnum;
}

int main(int argc, TCHAR *argv[])
{
    int nPortNum;
    TCHAR param1[MAX_COMPARAM_LEN+1];
    TCHAR param2[MAX_COMPARAM_LEN+1];

    if (argc > 1) {
        if (_tcslen(argv[1]) > MAX_COMPARAM_LEN) {
            _tprintf(_T("Invalid parameter (too long) - %s\n"), argv[1]);
            return 1;
        }
        _tcscpy(param1, argv[1]);
        _tcslwr(param1);
        if (argc > 2) {
            if (_tcslen(argv[2]) > MAX_COMPARAM_LEN) {
                _tprintf(_T("Invalid parameter (too long) - %s\n"), argv[2]);
                return 1;
            }
            _tcscpy(param2, argv[2]);
            _tcslwr(param2);
        } else {
            param2[0] = '\0';
        }
        if (_tcsstr(param1, _T("/?")) || _tcsstr(param1, _T("-?"))) {
            return Usage();
        } else if (_tcsstr(param1, _T("/status"))) {
            goto show_status;
        } else if (_tcsstr(param1, _T("lpt"))) {
            nPortNum = find_portnum(param1);
            if (nPortNum != -1)
                return ShowParallelStatus(nPortNum);
        } else if (_tcsstr(param1, _T("con"))) {
            return ShowConsoleStatus();
        } else if (_tcsstr(param1, _T("com"))) {
            nPortNum = find_portnum(param1);
            if (nPortNum != -1) {
                if (param2[0] == '\0' || _tcsstr(param2, _T("/status"))) {
                    return ShowSerialStatus(nPortNum);
                } else {
                    return SetSerialState(nPortNum, argc, argv);
                }
            }
        }
        _tprintf(_T("Invalid parameter - %s\n"), param1);
        return 1;
    } else {
show_status:;

        QueryDevices();
/*
        ShowParallelStatus(1);
        for (nPortNum = 0; nPortNum < MAX_COMPORT_NUM; nPortNum++) {
    	   ShowSerialStatus(nPortNum + 1);
        }
	    ShowConsoleStatus();
 */
    }
    return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -