WWW.ИСХОДНИКИ.РУ cpp.sources.ru
java.sources.ru web.sources.ru soft.sources.ru
jdbc.sources.ru asp.sources.ru api.sources.ru

  Форум на исходниках
  ASM
  СРОЧНО !!! ПРЕРЫВАНИЯ !!!

СПРОСИТЬ  ОТВЕТИТЬ
профайл | регистрация | faq

Автор Тема:   СРОЧНО !!! ПРЕРЫВАНИЯ !!!
alexhack опубликован 02-12-2001 21:11 MSK   Click Here to See the Profile for alexhack   Click Here to Email alexhack  
Народ !!! Подскажите, как повесить на 9 прерывание
свой обработчик так, чтобы сначало вызывался старый
обработчик, а потом исполнялась моя часть обработки
9-го прерывания ??? Если есть идеи или исходники -
присылайте на мыло madman@torba.com, не стесняйтесь :)
purpe опубликован 02-12-2001 22:10 MSK     Click Here to See the Profile for purpe  Click Here to Email purpe     
так ведь вроде идея любого хука такова, что сначала твой код исполняется, а потом остальной (предназначенный для данного прерывания). А иначе разве может быть ?
7in опубликован 02-12-2001 22:50 MSK     Click Here to See the Profile for 7in  Click Here to Email 7in     
.MODEL Tiny
.286
.CODE
ORG 100h

Start:

jmp SetIntVec

OldInt DD 0
Handler:
pushf
call cs:OldInt
;---------------------------------------------;
; Твои команды (не забудь сохранять регистры) ;
;---------------------------------------------;
iret

SetIntVec:
mov ax,3509h
int 21h
mov WORD PTR OldInt[0],bx
mov WORD PTR OldInt[2],es
mov ah,25h
lea dx,Handler
int 21h
mov ah,49h ; Советую вот эту штуку делать,
mov es,ds:[2Ch] ; если не используешь Environment
int 21h ; (лишнюю память освобождаешь)
lea dx,SetIntVec
int 27h

END Start

alexhack опубликован 03-12-2001 15:36 MSK     Click Here to See the Profile for alexhack  Click Here to Email alexhack     
2 7in:

Пасибо за source :)

И обьясни, если не лень, че ты делаешь вот тут:

>mov ah,49h ; Советую вот эту штуку делать,
>mov es,ds:[2Ch] ; если не используешь Environment
>int 21h ; (лишнюю память освобождаешь)
>lea dx,SetIntVec
>int 27h

Да, и если у меня TSR-прога, то-есть я итак оставляю в памяти
только резидентную часть, то нужно ли мне писать у себя
этот кусок твоего исходника ???

7in опубликован 03-12-2001 22:53 MSK     Click Here to See the Profile for 7in  Click Here to Email 7in     
Когда прога загружается в память, ей выделяется два участка памяти: один под переменные среды (Environment), которые устанавливаются командой DOS SET X=Y , а второй - под программу. Если ты не используешь в _резидентном куске_ этот самый Environment (а я на 99.9% уверен, что ты его не используешь :) , то его лучше удалить из памяти. Это делается с помощью...

mov ah,49h
mov es,ds:[2Ch] ; по адресу [2Ch] находится сегмент с Environment'ом
int 21h

Если ты этого не сделаешь, ничего плохого не произойдёт.

А с помощью...

lea dx,SetIntVec ; = mov dx,OFFSET SetIntVec
int 27h

...ты оставляешь DX байт программы в памяти (на Environment это никак не влияет). Т.е. DX указывает на следующий байт после последнего нужного тебе :) . Если ты используешь другой метод для оставления проги в памяти (например, int 21h,ah=31h), то последний кусок, естественно, писать не надо.


Кстати, объясню для чего нужен 'pushf' перед
'call cs:OldInt'... CALL оставляет в стеке 2 или 4 байта (как в данном случае), а INT - 6 байт (соответственно, IRET вытаскивает из стека 6 байт), первые два из которых - флаги. Т.о. с помощью конструкции 'pushf/call far' мы имитируем INT.

alexhack опубликован 04-12-2001 01:20 MSK     Click Here to See the Profile for alexhack  Click Here to Email alexhack     
2 7in:

Пасибо, понял все что хотел :)

Ilyia опубликован 10-02-2001 13:12 MSK     Click Here to See the Profile for Ilyia  Click Here to Email Ilyia     
> Когда прога загружается в память,
> ей выделяется два участка памяти:
> один под переменные среды (Environment),
> которые устанавливаются командой DOS SET X=Y ,
> а второй - под программу.
> Если ты не используешь в _резидентном куске_
> этот самый Environment (а я на 99.9% уверен,
> что ты его не используешь :) , то его лучше
> удалить из памяти. Это делается с помощью...


Объясните, пожалуйста,
как конкретно "использовать в _резидентном куске_
этот самый Enviroment", механизм этого и если
можно пример.

NOPIK опубликован 10-02-2001 19:00 MSK     Click Here to See the Profile for NOPIK  Click Here to Email NOPIK     
Кстати, свой код прерывания пишут перед родным, потому что после аппаратного прерывания нужно восстановить состояние PIC (обычно достаточно OUT 20H,20H - но не все PC в природе используют 8259-совместимый PIC, например, некоторые японские...)
7in опубликован 10-02-2001 23:35 MSK     Click Here to See the Profile for 7in  Click Here to Email 7in     
Environment представляет собой несколько ASCIIZ-строк:
db 'COMSPEC=C:\COMMAND.COM',0
db 'windir=C:\WINDOWS',0
и т.д.

Затем идёт ещё один ноль, показывающий, что Environment закончился... Потом идёт какое-то слово (не помню, смотреть надо), а затем параметры ASCIIZ. Первый - имя программы, затем первый заданные параметр и т.д. И по-моему заканчивается это всё нулём...

Так вот ответ: если ты будешь в проге читать эту область (адрес сегмента находится в PSP:2Ch), в чём я очень сомневаюсь, то удалять её из памяти не надо...

7in опубликован 10-02-2001 23:36 MSK     Click Here to See the Profile for 7in  Click Here to Email 7in     
2 NOPIK: Оригинальный обработчик это делает сам...
server_mouse опубликован 12-02-2001 10:03 MSK     Click Here to See the Profile for server_mouse  Click Here to Email server_mouse     
А я когда-то очень давно, затирал ещё и часть PSP, т.е. резидентная часть у меня стартавала не от 100h а от 5с или 5d... что-то так, сейчас уж не вспомню.
Вот 7in наверное точно знает...
frostbitten опубликован 12-02-2001 17:32 MSK     Click Here to See the Profile for frostbitten  Click Here to Email frostbitten     
Если удалять сегмент окружения, то фрагментация происходить... Не красиво.

Поэтому обычно в начале программы берем из окружения все что нучно, а далее затаскиваем себя на место окружения (микрософт клянется, что а) окружение _будет_ б) окружение будет в акурат над сегментом PSP (и MCB егошного)). А перетереть в PSP коммандную строку (начиная с PSP:0080) - это само собой. Резидент должен занимать 256 байт! (меньше не получается (обычно) - PSP должен быть).

Че-то еще помню :)

7in опубликован 13-02-2001 21:08 MSK     Click Here to See the Profile for 7in  Click Here to Email 7in     
2 server_mouse: Если в TechHelp загляну :)
2 frostbitten: А если окружения будет не хватать? К тому же это никому не нужный геморрой. И наверняка придётся заголовок енвиронмента (в смысле, "Memory Control Block", как его называют) подправлять.

СПРОСИТЬ  ОТВЕТИТЬ
Перейти:


E-mail | WWW.ИСХОДНИКИ.RU

Powered by: Ultimate Bulletin Board, Freeware Version 5.10a
Purchase our Licensed Version- which adds many more features!
© Infopop Corporation (formerly Madrona Park, Inc.), 1998 - 2000.