Нахождение адреса WndProc - PullRequest
       14

Нахождение адреса WndProc

3 голосов
/ 15 декабря 2009

Как мне найти адрес WndProc (окна другого процесса ). Даже если я внедряю DLL и пытаюсь найти ее с помощью GetClassInfoEx () или GetWindowLong () или GetWindowLongPtr (), я всегда получаю значения, такие как 0xffff08ed, который определенно не является исполняемым адресом. В соответствии с MSDN: «... адрес оконной процедуры или дескриптор, представляющий адрес оконной процедуры».

К сожалению, этого недостаточно, мне нужен фактический адрес. Spy ++ делает работу правильно большую часть времени (но даже это иногда не удается). Так должно быть возможно. Thanx.


[РЕДАКТИРОВАТЬ:] Престижность Крис Бекке за супер быстрое и правильное решение моей маленькой проблемы!

Ответы [ 2 ]

4 голосов
/ 15 декабря 2009

Возможно, вы зашли в тупик, потому что запрашиваете не ту версию windowproc.

Window Procs, как и приложения, существует в двух вариантах: ANSI и Unicode. Windows не может вернуть необработанный указатель на окно ANSI в приложение Unicode или наоборот, так как они попытаются вызвать его с неверным типом строки.

Итак, функция GetWindowLongPtr отсутствует. Это макрос, который разрешает две «настоящие» функции, которые предоставляет Windows API: GetWindowLongPtrA и GetWindowLongPtrW. Если окно является окном Юникода, и GetWindowLongPtrA вызывается, окна возвращают дескриптор вместо необработанного указателя, так что он может перехватывать вызовы (сделанные через CallWindowProc) и перенаправлять строки из ANSI в Юникод. Обратное преобразование имеет место в другом направлении.

Даже если вы вызываете правильную функцию, вы все равно можете получить дескриптор - вполне возможно, что ANSI-код подклассифицирует окно Unicode. поэтому windowproc был полностью заменен одним из дескрипторов callWindowProc.

В таком случае - думаю, мне не повезло.

1 голос
/ 03 апреля 2015

Чтобы расширить ответ Криса Бекке (который решил мою проблему, спасибо!):

Итак, функция GetWindowLongPtr отсутствует. Это макрос, который разрешает две «настоящие» функции, которые предоставляет Windows API: GetWindowLongPtrA и GetWindowLongPtrW. Если окно является окном Юникода, и GetWindowLongPtrA вызывается, окна возвращают дескриптор вместо необработанного указателя, так что он может перехватывать вызовы (сделанные через CallWindowProc) и перенаправлять строки из ANSI в Юникод. Обратное преобразование имеет место в другом направлении.

Вы можете проверить, является ли рассматриваемое окно юникодом или окном ANSI, вызвав функцию IsWindowUnicode. Используя эту информацию, вы можете определить, какую функцию GetWindowLongPtr нужно вызвать (во время выполнения),

...