![]() |
|
![]() ![]() ![]() |
|
fullnull |
|
|||
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 23.7.2007 Репутация: нет Всего: нет |
Здравствуйте. Простой вопрос не отнимет у Вас много времени.
Простейшая программа, скомпилированная с помошью Visual C++ Toolkit 2003,
не работает, завершается при выполнении int 21h. Вообще, не терпит команды int. Это особенность vc++ или еще что? Надеюсь на Вашу помощь. |
|||
|
||||
GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: нет Всего: 26 |
Это особенность windows. в windows прерывания DOS не работают.
|
|||
|
||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 2 Всего: 154 |
а инструкцию процессора int, вообще нельзя в обычных программах использовать |
|||
|
||||
GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: нет Всего: 26 |
Lazin, можно написать
_emit 0xCD _emit 0x21 |
|||
|
||||
W4FhLF |
|
|||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: нет Всего: 121 |
Для отладочных прерываний(int 1 / int 3) можно. -------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
|||
|
||||
ParaPik |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 132 Регистрация: 8.1.2009 Репутация: нет Всего: нет |
Дело в том, что в защищенном режиме работы микропроцессора имеются так называемые кольца привилегий. Их всего 4(0, 1, 2, 3).
0-ой по другому называют режимом ядра, т.к. на этом уровне работает Windows. А программы, которые компилирует Visual C++ имеют уровень привилегий 3(самый низший). 3-ий также называют режимом пользователя. На этом уровне нельзя выполнять след. и некоторые другие команды(а точнее их разновидности): int, iret, out, in, lmsw, smsw, lgdt, lldt. WinAPI функции находятся на более привилегированном уровне. И для их вызова используется команда sysenter. Когда микропроцессор встречает одну из следующих команд, то сравнивает поле RPL в сегментном регистре cs. Если это поле равно 3, то выбрасывается исключение(вид прерывания), на которое должна отреагировать OS. |
|||
|
||||
dumb |
|
|||
![]() sceloglauxalbifacies ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2929 Регистрация: 16.6.2006 Репутация: нет Всего: 158 |
ParaPik, почитай еще литературу. а пока не пиши о внутреннем устройстве windows - не вводи людей в "ступор".
|
|||
|
||||
GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: нет Всего: 26 |
ParaPik, ты написал чушь
|
|||
|
||||
ParaPik |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 132 Регистрация: 8.1.2009 Репутация: нет Всего: нет |
Во-первых, я пишу то, о чем читал, GoldFinch. А, во-вторых, если бы можно было использовать все команды для пользовательских приложений, то я мог бы сам установить привилегию, которая мне нужна с помощью команд call far, retf.(Но и это только половина работы)
Это сообщение отредактировал(а) ParaPik - 21.7.2009, 15:52 |
|||
|
||||
GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: нет Всего: 26 |
ParaPik, и то что ты читал - чушь.
Добавлено через 29 секунд или то что ты читал - не чушь, но ты не так понял то что прочитал. |
|||
|
||||
ParaPik |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 132 Регистрация: 8.1.2009 Репутация: нет Всего: нет |
1) Я описался. Микропроцессор должен анализировать CPL(как я понял, он берется из DPL дескриптора).
2) Я читал Юрова и Пирогова. Если это чушь, то я не знаю тогда, что читать. |
|||
|
||||
GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: нет Всего: 26 |
ParaPik, ты плохо их читал, они такого не пишут
|
|||
|
||||
ParaPik |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 132 Регистрация: 8.1.2009 Репутация: нет Всего: нет |
Правильно. Они пишут только основу(Хотя как основу. Они совсем немного не добирают до полноты изложения. А эти нюансы можно прочитать в отдельных статьях). Что конкретно тебя смущает? То, что я написал какие команды не доступны на 3-ем уровне. Так это другие профессионалы написали. А потом все подтвердилось на практике. А про анализ микропроцессора тоже у известных лиц прочитал. Правда, в своем сообщении я несколько отошел от прерываний. Вернее было бы сказать, что команда-то разрешается. Но при вызове прерывания происходит сравнение CPL с полем DPL в дескрипторе таблицы прерываний. Это поле и определяет, кто может вызывать это прерывание,а кто нет. Ну, вроде уже все конкретизировал.
Это сообщение отредактировал(а) ParaPik - 21.7.2009, 17:58 |
|||
|
||||
GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: нет Всего: 26 |
вкратце, код в Windows может выполняться на уровне ядра или на пользовательском уровне. Ядро винды по определению выполняется на ядерном уровне*; драйвера, винды или пользовательские тоже работают в кернелмоде. Юзермодный код винды и пользовательские процессы работают в юзермоде. Что характерно, код винды, ядерный или юзермодный ничем не отличается от пользовательского. WinAPI функции - это юзермодные функции. *kernel.dll тоже называется "ядро", а работает в юзермоде. |
|||
|
||||
Cheloveck |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1578 Регистрация: 26.7.2008 Где: Тула Репутация: нет Всего: 32 |
Я слышал о какой-то ОС, которая использует первый и второй уровень, но это не винда. Винда, как и большинство ОСей, используют только 0 и 3 -------------------- ![]() |
|||
|
||||
ParaPik |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 132 Регистрация: 8.1.2009 Репутация: нет Всего: нет |
GoldFinch, почитай-ка книгу "Внутреннее устройство Windows". Cheloveck, по-моему, Винда все-таки использует и другие кольца, кроме 0 и 3. Во-первых, уровни привилегий для того и были придуманы, чтобы обезопасить системный код от пользовательского. Программа на уровне 3 не может обращать и использовать сегменты кода и данных, которые более привилегированные. Таким программам запрещается на прямую работать с оборудованием(т.е. использовать команды in, out, ins, outs). Для этого служать драйвера, к функциям которых осуществляется через команду sysenter. Также осуществляется вызов и функций Винды. Те функции, которые находятся в библиотеках типа kernel.dll, и служат для обращения к привилегированным функциям. Так, например, функции GDI(GetDC, Rectangle и т.д.) работают в режиме ядра. И для того, чтобы к ним обратиться, мы и используем функции из dll-библиотек. Чтобы в этом убедиться проследите все действия через отладчик. Но есть функции, которые работают в режиме пользователя. Например, GetCurrentThread. Она возвращает псевдоуказатель на поток. И прерывания DOS тоже доступны. Только, чтобы их вызвать, надо иметь нулевой уровень привилегий, который имеют все программы под DOS, запускаемые под Виндой. Система, просто, эмулирует родную среду для приложения.
|
|||
|
||||
Cheloveck |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1578 Регистрация: 26.7.2008 Где: Тула Репутация: нет Всего: 32 |
цы здесь -------------------- ![]() |
|||
|
||||
GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: нет Всего: 26 |
ParaPik,
1) в винде колец 2: 0е и 3е 2) АПИ винды - в длл, это юзермод. GetProcAddress - функция апи винды, живет в kernel32.dll, не использует обращения к коду ядра 3) ВЕСЬ GDI - это юзермод.
да, управляется GDI ядром, но само GDI живет в юзермоде |
|||
|
||||
ParaPik |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 132 Регистрация: 8.1.2009 Репутация: нет Всего: нет |
GoldFinch,
1) В dll-библиотеках, как я уже писал, есть функции, которые работают в пользовательском режиме. 2) Во-первых, в книге "Внутреннее устройство Windows" дана хорошая схема, которая показывает расположение все частей системы. Сам центр GDI, который работает с оборудованием, если есть драйвер, то через него, расположен на уровне ядра. А как ты себе представляешь на 3-ей уровне обратиться к оборудованию, не использую команды in, out. Еще раз повторяю. Dll-библиотеки - это user mode, а они, большая часть из них, обращаются к функциям kernel mode. 3) Что такое kernel objects. Это самые "простые" объекты, которые инкапсюлируют в себе элементарные(меньчайшие) компоненты системы. Например, таймеры, мьютексы, cобытия, потоки ядра. Их главная особенность в том, что, чтобы к ним обратиться, не нужны описатели(handles). При этом время зря не тратится. User objects. Это объекты, на которые уже нужны описатели, чтобы с ними могла работать посторонняя программа(следовательно, появляются некоторые задержки при работе). Эти объекты инкапсюлируют в себе несколько kernel objects. Но их саморучно, как бы ты ни хотел, изменить никто не даст, потому что сами объекты находятся на 0-ом уровне(для этого есть WinAPI). 4) Cheloveck, сейчас прочту. |
|||
|
||||
GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: нет Всего: 26 |
ParaPik, юзермодные дллки винды могут обращаться к чему угодно, хоть к серверу с линуксом по сети через RPC
только апи винды - это функции которые экспортируют эти юзермодные дллки, и тот пост на 80% - бред |
|||
|
||||
ParaPik |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 132 Регистрация: 8.1.2009 Репутация: нет Всего: нет |
Если Винда находит PE-заголовок в файле, то сразу отправляет программу на 3-й уровень. И все DLL загружаются на 3-й уровень.
ВСЕ!. А раз ты считаешь это бредом, тогда Соломон с Руссиновичем - ламеры. А все, что они написали в своей книге, - фуфло. А все, что там написано, они записали со слов таких людей, как Катлер(один из разработчиков системы). В их книге все подробно описано. Куда Винда пихает, зачем пихает. P.S. Короче, прочитай их книгу. А то я смотрю, ты, GoldFinch, вообще не улавливаешь разницу между WinAPI DLL и низкоуровневым WinAPI. И еще. Ты хоть одну WinAPI функцию прогнал через отладчик? |
|||
|
||||
GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: нет Всего: 26 |
ParaPik, прочитай определение понятия API и WinAPI
http://en.wikipedia.org/wiki/Application_p...mming_interface http://en.wikipedia.org/wiki/Windows_API |
|||
|
||||
ParaPik |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 132 Регистрация: 8.1.2009 Репутация: нет Всего: нет |
Знаешь, GoldFinch, я ничего нового не узнал. Эти статьи написаны в максимально абстрагированном варианте. Т.е. в них сказано, что есть специализированный интерфейс, который позволяет приложениям выполнять определенные действия. Например, WinAPI. Но. Если говорить о реализации этого интерфейса на низком уровне, то определение можно дать такое: "API - это набор библиотек, через которые приложение общается с OS. Т.е. вызывает ее функции." А раз OS находится на 0-ом кольце, то и эти функции располагаются там же. Если и этого недостаточно. То могу предложить схему строения Windows, принятой Microsoft.
|
|||
|
||||
GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: нет Всего: 26 |
ParaPik, ОС не находится в 0м кольце. ядро - да. драйвера - да. но ОС находится и в 0 и в 3м кольцах.
АПИ - это интерфейс. сервисы ядра, к которым обращаются их юзермодные обертки - это реализация винды. это не интерфейс винды. юзермодные приложения обращаются к юзермодному интерфейсу винды - АПИ. драйвера обращаются к ядерному интерфейсу винды - это тоже АПИ, но АПИ для драйверов, приложения его не юзают. такого понятия в программировании нет. вы можете выдумывать и давать любые определения, например взять и назвать бит байтом, но не надо эти свои определения давать тут, взамен устоявшихся |
|||
|
||||
ParaPik |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 132 Регистрация: 8.1.2009 Репутация: нет Всего: нет |
1) Конечно, приложения его использовать не могут, если код этих функций написан без использования sysenter.
2) Под OS я имел в виду ее ядро(неточность). Еще имеются подсистемы, которые и работают в 3-ем кольце. 3) Сервисы ядра, конечно, - реализации OS. А я разве что-то не так написал. Я написал, что программа обращается к ее функциям, чтобы не вводить новую терминологию. 4) "Если говорить о реализации этого интерфейса на низком уровне". Так вообще-то говорят. Но только здесь речь идет о его реализации в мельчайших ячейках. Когда говорят о низком уровне, то подразумевают мельчайшее строение чего-либо. Если, например, говорить о программе, то имеется в виду машинные команды. 5) Сколько ни читал, везде мое определение о WinAPI и пишут. |
|||
|
||||
rthsobakas |
|
||||||
Опытный ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 562 Регистрация: 20.9.2007 Репутация: нет Всего: -1 |
позволю процитировать тему http://www.cracklab.ru/f/index.php?action=...&topic=9645
там кстати и про sysenter писали.
ведь смотря что понимать под приложением. Вроде как драйвера тоже разные бывают(то есть выполнятся могут в ринг 3 и 0 или я чет перепутал опять). пс. А если честно надо английский учить и говорить на нем, чтобы не портить русский. |
||||||
|
|||||||
![]() ![]() ![]() |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |