Носколько вопросов о 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)