Сейчас на форуме: tyns777 (+5 невидимых)

 eXeL@B —› Программирование —› Использование прерываний BIOS в проге под Windows
Посл.ответ Сообщение

Ранг: 4.6 (гость)
Активность: 0=0
Статус: Участник

Создано: 25 декабря 2007 17:56
· Личное сообщение · #1

Уважаемые друзья!
Может кто-то подскажет. Я пишу прогу транслирую в Masm"е под Виндой.
Когда пытаюсь использовать прерывания БИОСа 10, 16. Выскакивают какие-то ошибки.
Может в прогах под Виндой ХР принципиально невозможно использовать прерывания БИОСа ?

С благодарностью за помощь,
Виктор




Ранг: 107.3 (ветеран), 5thx
Активность: 0.20.04
Статус: Участник

Создано: 25 декабря 2007 17:59
· Личное сообщение · #2

можно погядеть на сами ошибки?



Ранг: 51.7 (постоянный)
Активность: 0.020
Статус: Участник

Создано: 25 декабря 2007 18:44
· Личное сообщение · #3

Да на кусочек кода ещё




Ранг: 240.5 (наставник)
Активность: 0.190
Статус: Участник
Author of ACKiller

Создано: 25 декабря 2007 19:17
· Личное сообщение · #4

VictorBondarenko пишет:
Может в прогах под Виндой ХР принципиально невозможно использовать прерывания БИОСа ?

Да, для безопасности системы невозможно напрямую обращаться к аппаратуре из юзер-мода.
(Есть одна лазейка, но для ее работы нужно-таки иметь доступ к ринг-0).



Ранг: 260.2 (наставник)
Активность: 0.190
Статус: Участник

Создано: 25 декабря 2007 19:29
· Личное сообщение · #5

VictorBondarenko пишет:
Когда пытаюсь использовать прерывания БИОСа 10, 16. Выскакивают какие-то ошибки.

если я не ошибаюсь, под защищеным режимом функции биоса недоступны..




Ранг: 387.4 (мудрец)
Активность: 0.170
Статус: Участник
системщик

Создано: 25 декабря 2007 21:15
· Личное сообщение · #6

VictorBondarenko, "int X" это привилигированная инструкция. HoBleen написал уже...




Ранг: 303.7 (мудрец), 4thx
Активность: 0.190
Статус: Участник
tPORt Manager

Создано: 25 декабря 2007 21:18
· Личное сообщение · #7

s0larian пишет:
"int X"

о та ты шо а int 3, а int 1, а ещё многие прерывания? Там просто есть уровень важности прерывания (вроде так) и если он выше порогового значения, то кранты, короче, IDT дампите и курите.




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 25 декабря 2007 23:21 · Поправил: Archer
· Личное сообщение · #8

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




Ранг: 387.4 (мудрец)
Активность: 0.170
Статус: Участник
системщик

Создано: 26 декабря 2007 10:23
· Личное сообщение · #9

Bit-hack, точняк, вызывать можно.

Archer, в доке ацкий псевдо-код. Как я понял, после всех проверок происходит переключение стека в kernel и прыжок (присвоение EIP) в обработчик. Получается что в IDT для 10h, 21h просто стоит адрес заглушки в ядре? Или там привилегии (в доке упомянут TSS)



Ранг: 37.1 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 26 декабря 2007 13:04
· Личное сообщение · #10

s0larian из ring 3 будет GP (из-за привилегий), из ring 0 - BSOD ( заглушка ядра).




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 26 декабря 2007 15:34
· Личное сообщение · #11

s0larian
Ну там всё сварганено на аппаратном уровне. Если прав не хватает, выкатиццо GP, а если хватает, то переключение (с сохранением старых флагов, ESP+EIP+ещё кой-чего в стеке) в 0 кольцо, а адрес берёццо из IDT. Поскльку всю идт винда сама заполняет, вполне реально, что там и синячок случится.



Ранг: 4.6 (гость)
Активность: 0=0
Статус: Участник

Создано: 27 декабря 2007 13:41
· Личное сообщение · #12

Ребята спасибо всем. Чтобы разговор не был абстрактным
привожу мою детскую прогу полностью.
Если ставлю ";" перед Int 10 все работает.
Как только снимаю ";" , все транслируется и линкуется без ошибок, но
после запуска проги высвечивается стандартное окно
с сообщением, что обнаружена ошибка (какая непонятно), далее извинения
за неудобства и посьба послать в Мелкософт .
Посмотрите, что не так.

С благодарностью за помощь,
Виктор

.386
.model flat, stdcall
option casemap:none

include d:\masm32\include\windows.inc
include d:\masm32\include\kernel32.inc
includelib d:\masm32\lib\kernel32.lib
include d:\masm32\include\user32.inc
includelib d:\masm32\lib\user32.lib

.data
MsgCaption db "Это моя первая программа",0
MsgBoxText db "Win32 Hello World! Привет, Мир!",0

.code
start:

;--------------------------------------------------------------------- ---
MOV AH,09 ;Функция вывода
MOV AL,03H ;Черви (карточная масть)
MOV BH,00 ;Страница 0 (текст. режим)
MOV BL,0F0H ;Мигание, инверсия
MOV CX,05 ;Пять раз
INT 10H ;Вызвать BIOS


;--------------------------------------------------------------------- ------
invoke MessageBox, NULL,addr MsgBoxText, addr MsgCaption, MB_OK
invoke ExitProcess,NULL
end start



Ранг: 251.3 (наставник), 81thx
Активность: 0.140.11
Статус: Участник

Создано: 27 декабря 2007 14:55
· Личное сообщение · #13

Уже ж написали что не так.
В Win32 из UserMode нельзя вызывать прерывания.
А так как ты пишеш даже в KernelMode нельзя - BIOS в ProtectedMode не работает всё равно.
Скрестил две программы - одну под DOS, вторую под Win и спрашиваеш почему не работает




Ранг: 387.4 (мудрец)
Активность: 0.170
Статус: Участник
системщик

Создано: 27 декабря 2007 20:51
· Личное сообщение · #14

VictorBondarenko, вот, тебе сюда, с первого самого:
win32assembly.online.fr/tutorials.html



Ранг: 251.3 (наставник), 81thx
Активность: 0.140.11
Статус: Участник

Создано: 28 декабря 2007 11:22
· Личное сообщение · #15

Не сочтите за рекламу, но вот тоже самое в переводе на русский язык
www.wasm.ru/publist.php?list=1



Ранг: 516.1 (!), 39thx
Активность: 0.280
Статус: Участник

Создано: 28 декабря 2007 12:52
· Личное сообщение · #16

для тестирования dos16 программ юзайте dosbox, а не винду


 eXeL@B —› Программирование —› Использование прерываний BIOS в проге под Windows
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати