Исполняемый файл C:\Windows\System32\Fodhelper.exe не найден

Я пытаюсь запустить указанный выше встроенный исполняемый файл Windows из программы на C++. Во-первых, я могу подтвердить, что программа существует по пути C:\Windows\System32\fodhelper.exe.

Каталог System32

Я пробовал 3 разных метода запуска этой программы:

  • System()
  • ShellExecuteW()
  • CreateProcessW()

Ни один из этих методов не работает. Я получаю сообщение об ошибке: The system cannot find the file specified.

Из-за того, что я могу запустить этот исполняемый файл как моя обычная учетная запись Windows из меню «Пуск», окна «Выполнить» и из проводника Windows, я считаю, что у моей учетной записи пользователя есть права на запуск программы. Кроме того, я не получаю сообщение об отказе в доступе из своего кода. Несмотря на это, я запускал VS в качестве администратора, и у меня все еще была та же проблема.

Я считаю, что код, который я использую для запуска процесса, правильный, так как тот же самый код запустится cmd.exe без проблем. Смотри ниже:

#include <Windows.h>
#include <tchar.h>
#include <iostream>

void CreateProcessMethod(LPCWSTR programPath) {

    HRESULT result;
    STARTUPINFO startupInfo;
    PROCESS_INFORMATION processInformation;

    ZeroMemory(&startupInfo, sizeof(startupInfo));
    startupInfo.cb = sizeof(startupInfo);
    ZeroMemory(&processInformation, sizeof(processInformation));

    result = CreateProcessW(programPath, NULL, NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &startupInfo, &processInformation);
    if (result == 0) {

        wchar_t buf[256];
        FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
            NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
            buf, (sizeof(buf) / sizeof(wchar_t)), NULL);

        /* Display error */
        std::wcout << programPath << " not started: " << buf << std::endl;

    }
    else {
        std::wcout << programPath << " started successfuly" << std::endl;
    }

}

void ShellExecuteMethod(LPCWSTR programPath) {

    SHELLEXECUTEINFOW shExecInfo = { 0 };
    shExecInfo.cbSize = sizeof(SHELLEXECUTEINFOW);

        
    shExecInfo.fMask = SEE_MASK_FLAG_NO_UI;
    shExecInfo.hwnd = nullptr;
    shExecInfo.lpVerb = L"open";
    shExecInfo.lpFile = programPath;
    shExecInfo.lpParameters = L"\\C";
    shExecInfo.nShow = SW_SHOWNORMAL;

    if (ShellExecuteExW(&shExecInfo) == 0)
    {
        if (GetLastError() != ERROR_CANCELLED) // Operation canceled by the user
        {
            wchar_t buf[256];
            FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
                NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
                buf, (sizeof(buf) / sizeof(wchar_t)), NULL);

            /* Display error */
            std::wcout << programPath << " not started: " << buf << std::endl;
        }
    }
    else {
        std::wcout << programPath << " started successfuly" << std::endl;
    }

}

int main(){

    CreateProcessMethod(L"C:\\Windows\\System32\\cmd.exe");
    CreateProcessMethod(L"C:\\Windows\\System32\\fodhelper.exe");

    ShellExecuteMethod(L"C:\\Windows\\System32\\cmd.exe");
    ShellExecuteMethod(L"C:\\Windows\\System32\\fodhelper.exe");

    
}

См. вывод программы ниже:

Окно вывода

Кто-нибудь знает, что именно я здесь делаю неправильно? Не могу найти никакой информации по этому вопросу. Насколько я понимаю, код, пытающийся запустить программу, правильный, работает с разными исполняемыми файлами. Это также происходит с тремя различными методами. Любая помощь будет принята с благодарностью.


person RandomHash    schedule 18.02.2021    source источник
comment
Вы случайно не компилируете в 32-битном режиме на 64-битной Windows?   -  person user253751    schedule 18.02.2021
comment
Я МОЖЕТ быть, не могли бы вы объяснить, как это может вызвать эту ошибку? Я также посмотрю на это, это не вызвало у меня никаких проблем с прессой, если это проблема, поэтому мне очень интересно, почему это проблема.   -  person RandomHash    schedule 18.02.2021
comment
phuclv объяснил это   -  person user253751    schedule 18.02.2021


Ответы (1)


32-разрядные приложения, работающие на WOW64, будут помещены в файл системное перенаправление. Поэтому, если ваше приложение является 32-битным, путь "C:\\Windows\\System32\\fodhelper.exe" будет перенаправлен на несуществующий C:\Windows\SysWOW64\fodhelper.exe. У вас есть несколько решений:

  • Используйте SysNative для доступа к реальной папке system32, что означает, что вам нужно использовать что-то вроде system("C:\\Windows\\SysNative\\fodhelper.exe");
  • Явно отключите перенаправление файловой системы (его вообще следует избегать)
  • Или лучше скомпилируйте свой exe как 64-битное приложение.
person phuclv    schedule 18.02.2021
comment
Идеальный. Это решение работает для меня. Ошибка новичка! Также отличное объяснение с пояснительной ссылкой. - person RandomHash; 18.02.2021
comment
Нет ничего плохого во временном отключении перенаправителя FS. Основная проблема с правильным использованием SysNative заключается в том, что вы не должны жестко кодировать C:\Windows, вы должны спрашивать Windows, где он фактически установлен, через GetWindowsDirectory(), SHGetFolderPath(CSIDL_WINDOWS) или SHGetKnownFolderPath(FOLDERID_Windows), а затем добавлять SysNative\fodhelper.exe к этому пути. . Или используйте ExpandEnvironmentStrings("%windir%\SysNative\fodhelper.exe"). Не все устанавливают в C:\Windows. - person Remy Lebeau; 18.02.2021
comment
@RemyLebeau правда. Перенаправление файловой системы существует именно потому, что программисты жестко запрограммировали пути, такие как windows, system32... - person phuclv; 19.02.2021
comment
Я скомпилировал как исполняемый файл x64, и это решило мои проблемы, однако я могу оценить стабильность кода, было бы лучше запросить %windir% из Win32api, а не предполагать, где он находится. - person RandomHash; 20.02.2021