Носколько вопросов о Win32

From
Boris Rudakov (2:5054/9.4)
To
Vitas Ramanchauskas ()
Date
1996-06-25T01:41Z
Area
SU.WINDOWS.PROG
Hello Vitas!

22 Jun 96 12:14, Vitas Ramanchauskas wrote to Boris Rudakov:

 VR> Hi!{

 VR> 21 Jun 96 13:58, Boris Rudakov (2:5054/9.4) -> Vitaly Ladygin:

 BR>> Впрочем, это смотря что писать, (и сколько пил накануне:):):)
 VR> я б сказал наоборот - сколько писать и что пил накануне ;)

 BR>> Иногда на ровном месте так упрешься, что часа 3-4 ищешь дурацкий
 BR>> баг (как с этим CLS/STS).
 VR>                      ^^^^^^^  так что было накануне ? ;)) (cld/std)
Хм, накануне мы с другом на пиво налегали (у него дочка родилась:)

 BR>> Нэ-хо-чу. Мне надо-то подгрузить Win16 DLL и солучить адрес
 BR>> хотя-бы одной функции, ее я вызову через CALL FWORD PTR и дело
 BR>> сделано. Делов-то, ненадо мне генераторов :) Как верно заметил по
 BR>> поводу этих thunk-ов Шульман, "а надо ли такие сложности ?"

 VR> не все так просто в этом мире. когда call происходит в 32-битном
 VR> сегменте, то на стек ляжет 32-битный адрес. а 16-битная dll этого не
 VR> ожидает. по этой причине произойдут следующие неприятные вещи -
Как так "не ожидает" ?! Еще как ожидает. Это будет чистейший thunk, только самопальный.
 VR> "съедут" параметры, команда ret отработает неправильно (она бы
 VR> отработала правильно если бы была б спрефиксом 66h). впрочем один
Обязательно. Возврат в 32битный код после __FWORD PTR__ другим и не может быть.
 VR> экзотический вариант есть - сделать из 32-битного сегмента 16-битный
 VR> call, но это получится только если адрес возврата будет лежать в
Нет, так хуже.
 VR> пределах первых 64-килобайт. еще будет маленькая большая проблема со
 VR> стеком (sp-esp), но если все это побороть то можно ручками сделать то,
 VR> что проще быстрее и надежнее делается с помощью thunk'ов.
Я специально еще раз Шульмана пересмотрел, реально там особых сложностей нет. Со стеком надо извращаться только если в Win32 части его предел больше 64к. Впрочем, можно переключиться и на временный стек (единственное узкое место), Шульман это тоже демонстрирует. Реальная сложность только одна - загрузить Win16 DLL и вытащить адрес одной из ее функций (очень специальной функции:)
Потом - Win32, CALL FWORD -> Win16, RETD -> Win32.

Как сделаю - напишу.
Может по ходу еще вопросов задам :)

 VR> }EndOfHi!

Boris Rudakov,               Советская колыбельная должна будить !
BBR

--- Be happy: BBR is looking at you !
 * Origin: АлкАголь малыми дозами безвреден в любых количествах (2:5054/9.4)