Да, это возможно.
Метод
Это связано, хотя. Я опишу основные шаги. Детали каждого шага задокументированы во многих местах в Интернете, включая переполнение стека.
Создание вспомогательной библиотеки DLL. DLL ничего не делает, кроме как установить переменные окружения, которые вы хотите установить. Это может сделать это из DllMain, не вызывая никаких проблем. Только не сердитесь на другие вызовы функций из DllMain. Как вы сообщаете в DLL, какие переменные устанавливать и какие значения устанавливать, вам остается решить (прочитать файл, прочитать из реестра ...)
Перечислите все процессы, которые вы хотите обновить (toolhelp32 поможет с этим).
Для каждого процесса, который вы хотите обновить, введите ваш dll помощника. CreateRemoteThread () поможет с этим. Это не удастся для 2% всех приложений в NT 4, увеличившись до 5% в XP. Скорее всего, более высокий процент отказов для Vista / 7 и серверных версий.
Вещи, с которыми вам придется жить:
Если вы выполняете 32-битный процесс в 64-битной ОС, CreateRemoteThread не сможет внедрить вашу DLL в 32-битные приложения 100% времени (и в любом случае не сможет внедрить в 64-битные приложения, поскольку это работа для 64-битных приложений). Бит приложение).
РЕДАКТИРОВАТЬ: Оказывается, 100% не правильно. Но это очень ударил. Не надейся на это.
Не оставайтесь резидентом
Если вы не хотите, чтобы ваша вспомогательная DLL оставалась резидентной в целевом приложении, верните FALSE для уведомления DLL_PROCESS_ATTACH.
BOOL APIENTRY DllMain(HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved)
{
if (ul_reason_for_call == DLL_PROCESS_ATTACH)
{
// set our env vars here
SetEnvironmentVariable("weebles", "wobble but they don't fall down");
// we don't want to remain resident, our work is done
return FALSE;
}
return TRUE;
}