Перехват 0x21 прерывания под досом

Тема в разделе "LANGS.C", создана пользователем merge, 16 июн 2007.

  1. merge

    merge New Member

    Публикаций:
    0
    Регистрация:
    19 янв 2007
    Сообщения:
    3
    а именно перехват чтения размера файла. Сразу вопрос - можно-ли сделать НЕ через 21 прерывание?

    Вобщем над этой проблемой уже бьюсь неделю.
    Необходимо изменить отображаемое в досе размер файла. Для этого перехватываю 0x21 прерывание, 0x23 функцию.
    В листинге ниже сделал проверку на занятость доса. но. Не работает!
    Загружаю досбокс, гружу там NC, затем из него свою прогу. В NC у меня уже не возвращается ) Если меняю прерывание - и в NC возвращается после запуска проги и ничо не зависает =)

    Код (Text):
    1. #include <dos.h>
    2. #include <stdlib.h>
    3.  
    4. #define INT 0x21
    5.  
    6. extern unsigned _heaplen = 1024;
    7. extern unsigned _stklen  = 512;
    8.  
    9. void interrupt (*oldhandler)(...);
    10. void interrupt newhandler(...);
    11.  
    12. union REGS inregs, outregs;
    13. struct SREGS segregs;
    14.  
    15. char far *PDOSBUSY;
    16.  
    17. #pragma argsused
    18. int main(int argc, char *argv[])
    19. {
    20.     inregs.h.ah = 0x34;
    21.     intdosx( &inregs, &outregs, &segregs );
    22. //проверяем на занятость дос
    23.     PDOSBUSY = (char far*)FP_MAKE(segregs.es,outregs.x.bx);
    24.     if (!(*PDOSBUSY))
    25.     {
    26.         oldhandler = getvect(INT);
    27.         setvect(INT, newhandler);
    28.     }
    29.  
    30.     keep(0, _SS + (_SP/16) - _psp);
    31.     return 0;
    32. }
    33.  
    34. void interrupt newhandler(...)
    35. {
    36.     (*oldhandler)();
    37. }
     
  2. merge

    merge New Member

    Публикаций:
    0
    Регистрация:
    19 янв 2007
    Сообщения:
    3
    ВСЕ! проблема решена!
    юзайте функцию _chain_intr для вызова старого обработчика! е-мае. неделя прошла до того, как в инете увидел эту фунцию. :dntknw:
     
  3. merge

    merge New Member

    Публикаций:
    0
    Регистрация:
    19 янв 2007
    Сообщения:
    3
    тогда вопрос по немного другой стороны проблемы.

    При вызове старого обработчика, у меня больше не возвращается в мой обработчик. В хелпе написано, что так может быть. Но как перебороть это?
    Код (Text):
    1. void interrupt newhandler(...)
    2. {
    3.   _chain_intr(oldhandler);
    4.   if (_AH == 0x42 && _AL == 2 &&
    5.       _CX == 0 && _DX == 0)
    6.   {
    7.     putstr("0x42",0,1);
    8.     delay(100);
    9.     _DX = 0;
    10.     _AX = 0x0001;
    11.     //_FLAGS
    12.   }
    13. }
     
  4. 10110111

    10110111 New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2006
    Сообщения:
    319
    Адрес:
    Санкт-Петербург
    поместить вызов _chain_intr() в конец обработчика