CodeNet / Платформы / Другие платформы / DOS / Прерывания DOS и BIOS
DOS Fn 34H: адрес статуса реентерабельности DOS
Вход
- AH = 34H НЕТ В ДОКУМЕНТАЦИИ
Выход
- ES:BX = адрес флага активности DOS
Описание:
Эту недокументированную функцию использует PRINT (фоновый процессор печатного спулинга) в момент его установки, так что он может позднее определить, можно ли использовать файловые функции DOS.
При возврате из этой функции ES:BX содержит адрес внутреннего флага DOS, указывающего, выполняется ли в данный момент какая-либо функция DOS. когда спулеру PRINT требуется открыть файл (или использовать какую-либо функцию DOS), он проверяет этот флаг. если ES:[BX] содержит не 0, фоновая программа (TSR, либо popup) НЕ ДОЛЖНА использовать никаких функций DOS.
Резидентные popup-программы часто активизируются по прерыванию от таймера или клавиатуры. так как это может произойти в любой момент, не исключено, что в этот момент будет выполняться какая-либо функция DOS. если теперь popup вызовет функцию DOS, это разрушит стек DOS и, вероятно, приведет к катастрофической ошибке. Путем проверки этого флага popup может определить, возможны ли вызовы функций DOS.
Это, однако, осложняется тем фактом, что COMMAND.COM и некоторые другие программы проводят большую часть времени, запросив ввод с клавиатуры через функцию 0aH (дать строку). таким образом, флаг почти всегда взведен, и на службу DOS наложено табу.
Вы можете выйти из положения, перехватывая INT 21H и отслеживая вызовы функции 0aH. когда приходит такой запрос, не выполняйте его немедленно. Вместо этого организуйте цикл, в котором с некоторой задержкой вызывайте функцию 0bH (дать статус ввода). Циклите, пока не заметите, что нажата клавиша. после этого можно выйти из цикла и вызвать функцию 0aH. Понятно, что при таком способе всегда существует окно времени, в котором проснувшийся popup может без боязни использовать функции DOS. можно также перехватывать INT 28H, если вы любите рисковать.
Предупреждение:
Эта функция не документирована, и опираться на нее рискованно. большинство popup-программ перехватывают INT 21H и отслеживают статус DOS индивидуально (ибо им и так приходится отслеживать 0aH).