а именно перехват чтения размера файла. Сразу вопрос - можно-ли сделать НЕ через 21 прерывание? Вобщем над этой проблемой уже бьюсь неделю. Необходимо изменить отображаемое в досе размер файла. Для этого перехватываю 0x21 прерывание, 0x23 функцию. В листинге ниже сделал проверку на занятость доса. но. Не работает! Загружаю досбокс, гружу там NC, затем из него свою прогу. В NC у меня уже не возвращается ) Если меняю прерывание - и в NC возвращается после запуска проги и ничо не зависает =) Код (Text): #include <dos.h> #include <stdlib.h> #define INT 0x21 extern unsigned _heaplen = 1024; extern unsigned _stklen = 512; void interrupt (*oldhandler)(...); void interrupt newhandler(...); union REGS inregs, outregs; struct SREGS segregs; char far *PDOSBUSY; #pragma argsused int main(int argc, char *argv[]) { inregs.h.ah = 0x34; intdosx( &inregs, &outregs, &segregs ); //проверяем на занятость дос PDOSBUSY = (char far*)FP_MAKE(segregs.es,outregs.x.bx); if (!(*PDOSBUSY)) { oldhandler = getvect(INT); setvect(INT, newhandler); } keep(0, _SS + (_SP/16) - _psp); return 0; } void interrupt newhandler(...) { (*oldhandler)(); }
ВСЕ! проблема решена! юзайте функцию _chain_intr для вызова старого обработчика! е-мае. неделя прошла до того, как в инете увидел эту фунцию.
тогда вопрос по немного другой стороны проблемы. При вызове старого обработчика, у меня больше не возвращается в мой обработчик. В хелпе написано, что так может быть. Но как перебороть это? Код (Text): void interrupt newhandler(...) { _chain_intr(oldhandler); if (_AH == 0x42 && _AL == 2 && _CX == 0 && _DX == 0) { putstr("0x42",0,1); delay(100); _DX = 0; _AX = 0x0001; //_FLAGS } }