Win32 Hooks DLL injection into Applications Built against "Any CPU"

Я работаю над проектом, который фиксирует все взаимодействия с пользователем. MSDN подсказывает (this)

SetWindowsHookEx можно использовать для внедрения DLL в другой процесс. A 32-битная DLL не может быть внедрена в 64-битный процесс, а 64-битная DLL не может быть внедрена в 32-битный процесс. Если приложение требует использования крючков в других процессах, необходимо, чтобы 32-битное приложение вызывало SetWindowsHookEx для внедрения 32-битной DLL в 32-битный процессах, а 64-битное приложение вызывало SetWindowsHookEx для внедрения 64-битной DLL в 64-битные процессы.

Мой вопрос в том, что произойдет, если приложение было собрано на любом процессоре. Нужно ли мне вызывать SetWindowsHookEx из DLL, собранной на Any CPU.

Я написал HookLogger_32.exe, загружающий HookFunctions_32.dll (оба x86) и HookLogger_64.exe, загружающий HookFunctions_64.dll (оба x64), устанавливающий WH_CBT и WH_MOUSE глобально (не для конкретного потока).

HookLogger_32.exe, HookLogger_64.exe, HookFunctions_32.dll и HookFunctions_64.dll написаны на C++.

Когда я нажимаю на приложение .NET, собранное на Any CPU, эти DLL внедряются (через SetWindowHookEx). ОС Windows зависает, и мне приходится принудительно перезагружать машину.

Когда одно и то же .NET-приложение собирается на x86 или x64, и когда я нажимаю на приложение после запуска HookLoggers (как 32, так и 64-битных), все работает нормально.

Любые причины такого неопределенного поведения.

Платформа, на которой я работаю - 64-битная машина.

7
задан sri 8 February 2012 в 02:37
поделиться