Поиск:

Ответ в темуСоздание новой темы Создание опроса
> asm-прерывания на vc++, программа аварийно закрывается 
:(
    Опции темы
fullnull
Дата 20.7.2009, 00:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 23.7.2007

Репутация: нет
Всего: нет



Здравствуйте. Простой вопрос не отнимет у Вас много времени.
Простейшая программа, скомпилированная с помошью Visual C++ Toolkit 2003,
Код

#include <iostream>
using namespace std;

int main()
{
    char message[] = "Hello World!$";

    _asm {
        mov ah,9
        lea dx,message
        int 21h ;завершается здесь
    }

    cin.get();
}

не работает, завершается при выполнении int 21h. Вообще, не терпит команды int. Это особенность vc++ или еще что?
Надеюсь на Вашу помощь.
PM MAIL   Вверх
GoldFinch
Дата 20.7.2009, 00:22 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: нет
Всего: 26



Это особенность windows. в windows прерывания DOS не работают.
PM MAIL ICQ   Вверх
Lazin
Дата 20.7.2009, 05:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 2
Всего: 154



Цитата(GoldFinch @  20.7.2009,  00:22 Найти цитируемый пост)
Это особенность windows. в windows прерывания DOS не работают.

а инструкцию процессора int, вообще нельзя в обычных программах использовать
PM MAIL Skype GTalk   Вверх
GoldFinch
Дата 20.7.2009, 07:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: нет
Всего: 26



Lazin, можно написать
_emit 0xCD
_emit 0x21

PM MAIL ICQ   Вверх
W4FhLF
Дата 20.7.2009, 07:26 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: нет
Всего: 121



Цитата(Lazin @  20.7.2009,  05:23 Найти цитируемый пост)
а инструкцию процессора int


Для отладочных прерываний(int 1 / int 3) можно.


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
ParaPik
Дата 20.7.2009, 15:05 (ссылка)    | (голосов:5) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 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.
PM MAIL   Вверх
dumb
Дата 20.7.2009, 21:15 (ссылка) |    (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: нет
Всего: 158



ParaPik, почитай еще литературу. а пока не пиши о внутреннем устройстве windows - не вводи людей в "ступор".
PM MAIL   Вверх
GoldFinch
Дата 20.7.2009, 21:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: нет
Всего: 26



ParaPik, ты написал чушь
PM MAIL ICQ   Вверх
ParaPik
Дата 21.7.2009, 11:24 (ссылка)   | (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 132
Регистрация: 8.1.2009

Репутация: нет
Всего: нет



Во-первых, я пишу то, о чем читал, GoldFinch. А, во-вторых, если бы можно было использовать все команды для пользовательских приложений, то я мог бы сам установить привилегию, которая мне нужна с помощью команд call far, retf.(Но и это только половина работы)

Это сообщение отредактировал(а) ParaPik - 21.7.2009, 15:52
PM MAIL   Вверх
GoldFinch
Дата 21.7.2009, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: нет
Всего: 26



ParaPik, и то что ты читал - чушь.

Добавлено через 29 секунд
или то что ты читал - не чушь, но ты не так понял то что прочитал.
PM MAIL ICQ   Вверх
ParaPik
Дата 21.7.2009, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 132
Регистрация: 8.1.2009

Репутация: нет
Всего: нет



1) Я описался. Микропроцессор должен анализировать CPL(как я понял, он берется из DPL дескриптора).
2) Я читал Юрова и Пирогова. Если это чушь, то я не знаю тогда, что читать.
PM MAIL   Вверх
GoldFinch
Дата 21.7.2009, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: нет
Всего: 26



ParaPik, ты плохо их читал, они такого не пишут
PM MAIL ICQ   Вверх
ParaPik
Дата 21.7.2009, 17:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 132
Регистрация: 8.1.2009

Репутация: нет
Всего: нет



Правильно. Они пишут только основу(Хотя как основу. Они совсем немного не добирают до полноты изложения. А эти нюансы можно прочитать в отдельных статьях). Что конкретно тебя смущает? То, что я написал какие команды не доступны на 3-ем уровне. Так это другие профессионалы написали. А потом все подтвердилось на практике. А про анализ микропроцессора тоже у известных лиц прочитал. Правда, в своем сообщении я несколько отошел от прерываний. Вернее было бы сказать, что команда-то разрешается. Но при вызове прерывания происходит сравнение CPL с полем DPL в дескрипторе таблицы прерываний. Это поле и определяет, кто может вызывать это прерывание,а кто нет. Ну, вроде уже все конкретизировал.

Это сообщение отредактировал(а) ParaPik - 21.7.2009, 17:58
PM MAIL   Вверх
GoldFinch
Дата 21.7.2009, 19:09 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: нет
Всего: 26



Цитата(ParaPik @  20.7.2009,  16:05 Найти цитируемый пост)
0-ой по другому называют режимом ядра, т.к. на этом уровне работает Windows. А программы, которые компилирует Visual C++ имеют уровень привилегий 3(самый низший). ... WinAPI функции находятся на более привилегированном уровне. И для их вызова используется команда sysenter. 

вкратце,

код в Windows  может выполняться на уровне ядра или на пользовательском уровне. Ядро винды по определению выполняется на ядерном уровне*;  драйвера, винды или пользовательские тоже работают в кернелмоде. Юзермодный код винды и пользовательские процессы работают в юзермоде. Что характерно, код винды, ядерный или юзермодный ничем не отличается от пользовательского.
WinAPI функции - это юзермодные функции.


*kernel.dll тоже называется "ядро", а работает в юзермоде. 
PM MAIL ICQ   Вверх
Cheloveck
Дата 21.7.2009, 19:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

Репутация: нет
Всего: 32



Цитата(ParaPik @  20.7.2009,  16:05 Найти цитируемый пост)
WinAPI функции находятся на более привилегированном уровне.

Я слышал о какой-то ОС, которая использует первый и второй уровень, но это не винда. Винда, как и большинство ОСей, используют только 0 и 3


--------------------
user posted image
PM Jabber   Вверх
ParaPik
Дата 21.7.2009, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 132
Регистрация: 8.1.2009

Репутация: нет
Всего: нет



GoldFinch, почитай-ка книгу "Внутреннее устройство Windows". Cheloveck, по-моему, Винда все-таки использует и другие кольца, кроме 0 и 3. Во-первых, уровни привилегий для того и были придуманы, чтобы обезопасить системный код от пользовательского. Программа на уровне 3 не может обращать и использовать сегменты кода и данных, которые более привилегированные. Таким программам запрещается на прямую работать с оборудованием(т.е. использовать команды in, out, ins, outs). Для этого служать драйвера, к функциям которых осуществляется через команду sysenter. Также осуществляется вызов и функций Винды. Те функции, которые находятся в библиотеках типа kernel.dll, и служат для обращения к привилегированным функциям. Так, например, функции GDI(GetDC, Rectangle и т.д.) работают в режиме ядра. И для того, чтобы к ним обратиться, мы и используем функции из dll-библиотек. Чтобы в этом убедиться проследите все действия через отладчик. Но есть функции, которые работают в режиме пользователя. Например, GetCurrentThread. Она возвращает псевдоуказатель на поток. И прерывания DOS тоже доступны. Только, чтобы их вызвать, надо иметь нулевой уровень привилегий, который имеют все программы под DOS, запускаемые под Виндой. Система, просто, эмулирует родную среду для приложения.
PM MAIL   Вверх
Cheloveck
Дата 21.7.2009, 21:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

Репутация: нет
Всего: 32



Цитата

Однако, большинство UNIX-систем используют только 2 кольца, даже если аппаратные средства поддерживают больше режимов центрального процессора.

Многие современные архитектуры центральных процессоров (включая популярную архитектуру x86) включают некоторые формы защиты. Но несмотря на это, операционная система Windows NT, также как и UNIX, полностью не используют эти возможности.

цы здесь


--------------------
user posted image
PM Jabber   Вверх
GoldFinch
Дата 21.7.2009, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: нет
Всего: 26



ParaPik
1) в винде колец 2: 0е и 3е
2) АПИ винды - в длл, это юзермод. GetProcAddress - функция апи винды, живет в kernel32.dll, не использует обращения к коду ядра
3) ВЕСЬ GDI - это юзермод.  
Код

Windows via C/C++, Fifth Edition, Jeffrey Richter 
Part I: Required Reading | Chapter 3: Kernel Objects | What Is a Kernel Object?

In addition to using kernel objects, your application might use other types of objects, such as menus, windows, mouse cursors, brushes, and fonts. These objects are User objects or Graphical Device Interface (GDI) objects, not kernel objects. 

да, управляется GDI ядром, но само GDI живет в юзермоде
PM MAIL ICQ   Вверх
ParaPik
Дата 22.7.2009, 10:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 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, сейчас прочту.
PM MAIL   Вверх
GoldFinch
Дата 22.7.2009, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: нет
Всего: 26



ParaPik, юзермодные дллки винды могут обращаться к чему угодно, хоть к серверу с линуксом по сети через RPC
только апи винды - это функции которые экспортируют эти юзермодные дллки, и тот пост на 80% - бред
Цитата(ParaPik @  20.7.2009,  16:05 Найти цитируемый пост)
(...) 0-ой по другому называют режимом ядра, т.к. на этом уровне работает Windows. А программы, которые компилирует Visual C++ имеют уровень привилегий 3(самый низший). (...) WinAPI функции находятся на более привилегированном уровне. И для их вызова используется команда sysenter. (...)


PM MAIL ICQ   Вверх
ParaPik
Дата 22.7.2009, 13:45 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 132
Регистрация: 8.1.2009

Репутация: нет
Всего: нет



Если Винда находит PE-заголовок в файле, то сразу отправляет программу на 3-й уровень. И все DLL загружаются на 3-й уровень.
ВСЕ!. А раз ты считаешь это бредом, тогда Соломон с Руссиновичем - ламеры. А все, что они написали в своей книге, - фуфло. А все, что там написано, они записали со слов таких людей, как Катлер(один из разработчиков системы). В их книге все подробно описано. Куда Винда пихает, зачем пихает.
P.S. Короче, прочитай их книгу. А то я смотрю, ты, GoldFinch, вообще не улавливаешь разницу между WinAPI DLL  и низкоуровневым WinAPI. И еще. Ты хоть одну WinAPI функцию прогнал через отладчик?
PM MAIL   Вверх
GoldFinch
Дата 22.7.2009, 16:27 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: нет
Всего: 26



ParaPik, прочитай определение понятия API и WinAPI
http://en.wikipedia.org/wiki/Application_p...mming_interface
http://en.wikipedia.org/wiki/Windows_API
PM MAIL ICQ   Вверх
ParaPik
Дата 22.7.2009, 18:24 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 132
Регистрация: 8.1.2009

Репутация: нет
Всего: нет



Знаешь, GoldFinch, я ничего нового не узнал. Эти статьи написаны в максимально абстрагированном варианте. Т.е. в них сказано, что есть специализированный интерфейс, который позволяет приложениям выполнять определенные действия. Например, WinAPI. Но. Если говорить о реализации этого интерфейса на низком уровне, то определение можно дать такое: "API - это набор библиотек, через которые приложение общается с OS. Т.е. вызывает ее функции." А раз OS находится на 0-ом кольце, то и эти функции располагаются там же. Если и этого недостаточно. То могу предложить схему строения Windows, принятой Microsoft.
PM MAIL   Вверх
GoldFinch
Дата 22.7.2009, 18:51 (ссылка)  | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: нет
Всего: 26



ParaPik, ОС не находится в 0м кольце. ядро - да. драйвера - да. но ОС находится и в 0 и в 3м кольцах.
АПИ - это интерфейс. сервисы ядра, к которым обращаются их юзермодные обертки - это реализация винды. это не интерфейс винды.
юзермодные приложения обращаются к юзермодному интерфейсу винды - АПИ.
драйвера обращаются к ядерному интерфейсу винды - это тоже АПИ, но АПИ для драйверов, приложения его не юзают.


Цитата(ParaPik @  22.7.2009,  19:24 Найти цитируемый пост)
Если говорить о реализации этого интерфейса на низком уровне,

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

PM MAIL ICQ   Вверх
ParaPik
Дата 22.7.2009, 21:51 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 132
Регистрация: 8.1.2009

Репутация: нет
Всего: нет



1) Конечно, приложения его использовать не могут, если код этих функций написан без использования sysenter.
2)  Под OS я имел в виду ее ядро(неточность). Еще имеются подсистемы, которые и работают в 3-ем кольце.
3) Сервисы ядра, конечно, - реализации OS. А я разве что-то не так написал. Я написал, что программа обращается к ее функциям, чтобы не вводить новую терминологию.
4) "Если говорить о реализации этого интерфейса на низком уровне". Так вообще-то говорят. Но только здесь речь идет о его реализации в мельчайших ячейках. Когда говорят о низком уровне, то подразумевают мельчайшее строение чего-либо. Если, например, говорить о программе, то имеется в виду машинные команды.
5) Сколько ни читал, везде мое определение о WinAPI и пишут.
PM MAIL   Вверх
rthsobakas
Дата 9.1.2010, 20:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 562
Регистрация: 20.9.2007

Репутация: нет
Всего: -1



Цитата

юзермодные приложения обращаются к юзермодному интерфейсу винды - АПИ.
драйвера обращаются к ядерному интерфейсу винды - это тоже АПИ, но АПИ для драйверов, приложения его не юзают.

позволю процитировать тему
http://www.cracklab.ru/f/index.php?action=...&topic=9645

Цитата

В основе высокоуровневых функций лежат низкоуровневые Nt* Zw* NativeAPI. Они выполняются в режиме ядра. Но вызвать их можно и из обычных программ. В этом случае будет переход в ядро, который выполняется с помощью SYSENTER. Справки по ним не густо, есть книжка-справочник. К сожалению где скачать не помню. Погугли.


там кстати и про sysenter писали. 

Цитата

АПИ для драйверов, приложения его не юзают.

ведь смотря что понимать под приложением. 

Вроде как драйвера тоже разные бывают(то есть выполнятся могут в ринг 3 и 0 или я чет перепутал опять). 


пс. А если честно надо английский учить и говорить на нем, чтобы не портить русский.

PM   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.1205 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.