我正在将 C dll(作为线程)注入(inject)正在运行的控制台进程,并尝试将其标准输出重定向到文件。我的 dll 还通过 wprintf
写入控制台。
作为一个简单的重定向测试,我在开始时调用了 dll TestRedirect
:
FILE *file = NULL;
BOOL WINAPI Test1(void *param);
void TestRedirect()
{
file = freopen("C:\\temp\\test1.txt", "w", stdout);
_beginthreadex(NULL, 0, Test1, (void*)file, NULL, 0, NULL);
}
BOOL WINAPI Test1(void *param)
{
FILE *file = (FILE*)param;
while (1)
{
wprintf(L"Test1\n");
fflush(file);
Sleep(200);
}
}
每次我的 dll 通过 wprintf
写入标准输出时,无论线程如何,文本都会出现在文件中。但是,我的测试控制台程序(也是 C 程序)不会写入文件。控制台程序所做的就是每秒调用 wprintf
来打印一些东西。当我的 dll 被注入(inject)到进程中时,exe 的文本停止出现在控制台窗口中,但不会写入文件。如果我在其他程序上尝试也一样,例如ping.exe.
但是,如果我将相同的代码直接放入我的测试控制台程序并使该程序调用 TestRedirect
,则程序的输出将写入文件(无需注入(inject) dll)。
我做错了什么?
最佳答案
我能够通过使注入(inject)的 dll 调用 FreeConsole
然后 AttachConsole
来做到这一点,将进程的 PID 传递到我想要输出的控制台被重定向到。
(我知道这个问题提到将它重定向到一个文件,但这实际上只是为了测试目的,因为表面上更容易做;最终,我希望它被重定向到一个控制台。在一天结束时,如果我愿意,我可以让我自己的控制台将其标准输出(它从“远程”进程接收)重定向到一个文件,这仍然应该满足实际问题。)
关于c - 进程的标准输出未通过 dll 注入(inject)正确重定向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32617695/