![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| leniviy |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 552 Регистрация: 8.2.2003 Где: Спб Репутация: 1 Всего: 5 |
Привет. Я написал сервис, который стартует некое приложение на дефолтном десктопе интерактивной сессии.
При переключении пользователя приложение на старой сессии завершается и стартует новое. Так как я стартую приложение через CreateProcessAsUser(), у меня есть хэндл процесса, который я передаю в TerminateProcess(). Но при таком завершении в трее остается значок. Я нашел, что можно посылать WM_COMMAND окну этой программы, и тогда она завершается штатно. Но я не могу ни послать сообщение этому окну из сервиса, ни даже найти это окно. Чтобы это обойти, я стартую второй вспомогательный процесс в сессии приложения и уже из него ищу окно и посылаю месагу. Можно ли сделать это без вспомогательных процессов? |
|||
|
||||
| feodorv |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 9 Всего: 45 |
Не понятно, почему. Это Вы так специально задумали?
А на какой рабочей станции? winsta0?
Но это вопрос межпроцессного взаимодействия. Устроить его можно как угодно. Например, через PostThreadMessage... -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
||||||
|
|||||||
| feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 9 Всего: 45 |
Кстати, почему? Если у Вас есть описатель десктопа, то Вы можете в сервисе назначить потоку, выполняющему CreateProcessAsUser, десктоп через SetThreadDesktop или SetProcessWindowStation, и уже после старта нового процесса дождаться, когда он проинициализируется и опустошит очередь, а затем выполнить поиск окна, кмк. -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
| leniviy |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 552 Регистрация: 8.2.2003 Где: Спб Репутация: 1 Всего: 5 |
значит надо перед этим вызвать SetProcessWindowStation()
Поменять sessionid процесса никак |
||||
|
|||||
| feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 9 Всего: 45 |
Я потерялся. Мы сейчас о чём? Пользователь может быть только один? Никак не больше? Приложение Ваше? Вы его можете менять/модифицировать? Вот честно, никогда лично не пробовал поиск окна в чужом десктопе, но, думаю, у сервиса достаточно прав, чтобы такое учудить.
Подобные шаги Вы должны бы были предпринимать, чтобы обеспечить доступ окну своего "некоего приложения" к активному десктопу. И не знаю точно, что там наперечисляет EnumDesktopWindows, если вообще что-нибудь перечислит... Это сообщение отредактировал(а) feodorv - 1.7.2012, 16:34 -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
| leniviy |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 552 Регистрация: 8.2.2003 Где: Спб Репутация: 1 Всего: 5 |
||||
|
||||
| feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 9 Всего: 45 |
-------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
| leniviy |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 552 Регистрация: 8.2.2003 Где: Спб Репутация: 1 Всего: 5 |
Там в итоге CreateProcessAsUser() . Это-то как раз не проблема.
маловато окон:
Все окна принадлежат explorer.exe, запущенному в активной сессии. Добавлено через 2 минуты и 42 секунды Не мое. Это cdlocker. Его надо рестартовать при просыпании и при переключении. |
||||
|
|||||
| feodorv |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 9 Всего: 45 |
Возможно, стоит обратиться к разработчику с целью выработки приемлемого решения проблемы))) Мда. Либо всё неправильно, либо одно из двух))) Первое. Дело в EnumDesktopWindows. К сожалению, в ближайшее время я не смогу воспроизвести эту интересную ситуацию, но можно Вас попросить заменить EnumDesktopWindows на просто EnumWindows? Второе. Вы правы: Но тогда я не понимаю, как Вы исхитрились запустить cdlocker на активном десктопе. Неужели, для этого достаточно SERVICE_INTERACTIVE_PROCESS плюс sessionid в токене? Без установки дополнительных прав для десктопа? Можно Вас так же попросить выполнить подобный код:
для saveWinsta перед установкой activeWinsta и для activeWinsta перед восстановлением saveWinsta? Тогда решение с
вполне адекватное ЗЫ Впрочем, хендл десктопа главного потока запущенного процесса можно попробовать получить через GetThreadDesktop, безо всяких дополнительных телодвижений. И тогда можно будет попробовать EnumDesktopWindows на правильном десктопе... Но PostMessage/SendMessage всё равно работать не будут... Это сообщение отредактировал(а) feodorv - 1.7.2012, 22:06 -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
||||
|
|||||
| leniviy |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 552 Регистрация: 8.2.2003 Где: Спб Репутация: 1 Всего: 5 |
Я взял пример отсюда http://www.rsdn.ru/forum/winapi/4243735.1.aspx Добавлено через 8 минут и 22 секунды
saveWinsta test: not visible activeWinsta test: visible Добавлено через 8 минут и 49 секунд
одинаковый результат |
||||
|
|||||
| feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 9 Всего: 45 |
Спасибо за ссылку! Всё таки без WTS-функций не обошлось))) Ха! Ну да, всё правильно... Полистал Интеренет, похоже, другого решения, кроме как запуск процесса в соответствующее окружение, нет -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
| bass |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 315 Регистрация: 5.8.2007 Репутация: 2 Всего: 2 |
Есть но тоже геморойный, инжектить свою длл в процесс и корректно его завершать. |
|||
|
||||
| feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 9 Всего: 45 |
Интересно, а перекрыла ли Майкрософт кислород в возможности дебажить (из одной сессии) процессы (из другой сессии)... Я бы всё-таки ещё надеялся на имперсонализацию... А вдруг... -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
| leniviy |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 552 Регистрация: 8.2.2003 Где: Спб Репутация: 1 Всего: 5 |
.dll можно добавить, пропатчив .exe файл. Это работает с несжатыми. Сжатые upx можно распаковать, сжатые проприетарно, типа skype.exe, нельзя. |
|||
|
||||
| bass |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 315 Регистрация: 5.8.2007 Репутация: 2 Всего: 2 |
Я не пропатчить а инжектить уже во время работы..... Или распределить память в процессе там
И поменять eip главного потока на область этой памяти...... А вот пропатчить не увлекался этим. Есть у меня дллка сквозная называеться USER32.dll. Вот если ее подкинуть в папку программы то вместо системной сначала подсосеться она..... Ну и делай с процессом что хочешь. Незнаю что в висте будет и в семерке. Добавлено @ 14:48 Надо попробовать сам сейчас интересуюсь. Вот от юзера в систем точно незя. Это сообщение отредактировал(а) bass - 29.7.2012, 14:53 |
|||
|
||||
![]()
|
| Правила форума "C/C++: Системное программирование и WinAPI" | |
|
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |