Резидентные программы windows 7
В этом разделе, как и в следующем, мы не будем ничего говорить о защищённом режиме работы процессора. Мы рассмотрим здесь некоторые особенности, которые необходимо учитывать при разработке резидентных программ и драйверов, работающих совместно с WINDOWS.
Очень часто резидентные программы или драйверы перехватывают аппаратное прерывание клавиатуры и отслеживают коды нажимаемых клавиш, выполняя те или иные действия при нажатии заданных комбинаций. Например, драйвер «секретного» диска Norton DISKREET может при нажатии заданной комбинации клавиш блокировать доступ к «секретному» диску, экрану и клавиатуре.
Так как WINDOWS в расширенном режиме использует собственную систему клавиатурного ввода/вывода, основанную на очередях сообщений, а также реализует концепцию виртуальных машин, нажатие активизирующих резидентную программу комбинаций клавиш в неподходящий момент может не привести к желаемому результату и даже стать причиной «зависания» системы.
Есть два возможных решения этой проблемы. Во-первых, можно запретить запуск WINDOWS, если активна резидентная программа или драйвер, не способные работать совместно с WINDOWS. Во-вторых, на время работы WINDOWS можно запретить выполнение резидентной программой или драйвером специфических функций, несовместимых с WINDOWS (например, запретить активизацию резидентной программы при нажатии комбинации клавиш).
Перед запуском WINDOWS и перед её завершением вызываются функции прерывания INT 2Fh 1605h и 1606h соответственно. Ваша резидентная программа или драйвер могут подготовить собственные обработчики для этих прерываний и отслеживать моменты запуска WINDOWS и завершения её работы.
Функция 1605h вызывается при запуске WINDOWS:
Регистры при вызове прерывания:
AX 1605h
ES:BX 0000h:0000h
DS:SI 0000h:0000h
CX 0000h
DX Флаги:
Бит 0 = 0, если выполняется инициализация WINDOWS в
расширенном режиме;
Бит 0 = 1, если выполняется инициализация DOS-экстендера
«Microsoft 286 DOS extender»
(используется в стандартном режиме работы WINDOWS);
Биты 1-15 зарезервированы, их содержимое неопределено.
Регистры перед возвратом из прерывания:
CX 0000h, если WINDOWS может продолжать инициализацию;
CX <> 0, если запуск WINDOWS недопустим.
Функция 1606h вызывается при завершении WINDOWS расширенном или стандартном режиме:
Регистры при вызове прерывания:
AX 1606h
DX Флаги:
Бит 0 = 0, если выполняется завершение WINDOWS,
работавшей в расширенном режиме;
Бит 0 = 1, если выполняется завершение DOS-экстендера
«Microsoft 286 DOS extender»;
Биты 1-15 зарезервированы, их содержимое не определено.
Обработчик функции 1605h может выполнить необходимые действия, связанные с модификацией алгоритма работы резидентной программы или драйвера, а также при помощи соответствующей установки регистра CX может разрешить или запретить запуск WINDOWS.
Обработчик функции 1606h получает управление при завершении работы WINDOWS и может восстановить прежний алгоритм работы критичной к WINDOWS резидентной программы или драйвера.
Приведённая ниже резидентная программа перехватывает прерывание INT 2Fh и отслеживает функции 1605h и 1606h, вызывая сообщение и ожидая нажатия на любую клавишу при запуске и завершении работы WINDOWS:
.MODEL tiny
.CODE
.STARTUP
old_int2Fh_off dw 0 ; Адрес старого обработчика
old_int2Fh_seg dw 0 ; прерывания 2Fh
; Сообщение, которое будет выдано на экран
; при запуске WINDOWS
msg_win db ‘WINDOWS Started. Press any key. $’
msg_win_off dw offset msg_win
; Сообщение, которое будет выдано на экран
; при завершении WINDOWS
msg_win1 db ‘WINDOWS Ended. Press any key. $’
msg_winend_off dw offset msg_win1
; Новый обработчик прерывания 2Fh нужен
; для проверки наличия программы в памяти
; при ее запуске для предохранения
; от повторного запуска
new_int2Fh proc far
cmp ax,0FF00h
jz installed
cmp ax,1605h
jz winstart
cmp ax,1606h
jz winend
jmp dword ptr cs:old_int2Fh_off
winstart: ; запуск WINDOWS
push ax
push bx
push cx
push dx
push ds
mov dx,cs:msg_win_off
mov ah,9
push cs
pop ds
int 21h
pop ds
pop dx
pop cx
pop bx
pop ax
jmp dword ptr cs:old_int2Fh_off
winend: ; завершение WINDOWS
push ax
push bx
push cx
push dx
push ds
mov dx,cs:msg_winend_off
mov ah,9
push cs
pop ds
int 21h
pop ds
pop dx
pop cx
pop bx
pop ax
jmp dword ptr cs:old_int2Fh_off
; Если код функции 0FF00h, то возвращаем
; в регистре AX значение 00FFh. Это признак
; того, что программа уже загружена в память
installed:
mov ax,00FFh
iret
; Точка входа в программу
; В этом месте начинается выполнение программы
; Проверяем, не загружена ли уже программа
; в память
mov ax,0FF00h
int 2Fh
cmp ax,00FFh
jne first_start
mov dx,offset msg_load1
mov ah,9
int 21h
; Первоначальный запуск программы
; Запоминаем адрес старого обработчика прерывания 2Fh
mov ax,352Fh
int 21h
mov cs:old_int2Fh_off,bx
mov cs:old_int2Fh_seg,es
mov dx,offset msg_load
mov ah,9
int 21h
mov dx,OFFSET new_int2Fh
mov ax,252Fh
int 21h
; Завершаем программу и оставляем резидентно
; в памяти часть программы, содержащую новые
; обработчики прерываний
mov dx,OFFSET begin
int 27h
msg_load db ‘Резидентная программа WINTSR загружена$’
msg_load1 db ‘Резидентная программа WINTSR уже загружена$’
Следующая резидентная программа работает аналогично, но она запрещает запуск WINDOWS. Попробуйте, запустив предварительно программу NOWINTSR, запустить WINDOWS и посмотрите, что из этого получится.
.MODEL tiny
.CODE
.STARTUP
old_int2Fh_off dw 0 ; Адрес старого обработчика
old_int2Fh_seg dw 0 ; прерывания 2Fh
; Сообщение, которое выдаётся при запуске WINDOWS
msg_win db ‘NOWINTSR несовместима с’
‘WINDOWS. Нажмите любую клавишу. $’
msg_win_off dw offset msg_win
; Сообщение, которое выдаётся при завершении WINDOWS
msg_win1 db 10,13,’WINDOWS Ended. Press any key. $’
msg_winend_off dw offset msg_win1
; Новый обработчик прерывания 2Fh нужен
; для проверки наличия программы в памяти
; при ее запуске для предохранения
; от повторного запуска
new_int2Fh proc far
cmp ax,0FF00h
jz installed
cmp ax,1605h
jz winstart
cmp ax,1606h
jz winend
jmp dword ptr cs:old_int2Fh_off
push ax
push bx
push cx
push dx
push ds
mov dx,cs:msg_win_off
mov ah,9
push cs
pop ds
int 21h
pop ds
pop dx
pop cx
pop bx
pop ax
mov cx,0ffh
jmp dword ptr cs:old_int2Fh_off
push ax
push bx
push cx
push dx
push ds
mov dx,cs:msg_winend_off
mov ah,9
push cs
pop ds
int 21h
pop ds
pop dx
pop cx
pop bx
pop ax
jmp dword ptr cs:old_int2Fh_off
; Если код функции 0FF00h, то возвращаем
; в регистре AX значение 00FFh. Это признак
; того, что программа уже загружена в память
installed:
mov ax,00FFh
iret
; Точка входа в программу
; Проверяем, не загружена ли уже программа
; в память
mov ax,0FF00h
int 2Fh
cmp ax,00FFh
jne first_start
mov dx,offset msg_load1
mov ah,9
int 21h
; Первоначальный запуск программы
; Запоминаем адрес старого обработчика прерывания 2Fh
mov ax,352Fh
int 21h
mov cs:old_int2Fh_off,bx
mov cs:old_int2Fh_seg,es
mov dx,offset msg_load
mov ah,9
int 21h
mov dx,OFFSET new_int2Fh
mov ax,252Fh
int 21h
; Завершаем программу и оставляем резидентно
; в памяти часть программы, содержащую новые
; обработчики прерываний
mov dx,OFFSET begin
int 27h
msg_load db ‘Резидентная программа NOWINTSR загружена$’
msg_load1 db ‘Резидентная программа NOWINTSR уже загружена$’
7. ОПЕРАЦИОННАЯ СИСТЕМА MICROSOFT WINDOWS
Не будет преувеличением сказать, что операционная система WINDOWS версии 3.0 открыла новый этап в жизни персонального компьютера IBM PC. Удобная, интуитивно ясная графическая оболочка, аналогичная используемой в компьютерах фирмы Apple, быстро завоевала популярность у пользователей IBM PC. В нашей стране WINDOWS также получила широкое распространение, особенно после того, как стали доступны компьютеры с памятью 2 мегабайта и более. Новая верисия WINDOWS 3.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:
Регистры при вызове прерывания:
Регистры перед возвратом из прерывания:
Функция 1606h вызывается при завершении WINDOWS расширенном или стандартном режиме:
Регистры при вызове прерывания:
Обработчик функции 1605h может выполнить необходимые действия, связанные с модификацией алгоритма работы резидентной программы или драйвера, а также при помощи соответствующей установки регистра CX может разрешить или запретить запуск WINDOWS.
Обработчик функции 1606h получает управление при завершении работы WINDOWS и может восстановить прежний алгоритм работы критичной к WINDOWS резидентной программы или драйвера.
Приведённая ниже резидентная программа перехватывает прерывание INT 2Fh и отслеживает фунции 1605h и 1606h, вызавая сообщение и ожидая нажатия на любую клавишу при запуске и завершении работы WINDOWS:
Следующая резидентная программа работает аналогично, но она запрещает запуск WINDOWS. Попробуйте, запустив предварительно программу NOWINTSR, запустить 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-программ. В терминологии WINDOWS DOS-программы относятся к так называемым старым приложениям WINDOWS (WINDOWS Old Application). Версию драйвера WINDOWS, поддерживающего работу с приложениями WinOldAp, можно узнать с помощью функции 1700h прерывания INT 2Fh:
Открыть CLIPBOARD
Перед выполнением любой операции с CLIPBOARD необходимо открыть CLIPBOARD (по аналогии с обычным файлом):
Очистить CLIPBOARD
С помощью этой функции можно удалить данные из CLIPBOARD:
Записать данные в CLIPBOARD
С помощью этой функции DOS-программа может выполнить запись данных в WINDOWS CLIPBOARD.
С помощью этой функции можно записывать как текстовые, так и графические данные.
Операционная система 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) | указатель на начало данных |
0Eh (2) | ширина в 0.1 mm |
10h (2) | высота в 0.1 mm |
12h | графические данные |
Исчерпывающую информацию о форматах графических файлов WINDOWS вы можете получить из документации, поставляемой Microsoft для разработчиков приложений.
Получить размер CLIPBOARD
Размер данных, записанных в CLIPBOARD, можно узнать с помощью следующей функции:
Прочитать данные из CLIPBOARD
Закрыть CLIPBOARD
После выполнения записи необходимо закрыть CLIPBOARD (точно также, как вы закрываете файл). Для того, чтобы закрыть CLIPBOARD, вы можете использовать следующую функцию:
Установить размер данных, записанных в CLIPBOARD
После записи данных в CLIPBOARD программист может ограничить размер CLIPBOARD:
Критическая секция
DOS-программа, работающая на виртуальной машине WINDOWS, может временно запретить переключение задач, захватив процессор в монопольное пользование. Для этого она должна вызвать функцию 1681h прерывания INT 2Fh. Параметры задавать не надо.
Про программу, захватившую процессор, говорят, что она вошла в критическую секцию.
Для выхода из критической секции и возобновления работы диспетчера задач WINDOWS программа должна вызвать функцию 1682h прерывания INT 2Fh.
Пример программы для работы с CLIPBOARD
Приведённая ниже программа демонстрирует запись в CLIPBOARD из DOS-программы, а также вход в критическую секцию и выход из неё.
Вначале программа убеждается в том, что она запущена под управлением WINDOWS, работающем в расширенном режиме. Только в этом случае доступны функции для работы с CLIPBOARD.
Далее программа демонстрирует блокировку механизма переключения задач при входе в критическую секцию. После этого проверяется доступность CLIPBOARD.
Если CLIPBOARD доступен, программа проверяет, есть ли в нём текстовые данные. Если текстовые данные есть, они читаются из CLIPBOARD и выводятся на экран. Затем CLIPBOARD очищается и в него записывается тестовая строка, состоящая из латинских букв и символов кириллицы (для проверки выполнения перекодировки из OEM в ANSI).
После записи строки программа устанавливает размер CLIPBOARD и закрывает его. Далее вы можете запустить приложение WINDOWS «Clipboard» и посмотреть результат!