Thunk's
- From
- Andry Ivanov (2:5030/53.152)
- To
- All ()
- Date
- 1996-05-29T11:38Z
- Area
- SU.WINDOWS.PROG
Hi All!
Уважаемые специалисты по написанию и чтению subj-ей.
Только-что с большим интересом в который раз просмотрел
файл OWL.CPP из исходников OWL 5.0 ( впрочем по сравнению
с 2.x он слабо изменился). Есть там функция, которая генерит
этот самый thunk. Причем присутствует она в двух экземплярах -
для Win16 и для Win32.
Суть thunk'а проста - в массив char'ов забивается код, который должен
вызвать некую функцию, передав ей на регистрах некий адрес. Точнее,
адрес оконного обьекта, для которого thunk создается.
Так вот, кроме очевидных отличий в используемых регистрах, имеются
еше такие:
- Win32 вариант действует просто и прямолинейно, Распределяет память
по new,забивает чем надо и предлагает выполнять. Чего выделил нигде
не запоминает, поскольку thunk станет потом WNDPROC. Когда надо
освободить экземпляр - приводит WNDPROC к указателю на структуру,
которой он и был раньше, и ничтоже сумняшеся delete ее.
- Win16 во первых все чего наделал хранит внутри себя, во вторых
данные выполнять не дает, а вместо этого создает алиасный селектор
с помощью PrestoChangoSelector() и от него уже генерит thunk.
И освобождает все посредством FreeSelector.
Зачем сложности в Win16 вроде написано прямо в коде - нельзя данные выполнять.
Логичный вывод - если в Win32 сложностей нет, значит то, что
Borland распределяет по new выполнять можно. То есть хочешь
- выполняй как код, хочешь - удаляй как данные?
Так это или нет?
И где Borland выделяет эту память? В умолчаемой куче процесса или
свою создает?
С уважением, Andry
--- Дед-нудист 2.42.G0214+
* Origin: Мир несовершенен (2:5030/53.152)