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

 WASM Phorum —› WASM.ASSEMBLER —› Пара глупых вопросов и не очень...

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


Дата: Окт 31, 2003 10:56:20

1. mov word ptr MyStruc.Myfield,ax
Что окажется в [ebx].MyStruc?
Он ведь переворачивает как-то, прежде чем в память пишет.
2. mov dword ptr MyStruc.Myfield,eax
что окажется в [ebx].MyStruc?
Он ведь переворачивает как-то, прежде чем в память пишет.
3.Прочитал я тут про формат PE(Portable Executable) и разобрался, как в винде происходит вызов процедур из DLL. И ещё видел юнит к Turbo Pascal который работает с сокетами, обращаясь к VxD через int 16h
И возник вопрос, а как он узнаёт пользователя, который запустил прогу? Dll подгружаются каждая своя под каждого пользователя? Просто странно, происходит обычный вызов Call, и вдруг DLL узнаёт о привилегиях программы, вызвавший Call, каким образом? И вообще, ведь DLL не является процессом вроде, так что у неё могут быть свои привилегии, я так понимаю? Она потипу смотрит по стеку, кто её вызвал, потом по адресу узнаёт пользователя и привилегии, и решает выполнять или нет?
4.Можно ли в Protect Mode шлюзы процедур распологать в GDT, а не в IDT ведь IDT слишком узкая для такого дела...Т.е если присвоить дескриптору бит системности, и обозначить его, как шлюз процедуры кольца 0, то можно ли потом зделать Call на этот дескриптор? Скорей всего, мне кажется, что нельзя, но это просто так неудобно, обращаться к ядру через системные прерывания. Мне так кажется. Просто если есть формат PE, то ведь удобно везде использовать его, а не смешивать два способа вызова процедур.
5. И ещё, а в бинарных файдах, скажем BMP тоже всё перевёрнуто, как если из eax писать в память? И нафиг вообще так сделано, что всё местами меняется?
6. А сравнение с памятью как происходит(scasd,cmp), так, будто бы из памяти загружается в регистр, и сравнивается, тоесть тоже с перевёртыванием?
7.Вот ещё вопросик, а как с совместимостью указателей в C/C++? В смысле, в досе размер смещения FFFF а в ProtectMode FFFFFFFF. Как из RM безболезненно перейти в 32-х битный PM, если я пишу на C+TASM. В смысле вот в Асме есть SEGMENT USE32/ SEGMENT USE16, а как быть с "C",ведь то я был под 16-ти битами, а теперь под 32-мя? И вообще, какго размера эти указатели?


Дата: Окт 31, 2003 11:30:02

MishaSt
Про переворачивает:
Применительно к x86 архитектуре понимайте так - "младшие" данные располагаются по младшим адресам, а "старшие" по старшим, адрес при этом указывает на "младшие" данные, т.е. если записать двойное слово из EAX = 012345678h по адресу 0, то получим:
00000000 78
00000001 56
00000002 34
00000003 12
если прочитать его обратно в EAX, оно будет выглядеть так же, как до записи.

При сравнении при помощи CMP надо учитывать перевертывание, при сравнении любым из SCASx'ов не надо.


Дата: Окт 31, 2003 13:52:07

3.Прочитал я тут про формат PE(Portable Executable) и разобрался, как в винде происходит вызов процедур из DLL. И ещё видел юнит к Turbo Pascal который работает с сокетами, обращаясь к VxD через int 16h
И возник вопрос, а как он узнаёт пользователя, который запустил прогу? Dll подгружаются каждая своя под каждого пользователя? Просто странно, происходит обычный вызов Call, и вдруг DLL узнаёт о привилегиях программы, вызвавший Call, каким образом? И вообще, ведь DLL не является процессом вроде, так что у неё могут быть свои привилегии, я так понимаю? Она потипу смотрит по стеку, кто её вызвал, потом по адресу узнаёт пользователя и привилегии, и решает выполнять или нет?


Сам то понял че спросил? DLL копируется в память процесса, соответственно становится его частью, соответственно наследует все его свойства и ничего сама "узнавать" не должна


Дата: Окт 31, 2003 18:11:03

При сравнении при помощи CMP надо учитывать перевертывание

Что здесь имеется ввиду?
mov eax, 12345678h
mov [ebx], eax
cmp dword ptr [ebx], 12345678h ;-??

Вы хотите сказать, что эта команда CMP не сравнит пока данные не будут перевёрнуты?


Дата: Окт 31, 2003 20:05:51

3.Прочитал я тут про формат PE(Portable Executable) и разобрался, как в винде происходит вызов процедур из DLL. И ещё видел юнит к Turbo Pascal который работает с сокетами, обращаясь к VxD через int 16h
И возник вопрос, а как он узнаёт пользователя, который запустил прогу? Dll подгружаются каждая своя под каждого пользователя? Просто странно, происходит обычный вызов Call, и вдруг DLL узнаёт о привилегиях программы, вызвавший Call, каким образом? И вообще, ведь DLL не является процессом вроде, так что у неё могут быть свои привилегии, я так понимаю? Она потипу смотрит по стеку, кто её вызвал, потом по адресу узнаёт пользователя и привилегии, и решает выполнять или нет?

Сам то понял че спросил? DLL копируется в память процесса, соответственно становится его частью, соответственно наследует все его свойства и ничего сама "узнавать" не должна

Я про то, когда вызываешь функцию, которою не все имеют права вызывать,например, записи в реестр, то значит DLL обращается к устройству, или к Native Api, а оно, устройство или Native Api определяет, выполнять процедуру или нет, значит так получается, и что, для каждого приложения своя копия kernel32.dll загружается? А как устройство или Native Api определет пользователя, от которого выполняется данная процедура?


Дата: Окт 31, 2003 20:23:43

MishaSt

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

Native API не определяет ничего. Это ему на хер не нужно. Native API - это, всего лишь, переходники к функциям ядра (не все, не всегда, но для упрощения оставим как есть). А вот в ядре система решает (согласно объектам ядра), ЧТО делать с поступившим запросом - есть ли у тебя необходимые права, а не пытаешься ли ты залезть по недопустимым адресам и т.п.
Что до копии kernel32.dll. Да, под NT+ каждый процесс в своем контексте может иметь kernel32.dll. То, что она будет загружена - не факт, но ntdll.dll загружается принудительно.


Дата: Окт 31, 2003 20:42:57

Я про то, когда вызываешь функцию, которою не все имеют права вызывать,например, записи в реестр, то значит DLL обращается к устройству, или к Native Api, а оно, устройство или Native Api определяет, выполнять процедуру или нет, значит так получается, и что, для каждого приложения своя копия kernel32.dll загружается? А как устройство или Native Api определет пользователя, от которого выполняется данная процедура?
Володя в принципе правильно сказал.
Хочу чутка дополнить
1) Перед задаванием вопросов. ЧИТАЕМ РИХТЕРА !!!
2) По поводу DLL - Это кусок процесса уже. Такой же как модуль в трупо-паскале.
3) Все привилегии контроллируются внутри ядра.
4) Читаем книги
5) Читаем MSDN
6) Читаем опять книги.
newbe блин.


Дата: Ноя 3, 2003 04:58:27

AsmGuru62
Зачем такой тривиальный пример.
Я имел ввиду, например, если прочитать в память bmp-файл, то для сравнения сигнатуры 'BM', можно использовать
cmp FileHeader.bfType,04D42h ; 'B' - 042h, 'M' - 04Dh


хотите сказать, что эта команда CMP не сравнит
Ты не видишь разницы между моим надо учитывать и своим не сравнит?


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