我的主机是我的还是从父母那里继承的?

问题描述 投票:0回答:2

NT 字符模式应用程序如何确定其控制台是否是从父进程继承的,而不是在 CreateProcess 中新分配的控制台?

哇,这么不受欢迎的标签!添加窗口以吸引合适的程序员


@anonymous downvoter:我可以仅根据一些反馈对这个问题进行有限的扩展。说明不清楚的内容(但是需要熟悉 Windows 内核和子系统)。请记住,我们这里很多人都是程序员,所以我们的幽默非常具体,不要判断标题双关语太严厉。

windows winapi console windows-nt
2个回答
2
投票

一些想法可能有帮助,也可能没有帮助 - 这并不是真正的答案,但它太长,无法放入评论中。*

您可以使用 GetConsoleWindow() 来确定控制台的 HWND。然后可以看看是否有其他人在分享。尝试在其上调用 GetWindowThreadProcessId - 在某些版本的 Windows 上,如果我没记错的话,这似乎会返回 CSRSS 进程的 PID - 这没有帮助。但似乎在Win7上,它返回最初拥有该窗口的进程的PID。

例如,我启动了一个CMD窗口,然后输入了more;所以我们有 cmd.exe 和 more.exe 共享同一个窗口。 Spy++ 报告 HWND 属于 cmd.exe。

但是使用“start more”,因此创建一个包含 more 的新控制台,spy++ 报告新窗口属于 more.exe。

然而,这可能是 Win7 中的新行为(或者至少可能与以前的版本不一致);控制台窗口实际上由一个辅助进程拥有,Win7 中为 conhost.exe,以前版本中为 csrss。 GetWindowThreadProcessId 可能会返回以前版本中这些辅助进程的 PID。谁知道它会在未来版本的 Windows 中返回什么 - 控制台窗口是“特殊的”。

--

不依赖 GetWindowThreadProcessID 的另一种方法是:

  • 确定你父进程的进程ID(检查stackoverflow以获取此问题的过去答案!)
  • AttachConsole(pid)、GetConsoleWindow() 和 FreeConsole() 可以“查看”父进程正在使用的控制台 HWND(如果有)。
  • 这样做的问题是,一个进程一次只能附加到一个控制台 - 所以你必须在一个单独的帮助进程中进行“查看”(!) - 否则你必须放弃你的进程首先拥有自己的控制台。

长话短说,也许可以近似这一点,但不清楚你是否真的想“在现实生活中”这样做; “如果没有参数则暂停”可能是最好的方法。

[*此答案仅供娱乐,禁止等情况无效]


0
投票

您可以尝试

GetConsoleProcessList
,第一个进程将是发出请求的进程,第二个进程是父进程,但如果它已退出(例如
start.exe
),则列表链将中断,并且它将仅包含当前正在运行的进程.

尽管当我使用 Sysinternals Process Explorer 检查进程时,它在“线程”选项卡中显示

ConEmuHk64.dll
。当我正常运行我的应用程序时,该函数报告
ConEmuC64.exe <= Far.exe <= ConEmuC64.exe
进程(没有第一个进程),或者从标准 Windows 终端运行时报告
cmd.exe
powershell.exe

所以实际上进程可能会退出,但控制台仍然是继承的

© www.soinside.com 2019 - 2024. All rights reserved.