0

我正在尝试获取单独的进程仅使用其进程 ID 打开的 winstation 的名称(例如“winsta0”)。我在 MSDN 上找不到任何可以做到这一点的东西。他们似乎只有 GetProcessWindowStation() 仅适用于您自己的进程。

有任何想法吗?

更新:也许这是难题的一部分......

BOOL ProcessIdToSessionId( __in DWORD dwProcessId, __out DWORD *pSessionId );

4

2 回答 2

1

您可能必须使用 EnumWindowStations()、EnumDesktops()、EnumDesktopWindows() 和 GetWindowThreadProcessId() 来查看所有正在运行的窗口,直到找到与所需进程 ID 匹配的窗口。

于 2009-06-03T23:40:52.783 回答
0

好吧,我查看了 API 函数,但遇到了和你一样的死胡同。只要目标进程创建一个或多个顶级窗口,Remy 的建议就应该有效。我也想到了以下疯狂的想法:

  1. 使用 VirtualAllocEx() 在目标进程中分配一些可执行内存
  2. 使用 WriteProcessMemory() 将一些代码写入该内存
  3. 使用 CreateRemoteThread() 执行该进程中的代码

注入的代码将调用 GetProcessWindowStation(),然后使用 IPC 机制将其发送回您的进程。获取后,使用 VirtualFreeEx() 恢复目标进程的原始地址空间。在其他用户的进程中使用它会产生一些额外的问题,但如果您以管理员身份运行,它应该仍然可以工作。

于 2009-06-04T13:15:58.603 回答