Re: Способ выгрузить hook dll после удаления хука
От: Abandoned Беларусь  
Дата: 06.04.06 13:24
Оценка: 10 (1)
баян :

Re: деинсталляция hook dll
Автор: Вумудщзук
Дата: 17.03.06
Способ выгрузить hook dll после удаления хука
От: Кодёнок  
Дата: 06.04.06 12:14
Оценка:
Может быть вы писали глобальные хуки под Win32 c помощью SetWindowsHookEx(). Тогда вам знакома ситуация, когда выше приложение закончило работать, оно удалило хук, и вы, поправив код, пытаетесь пересобрать DLL, но линкер вам говорит: HOOK.DLL: Cannot open file for writing. Оказывается, DLL хука осталась загруженной в некоторых процессах. Что делать? Обычно люди просто переименовывают файл DLL, и линкер успешно создаёт новый. Но после нескольких таких переименований могут начаются глюки и придется перелогиниться.

Сегодня я вдруг понял проблему Выгрузка хуков происходит внутри GetMessage. Некоторые процессы не получают никаких сообщений часами, соответственно, GetMessage у них не вызывается. Решение — послать окнам этих процессов хоть что-нибудь с помощью PostMessage.

Вот например, решение на питоне — посылает какому-нибудь окну каждого из процессов WM_NULL. После запуска этого скрипта все невыгруженные DLL с хуками выгружаются. Требует ActivePython, но вы можете легко переписать это на C++.

# Post WM_NULL to some window of every process in current desktop.
# This helps to unload hook DLL when hook has been removed, but DLL stays loaded into some processes.
import win32gui, win32process, win32api

# Find all top-level windows
def MyEnumWindows():
    lst = []
    win32gui.EnumWindows( (lambda hwnd, lparam: lst.append( hwnd ) and True), 0 )
    return lst
windows = MyEnumWindows()

# Select one window from each unique process
pid_hwnd_pairs = [(win32process.GetWindowThreadProcessId( hwnd )[1], hwnd) for hwnd in windows]
windows = dict(pid_hwnd_pairs).values()

# Post WM_NULL to each
for hwnd in windows:
    print "Posting to 0x%08X" % hwnd
    win32api.PostMessage( hwnd, 0, 0, 0 )

# Now your hook dlls must be unloaded.
Re: Способ выгрузить hook dll после удаления хука
От: Кодёнок  
Дата: 06.04.06 12:26
Оценка:
Здравствуйте, Кодёнок, Вы писали:

Хотя если подумать, достаточно лишь

import win32gui, win32api
win32gui.EnumWindows( (lambda hwnd, lparam: win32api.PostMessage( hwnd, 0, 0, 0 ) and True ), 0 )
Re[2]: Способ выгрузить hook dll после удаления хука
От: Кодёнок  
Дата: 07.04.06 04:25
Оценка:
Здравствуйте, Abandoned, Вы писали:

A>баян :

A>Re: деинсталляция hook dll
Автор: Вумудщзук
Дата: 17.03.06


Ясно, я проморгал
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.