cmp al,1ah ;подсистема активна ?
jne NonSubst ;нет, возможно переключение
; в режим другого
; видеоадаптера или
; подсистема остутствует
cmp bl,07h ;VGA ?
je VgaAct ; да
cmp bl,08h ;VGA ?
je VgaAct ; да
cmp bl,0bh ;MCGA ?
je MCGAct ; да
cmp bl,0ch ;MCGA ?
je MCGAct ; да
jmp NonSubst ; не найден VGA/MCGA
Следует отметить, что все регистры видеоадаптера VGA
можно прочитать. Таким образом резидентная программа может
определить режим работы видеоадаптера - графический или
текстовый. Это может быть полезно для программ, которым
требуется сохранить текущее состояние экрана, или для
драйверов русского языка, чтобы определить режим загрузки
знакогенератора. Знание режима видеоадаптера позволяет
драйверам русского языка поддерживать старшие режимы работы
нестандартных видеоадаптеров VGA, не привязываясь к номеру
видеорежима. Определение текущего режима основано на анализе
содержимого регистра 06h GRAFICS CONTROLLER (Miscellaneous
Register). Размер буквы можно узнать в области данных BIOS
по адресу 40h:85h.
Приведем фрагмент кода для определения режима работы
видеоадаптера VGA.
; прочитаем GC регистр 06h
mov dx,03ceh ;адресный порт
mov al,06h ;номер регистра
out dx,al ;затребуем регистр
jmp short $+2
inc dx ;порт данных
in al,dx ;прочитаем регистр
; анализ типа знакогенератора
test al,01 ;графический режим ?
jz VgaTxt ;текстовый режим
jmp VgaGraf ;графический режим
5
СПОСОБ ОПРЕДЕЛЕНИЯ ТИПА ОСНОВНОГО И АЛЬТЕРНАТИВНОГО
ВИДЕОАДАПТЕРА.
В данном разделе мы расскажем Вам, как определить,
какие видеоадаптеры установлены на ПЭВМ. Предлагаемый метод
позволяет идентифицировать видеоадаптеры MDA, CGA, EGA,
MCGA, VGA, HGC, HGC+ и HGC In Color и совместимые с
HERCULES, которые мы будем называть MGA.
ПОРЯДОК ИДЕНТИФИКАЦИИ ВИДЕОАДАПТЕРОВ.
Приведем порядок, в котором Вам следует выполнять
идентификацию видеоадаптеров.
1. Проверить наличие видеоподсистемы VGA/MCGA по
функции INT 10h, AX=1A00h. Если подсистема активна, то код
основного и альтернативного видеоадаптера будет передан в
регистрах BL и BH.
2. Если в шаге 1 обнаружен монохромный дисплей, то
следует удостовериться, не является ли он адаптером типа
HERCULES. Метод определения видеоадаптеров типа HERCULES
рассмотрим ниже.
3. Если функция шага 1 не выполнена, то следует
проверить наличие видеоадаптера EGA по функции INT 10h,
AH=12h, BL=10h.
4. Если видеоадаптер EGA обнаружен, то следует
определить, работает EGA в цветном или монохромном режиме.
Метод определения основан на анализе переключателей на плате
EGA, полученных по функции INT 10h, AH=12h, BL=10h в младших
четырех битах регистра CL. Комбинация переключателей
следующая:
000X - обычный цветной дисплей;
001X - цветной дисплей с расширенными возможностями;
010X - монохромный терминал;
011X - обычный цветной дисплей;
100X - цветной дисплей с расширенными возможностями;
101X - монохромный терминал.
5. Если видеоадаптер EGA работает в цветном режиме, то
следует проверить, не подключен ли видеоадаптер
MDA/HERCULES.
6. Если видеоадаптер EGA работает в монохромном режиме,
то следует проверить, не подключен ли видеоадаптер CGA.
8. Если видеоадаптер EGA не обнаружен, то следует
проверить наличие видеоадаптеров MDA/HERCULES или CGA. Выбор
текущего видеоадаптера при одновременном наличии CGA и
MDA/HERCULES производится на основе анализа видеорежима в
области данных BIOS по адресу 40h:49h. Видеорежим 07h
указывает на активность видеоадаптера MDA/HERCULES.
6
МЕТОД ОПРЕДЕЛЕНИЯ ВИДЕОАДАПТЕРА CGA.
Видеоадаптер CGA определяется путем проверки наличия
6845 CHIP (CRT CONTROLLER) с индексным регистром 3D4h. Метод
проверки наличия 6845 описан ниже.
МЕТОД ОПРЕДЕЛЕНИЯ ВИДЕОАДАПТЕРА MDA/HERCULES.
Проверка наличия видеоадаптера MDA или HERCULES, а
также подобных им адаптеров выполняется на основе следующего
алгоритма.
1. Проверяется наличие 6845 CHIP (CRT CONTROLLER) с
индексным регистром 3B4h.
2. Считывается содержимое порта 3BAh (состояние CRTC)
и проверяется, изменяется ли бит 7 этого порта (индицирует
VERTICAL SYNC). Если нет, то видеоадаптер классифицируется
как MDA.
3. Адаптеры фирмы HERCULES идентифицируются битами 4-6
состояния CRTC:
000 - HGC;
001 - HGC+;
101 - InColor Card).
остальное - совместимый с HERCULES монохромный графичесий
адаптер - MGA.
Следует отметить, что идентификация типа видеоадаптера
фирмы HERCULES на базе бит 4-6 может быть недостоверна, т.к.
многие фирмы разработчики совместимых видеоадаптеров
неправильно устанавливают эти биты.
Приведем фрагмент кода, идентифицирующий видеоадаптеры
MDA/HERCULES/MGA.
mov dx,3B4h ; проверить наличие 6845
; CHIP.
call Test_6845 ; процедура проверки наличия
; 6845
; CF=1 - 6845 не найден
; CF=0 - 6845 найден
jc NonMdaHgc ;6845 CHIP отсутствует.
;нет MDA/HERCULES/MGA.
mov dx,3BAh ; считать регистр состояния
in al,dx ; CRTC.
and al,80h ; изолировать бит 7
; (VERTICAL SYNC).
mov ah,al ; проверим, изменяется ли
; бит 7.
mov cx,8000h ; количество повторов.
TBIT7: in al,dx ; регистр состояния CRTC
and al,80h ; изолировать бит 7
; (VERTICAL SYNC).
cmp ah,al ; сравним значения
loope TBIT7 ; повторим
7
je MDAFOUND ; переход, если бит 7 не
; изменился. Только MDA
; определим тип адаптера HERCULES.
in al,dx ; считать состояние CRTC.
and al,70h ; изолировать биты 4-6.
jz HGCFOUND ; переход, если это HGC.
cmp al,10h ; это HGC+?
je HGCPFOUND ; да, переход.
cmp al,50h ; это InColor Card?
je HGCICFOUND ; да, переход.
jmp MGAFOUND ; адаптер, совместимый с
; HERCULES - MGA.
МЕТОД ОПРЕДЕЛЕНИЯ НАЛИЧИЯ 6845 CHIP
6845 CHIP используется в видеоадаптерах MDA, CGA и
HERCULES в качестве CRT CONTROLLER. Техника определения
наличия этой микросхемы заключается в том, что в регистр 15
CRT CONTROLLER (младший байт местоположения курсора)
записывается значение, которое затем считывается обратно.
Если возвращено записанное значение, то 6845 CHIP есть в
компьютере.
Приведем фрагмент кода для определения 6845 CHIP.
Считается, что при входе в программу регистр DX содержит
адрес индексного регистра 6845 CHIP ( 3D4h/3B4h ).
cli ; запретить прерывания.
mov al,15 ; подготовиться к работе с
; регистром 15 CRTC.
out dx,al ; передать номер регистра
jmp short $+2
inc dx ; регистр данных
in al,dx ; считать текущее значение
; регистра 15.
mov ah,al ; запомнить считанное
; значение
mov al,66h ; записать в регистр 15
; тестовое значение.
out dx,al ; передадим
jmp short $+2
mov cx,400h ; дождаться, пока 6845 все
; это воспримет.
W1: loop W1 ; ждем
in al,dx ; считать тестовое значение.
xchg ah,al ; восстановить
; первоначальное значение
; регистра 15.
out dx,al ; передадим
jmp short $+2
sti ; разрешить прерывания.
cmp ah,66h ; считано тестовое значение?
je F6845 ; да, 6845 найден.
jmp NF6845 ; 6845 не найден
8
ОПЫТ ПРИМЕНЕНИЯ.
Описанный механизм был, в частности, применен при
разаработке универсального драйвера русского языка. Авторы
стокнулись с тем фактом, что ни один из существоваших на
этот момент драйверов не поддерживал работу с альтернативным
видеоадаптером и не обеспесчивал расширенных режимов VGA
видеоадаптера. Любая попытка перейти на альтернативный
видеоадаптер приводила к срыву синхронизации. Авторы
использовали комбинации видеоадаптеров EGA/HGC и VGA/MGA.
Разработанный авторами драйвер поддерживает все описанные
выше комбинации видеоадаптеров. Он может запускаться как
драйвер из CONFIG.SYS или использоваться как обычная
программа и запускаться, например, из AUTOEXEC.BAT.
1
ГРУППА ПРОГРАММИСТОВ 2B.
КАК СКОПИРОВАТЬ ЗАЩИЩЕННУЮ ОТ КОПИРОВАНИЯ ДИСКЕТУ.
Статья посвящена анализу форматов защищенных от копирования дискет
и возможным методам их копирования.
НЕСКОЛЬКО СЛОВ О ЗАЩИТЕ ОТ КОПИРОВАНИЯ.
Системы защиты от копирования предотвращают использование
"ворованных" копий программного обеспечения. Разработка таких систем в
условиях нашей страны, когда огромные толпы программистов стремятся
всячески вскрыть защищенные программы, является делом достаточно
сложным и требует определенной квалификации и опыта. В настоящее время
на рынке программного обеспечения средств защиты появилось много
программ, обеспечивающих защиту от копирования. Зачастую реклама этих
программ не соответствует действительным возможностям. Авторы решили
приобщиться к когорте программистов, вскрывающих системы защиты от
копирования. При этом мы не хотим дискредитировать сами системы защиты
от копирования, а просто хотим предостеречь возможных покупателей от
использования несовершенных систем с одной стороны, а также привлечь
новые отряды высококвалифицированных программистов к разработке систем
защиты, которые действительно всем нам очень нужны.
В основном все программисты, занимающиеся вскрытием защит, идут по
пути преодоления систем защиты от отладчиков, чтобы выполнить
модификацию тех частей программы, которые отвечают за проверку
легальности копии. Эта работа требует высокой квалификации. Мы пошли
несколько другим путем. Система защиты предполагает наличие дискеты,
называемой ключевой, и не копируемой стандартными средствами, а также