【问题标题】:Get a Winstation Name from a Process ID从进程 ID 获取 Winstation 名称
【发布时间】:2009-05-29 15:59:21
【问题描述】:
我正在尝试获取仅使用其进程 ID 的单独进程打开的 winstation 的名称(例如“winsta0”)。我在 MSDN 上找不到任何可以做到这一点的东西。他们似乎只有 GetProcessWindowStation() 仅适用于您自己的进程。
有什么想法吗?
更新:
也许这就是谜题的一部分……
BOOL ProcessIdToSessionId(
__in DWORD dwProcessId,
__out DWORD *pSessionId
);
【问题讨论】:
标签:
c
windows
winapi
msdn
【解决方案1】:
您可能必须使用 EnumWindowStations()、EnumDesktops()、EnumDesktopWindows() 和 GetWindowThreadProcessId() 来查看所有正在运行的窗口,直到找到与所需进程 ID 匹配的窗口。
【解决方案2】:
好吧,我查看了 API 函数,但遇到了和你一样的死胡同。只要目标进程创建一个或多个顶级窗口,Remy 的建议就应该有效。我也想到了以下疯狂的想法:
- 使用 VirtualAllocEx() 在目标进程中分配一些可执行内存
- 使用 WriteProcessMemory() 将一些代码写入该内存
- 使用 CreateRemoteThread() 执行该进程中的代码
注入的代码将调用 GetProcessWindowStation(),然后使用 IPC 机制将其发送回您的进程。获取后,使用 VirtualFreeEx() 恢复目标进程的原始地址空间。在其他用户的进程上使用它会产生一些额外的问题,但如果您以管理员身份运行,它应该仍然可以工作。