распространение переменных среды в системе Windows - PullRequest
0 голосов
/ 10 августа 2009

Можно распространять в уже открытом приложении значение (переменные окружения Windows) переменной Windows после ее создания или ее модификации без перезапуска приложений, которые поворачиваются?

Как?

Может быть, лучше использовать такой вопрос на сервере, чтобы отправить такой вопрос?

Ответы [ 3 ]

3 голосов
/ 10 августа 2009

Что-то вроде SendMessage(HWND_BROADCAST,WM_WININICHANGE,0,"Environment") - ваша лучшая ставка, но большинство приложений игнорируют ее, но Explorer должен справиться с этим.

Если вы хотите попасть в безумную недокументированную страну, вы можете использовать WriteProcessMemory и обновлять блок среды в каждом процессе, к которому у вас есть доступ.

3 голосов
/ 03 апреля 2010

Да, это возможно.

Метод

Это связано, хотя. Я опишу основные шаги. Детали каждого шага задокументированы во многих местах в Интернете, включая переполнение стека.

  1. Создание вспомогательной библиотеки DLL. DLL ничего не делает, кроме как установить переменные окружения, которые вы хотите установить. Это может сделать это из DllMain, не вызывая никаких проблем. Только не сердитесь на другие вызовы функций из DllMain. Как вы сообщаете в DLL, какие переменные устанавливать и какие значения устанавливать, вам остается решить (прочитать файл, прочитать из реестра ...)

  2. Перечислите все процессы, которые вы хотите обновить (toolhelp32 поможет с этим).

  3. Для каждого процесса, который вы хотите обновить, введите ваш 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;
}
1 голос
/ 10 августа 2009

Нет, я почти уверен, что это невозможно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...