![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| merge |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 84 Регистрация: 20.3.2007 Репутация: нет Всего: 1 |
Вобщем над этой проблемой уже бьюсь неделю.
Необходимо изменить отображаемое в досе размер файла. Для этого перехватываю 0x21 прерывание, 0x23 функцию. В листинге ниже сделал проверку на занятость доса и, пока, изменение первой буквы файла на 1. с размером пока ничего дне делал. но. Не работает! Загружаю досбокс, гружу там NC, затем из него свою прогу. В NC у меня уже не возвращается ) делаю dir. Все как было. все имена нормальные :( На экране признак вхождения в if в обработчике не появляется. Если меняю прерывание - и в NC возвращается после запуска проги и ничо не зависает =)
помогите пожалуйста, совсем мало времени осталось ( или подскажите - куда запостить, чтоб помогли Это сообщение отредактировал(а) merge - 16.6.2007, 09:05 |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
Если я не ошибаюсь, у тебя проблема с передачей значений регистров в старый обработчик. Обработчик прерывания немного по-другому надо оформлять, чтобы этого не было. Но как - уже не помню.
|
|||
|
||||
| Sartorius |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1568 Регистрация: 18.7.2006 Где: Ivory tower Репутация: 8 Всего: 37 |
уверен, что старый обработчик AH не меняет?
PS Попробуй без дос бокса в чистом досе запуситть? |
|||
|
||||
| merge |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 84 Регистрация: 20.3.2007 Репутация: нет Всего: 1 |
даже так не хочет (
Добавлено через 48 секунд запускал на вирт машине. результат тот-же Добавлено через 1 минуту и 33 секунды
ну намекни хоть как поискать.. какие слова повводить. ато я уже пол инета перерыл ( |
||||
|
|||||
| merge |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 84 Регистрация: 20.3.2007 Репутация: нет Всего: 1 |
ВСЕ! проблема решена!
юзайте функцию _chain_intr для вызова старого обработчика! е-мае. неделя прошла до того, как в инете увидел эту фунцию. :( |
|||
|
||||
| merge |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 84 Регистрация: 20.3.2007 Репутация: нет Всего: 1 |
тогда вопрос по немного другой стороны проблемы.
При вызове старого обработчика, у меня больше не возвращается в мой обработчик. В хелпе написано, что так может быть. Но как перебороть это?
Это сообщение отредактировал(а) merge - 16.6.2007, 21:25 |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
Вызывай его после для тех случаев, когда не возвращается.
|
|||
|
||||
| merge |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 84 Регистрация: 20.3.2007 Репутация: нет Всего: 1 |
||||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
Ты не понял.
Я думаю, он не возвращается в случае завершения программ. Если я не ошибаюсь, при завершении программа вызывает какую-то функцию DOS. Более того, тот же keep, если память не изменяет не возвращает управление. Поэтому, если ты видишь, что программа хочет выполнить какой-то из этих вызовов, то просто либо сначала выполняй свой код, либо сразу передавай управление обработчику ДОС, понимая, что из него не вернешься. |
|||
|
||||
| merge |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 84 Регистрация: 20.3.2007 Репутация: нет Всего: 1 |
а если мне нужно узнать дискриптор открытого файла функцией 3d ?
|
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
Ты не понял. Сначала проверяй функцию дос. Если она та, что тебе нужна, делай какие-либо действия. Иначе вызывай сразу обработчик DOS:
|
|||
|
||||
| dumb |
|
|||
![]() sceloglauxalbifacies ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2929 Регистрация: 16.6.2006 Репутация: 8 Всего: 158 |
вставлю свои "пять копеек":
1. флаг занятости доса проверяется в обработчиках аппаратных прерываний для исключения повторного входа в функции доса. его проверка в вышеприведенном куске совершенно бессмысленна. 2. _chain_intr - это по сути jmp на указанный обработчик с восстановлением состояния регистров на момент входа в текущий обработчик. возврата не будет. 3. размер файлов получают, как правило, при их перечислении функциями 4e/4f. 4. C вообще весьма посредственно заточен под написание такого рода обработчиков - эти вещи лучше делать на асме и прилиньковывать obj. поясню мыслю: чтобы выполнить вызов(call) "старого" обработчика с состоянием регистров таким, какое оно было на входе в наш обработчик, нужно неплохо попрыгать с бубном на костылях(выглядеть это будет крайне убого - как прыжки, так и получившийся код 5. а для реализации такой мелочи, как описанная выше задача, лучше воспользоваться асмом в чистом виде - получится гораздо меньше букв. |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |