Перехват прерываний DOS

Тема в разделе "WASM.BEGINNERS", создана пользователем SparK, 2 авг 2008.

  1. SparK

    SparK New Member

    Публикаций:
    0
    Регистрация:
    29 янв 2008
    Сообщения:
    11
    Пробую написать небольшой перехватчик прерывания 21h функция 09, код ниже. Запустил, вроде все отработало нормально. Дальше запустил небольшую программку которая используя 9-ю функцию 21-го прерывания выводит сообщение, по идее, должно показаться сообщение которое прописано в моем обработчике, а на самом деле выводится сообщение реальное из программы. Что не так, подскажите?
    Код (Text):
    1. .model tiny
    2. .code
    3.         org     100h
    4. Begin:
    5.     jmp Init
    6. int21hProc  proc
    7.     cmp al,9
    8.     je  Ok_09
    9.     jmp dword ptr cs:[int21hVect]
    10. Ok_09:
    11.     push    ds
    12.     push    dx
    13.     push    cs
    14.     pop ds
    15.     mov dx,offset MyStr
    16.     pushf
    17.     call    dword ptr cs:[int21hVect]
    18.     pop dx
    19.     pop ds
    20.     iret
    21. int21hVect  dd ?
    22. MyStr       db "Abra$"
    23. int21hProc  endp
    24. Init:
    25.     mov ax,3521h
    26.     int 21h
    27.    
    28.     mov word ptr int21hVect,bx
    29.     mov word ptr int21hVect+2,es
    30.    
    31.     mov ax,2521h
    32.     mov dx,offset int21hProc
    33.     int 21h
    34.    
    35.     mov dx,offset Init
    36.     int 27h
    37. end Begin
     
  2. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    SparK
    cmp al,9
    Номер функции в регистре ah.
     
  3. SparK

    SparK New Member

    Публикаций:
    0
    Регистрация:
    29 янв 2008
    Сообщения:
    11
    Все равно не работает (
    Дело не в проверке, программы даже не переходят на мой перехватчик, они вызывают оригинальный.
     
  4. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    SparK
    Опиши методику проверки.

    Я проверял так:
    1. в твоей программе после заменил al на ah, собрал com-файл;
    2. написал программу
    Код (Text):
    1. .model tiny
    2. .code
    3.         org     100h
    4. Begin:
    5.     jmp Init
    6. msg db  'Hello, world!$'
    7. Init:
    8.     mov ah,9
    9.     mov dx,offset msg
    10.     int 21h
    11.  
    12.     mov ax,4C00h
    13.     int 21h
    14. end Begin
    собрал com-файл;
    3. запустил cmd (сижу под xp);
    4. запустил свою программу - увидел "Hello, world!";
    5. запустил твою программу, она отработала;
    6. повторно запустил свою - увидел "Abra".
     
  5. SparK

    SparK New Member

    Публикаций:
    0
    Регистрация:
    29 янв 2008
    Сообщения:
    11
    У меня XP XTreme SP3.
    1. запустил cmd;
    2. запустил программу для проверки выдает "Резидент в памяти не обнаружен!";
    3. запустил перехватчик, он отработал;
    4. повторно запустил проверку - выдало "Резидент в памяти не обнаружен!".
    Я архив прикрепил там есть и перехватчик и программа для проверки.
     
  6. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    SparK
    запустил программу для проверки ... повторно запустил проверку
    Это ты про test12?
    Imho она не имеет ни какого отношения к проверке наличия перехватчика int21h_fn_9.
    Для его проверки надо использовать test10.
    test12 проверяет rezid12.
     
  7. SparK

    SparK New Member

    Публикаций:
    0
    Регистрация:
    29 янв 2008
    Сообщения:
    11
    нет, для 21-го прерывания я запускал test10, а для 10-го test12. rezis12 это уже 2-й перехватчик и он тоже не работает.
     
  8. SparK

    SparK New Member

    Публикаций:
    0
    Регистрация:
    29 янв 2008
    Сообщения:
    11
    Все я понял почему перехватчик не работал. Я запускал .COM файл перехватчика из Винды, а 27-е прерывание восстанавливает все оригинальные обработчики после выхода из DOS среды. Поэтому то у меня и не работали все перехватчики.

    Спасибо всем кто пытался помочь )