zoukankan      html  css  js  c++  java
  • 重定向

    bool RandAndSeq::RunCmdAndOutPutRedirect(const std::string &outPutFile,
                                             const std::string &cmd,
                                             bool wait = false)
    {
        LOG_INFO << "outPutFile:" << outPutFile << " cmd:"
            << cmd << " wait:" << wait;
        STARTUPINFOA si;
        PROCESS_INFORMATION pi;
    
        SECURITY_ATTRIBUTES sa;
        sa.nLength = sizeof(sa);
        sa.lpSecurityDescriptor = NULL;
        sa.bInheritHandle = TRUE;
        HANDLE handle = CreateFileA(outPutFile.c_str(),
                                    FILE_APPEND_DATA,
                                    FILE_SHARE_WRITE | FILE_SHARE_READ,
                                    &sa,
                                    CREATE_ALWAYS,
                                    FILE_ATTRIBUTE_NORMAL,
                                    NULL);
        if (!handle)
        {
            LOG_WARN << "CreateFile failed:" << GetLastError();
            return false;
        }
    
        memset(&si, 0, sizeof(STARTUPINFO));
        memset(&pi, 0, sizeof(PROCESS_INFORMATION));
        si.cb = sizeof(STARTUPINFO);
        si.dwFlags |= STARTF_USESTDHANDLES;
        si.wShowWindow = SW_HIDE;
        si.wShowWindow = SW_SHOWNORMAL;
        si.hStdInput = NULL;
        si.hStdError = NULL;
        si.hStdOutput = handle;
    
        if (!CreateProcessA(NULL,
            (LPSTR)cmd.c_str(),
            NULL,
            NULL,
            TRUE,
            CREATE_NO_WINDOW,
            NULL,
            NULL,
            &si,
            &pi))
        {
            LOG_WARN << "CreateProcess failed:" << GetLastError();
            CloseHandle(handle);
            return false;
        }
    
        if (wait)
        {
            WaitForSingleObject(pi.hProcess, INFINITE);
        }
        LOG_WARN << "WaitForSingleObject finish return:" << GetLastError();
        CloseHandle(handle);
        CloseHandle(pi.hThread);
        CloseHandle(pi.hProcess);
        return true;
    }
    
    
    void RandAndSeq::RedirectCmd()
    {
        PVOID oldValue = NULL;
        if (Wow64DisableWow64FsRedirection(&oldValue))
        {
            std::string filePath = temp_file_path::kRandAndseqPath;
            std::string cmd = "winsat disk";
            RunCmdAndOutPutRedirect(filePath, cmd, true);
        }
        else
        {
            LOG_WARN << "重定向失败.ErrorCode: " << GetLastError();
        }
        if (Wow64RevertWow64FsRedirection(oldValue) == FALSE)
        {
            LOG_WARN << "恢复调用线程的文件系统重定向失败. ErrorCode:" << GetLastError();
            return;
        }
    }

    比如X64系统无法使用X32目录下的cmd等等。如:winsat必须是X32目录下cmd才存在。

    也可以重定向X64或X32的注册表

  • 相关阅读:
    Ubuntu18下解决和IDEA快捷键冲突
    SM.SM图床踩坑记录
    springboot热部署
    springboot创建项目报错
    三次握手,四次挥手(转载)
    slf4j和log4j2整合报错,绑定失败
    Linux终端光标消失解决
    ssh免密登录
    Spring中编写单元测试
    用js模拟查询方法 hide() filter(":contains('"
  • 原文地址:https://www.cnblogs.com/gd-luojialin/p/11922919.html
Copyright © 2011-2022 走看看