7. ОПЕРАЦИОННАЯ СИСТЕМА MICROSOFT WINDOWS
7.1.
Использование функций DPMI7.2.
Драйверы, резидентные программы и WINDOWS7.3.
Связь с WINDOWS CLIPBOARD Не будет преувеличением сказать, что операционная система WINDOWSверсии 3.0 открыла новый этап в жизни персонального компьютераIBM PC. Удобная, интуитивно ясная графическая оболочка, аналогичнаяиспользуемой в компьютерах фирмы Apple, быстро завоевала популярностьу пользователей IBM PC. В нашей стране WINDOWS также получилаширокое распространение, особенно после того, как стали доступныкомпьютеры с памятью 2 мегабайта и более. Новая верисия WINDOWS3.1 обладает улучшенным графическим интерфейсом и большей производительностью.
Однако WINDOWS - это не только графика и перекрывающиеся окна.С точки зрения программиста, WINDOWS является графически ориентированноймультизадачной операционной системой, работающей в защищённомрежиме процессора.
Стандартные приложения WINDOWS используют как бы "вывернутуюнаизнанку" логику работы программ. Обычно, создавая программыдля MS-DOS, программист полностью планирует сценарий работы программы.Он последовательно определяет, что и когда программа будет выводитьна экран, что и когда должно быть введено с клавиатуры.
Логика работы приложений WINDOWS основана на использовании очередейсобытий. Событием является, например, нажатие клавиши на клавиатуре,прерывание от системного таймера, нажатие на кнопку мыши или перемещениемыши. Для каждого приложения создаётся своя собственная очередь,в которую записываются коды событий и дополнительная информацияо событиях (например, код нажатой клавиши).
Приложение WINDOWS в цикле опрашивает состояние очереди событий.Если происходит какое либо событие, вызывается соответствующиймодуль, который и реагирует на событие. Перед обработкой событиеудаляется из очереди.
Программа не может знать последовательности событий, поэтому еёповедение полностью определяется событиями, происходящими в системе.Такая логика работы программ называется логикой, управляемой событиями,а сами программы - программами, управляемыми событиями.
Кроме изменений в логике работы программ, WINDOWS реализует новыйподход к использованию системных ресурсов. Операционная системаMS-DOS не содержит сколько-нибудь значительной поддержки диалоговыхпрограмм, поэтому программисты вынуждены прибегать к использованиюспециальных библиотек, содержащих программы меню, управления окнами,модули для работы с мышью и графикой. Все необходимые модули прикомпоновывалиськ основной программе, сильно увеличивая размер загрузочного модуля.
Операционная система WINDOWS в своём ядре содержит все модули,необходимые для организации высококачественного графического диалогас пользователем. Причём нет необходимости в их компоновке с основныммодулем - весь сервис WINDOWS реентерабельный, одни и те же модулииспользуются всеми одновременно работающими приложениями.
Новый подход в создании программ, предложенный в WINDOWS, способствуетсозданию удобных программ с дружественным диалогом, использующихвсе доступные ресурсы компьютера. Однако WINDOWS едва ли получилабы такое широкое распространение, если бы она не позволяла одновременнос приложениями WINDOWS использовать разработанные ранее программы,ориентированные на MS-DOS (DOS-программы).
В зависимости от типа процессора и режима, в котором работаетWINDOWS (стандартный или расширенный) выполнение DOS-программорганизуется по-разному.
В стандартном режиме и при использовании процессора i80286 DOS-программывыполняются в реальном режиме процессора. В любой момент времениможет выполняться только одна DOS-программа, остальные запущенныеDOS-программы находятся в "замороженном" состоянии.
Расширенный режим требует наличия процессора i80386 или i80486.Он организует параллельную работу всех запущенных приложений WINDOWSи DOS-программ, выделяя в распоряжение каждому приложению и программетак называемую виртуальную машину. Виртуальную машину, на которойвыполняется DOS-программа, мы будем называть виртуальной DOS-машиной.
Что такое виртуальная машина, хорошо знают те, кто работал наЕС ЭВМ в операционной системе VM (известна также под названием"СВМ" - система виртуальных машин). Все ресурсы компьютераразделяются между запущенными программами. В распоряжение каждойпрограммы предоставляется собственный виртуальный процессор, виртуальнаяпамять, виртуальная система прерываний. Дисплей, клавиатура имышь используются совместно и распределяются той программе, котораяв данный момент работает с оператором (про такую программу разработчикиприложений WINDOWS говорят, что она имеет "фокус ввода"- input focus).
Когда WINDOWS работает в расширенном режиме, процессор может находитьсялибо в защищённом, либо в виртуальном режиме. DOS-программа получаетуправление, когда процессор находится в виртуальном режиме. Приэтом, используя механизм трансляции страниц, WINDOWS отображаетучасток расширенной памяти в область младших адресов задачи, врамках которой работает DOS-программа. Таким образом для DOS-программыорганизуется виртуальное адресное пространство, которая программане может отличить от реальной памяти, расположенной в пределахпервого мегабайта.
Дополнительно в распоряжение DOS-программы может быть предоставленарасширенная или дополнительная память (интерфейсы EMS и XMS).Размер этой памяти можно задать в pif-файле (см. руководство поWINDOWS).
Если DOS-программа выдаёт команду программного прерывания, процессорпереходит в защищённый режим и управление передаётся ядру WINDOWS.WINDOWS эмулирует для DOS-программы все прерывания DOS и BIOS,аналогично тому, как это делают DOS-экстендеры. Поэтому виртуальнуюDOS-машину, на которой выполняется DOS-программа, можно считатьDOS-экстендером.
Для приложений WINDOWS и виртуальной DOS-машины доступен интерфейсDPMI. Это, в частности, означает, что виртуальная DOS-машина непросто допускает выполнение DOS-программ, но и предоставляет имдополнительные возможности, которые они не имели бы, если бы работалипод управлением "настоящей" MS-DOS.
Описанию этих дополнительных возможностей и посвящена данная главакниги.
Приведённая ниже программа демонстрирует использование функцийинтерфейса DPMI, описанного в предыдущей главе. Эта программаможет работать только под управлением WINDOWS версий 3.0, 3.1и только в расширенном режиме на процессорах i80386 или i80486.Такое ограничение связано с тем, что только в расширенном режимесуществует понятие виртуальной DOS-машины, и только в этом режимеDOS-программа может воспользоваться сервисом DPMI.
Вы можете также попробовать запустить эту программу под управлениемDOS-экстендера, входящего в состав интегрированной системы разработкипрограмм Borland C++ 3.1. Запустите программу DPMIRES.EXE, входящуюв состав Borland C++ 3.1, и затем - программу, приведённую ниже.(DOS-экстендеры, входящие в состав Borland C++ 2.0 или 3.0, невполне совместимы с DPMI, поэтому наш пример с этими системамиработать не будет).
Программа начинает свою работу с проверки доступности сервераDPMI, при этом не делается никаких предположений относительносредств, обеспечивающих присутствие DPMI. Это означает, что выможете проверить работоспособность этой программы в различныхсредах, предоставляющих интерфейс DPMI, например на виртуальнойDOS-машине операционной системы OS/2 версии 2.0.
Программа демонстрирует возможность вызова в защищённом режимепрерываний реального режима. В первой части программы вывод наэкран и ввод с клавиатуры выполняется в защищённом режиме, нос использованием привычных вам прерываний реального режима.
Во второй части программы демонстрируется непосредственная записьв видеопамять. При этом для адресации видеопамяти программа заказываетселектор в таблице LDT с помощью специально предназначенных дляэтого функций DPMI.
В этом разделе, как и в следующем, мы не будем ничего говоритьо защищённом режиме работы процессора. Мы рассмотрим здесь некоторыеособенности, которые необходимо учитывать при разработке резидентныхпрограмм и драйверов, работающих совместно с WINDOWS.
Очень часто резидентные программы или драйверы перехватывают аппаратноепрерывание клавиатуры и отслеживают коды нажимаемых клавиш, выполняяте или иные действия при нажатии заданных комбинаций. Например,драйвер "секретного" диска Norton DISKREET может принажатии заданной комбинации клавиш блокировать доступ к "секретному"диску, экрану и клавиатуре.
Так как WINDOWS в расширенном режиме использует собственную системуклавиатурного ввода/вывода, основанную на очередях сообщений,а также реализует концепцию виртуальных машин, нажатие активизирующихрезидентную программу комбинаций клавиш в неподходящий моментможет не привести к желаемому результату и даже стать причиной"зависания" системы.
Есть два возможных решения этой проблемы. Во-первых, можно запретитьзапуск WINDOWS, если активна резидентная программа или драйвер,не способные работать совместно с WINDOWS. Во-вторых, на времяработы WINDOWS можно запретить выполнение резидентной программойили драйвером специфических функций, несовместимых с WINDOWS (например,запретить активизацию резидентной программы при нажатии комбинацииклавиш).
Перед запуском WINDOWS и перед её завершением вызываются функциипрерывания INT 2Fh 1605h и 1606h соответственно. Ваша резидентнаяпрограмма или драйвер могут подготовить собственные обработчикидля этих прерываний и отслеживать моменты запуска WINDOWS и завершенияеё работы.
Функция 1605h вызывается при запуске WINDOWS:
Регистры при вызове прерывания:
AX 1605hES:BX 0000h:0000hDS:SI 0000h:0000hCX 0000hDX Флаги: Бит 0 = 0, если выполняется инициализация WINDOWS в расширенном режиме; Бит 0 = 1, если выполняется инициализация DOS-экстендера "Microsoft 286 DOS extender" (используется в стандартном режиме работы WINDOWS); Биты 1-15 зарезервированы, их содержимое неопределено.Регистры перед возвратом из прерывания:
CX 0000h, если WINDOWS может продолжать инициализацию;CX <> 0, если запуск WINDOWS недопустим.Функция 1606h вызывается при завершении WINDOWS расширенном илистандартном режиме:
Регистры при вызове прерывания:
AX 1606hDX Флаги: Бит 0 = 0, если выполняется завершение WINDOWS, работавшей в расширенном режиме; Бит 0 = 1, если выполняется завершение DOS-экстендера "Microsoft 286 DOS extender"; Биты 1-15 зарезервированы, их содержимое не определено.Обработчик функции 1605h может выполнить необходимые действия,связанные с модификацией алгоритма работы резидентной программыили драйвера, а также при помощи соответствующей установки регистраCX может разрешить или запретить запуск WINDOWS.
Обработчик функции 1606h получает управление при завершении работыWINDOWS и может восстановить прежний алгоритм работы критичнойк WINDOWS резидентной программы или драйвера.
Операционная система Microsoft WINDOWS имеет чрезвычайно удобноесредство обмена информацией между программами - CLIPBOARD. Этосредство предназначено для обмена как текстовой, так и графическойинформацией. Что имеется в виду под обменом информацией?
Например, вы подготавливаете рекламный проспект при помощи текстовогоредактора Microsoft Word for WINDOWS. В проспект необходимо поместитьфотографию рекламируемого изделия. Используя сканер, вы считываетефотографию и записываете изображение в файл. Далее полученноеизображение может быть отредактировано любым графическим редактором.Выделив в графическом редакторе прямоугольный участок изображения,вы можете скопировать его в CLIBBOARD (как во временную память).Затем, переключившись на текстовый редактор, вы можете вставитьв любое место текста изображение, взятое из CLIPBOARD.
Вы можете также выделить часть текста и скопировать её в CLIPBOARD.Затем этот текст может быть вставлен в другое место того же текстаили вообще в другой текст, редактируемый другим редактором.
Если WINDOWS работает в расширенном режиме, запустив обычную DOS-программув окне, вы можете выделить любую часть экрана и скопировать еёв CLIPBOARD. Затем содержимое CLIPBOARD можно вставить в другуюDOS-программу, если она ожидает ввода с клавиатуры. Таким образоморганизуется перенос текстовой информации из одной DOS-программыв другую DOS-программу. Заметьте, что обе эти программы могутне знать о том, что они работают в среде WINDOWS.
Однако DOS-программа, работающая в среде WINDOWS, может и самаработать с CLIPBOARD. При этом возможен обмен информацией (текстовойили графической) между DOS-программами и приложениями WINDOWS.
Зная интерфейс DOS-программы с WINDOWS CLIPBOARD, вы легко сможетесоздавать DOS-программы, обменивающиеся информацией с приложениямиWINDOWS. Расскажем о некоторых, наиболее полезных функциях, которыемогут быть использованы для работы с WINDOWS CLIPBOARD.
Получить версию WinOldAp
Операционная система WINDOWS содержит специальные средства, предназначенныедля работы под её управлением DOS-программ. В терминологии WINDOWSDOS-программы относятся к так называемым старым приложениям WINDOWS(WINDOWS Old Application). Версию драйвера WINDOWS, поддерживающегоработу с приложениями WinOldAp, можно узнать с помощью функции1700h прерывания INT 2Fh:
Регистры на входеAX 1700hРегистры на выходе:AX 1700h, если данная версия WinOldAp не поддерживает работу с CLIPBOARD.Если AX не равно 1700h, то: AL = верхнее значение весрии (major version); AH = нижнее значение версии (minor version).Открыть CLIPBOARD
Перед выполнением любой операции с CLIPBOARD необходимо открытьCLIPBOARD (по аналогии с обычным файлом):
Регистры на входеAX 1701hРегистры на выходе:AX 0, если CLIPBOARD уже открыт;не равно 0, если операция успешно выполнена.Очистить CLIPBOARD
С помощью этой функции можно удалить данные из CLIPBOARD:
Регистры на входеAX 1702hРегистры на выходе:AX 0, если при выполнении операции произошла ошибка;не равно 0, если операция успешно выполнена.Записать данные в CLIPBOARD
С помощью этой функции DOS-программа может выполнить запись данныхв WINDOWS CLIPBOARD.
Регистры на входеAX 1703hDX Формат данных, записываемых в CLIPBOARD: 01h текст; 02h графика в формате bitmap; 03h графика в формате metafile picture; 04h SYLK; 05h DIF; 06h графика в формате TIFF; 07h текст в кодировке OEM.ES:BX Указатель на записываемые данныеSI:CX Длина записываемых данныхРегистры на выходе:AX 0, если при выполнении операции произошла ошибка;не равно 0, если операция успешно выполнена.С помощью этой функции можно записывать как текстовые, так и графическиеданные.
Операционная система WINDOWS использует отличную от принятой вDOS кодировку символов. Кодировка WINDOWS называется ANSI-кодировкой,кодировка DOS - OEM-кодировкой. Если при записи текстовых данныхв CLIPBOARD вы зададите кодировку OEM (записав в регистр DX значение7), одновременно с записью данных будет автоматически выполнятьсяперекодировка из OEM в ANSI.
Пользуясь следующей таблицей, вы можете записывать в CLIPBOARDграфические данные в формате bitmap:
Таблица 15. Формат CLIPBOARD для BITMAP-файлов.
Смещение, размер | Описание |
00h (2) | тип(0000h) |
02h (2) | ширина bitmap в пикселах |
04h (2) | высота bitmap в пикселах |
06h (2) | количество байт на строку |
08h (1) | количество цветовых планов |
09h (1) | количество цветовых битов в пикселе |
0Ah (4) | указатель на начало данных |
0E0Eh (2) | ширина в 0.1 mm |
10h (2) | высота в 0.1 mm |
12h | графические данные |
Исчерпывающую информацию о форматах графических файлов WINDOWSвы можете получить из документации, поставляемой Microsoft дляразработчиков приложений.
Получить размер CLIPBOARD
Размер данных, записанных в CLIPBOARD, можно узнать с помощьюследующей функции:
Регистры на входеAX 1704hDX Формат данных: 01h текст; 02h графика в формате bitmap; 03h графика в формате metafile picture; 04h SYLK; 05h DIF; 06h графика в формате TIFF; 07h текст в кодировке OEM.Регистры на выходе:DX:AX 0, если CLIPBOARD не содержит данных в указанном формате;размер записанных данных, включая заголовки.Прочитать данные из CLIPBOARD
Регистры на входеAX 1705hDX Формат данных, читаемых из CLIPBOARD: 01h текст; 02h графика в формате bitmap; 03h графика в формате metafile picture; 04h SYLK; 05h DIF; 06h графика в формате TIFF; 07h текст в кодировке OEM.ES:BX Указатель на буфер для читаемых данныхРегистры на выходе:AX 0, если при выполнении операции произошла ошибка;не равно 0, если операция успешно выполнена.Закрыть CLIPBOARD
После выполнения записи необходимо закрыть CLIPBOARD (точно также,как вы закрываете файл). Для того, чтобы закрыть CLIPBOARD, выможете использовать следующую функцию:
Регистры на входеAX 1708hРегистры на выходе:AX 0, если произошла ошибка;не равно 0, если операция успешно выполнена.Установить размер данных, записанных в CLIPBOARD
После записи данных в CLIPBOARD программист может ограничить размерCLIPBOARD:
Регистры на входеAX 1709hSI:CX Размер данных в байтахРегистры на выходе:DX:AX Размер максимального доступного участка памятиКритическая секция
DOS-программа, работающая на виртуальной машине WINDOWS, можетвременно запретить переключение задач, захватив процессор в монопольноепользование. Для этого она должна вызвать функцию 1681h прерыванияINT 2Fh. Параметры задавать не надо.
Про программу, захватившую процессор, говорят, что она вошла вкритическую секцию.
Для выхода из критической секции и возобновления работы диспетчеразадач WINDOWS программа должна вызвать функцию 1682h прерыванияINT 2Fh.
Пример программы для работы с CLIPBOARD
Приведённая ниже программа демонстрирует запись в CLIPBOARD изDOS-программы, а также вход в критическую секцию и выход из неё.
Вначале программа убеждается в том, что она запущена под управлениемWINDOWS, работающем в расширенном режиме. Только в этом случаедоступны функции для работы с CLIPBOARD.
Далее программа демонстрирует блокировку механизма переключениязадач при входе в критическую секцию. После этого проверяетсядоступность CLIPBOARD.
Если CLIPBOARD доступен, программа проверяет, есть ли в нём текстовыеданные. Если текстовые данные есть, они читаются из CLIPBOARDи выводятся на экран. Затем CLIPBOARD очищается и в него записываетсятестовая строка, состоящая из латинских букв и символов кириллицы(для проверки выполнения перекодировки из OEM в ANSI).
После записи строки программа устанавливает размер CLIPBOARD изакрывает его. Далее вы можете запустить приложение WINDOWS "Clipboard"и посмотреть результат!