微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

CreateProcess 无法运行 sfc.exe ?为什么

如何解决CreateProcess 无法运行 sfc.exe ?为什么

使用 CreateProcess 创建一个运行 sfc.exe 的进程。然而,没有效果我有管理员权限来运行这个程序

我使用 CreateProcess API 来控制 CUI 输出并捕获 CUI 程序输出信息。

我想通过使用管道接收 sfc /scanNow 命令输出

    Security_ATTRIBUTES sa;
    sa.nLength = sizeof(Security_ATTRIBUTES);
    sa.bInheritHandle = TRUE;
    sa.lpSecurityDescriptor = NULL;

    HANDLE hReadPipe = NULL;
    HANDLE hWirtePipe = NULL;
    if (!CreatePipe(&hReadPipe,&hWirtePipe,&sa,NULL)) {
        std::cout << "create pipe Failed \n";
        return -1;
    } 


    PROCESS_informatION pi;
    STARTUPINFO si;
    ZeroMemory(&si,sizeof(STARTUPINFO));
    ZeroMemory(&pi,sizeof(PROCESS_informatION));
    si.cb = sizeof(STARTUPINFO);
    si.dwFlags = STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES,si.wShowWindow = SW_HIDE;
    si.hStdError = hWirtePipe;
    si.hStdOutput = hWirtePipe;

    TCHAR szCommand[] = TEXT("sfc /scanNow");
    if (!CreateProcess(NULL,szCommand,NULL,TRUE,CREATE_NO_WINDOW,&si,&pi)) 
    {
        cout << "process create Failed,errno is :"<< GetLastError() << endl;
        CloseHandle(hReadPipe);
        CloseHandle(hWirtePipe);
        return -1;
    }
    
    DWORD dwRead = 0;
    DWORD stdRead = 0;
    DWORD total;
    DWORD timeout = 50;
    TCHAR bufferOutPipe[1024] = {0};
    TCHAR readBuffer[1024] = {0};
    BOOL flag = true;
    while (flag) {
        if (WAIT_TIMEOUT == WaitForSingleObject(pi.hProcess,timeout)) {
            if (!PeekNamedPipe(hReadPipe,bufferOutPipe,1024,&dwRead,&total,0) || dwRead <= 0) {
                continue;
            }
            else {
                ReadFile(hReadPipe,readBuffer,dwRead,&stdRead,NULL);
                printf("%s\n",readBuffer);
                dwRead = 0;
            }
        }
        else if (WAIT_OBJECT_0 == WaitForSingleObject(pi.hProcess,timeout)) {
            if (PeekNamedPipe(hReadPipe,0) && dwRead > 0) {

                ReadFile(hReadPipe,readBuffer);
            }
            flag = false;
        }
        ZeroMemory(readBuffer,1024);
    }
    CloseHandle(hReadPipe);
    CloseHandle(hWirtePipe);
    CloseHandle(pi.hThread);
    CloseHandle(pi.hProcess);

我想接收'SFC / scanNow'命令的输出并使用匿名管道和进程重定向输出,但我听不到任何管道数据,创建的进程立即启动,

我和管理员一起开始了visual studio

解决方法

si.hStdInput 未初始化为有效值。 0 无效。你似乎想要INVALID_HANDLE_VALUE

对于 FALSEbInheritHandles,无论如何您的输出重定向都不起作用。这似乎是您当前的根本问题。

此外,一旦进程打开,您的代码将永远旋转,因为 CloseHandle(hWirtePipe); 没有及时调用,而是在循环之后调用。然后倾向于你的手柄泄漏。

现在是等待循环。哎呀。正常的构造是读到管道结束,然后才等待进程退出。在循环中,您有一个竞争条件,这将导致您(很可能)丢失输出的尾端。请注意,这将永远阻塞,直到您在进入循环之前关闭写入端的副本。您也不需要任何 PeekWhatever 废话。只需读取句柄,直到获得管道末端的特定错误。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。