Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.212.242.203] |
|
Страницы: (4) 1 2 [3] 4 все ( Перейти к последнему сообщению ) |
Сообщ.
#31
,
Сообщение отклонено: negram -
|
Сообщ.
#32
,
|
|
|
Довольно долго эксперементировал в DOS c режимом UNREAL(нереальный режим). Столкнулся с многими неприятностями. Основная неприятность, это
некоторые программы переводят DOS в режим REAL (реальный режим). Спрвится с ними (программами) не сложно. Нужно найти в коде программы, с помощью HEX редактора селектор отвечающий за перевод в режим REAL и откоректировать его на перевод в режим UNREAL. Но за всеми программами не уследишь, и рано или позно появится что то переводящее среду DOS в режим REAL. Выйти из этого положения можно несколькими способами. 1. Контролировать исключение 0DH, путем установки драйвера и при его появление, устанавливать режим UNREAL. 2. В каждой программе ввести код, который при обращение за пределы сегмента, устанавливает режим UNREAL. Я так и не выяснил, что лутше. Установить драйвер на своем коммъютере, (можно попасть в просак на чужом компъютере),или вписывать код перехода в UNREAL в каждой программе (что иногда накладно). Пока, для себя я разработал драйвер KEY_R8.SYS (аналог KEYRUS), и в его тело включил обработчик исключения 0DH, переводящий в режим UNREAL. Если кому интересно, могу поделится алгоритмом перехвата исключения 0DH и установки UNREAL. |
Сообщ.
#33
,
|
|
|
2-ой вариант будет сильно напрягать всех, начиная с антивирусов. 1-ый проблематичен в связи с необходимостью отделять исключение от IRQ.
Я бы упомянул 3-ий вариант: т.к. подавляющее большинство "нехороших" программ используют protect mode, а тот в свою очередь реализован в них через стандартизированные интерфейсы DPMI (или VCPI, но тут я затрудняюсь дать оценку трудоёмкости решения, скорее, оно будет гораздо проще... но я уже плоховато помню нюансы), то имеет смысл универсально решить проблему посредством собственного DPMI-хоста. И это не так сложно как может показаться. В составе QEMM есть готовый qdpmi.sys, который теоретически несложно отреверсить. К нему там прилагаются ещё управляющая консоль qdpmi.com и менеджер виртуальной памяти qdpmivm.ovl, но без них реверсинга, почти уверен, можно обойтись. Правда, боюсь, qdpmi.sys может быть завязан на сервисы самого QEMM... |
Сообщ.
#34
,
|
|
|
Зачем все это?
|
Сообщ.
#35
,
|
|
|
Та ради фана, почему нет. А зачем в современном мире вообще ассемблер?
|
Сообщ.
#36
,
|
|
|
Отделить исключение от IRQ не так уж сложно. Это показано в прикрепленном файле. Я в последнее время не веду контроль над IRQ. Ничего страшного если вместо исключения сработает IRQ, да и не нашел я прерываний 0DH в своем программном обеспечение.
Прикреплённый файлmasm.txt (743 байт, скачиваний: 173) |
Сообщ.
#37
,
|
|
|
Не факт. IRQ5 самое распространённое для звуковых карт, и оно не обязательно будет аппаратным. Я встречал эмуляторы SB, вызывающих его программно.
|
Сообщ.
#38
,
|
|
|
Я в настоящее время не могу проверить это со звуковой картой с IRQ5 из-за наличия отсутствия таковой. Возможно контроль исключения 0DH приведет к тормозу работы звуковой карты (компьютера).
P.S. совсем забыл. В предыдущем фрегменте использовал макросы. Прикрепляю их. Прикреплённый файлMACRO0.MAC (2,56 Кбайт, скачиваний: 183) Добавлено Да, кстати для проверки работы режима UNREAL на виртуальной машине, нужно удостоверится, что сама среда не находится в режиме REAL. Я однажды накололся на этом. Установил режим UNREAL, все прекрасно работает. Но на реальной машине зависает. Проверил. Оказывается, что VMware (не все версии) изначально запускается уже в режиме UNREAL. |
Сообщ.
#39
,
|
|
|
Обнаружил небольшую ошибку в большинстве программ, которые применяют тежим UNREAL.
Эта ошибка присутствует да же в таких мощных программах как драйвер HIMEM.SYS Это дескриптор данных (загужается в сегменты данных DS ES ...). GDT_DS dd 00000FFFFh,000CF9300h ;4-GB data segment. Ошибка заключается в том, что бит разрядности данных = 32. Но при 16-битном коде, это влияет только на регист стека. Программа начинает использовать вместо регистра SP, регистр ESP . Обычно программы DOS не использую регистр ESP, но если оставить мусор в старших битах ESP (биты 16...31), то дальнейшая судьба DOS, это крах. Например программа HIEW.EXE делает это иногда (HIMEM.SYS не использует ESP). Я по возможности исправляю это и сам использую дескриптор GDT_DS dd 00000FFFFh,0008F9200h ;4-GB data segment. Проблем на порядок становится меньше. |
Сообщ.
#40
,
|
|
|
andr00, хочешь сказать, что когда HIMEM выходит в PM (для предоставления блока памяти проге), он использует текущий программный стек, в котором старшая половина ESP может быть непустой, и ем самым он разрушит данные, находящиеся где-то далеко?
|
Сообщ.
#41
,
|
|
|
Мне не ясно зачем вообще трогать для этих целей SS.
|
Сообщ.
#42
,
|
|
|
shm, а вообще да. Если в SS ничего не писать, там останется то, что и было раньше (вместе с теневой частью).
|
Сообщ.
#43
,
|
|
|
Драйвер HIMEM.SYS после предоставления блока памяти в области XMS, оставляет в сегментах DS, ES (скрытая часть) 4-гигабайтный лимит и 32-битную разрядность данных. 32-битная разрядность может сыграть плохую шутку, и компъютер зависнет. Я с помощью hex-редактора (HIEW.EXE) нашел дескриптор, отвечающий за перевод в 4-гиг. режим 32-бит. разрядности по сигнатуре
0ffh,0ffh,000h,00h,000h,093h,0сfh,00h и заменяю его на 4-гиг. режим 16-бит. разрядности. 0ffh,0ffh,000h,00h,000h,093h,08fh,00h К стати, именно программа HIEW.EXE иногда глючит на 32-битной разрядности. |
Сообщ.
#44
,
|
|
|
Цитата andr00 @ Ты же говорил про стек.32-битная разрядность может сыграть плохую шутку, и компъютер зависнет. Какую плохую шутку может сыграть 32-битная разрядность данных? |
Сообщ.
#45
,
|
|
|
Возможно я ошибаюсь. Вычитал где то,что установка ( в DS и ES ) селектора данных в 32-битной разрядности (без установки 32-го кода), влияет только на регистр ESP.
Довольно много программ, для собственных нужд, устанавливают именно 32-бит селектор данных (но не всегда сбрасывают). Возможно они и трогают регистр SS. Но, повторяю, когда я на постоянной основе пытаюсь установить 32-бит и лимитом 4-Г.( в DS и ES ), то компьютер начинает иногда глючить. С 16-бит. разрядностью и лимитом 4-Г., пока с глюками не встречался. |