Получить имя Winstation из идентификатора процесса - PullRequest
0 голосов
/ 29 мая 2009

Я пытаюсь получить имя winstation (например, "winsta0"), которую открыл отдельный процесс, используя только его идентификатор процесса. Я не могу найти ничего, что делает это на MSDN. Кажется, что они имеют только GetProcessWindowStation (), который работает только для вашего собственного процесса.

Есть идеи?

UPDATE: Может быть, это часть головоломки ...

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

Ответы [ 2 ]

1 голос
/ 04 июня 2009

Возможно, вам придется использовать EnumWindowStations (), EnumDesktops (), EnumDesktopWindows () и GetWindowThreadProcessId () для просмотра всех запущенных окон, пока не найдете одно, которое соответствует желаемому идентификатору процесса.

0 голосов
/ 04 июня 2009

Ну, я посмотрел на функции API, но попал в тот же тупик, что и вы. Предложение Реми должно работать, пока целевой процесс создает одно или несколько окон верхнего уровня. Мне пришла в голову следующая безумная идея:

  1. Используйте VirtualAllocEx () для выделения некоторой исполняемой памяти в целевом процессе
  2. Используйте WriteProcessMemory () для записи некоторого кода в эту память
  3. Используйте CreateRemoteThread () для выполнения кода в этом процессе

Внедренный код будет вызывать GetProcessWindowStation (), а затем использовать механизм IPC для отправки его обратно в ваш процесс. После того, как вы его получите, используйте VirtualFreeEx () для восстановления оригинального адресного пространства целевого процесса. Есть некоторые дополнительные проблемы, связанные с использованием этого процесса другого пользователя, но он все равно должен работать, если вы работаете от имени администратора.

...