Радиоперехват

Xakep, номер #036, стр. 036-052-2


D.J.: Напоминаю слушателям, что мы в 16-ричной системе исчисления.

Z.: ...Но заставить двигаться системное время медленнее, только программируя таймер, мы уже не сможем, так как 0FFFFh максимальное значение для регистра-счетчика. Вместо этого можно перехватить прерывание, которое соответствует IRQ0 (это аппаратное прерывание), для DOS 08h (это программное прерывание) и, например, циклически в первый раз передавать управление системному обработчику с последующим возвратом в прерванную программу, а в следующий раз произвести простой возврат из прерывания командой IRET. В первом случае происходит обновление системного времени, а во втором - нет, поэтому оно течет в два раза медленней.

D.J.: А как же в windows?

Z.: Ну, про Win2K разговор отдельный, я опишу 9x. C приходом операционной системы Windows, однако, все изменилось. Теперь операционка может менять начальное значение регистра-счетчика как ей вздумается в зависимости от потребностей прикладных задач.

D.J.: Это Гейтс во всем виноват...

Z.: Нет, он не виноват, хотя... Бог с ним. Ну вот, перепрограммированный нами таймер сохранит свое состояние только до первого обращения к нему операционной системы. Для изменения скорости течения времени нам необходимо также использовать перехват прерываний. В моем примере проглатывается каждое третье прерывание от таймера, то есть происходит возврат в прерванную программу без вызова системного обработчика.

D.J.: В вашем примере???

Z.: Я исходник принес с собой... Потом покажу...

D.J.: А!!! Sorry! Continue, plz!!

Z.: Следует помнить, что программа окажет влияния ТОЛЬКО на события, синхронизируемые по таймеру. Например, на скорость воспроизведение звука она не окажет никакого влияния, так как синхронизация идет не через таймер, а через DSP (Digital Sygnal Process) звуковой карточки.

В проге используется перехват прерывания INT3 для выхода на нулевое кольцо защиты. У этого прерывания DPL=3, то есть его можно вызывать с любым уровнем привилегий. VMM (Virtual Memory Managment) сервисом PageAllocate выделяем место в системной области памяти и пихаем... ммм... запихиваем... в общем, кладем туда наш обработчик прерываний от таймера. Так как каждое третье прерывание от таймера "теряется", то и процессор замедляется на треть.

Прога не будет работать на Windows NT/2k, так как прерывания там надежно защищены от перехвата прикладными программами... Пока...

D.J.: Что, простите!!?

Z.: Я в смысле руки не дотянулись до Win2K еще...

D.J.: Ясно.

Z.: Вот вам исходник.

D.J.: О, спасибо!!! Покажу жене, пусть тоже приобщается... Ну и на сайт выложим, конечно...

Z.: Да, чуть не забыл!!! Когда компильнете исходник, получите exe-файл...

D.J.: Не может быть! :))

Z.: ...который при повторном запуске снова замедлит процессор от уже оставшегося "быстродействия".

D.J.: Круто!!!

Z.: Ну у меня пока все.

D.J.: Благодарю вас за столь интересный рассказ! На следующей неделе мы вас обязательно еще пригласим для просвещения народа, о чем расскажете?

Назад на стр. 036-052-1  Содержание  Вперед на стр. 036-052-3