• 重定向


    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的注册表

  • 相关阅读:
    用户控件包装器的设计与实现
    rskeymgmt 实用工具
    外连接(outer join)
    SQL Server中 char与varchar  
    正则表达式的优先级顺序
    正则表达式语法
    SQL各个子句: outer join,on,where,group by,having,select case子句执行
    SQL语法手册
    ACESS编程中判断空的sql语句
    Sql Server 中一个非常强大的日期格式化函数
  • 原文地址:https://www.cnblogs.com/gd-luojialin/p/11922919.html
Copyright © 2020-2023  润新知