我知道我可以调用AttachConsole
和 GetStdHandle
kernel32 函数来访问不同控制台进程的控制台屏幕缓冲区,但是如果此进程的输入/输出/错误重定向到文件或设备,我如何才能获得这些重定向位置的句柄呢?
说清楚:我无法控制我试图附加到的应用程序,这是由第三方提供的,所以我使用 IPC 的机会很小。
我知道我可以调用AttachConsole
和 GetStdHandle
kernel32 函数来访问不同控制台进程的控制台屏幕缓冲区,但是如果此进程的输入/输出/错误重定向到文件或设备,我如何才能获得这些重定向位置的句柄呢?
说清楚:我无法控制我试图附加到的应用程序,这是由第三方提供的,所以我使用 IPC 的机会很小。
GetStdHandle
将尊重任何重定向并返回重定向的句柄;
进程的标准句柄可以通过调用来重定向
SetStdHandle
,在这种情况下GetStdHandle
返回重定向的句柄。
该链接还描述了如何索取原件。
您可以使用CreateRemoteThread
将代码插入其他进程并GetStdHandle
从那里调用。然后,您需要使用DuplicateHandle
在您自己的进程中制作句柄的副本。
请记住,您对该句柄所做的任何事情都会影响目标进程中的句柄,这可能会导致意外问题。例如,如果两个进程都尝试从标准输入流中读取,您将无法预测哪个进程会看到输入的哪一部分,并且如果两个进程都写入标准输出流,则输出可能会随机重叠方式或一组输出可能会覆盖另一组。