Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: программирование на языке Assembler


Информационный Канал Subscribe.Ru

РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Assembler

Выпуск № 245
от 21.09.2005, 11:07

Администратор:Калашников О.А.
В рассылке:Подписчиков: 258, Экспертов: 19
В номере:Вопросов: 2, Ответов: 6


Вопрос № 26408: Я только начинаю разбираться с программированием под Win32. Простые приложения получаются. Решил с чужими DLL поработать, но вот проблема: Есть заголовочный файл (на С++) и я никак не могу переделать его в inc файл для АСМа. Никак не врублюсь что...
Вопрос № 26418: Здравствуйте, уважаемые эксперты. Есть несколько вопросов. 1) Зачем под Win32 используются регистры CS, DS и т.д.? Что в них? 2) Как под Win32 из приложения получить доступ к произвольной области памяти, расположенной за пределами памяти,...

Вопрос № 26.408
Я только начинаю разбираться с программированием под Win32. Простые приложения получаются. Решил с чужими DLL поработать, но вот проблема:
Есть заголовочный файл (на С++) и я никак не могу переделать его в inc файл для АСМа. Никак не врублюсь что-такое callback функции и как их представлять в inc файле и использовать?
Например:

typedef int (CALLBACK PASCAL * DOACTION)(PSESSION);

Насколько я понял - это указатель на функцию, находящуюся в DLL, но как компилятор определяет её адрес, если ни в одном заголовочном файле его нет?

Помогите пожалуйста!!!
Отправлен: 15.09.2005, 23:20
Вопрос задал: Qwestor (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Евгений Иванов
Здравствуйте, Qwestor!
Это просто тебе для помощи может пригодиться. Для справки...

Но Ассемблере это маловажно.

Обычно есть справка по функциям и нужно просто вызывать подпрограмму с нужными параметрами.
Ну и смотреть на язык.
Если pascal, то пишешь также.
Если С, то пишешь С.
Обычно в win32 используется STDCALL.

Ставишь в модели вот так:
Model NearStack use32 NT Flat,Normal StdCall
И дальше всё будет автоматом вызываться правильно.
А если вызываешь подпрограмму на С, то вот так ишешь:
Call _wsprintfA C, ecx, ofs szNameZoom, [@@num_by]

И всё будет правильно, слева направо и стек потом нормализовываться код проставлять будет.

Удачи!

---------
Что имеем - не храним, потерявши - плачем
Ответ отправил: Евгений Иванов (статус: Профессор)
Отправлен: 16.09.2005, 00:04


Вопрос № 26.418
Здравствуйте, уважаемые эксперты.
Есть несколько вопросов.
1) Зачем под Win32 используются регистры CS, DS и т.д.? Что в них?
2) Как под Win32 из приложения получить доступ к произвольной области памяти, расположенной за пределами памяти, отведённой под это приложение (скажем, считать байт с адреса 00000000 или записать)?
3) Как под Win32 можно "на лету" изменить код программы? При попытке сделать это винда закрывает прогу с ошибкой типа "Access violation: write" (см. приложение).
4) Как из виртуального адреса получить физический, и как с ним потом можно работать?
Система WinXP.

Приложение:

Отправлен: 16.09.2005, 01:26
Вопрос задал: AbVoid (статус: Посетитель)
Всего ответов: 5
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Лысков Игорь Витальевич
Здравствуйте, AbVoid!

Для начала встречный вопрос: что-нибудь про защищенный режим работы процессора слышал? Не мешало бы ознакомиться, иначе никак...
Тут долго рассказывать, может народ подскажет ссылочку, где почитать, я в двух словах раскажу.
Винда работает именно в защищенном режиме. Что это значит? Память разбивается на сегменты, задаются права, необходимые для работы с этой памятью. Эта память специальным образом описуются в так называемой таблице дескрипторов. Индекс в этой таблице как раз и записуется в сегментные регистры и называется селектор. Права могут быть на изменение, на выполнение и т.д.
Это очень краткий и далеко неполный ответ на первый вопрос.
2) Если сможешь записать дескриптор на необходимый участок памяти, то сможешь, иначе никак :) (Только не понимаю, зачем надо? Система наоборот защищает тебя от идиотских попыток писать куда не позволено. Забудь про ДОСовскую практику!)
3)Можно, но для этого опять же необходимо описать сегмент данных, совпадающий с сегментом кода (код, по определению, нельзя менять!)
4)Если не знаешь, для чего оно надо, то зачем задавать этот вопрос. :) А вообще надо работать с таблицами адресов. Короче, изучай матчасть!
3)
---------
Удачи!
Ответ отправил: Лысков Игорь Витальевич (статус: 3-ий класс)
Отправлен: 16.09.2005, 10:20
Оценка за ответ: 4

Отвечает: Евгений Иванов
Здравствуйте, AbVoid!
1. В них находятся селекторы. По сути, сегментация то остаётся хоть в реальном, хоть в защищённом режиме. В них находятся selector кода и данных. Они для выборки из таблиц описания сегментов нужны.

2. это невозможно. для этого нужно находиться на уровне ядра. пиши драйвер.

3. обычными средствами нельзя.


---------
Что имеем - не храним, потерявши - плачем
Ответ отправил: Евгений Иванов (статус: Профессор)
Отправлен: 16.09.2005, 10:35
Оценка за ответ: 3

Отвечает: Bob Johnson
Здравствуйте, AbVoid!
1. cs - сегмент кода, ds - сегмент данных. реально адресуют одит и тот же участок памяти (и тот же, что и es, и ss).
2. 0х0 - это виртуальный адрес, который не соответствует никакому физическому (соотв. таблица страниц отсутствует), поэтому ты никак не получишь к ней доступ. Вообще же для работы с виртуальным адресным пространством винда предоставляет функции VirtualAlloc, VirtualProtect, VirtualFree и т.п.
3. Измени защиту страниц (VirtualProtect) на read-write-execute (по умолчанию стоит read-execute). хотя это же можно менять и в заголовке PE файла.
4. Кажется что-то подобное я видел в DDK (вообще, работать с физической памятью - это уже задача драйверов).
Ответ отправил: Bob Johnson (статус: Академик)
Отправлен: 16.09.2005, 10:55
Оценка за ответ: 4

Отвечает: Sager
Здравствуйте, AbVoid!
В дополнение скажу, что
1),4) это хорошо описано у Broken Sword'a Процессор Интел в защищенном режиме(wasm.ru там лежит это и многое другое)
3) по умолчанию когда программа компилируется, то сегмент кода устанавливается в режим только чтения. Нужно линкеру указать ключ /SECTION:.text,rw, тогда ты разрешишь запись в этот сегмент и никакой Access violation: write выскакивать не будет, .text - это имя сегмента кода. Это майкрософтовский линкер дает ему такое имя, борлондавский же если не ошибаюсь .code
Ответ отправил: Sager (статус: 8-ой класс)
Отправлен: 16.09.2005, 11:08
Оценка за ответ: 4

Отвечает: Undertaker
Здравствуйте, AbVoid!
1. Практически весь код, выполняемый под Win32, DJGPP (или под любой вариант Unix) выполняется в плоской (flat) модели памяти. Это означает, что сегментные регистры и механизм страничной адресации уже установлены заранее для того, чтобы дать вам одно и то же 32-битное адресное пространство в 4 Гб, не зависимо относительно какого сегмента вы работаете. Поэтому вы должны полностью игнорировать (не использовать) все сегментные регистры.
2. Технически прием состоит в том, чтобы внедрить в систему драйвер слежения, который считывал бы память в запрошенном диапазоне и отправлял бы ее содержимое вспомогательному приложению, работающему в режиме пользователя. Хочу особо обратить ваше внимание, что даже драйвер режима ядра не может читать значеиня по адресам виртуальной памяти, которым не соответствует физическая память или память в page-файле. Следовательно, такой драйвер должен тщательно проверять все адреса, перед обращением к ним, дабы избежать BSOD.
3. В совpеменных многозадачных сpедах типично использование одного кода многими потоками, что с самомодификацией малосовместимо. Так что на данный момент это однозначно вpедный пpием.
4. Физические адреса представляют интерес только если процессор работает в режиме страничного обмена. Ведь по существу физический адрес представляет собой напряжение на выводах адресной шины процессора, а ОС отображает линейные адреса на физические,
устанавливая таблицы страниц.
Ответ отправил: Undertaker (статус: Заблокирован)
Отправлен: 16.09.2005, 19:51


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2005, RusFAQ.ru, Россия, Москва. Все права защищены.
Идея, дизайн, программирование, авторское право: Калашников О.А.

Яндекс


Subscribe.Ru
Поддержка подписчиков
Другие рассылки этой тематики
Другие рассылки этого автора
Подписан адрес:
Код этой рассылки: comp.soft.prog.faq
Отписаться
Вспомнить пароль

В избранное