Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.216.239.46] |
|
Сообщ.
#1
,
|
|
|
Здравствуйте. Пишу на C и ассемблере (tcc/tasm) резидентную программу под DOS, которая должна перехватывать прерывание клавиатуры и сохранять на диске файл. На виртуальной машине Windows ntvdm всё работает, а на VMware Player (который, как я понял, ближе к реальному DOS) виснет при попытке создать файл. Пробовал работать с файлами как с помощью стандартных библиотечных функций C, так и напрямую вызывать функции DOS int 21h.
В обработчике прерываний сохраняю все регистры (pusha/popa), устанавливаю свой ds и свой стек (потом естественно возвращаю обратно). Кроме этого, устанавливаю свой ID процесса (адрес PSP) с помощью функции DOS 50h. И всё равно виснет. Установил, что виснет при вызове функции DOS создания файла. Может быть я что-то ещё забыл инициализировать в обработчике прерывания? |
Сообщ.
#2
,
|
|
|
Ты забыл, что DOS не реентерабельна. Вызов функций DOS внутри обработчика аппаратного прерывания, который может быть вызван внутри функции DOS, грозит большими неприятностями.
|
Сообщ.
#3
,
|
|
|
Я сделал такой эксперимент: вызвал прерывание клавиатуры в тот момент, когда выполнялась программа, состоящая из одной строки while(1); При этом проверял флаг активности DOS (адрес которого получил при инициализации TSR-программы с помощью функции 34h). Флаг активности - нулевой, т.е. в момент выполнения while(1); DOS разрешает вызывать свои функции. И всё равно при таком раскладе тоже виснет.
Может быть это как-то связано с файловой системой DOS? Догадываюсь, что ntvdm использует не реальную файловую систему DOS, а всё таки Windows-овскую (т.к. файлы там сохраняются на реальном диске в системе NTFS). Поэтому наверное в ntvdm проблем и не возникает. |
Сообщ.
#4
,
|
|
|
Цитата Зойберг @ Может быть это как-то связано с файловой системой DOS? Нет, ты делаешь какую-то ошибку связанную с обработкой прерывания. NTVDM вообще большую часть аппаратных ошибок и возможностей железа просто игнорит. Даю 50%, что неправильно считываешь данные или отправляешь команды железке, возможно не шлешь EOI. Даю 40% на то, что ты перетираешь (невалидными указателями, etc) системные области DOS или BIOS. Более конкретно только после ознакомления с кодом. |