Перехват приложений :: система x64 - PullRequest
0 голосов
/ 27 мая 2009

Есть ли какой-то секрет в подключении 64-битного и 32-битного процессов в 64-битной системе?

В приложении, которое я сейчас пишу, мне нужно иметь возможность подключать 64-битные процессы. Перехват 32-битных процессов прекрасно работает в 64- и 32-битных системах, но при попытке перехвата 64-битных приложений сообщения не принимаются.

Прежде чем кто-нибудь скажет мне, что я не должен делать что-то подобное, позвольте мне объяснить, что это очень необходимая вещь для меня. Без установки глобальных системных перехватов мое приложение будет бесполезным / бессмысленным.

Это приложение написано на C # / WPF, но с использованием DLL C ++ для реальной перехватки. Я попытался скомпилировать dll для 64-битных систем, хотя он все еще не делает то, что должен делать. Когда он скомпилирован и работает на 32-битных системах, он работает точно так же, как и должен.

* Редактировать :: Я говорю о перехвате оконных сообщений - сообщения WH_CBT & WH_SHELL

1 Ответ

3 голосов
/ 08 июля 2009

Чтобы подключить как 32-разрядные, так и 64-разрядные процессы, необходимо убедиться, что:

  1. У вас есть 32-битная DLL для подключения 32-битных процессов и 64-битная DLL для подключения 64-битных процессов
  2. SetWindowsHookEx () вызывается из 32-битного кода для перехвата 32-битных процессов и из 64-битного кода для перехвата 64-битных процессов.

Последнее в основном означает, что вам необходимо создать как 32-битный, так и 64-битный исполняемый файл, который вызывает SetWindowsHookEx (), предоставляя 32-битную и 64-битную DLL соответственно в качестве параметра hMod.

Если ваше приложение 32-битное, вам нужно будет запустить 64-битный процесс, который будет вызывать SetWindowsHookEx () и, вероятно, больше ничего не делать, пока вы не отсоединитесь. Обратите внимание, что Windows автоматически отменяет перехват, когда / если этот процесс завершается / завершается, поэтому он должен оставаться активным все время, пока вам нужны перехватчики, возможно, в течение всего времени жизни вашего приложения - в этом случае вы можете сделать свой 64-битный процесс WaitForSingleObject () до тех пор, пока ваш основной процесс приложения не завершится / не завершится, не отсоединится и не выйдет после завершения WaitForSingleObject ().

...