Сообщений: 115
Сделать программу резидентной
Добрый день, есть программа, которая делает снимок экрана, вот ее исходник
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtDlgs, StdCtrls,jpeg; type TForm1 = class(TForm) Button1: TButton; SavePictureDialog1: TSavePictureDialog; Button2: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private < Private declarations >public < Public declarations >// procedure CreateParams (var Params: TCreateParams); override; end; var Form1: TForm1; DC: HDC; bmp: TBitmap; jpgImg:TJPEGImage; implementation procedure TForm1.Button1Click(Sender: TObject); var Canvas:TCanvas; ScreenV:HDC; i: String; begin bmp:=TBitmap.Create; jpgImg := TJPEGImage.Create; bmp.Height:=Screen.Height; bmp.Width:=Screen.Width; DC:=GetDC(0); bitblt(bmp.Canvas.Handle, 0, 0, Screen.Width, Screen.Height, DC, 0, 0, SRCCOPY); ReleaseDC(0, DC); jpgImg.Assign(bmp); jpgImg.CompressionQuality:=100; SavePictureDialog1.Execute; jpgImg.SaveToFile(SavePictureDialog1.FileName+’.jpg’); jpgImg.Free; bmp.Free; end; procedure TForm1.Button2Click(Sender: TObject); var Params: TCreateParams; begin inherited CreateParams (Params); Params.ExStyle := Params.ExStyle or WS_EX_TRANSPARENT; end; end.
Необходимо сделать, чтобы при нажатии на Button2 программа «стала невидимой» (т.е. ее невидно ни в трее, ни в диспетчере задач, ни на рабочем столе) и в определенное время делала снимок экрана и сохраняла в определенном месте. Подскажите, пожалуйста, как это сделать.
ОС #3-2. Виртуальная память
Форумчанин
: 110
типа так вот
procedure TForm1.Button2Click(Sender: TObject); begin Form1.Visible:=false; end;
٩(๏̯͡๏)۶٩(๏̯͡๏)۶٩(๏̯͡๏)۶ моя любимая книга — Окна for чайников . Кодить начал ещё вчера . . кто там кодит ? Да не кто не кодит это я куякнулся
Источник: www.programmersforum.ru
Индивидуальные задания. Резидентные программы
Существуют программы, специально разработанные так, чтобы находиться в памяти во время работы других программ. Обычно эти программы можно активизировать нажатием определенных клавиш. Такие программы называются резидентными. Обычно они загружаются в память сразу после загрузки DOS перед выполнением обычных программ.
Чтобы оставить резидентную COM-программу в памяти, необходимо вместо команды RET или INT 20H для выхода использовать команду INT 27H или функцию DOS 31Н. Для INT 27Н следует передать системе в регистре DX размер программы:
При выполнении программы инициализации DOS резервирует (выделяет) в старших доступных адресах блок памяти и загружает в него резидентную программу. Это – самая простая часть создания резидентной программы.
Более сложная часть включает программирование механизма активизации резидентной программы, которая хотя присоединена к DOS, но не относится ко внутренним программам – командам DOS (как DIR, COPY и пр.). Общий подход к этому – модификация таблицы векторов прерываний так, чтобы резидентная программа получала управление при нажатии определенных клавиш или их комбинаций, а все остальные передавала через себя дальше. Резидентная программа обычно (но не обязательно) состоит из следующих частей:
Уроки C++ / Первая программа на С++
1) секция, переопределяющая адреса в таблице векторов прерываний;
2) процедура, выполняемая только один раз при загрузке программы и обеспечивающая:
— замену адреса в таблице векторов прерываний на собственный адрес;
— установку размера части программы, которая должна стать резидентной;
— использование прерывания DOS для завершения программы и создания резидентной части по указанному размеру;
3) процедура, которая остается резидентной и активизируется, например, по вводу с клавиатуры или по сигналам таймера.
Процедура инициализации должна создать необходимые условия для обеспечения работы резидентной программы, а затем позволить себе быть стертой в памяти. В итоге память распределится следующим образом:
Таблица векторов прерываний
IВМВIO.СОМ и IBMDOS.COM
Резидентная часть программы – остается в памяти
Инициализирующая часть программы – перекрывается следующей программой
Остальная часть доступной памяти
TITLE RESIDENT (COM) Резидентная программа для очистки
; экрана и установки цвета при нажатии
INTTAB SEGMENT AT 0H ;Таблица векторов прерываний:
ORG 9H*4 ; адрес для Int 9H,
KBADDR LABEL DWORD ; двойное слово
ROMAREA SEGMENT AT 400H ;Область параметров BIOS:
ORG 17H ; адрес флага клавиатуры,
KBFLAG DB ? ; состояние Alt + Shift
CSEG SEGMENT PARA ;Сегмент кода
BEGIN: JMP INITZ ;Выполняется только один раз
KBSAVE DD ? ;Для адреса INT 9 BIOS
; Очистка экрана и установка цветов:
COLORS PROC NEAR ;Процедура выполняется
PUSH AX ; при нажатии Alt+Left Shift
PUSH CX ;Сохранить регистры
CALL KBSAV ;Обработать прерывание
MOV AX,ROMAREA ;Установить DS для
MOV DS,AX ; доступа к состоянию
MOV AL,KB AG ; Alt+Left Shift
CMP AL,00001010B ;Alt+Left Shift нажаты?
JNE EXIT ; нет — выйти
MOV AX,0600H ;Функция прокрутки
MOV BH,61H ;Установить цвет
POP ES ;Восстановить регистры
INITZE PROC NEAR ;Выполнять только один раз
PUSH DS ;Обеспечить возврат в DOS
MOV AX,INTTAB ;Установить сегмент данных
CLI ;Запретить прерывания
;Замена адреса обработчика:
MOV AX,WORD PTR KBADDR ;Сохранить адрес
MOV WORD PTR KBSAVE,AX ; BIOS
MOV AX,WORD PTR BADDR+2
MOV WORD PTR KBSAVE+2,AX
MOV WORD PTR KBADDR,OFFSET COLORS ;Заменить
MOV WORD PTR KBADDR+2,CS ; адрес BIOS
STI ;Разрешить прерывания
MOV DX,OFFSET INITZE ;Размер программы
INT 27H ;Завершить и остаться
INITZE ENDP ; резидентом
Рис. 1. Резидентная программа
Пример на рис. 1 иллюстрирует резидентную программу, которая устанавливает цвет экрана при одновременном нажатии клавиш Alt и Left Shift. Основные моменты, представляющие интерес:
— Сегмент INTTAB определяет таблицу векторов прерываний, начинающуюся по адресу 0, а точнее – адрес элемента для прерывания 9 (ввод с клавиатуры), названный в программе KBADDR.
— Имя ROMAREA определяет сегмент, начинающийся по адресу 400Н, и в нем флаговый байт клавиатуры (KBFLAG), который отражает состояние клавиатуры. Бит 3 в этом байте регистрирует нажатие клавиши Alt, бит 1 – нажатие клавиши Left Shift.
— Сегмент CSEG начинает сегмент обычной COM-программы. Первая выполняемая команда JMP INITZE обходит резидентную часть и передает управление в процедуру инициализации (INITZE) в конце программы. Эта процедура устанавливает в регистре DS адрес таблицы векторов прерывания (INTTAB) и передает адрес элемента таблицы для INT 9 (KBADDR) в поле KBSAVE в резидентной процедуре.
Следующим шагом в таблице в KBADDR устанавливается адрес резидентной процедуры (COLORS) (первое слово) и содержимое регистра CS (второе слово). Таким образом, KBADDR содержит теперь два измененных слова: смещение и значение адреса из регистра CS, которые вместе определяют адрес процедуры COLORS в памяти, куда будут направляться теперь все символы, поступающие с клавиатуры. Затем процедура инициализации заносит в регистр DX размер процедуры COLORS (адрес INITZE на один байт больше, чем адрес конца процедуры COLORS) и прекращает работу, используя INT 27H.
— Процедура COLORS является резидентной и получает управление при нажатии любой клавиши на клавиатуре. Так как это происходит при работе других программ (например, DOS или текстового редактора), процедура должна сохранить все регистры, которые она использует (а также несколько других на всякий случай). Затем происходит вызов по адресу KBSAVE, т.е. вызов подпрограммы обработки прерывания, после чего процедура проверяет флаг клавиатуры для определения нажатия клавиш Alt и Left Shift. Если эти клавиши были нажаты, то процедура устанавливает необходимые цвета. Завершающие команды включают восстановление всех запомненных вначале регистров (в обратной последовательности) и выход из обработки прерывания по команде IRET.
Приведенная программа носит иллюстративный характер, ее можно модифицировать или расширить для собственных целей.
Индивидуальные задания
номер варианта | позиция экрана | сообщение | клавиша |
X | Y | ||
DOS | Tab | ||
Number | F1 | ||
. | End | ||
Hi | Ctrl | ||
Good | Alt | ||
Bad | F7 | ||
Lmn | BKSP | ||
Zip | F5 | ||
skip | Del | ||
OK | F9 | ||
Linux | Tab | ||
UNIX | F1 | ||
Head | End | ||
Logic | Ctrl | ||
Go | Alt | ||
F7 | |||
Scroll | BKSP | ||
Shift | F5 | ||
Up | Del | ||
Down | F9 | ||
Left | Tab | ||
Right | F1 | ||
Stupid | End | ||
Good | Ctrl | ||
Save | Alt | ||
Cat | F7 | ||
Value | BKSP | ||
RAR | F5 | ||
Ace | Del | ||
Seven | F9 |
Источник: megaobuchalka.ru
Завершить и остаться резидентной программой
A завершить резидентную программу (обычно TSR ) — это компьютерная программа, работающая под DOS, которая использует системный вызов для возврата управления в DOS, как если бы она была завершена, но остается в памяти компьютера, поэтому его можно будет повторно активировать позже. Этот метод частично преодолел ограничение DOS на выполнение только одной программы или задачи за раз. TSR используются только в DOS, а не в Windows.
Некоторые TSR представляют собой служебное программное обеспечение, которое пользователь компьютера может вызывать несколько раз в день, работая в другой программе, используя горячую клавишу. Borland Sidekick был ранним и популярным примером этого типа. Остальные служат драйверами устройств для оборудования, которое операционная система не поддерживает напрямую.
Используйте
Обычно DOS может запускать только одну программу за раз. Когда программа завершает работу, она возвращает управление DOS с помощью системного вызова INT 21h / 4Ch. Используемая память и системные ресурсы помечаются как неиспользуемые. Это делает невозможным перезапуск частей программы без перезагрузки всей программы. Однако, если программа завершается системным вызовом INT 27hили INT 21h / 31h, операционная система не использует повторно определенную указанную часть своей памяти.
Исходный вызов, INT 27h, называется «завершить, но оставаться резидентным», отсюда и название «TSR». Используя этот вызов, программа может сделать до 64 КБ своей памяти резидентной. MS-DOS версии 2.0 представила улучшенный вызов INT 21h / 31h(«Сохранить процесс»), который снял это ограничение и позволил программе возвращать код выхода.
Перед выполнением этого вызова программа может установить один или несколько обработчиков прерываний , указывающих на себя, чтобы его можно было вызвать снова. Установка вектора аппаратных прерываний позволяет такой программе реагировать на аппаратные события. Установка программного вектора прерывания позволяет вызывать его из текущей запущенной программы. Установка обработчика прерывания таймера позволяет TSR запускаться периодически (см. ISA и программируемый интервальный таймер, особенно раздел «IBM PC-совместимый »).
Типичный метод использования вектора прерывания включает чтение его текущего значения (адреса), сохранение его в пространстве памяти TSR и замену его адресом в его собственном коде. Сохраненный адрес вызывается из TSR, фактически формируя односвязный список из обработчиков прерываний, также называемых подпрограммами обслуживания прерываний или ISR. Эта процедура установки ISR называется цепочкой или перехватом прерывания или вектора прерывания.
Путем объединения векторов прерывания TSR могут получить полный контроль над компьютером. TSR может иметь одно из двух поведения:
- Полностью управлять прерыванием, не вызывая других TSR, которые ранее изменили тот же вектор прерывания.
- Каскадирование с другими TSR, вызывая старый вектор прерывания. Это можно сделать до или после того, как они выполнили свой фактический код. Таким образом, TSR могут формировать цепочку, в которой каждый вызывает следующий.
Метод terminate-and-stay-resident используется большинством DOS вирусов и других вредоносных программ, которые могут либо взять под контроль ПК, либо оставаться в тени. Эта вредоносная программа будет реагировать на дисковый ввод-вывод или события выполнения, заражая исполняемые файлы (.EXE или.COM) при запуске и файлы данных при их открытии.
TSR могут быть загружены в любое время; либо во время загрузки DOS (например, из AUTOEXEC.BAT ), либо по запросу пользователя (например, Borland ‘s Sidekick и Turbo Debugger, Quicken’s QuickPay или Персональный календарь FunStuff Software). Некоторые части самой DOS используют эту технику, особенно в версиях DOS 5.0 и новее. Например, редактор командной строки DOSKEY и различные другие утилиты можно установить, запустив их из командной строки (вручную, из AUTOEXEC.BAT или через УСТАНОВИТЕ из CONFIG.SYS ), а не загружайте их как драйверы устройств с помощью операторов DEVICE в CONFIG.SYS.
У некоторых TSR нет возможности выгрузить себя, поэтому они остаются в памяти до перезагрузки. Однако выгрузка возможна извне с использованием таких утилит, как / combo by или TSR с мягкой перезагрузкой, которые перехватывают определенную комбинацию клавиш и освобождают все загруженные после них TSR. Поскольку цепочка ISR является односвязной, и TSR может хранить ссылку на своего предшественника в любом месте по своему выбору, у TSR нет общего способа удалить себя из цепочки. Поэтому обычно при выгрузке TSR в памяти необходимо оставлять заглушку, что вызывает фрагментацию памяти. Эта проблема привела к созданию структур сотрудничества TSR, таких как AMIS.
Совместное использование прерываний
Для решения проблем, связанных с множеством TSR, совместно использующих одно и то же прерывание, был предложен метод, называемый спецификацией альтернативного мультиплексного прерывания (AMIS) Автор Ральф Д. Браун как усовершенствование ранее использованных услуг, предлагаемых через INT 2Fh. AMIS предоставляет способы управления программными прерываниями. Он создан по образцу IBM, изначально изобретенного для разделения аппаратных прерываний процессора x86. Услуги AMIS доступны через Int 2Dh.
В то время это предложение никогда не получало широкого распространения среди программистов. Он существовал вместе с несколькими другими конкурирующими спецификациями разной сложности.
Ошибки
Хотя они очень полезны или даже необходимы для преодоления ограничений DOS, TSR имеют репутацию нарушителей спокойствия.. Многие захватывают операционную систему различными задокументированными или недокументированными способами, часто вызывая сбои системы при их активации или деактивации при использовании с определенными приложениями или другими TSR. Как объяснялось выше, некоторые вирусы и другое вредоносное ПО были закодированы как TSR и намеренно доставляют неприятности. Кроме того, в DOS все программы, даже с большими объемами физической RAM, должны быть загружены в первые 640 КБ RAM (обычная память ). TSR не являются исключением и берут фрагменты из этих 640 КБ, которые, таким образом, недоступны для других приложений. Это означало, что написание TSR было проблемой, заключающейся в достижении минимально возможного размера для него и проверке его на совместимость с множеством программных продуктов от разных поставщиков, что часто было очень неприятной задачей.
В конце 1980-х и начале 1990-х многие видеоигры на платформе ПК вышли за этот предел и оставляли все меньше и меньше места для TSR, даже таких важных, как CD- Драйверы ROM — и организация вещей таким образом, чтобы было достаточно свободной оперативной памяти для запуска игр, при сохранении необходимых TSR, стала черным искусством. У многих геймеров было несколько загрузочных дисков с разной конфигурацией для разных игр. В более поздних версиях MS-DOS сценарии «загрузочного меню» позволяли выбирать различные конфигурации с одного «загрузочного диска». В середине и конце 1990-х, когда многие игры все еще писались для DOS, ограничение в 640 КБ было в конечном итоге преодолено путем помещения частей данных или кода игры выше первого 1 МБ памяти и использования кода ниже 640 КБ для доступа к расширенная память (с использованием методов расширения DOS ), при этом код заменяется на нижний 1 МБ ОЗУ, поскольку накладывается на. Поскольку программирование с множеством наложений само по себе является проблемой, когда программа была слишком большой, чтобы полностью уместиться примерно в 512 КБ, использование расширенной памяти почти всегда выполнялось с помощью стороннего расширителя DOS, реализующего VCPI или DPMI, потому что становится намного проще и быстрее получить доступ к памяти выше границы 1 МБ, и можно запускать код в этой области, когда процессор x86 переключается из реального режима на защищенный режим. Однако, поскольку DOS и большинство программ DOS работают в реальном режиме (VCPI или DPMI делают программу защищенного режима похожей на программу реального режима для DOS и остальной системы, переключаясь туда и обратно между двумя режимами), TSR DOS и устройство драйверы также работают в реальном режиме, и поэтому каждый раз, когда кто-то получает управление, расширитель DOS должен переключаться обратно в реальный режим, пока он не откажется от управления, что приведет к сокращению времени (если они не используют такие методы, как DPMS или ЗАЩИТА ).
Возврат
С появлением плат с расширенной памятью и особенно процессоров Intel 80386 во второй половине 1980-х, стало возможным используйте память более 640 КБ для загрузки TSR. Это потребовало сложных программных решений, получивших название менеджеров расширенной памяти. Некоторые менеджеры памяти: QRAM и QEMM по Quarterdeck, 386 по, CEMM по Compaq и более поздние EMM386 от Microsoft. Области памяти, используемые для загрузки TSR размером более 640 КБ, называются «блоками старшей памяти » (UMB), а загрузка программ в них называется высокой загрузкой. Позже менеджеры памяти начали включать такие программы, как Quarterdeck Optimize или Microsoft MEMMAKER, которые пытаются максимизировать доступное пространство в первых 640 КБ, определяя, как лучше всего распределять TSR между низкой и высокой памятью
Отклонение
С разработкой игр с использованием расширителей DOS (ранним примером был Doom ), которые преодолели барьер в 640 КБ, многие проблемы, связанные с TSR, исчезли, и с широким распространением Microsoft Windows и особенно Windows 95 (за которым следует Windows 98 ), что сделало большинство TSR ненужными, а некоторые TSR несовместимыми — TSR исчез к устареванию, хотя приложения Win16 могут выполнять трюки, подобные TSR, такие как исправление таблицы дескрипторов прерываний (IDT), поскольку Windows это позволяла. В настоящее время TSR почти исчезли, поскольку многозадачные операционные системы, такие как Windows Vista, Windows 7, Mac OS X и Linux, предоставляют средства для одновременного запуска нескольких программ и драйверов устройств без необходимости в специальных приемах программирования, а современное понятие защищенной памяти делает ядро и его модули исключительной ответственностью за изменение таблицы прерываний.
См. Также
- Демон (Unix)
- Службы защищенного режима DOS (DPMS)
- Настольный аксессуар
- Расширение (Mac OS)
- Резидентное системное расширение (RSX)
- Служба Windows
Ссылки
Внешние ссылки
- Ранний TSR
- comp.os.msdos.programmer FAQ — Как написать TSR Утилита (Terminate-and-Stay-Resident)?
- Спецификация альтернативного мультиплексного прерывания (AMIS), v.3.5
- AMISLIB — библиотека функций для записи самозагружающейся, съемной TSR на ассемблере
- от А до Я C ; бесплатная книга по программированию DOS на C; Глава 27 — «Программирование TSR» (PDF). (80 КБ)
- Протокол IBM Interrupt-Sharing Protocol, zip-архив, 6,5 КБ (Simtel )
Источник: alphapedia.ru