деинсталляция hook dll
От: Amethyst  
Дата: 17.03.06 08:53
Оценка:
Доброго времени суток.
Коллеги, подскажите pls каким образом обычно решается следующая проблема. Есть некое приложение, которое использует хуки — например "хучит мышь". Пользователь поигрался с программой, а потом решил её деинсталлировать. Удалить hook.dll не всегда представляется возможным, т.к. она может быть загружена в адресное пространство другого процесса и использоваться. Однако оставлять компонент деинсталлированной программы имхо не есть гут. Как штатно обходится эта неприятность ?
Почему добро всегда побеждает зло? Потому что историю пишут победители.
Re: деинсталляция hook dll
От: Vovik1982 Россия  
Дата: 17.03.06 08:56
Оценка:
При выходе из программы ты должен снимать все хуки и освобождать библиотеку.
Re[2]: деинсталляция hook dll
От: Amethyst  
Дата: 17.03.06 09:02
Оценка:
Здравствуйте, Vovik1982, Вы писали:

V>При выходе из программы ты должен снимать все хуки и освобождать библиотеку.

Этого недостаточно. Если загружено стороннее приложение, dll убить невозможно. Выход — это ребут / логаут, а при входе в систему стереть компонент. Но может чего-нибудь поизящнее существует в мире стандартных решений ...
Почему добро всегда побеждает зло? Потому что историю пишут победители.
Re[3]: деинсталляция hook dll
От: Vovik1982 Россия  
Дата: 17.03.06 09:05
Оценка:
Разве что грохнуть все приложения, которые ее пользуют...
Re[3]: деинсталляция hook dll
От: ekamaloff Великобритания  
Дата: 17.03.06 09:05
Оценка:
Здравствуйте, Amethyst, Вы писали:

A>Этого недостаточно. Если загружено стороннее приложение, dll убить невозможно. Выход — это ребут / логаут, а при входе в систему стереть компонент. Но может чего-нибудь поизящнее существует в мире стандартных решений ...


Так и делай ИМХО. Причем MoveFileEx тебе в помощь.
It is always bad to give advices, but you will be never forgiven for a good one.
Oscar Wilde
Re: деинсталляция hook dll
От: Вумудщзук Беларусь  
Дата: 17.03.06 10:11
Оценка: 30 (7)
>Коллеги, подскажите pls каким образом обычно решается следующая проблема. Есть некое приложение, которое использует хуки — например "хучит мышь". Пользователь поигрался с программой, а потом решил её деинсталлировать. Удалить hook.dll не всегда представляется возможным, т.к. она может быть загружена в адресное пространство другого процесса и использоваться. Однако оставлять компонент деинсталлированной программы имхо не есть гут. Как штатно обходится эта неприятность ?

Хуковая dll загружается в процесс тогда, когда процесс (не совсем точно... видимо, когда любой из потов процесса) получает сообщение в очередь. Аналогично dll'ка выгружается, когда в приходит сообщение, а система обнаруживает, что хук снят. Так что если процесс висит в бэкграунде и не получает сообщений, dll'ка будет болтаться в его адресном пространстве. А чтобы форсировать выгрузку можно попробовать после снятия хука послать всем приложениям какое-нть сообщение, например WM_NULL:

DWORD dwRecipients = BSM_ALLCOMPONENTS;
BroadcastSystemMessage(BSF_POSTMESSAGE, &dwRecipients, WM_NULL, 0, 0);
Homo sum et nihil humani a me alienum puto...
Re[2]: деинсталляция hook dll
От: Аноним  
Дата: 12.01.09 13:39
Оценка: -1
Но есть одно НО. Если процесс, в котором сидит Хук, заснул на функции аля WaitForSingleObject, то сколько не посылай сообщений, то он (процесс), его не обработает, и хук будет оставаться в этом процессе.
Варианты решения есть типа, заставить это процесс вызвать функцию PeekMessage, причем это можно это сделать из другого потока, данного процесса. Достигнуть такого эффекта можно или внедрения своего кода в это процесс с помощью CreateRemoteThread или, сам хук должен создавать поток и ждать сигнала, что бы вызвать PeekMessage.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.