У меня есть стороннее консольное приложение. Мне нужно запустить его из моего приложения, но я не могу запустить его как отдельный процесс (потому что мне нужно работать со своими зависимостями: заполнить таблицы импорта вручную, настроить крючки и т.д.). Поэтому, вероятно, я должен вызвать функцию main
этого исполняемого файла вручную. Вот как я пытаюсь это сделать:
- Загрузите этот EXE с помощью
auto hMod = LoadLibrary("console_app.exe")
- Заполнить таблицу импорта этого exe вручную
- Получить точку входа этого EXE и назвать ее
И я застрял с последним шагом.
Вот как я пытаюсь вызвать точку входа:
void runMain(HINSTANCE hInst)
{
typedef BOOL(WINAPI *PfnMain)(int, char*[]);
auto imageNtHeaders = ImageNtHeader(hInst);
auto pfnMain = (PfnMain)(DWORD_PTR)(imageNtHeaders->OptionalHeader.AddressOfEntryPoint + (DWORD_PTR)hInst);
char* args[] = { R"(<console_app_path>)", R"(arg1)", R"(arg2)" };
pfnMain(3, args);
}
Это работает. Но он работает так, как будто нет аргументов.
Где я ошибаюсь? Как запустить исполняемый файл внутри моего процесса с помощью аргументов? Спасибо.
UPDATE:
Я исследовал, как мой сторонний exe получает аргументы cmd и обнаружил, что:
- Он не импортирует
GetCommandLine
вообще и не называет его - После
call _initterm
вызовargc
иargv
аргументы доступны черезcs:argc
иcs:argv
(см. рисунки ниже) - Аргументы CMD, которые я передаю в основное приложение консоли, переносятся на дочерний EXE тоже.
Можете ли вы объяснить, пожалуйста, что _initterm
действительно и где аргументы CMD на самом деле хранятся?