· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› Куда возвращает команда RET из WndProc

. 1 . 2 . >>

Посл.отвђт Сообщенiе


Дата: Авг 29, 2004 16:16:10

Доброго здоровья,
пишет ищущий чайник.

Изучая урок 4 Iczelion'a, задался вопросом

Куда возвращает команда RET из WndProc

Процедуру окна сама прога не вызывает, это понятно, но логично предположить, что после обработки сообщения, прого должна вернуться в цикл сообщений.
Вопрос как в win32 это происходит, и как в айсе это увидеть.


Дата: Авг 29, 2004 17:55:24

Прога вызывает процедуру окна неявно через DispatchMessage


Дата: Авг 29, 2004 20:13:02

[ Bitfry: и как в айсе это увидеть. ]

Добавь int 3 в любое место своей WndProc. В айсе набери i3here on. Когда трапнешься набери p ret и ты в сабже.


Дата: Авг 29, 2004 22:27:55

[Прога вызывает процедуру окна неявно через DispatchMessage]

Loger я это понимаю, я так же понимаю, что и без DispatchMessage может вызваться процедура окна.
Я не очень понимаю, что происходит после этой процедуры.
Команда ret кидает меня в user32, и даже если я буду выполнять код в айсе дальше, я не попаду в цикл сообщений, почему?


[Добавь int 3 в любое место своей WndProc. В айсе набери i3here on. Когда трапнешься набери p ret и ты в сабже.]

Four-F у меня не работает или я что делаю не так.

Насколько я понял нужно выполнить следующее:

В код программы в WndProc добавить строку int 3
Вызвать айс и набрать i3here on
Запустить прогу и трапнуца
Набрать в айсе p ret

И вот здесь айс должен оказаться в сабже.
Только он оказываюсь в том же user32
А за сабж я принимаю цикл сообщений, или я неправ?


Дата: Авг 29, 2004 23:22:18 · Поправил: leo

Bitfry
"А за сабж я принимаю цикл сообщений"

Насколько я понимаю, тебе нужен call stack - цепочка вызовов. В айсе call stack вызывается комадой STACK (подробности в Command Reference). Если под циклом сообщенний имеется ввиду обработка сообщений в дебажном процессе, то в итоге ты должен попасть в PeekMessage или GetMessage дебажного процесса, а из них в message loop. Поэтому после трапа на int3 смотрим call stack и откуда идет вызов PeekMessage и т.п.


Дата: Авг 30, 2004 03:09:51

Bitfry
> И вот здесь айс должен оказаться в сабже.

нажимай F12(p ret) несколько раз, пока не окажешься в адресном пространстве проги.


Дата: Авг 30, 2004 10:31:23 · Поправил: leo

Оычно цикл сообщений это: если не PeekMessage, то WaitMessage. Поэтому вместо int3 можно попробовать bpx WaitMessage. Затем смотришь адрес возврата в ESP.


Дата: Авг 30, 2004 11:18:17

Leo, команда stack очень полезная, спасибо, буду пользоваться.

[пока не окажешься в адресном пространстве проги.]

Asterix, не окажусь я там. Через несколько p ret'ов айс больше не появляется.

Да что вы меня путаете!

Ставлю простой бряк на строку ret
В айсе выполняю эпилог (leave и ret 0010)
Прога в user32, и в стеке сверху лежит указатель начала цикла сообщений моей программы.
Вот и все!

Но суть не в этом, я не хочу возвратиться в цикл по всяким p ret'ам,
я хочу понять, кто и где берет из стека этот указатель и возвращается в мой цикл сообщений за новой месагой.
Блин, я скоро как программер буду изъясняться! :)


Дата: Авг 30, 2004 11:30:40

[Прога в user32, и в стеке сверху лежит указатель начала цикла сообщений моей программы.]

Наврал!
Там не указатель цикла сообщений. Там указатель WndProc, но почему?


Дата: Авг 30, 2004 13:16:09

Сообщения виндоса - штука довольно муторная.
Помимо DispatchMessage, многие другие функции (например DefWindowProc, GetClientRect и т.п.) так же могут вызывать WndProc. т.е. вызов происходит непосредственно из WndProc рекурсивно, может по многу раз.

По RET из WindProc (в XP по крайней маре) попадаем в user32 на
cmp [dword ss:esp+4], DCBAABCD
так виндос заботится о тех, кто использует RETN, вместо RETN 10h.

Ещё поищите Джеффри Рихтер "Создание эффективных WIN32-приложений с учетом специфики 64-разрядной версии Windows", там про сообщения есть целая глава. Ссылки на такие вещи запрещены, но поиск поможет ;-)


Дата: Авг 30, 2004 13:35:05

S_T_A_S_

Вот это ответ так ответ, спасибо.
Буду читать, оно у меня есть.
Если чего не пойму, опять здесь спрашивать буду.
Еще раз спасибо.


Дата: Авг 30, 2004 14:27:29

[ Bitfry: Да что вы меня путаете! ]

Так это не мы тебя, а ты нас :) Ты спросил "Куда возвращает команда RET из WndProc?". И я ответил именно на вопрос. А что ты там имел ввиду - пойди разбери. А Рихтера почитай.


Дата: Авг 30, 2004 16:20:53

Four-F

Да ты прав, я не ясно задал вопрос.

Я не имел введу каманду айса. Вопрос был про опкод ret 0010 в конце WndProc в 4 уроке у Iczelion'a

А книга дельная, я ее отложил, потому что название меня сбило, а вот сейчас читаю.


Дата: Сен 1, 2004 11:38:49

Джеффри РИХТЕР "Создание эффективных WIN32-приложений с учетом специфики 64-разрядной версии Windows"

Цитата из главы 26
...
Алгоритм выборки сообщений из очереди потока

Когда поток вызывает GetMessage или PeekMessage, система проверяет флаги состояния очередей потока и определяет, какое сообщение надо обработать

1. Если флаг QS_SENDMESSAGE установлен, система отправляет сообщение соответствующей оконной процедуре GetMessage и PeekMessage контролируют процесс обработки и не передают управление потоку сразу после того, как оконная процедура обработает сообщение, вместо этого обе функции ждут следующего сообщения.

2. Если очередь асинхронных сообщений потока не пуста, GetMessage и Peek Message заполняют переданную им структуру MSG и возвращают управление в Цикл выборки сообщений (расположенный в потоке) в этот момент обычно обращается к DispatchMessage, чтобы соответствующая оконная процедура обработала сообщение.

3. Если флаг QS_QUIT установлен, GetMessage и PeekMessage возвращают сообщение WM__QUIT (параметр wParam которого содержит указанный код заверше ния) и сбрасывают этот флаг.

4 Если в очереди виртуального ввода потока есть какие-то сообщения, GetMessage и PeekMessage возвращают сообщение, связанное с аппаратным вводом.

5. Если флаг QS_PAINT установлен, GetMessage и PeekMessage возвращают сооб щение WM_PAINT для соответствующего окна
...

Если кто может, объясните, пожалуйста, в пункте 1, идет речь о том, куда прога попадет из WndProc?
А вообще я не нашел в этой главе про сабж, только это.
Может, есть еще дельные книги по архитектуре форточек?


Дата: Сен 1, 2004 13:54:42

Дык я же написАл - из WndProc мы всегда будем попадать в user32, поскольку именно оттуда и происходит непосредственно вызов.
Куда попадём дальше - вопрос неоднозначный, зависит от состояния очереди сообщений.

Ты б написАл подробнее зачем это нужно, может тогда кто-нибудь и даст более вразумительный ответ.

Досконального описания всего этого механизма imho нигде нет, т.к. он меняется с развитием виндоса.
Например, до XP можно было обходиться без ф-ции DispatchMessage, самостоятельно вызывая WndProc.
Можно ещё создать окна без цикла выборки сообщений.
Или зарегистрировать DefWindowProc в качестве WndProc.

. 1 . 2 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.092