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

Любые идеи?

ОБНОВЛЕНИЕ: Возможно, это часть головоломки...

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

0
user110143 29 Май 2009 в 19:59

2 ответа

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

1
Remy Lebeau 4 Июн 2009 в 03:40

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

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

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

0
Peter Ruderman 4 Июн 2009 в 17:15