可以在已经打开的应用程序中传播Windows变量创建或修改后的值(Windows的环境变量),而不必重新启动转向的应用程序?
如何?
也许,使用服务器故障发布这样的问题会更好吗?
答案 0 :(得分:3)
像SendMessage(HWND_BROADCAST,WM_WININICHANGE,0,"Environment")
这样的东西是你最好的选择,但大多数应用程序会忽略它,但资源管理器应该处理它。
如果你想进入疯狂的未记录的土地,你可以使用WriteProcessMemory并在你有权访问的每个进程中更新环境块。
答案 1 :(得分:3)
是的,这是可能的。
方式强>
虽然参与其中。我将概述基本步骤。每个步骤的详细信息都记录在Web上的许多地方,包括Stack Overflow。
创建一个帮助器dll。除了设置要设置的环境变量之外,dll不执行任何操作。它可以从DllMain执行此操作而不会导致任何问题。只是不要对来自DllMain内部的其他函数调用感到生气。如何与DLL通信要设置哪些变量以及设置它们的值由您决定(读取文件,从注册表中读取...)
枚举您要更新的所有进程(toolhelp32将对此有所帮助)。
对于您希望更新的每个进程,请注入您的帮助程序DLL。 CreateRemoteThread()将有助于此。对于NT 4上的所有应用程序,这将失败2%,在XP上升至5%。很可能Vista / 7和服务器版本的百分比失败率更高。
您必须与之共存的事物:
如果您在64位操作系统上运行32位进程,CreateRemoteThread将无法在100%的时间内将您的DLL注入32位应用程序(并且无论如何都无法注入64位应用程序,因为这是64位工作位app)。
编辑:结果100%不正确。但它非常受欢迎。不要依赖它。
不要居住
如果您不希望助手DLL保持驻留在目标应用程序中,请为DLL_PROCESS_ATTACH通知返回FALSE。
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;
}
答案 2 :(得分:1)
不,我很确定这是不可能的。