Системное программное обеспечение персональных ЭВМ


Пример 1



Пример 1

/*===== Таблица Векторов Связи для DOS 3.0 и выше =====*/ struct CVT { word MCB_segment; /* Сегментный адрес 1-го Блока Управления Памятью */ dword DPB_ptr; /* Адрес 1-го Блока Параметров Диска */ dword SFT_ptr; /* Адрес 1-й Системной Таблицы Файлов */ dword clock_ptr; /* Адрес заголовка драйвера CLOCK$ */ dword con_ptr; /* Адрес заголовка драйвера CON */ word maxBlock; /* Максимальный размер блока на блочном устройстве */ dword BCB_ptr; /* Адрес 1-го буфера дисковых операций */ dword ACD_ptr; /* Адрес Массива Текущих Каталогов */ dword FCBtab_ptr; /* Адрес Таблицы Блоков FCB, открываемых в режиме разделения */ word FCBtab_size; /* Размер Таблицы Блоков FCB (параметр FCBS в CONFIG.SYS) */ byte driveCnt; /* Число блочных устройств в системе */ byte lastdrive; /* Число идентификаторов дисков (параметр LASTDRIVE в CONFIG.SYS) */ byte NUL_drive[18]; /* Заголовок драйвера NUL */ };

Недокументированная функция DOS 0x52, именуемая в нефирменных описаниях GetSysVars или GetCvt, возвращает в регистрах ES:BX адрес поля DPB_ptr таблицы векторов связи. Но перед этим полем в памяти находится 2-байтный сегментный адрес первого управляющего блока памяти, который логически также относится к векторам связи (мы уже использовали это свойство функции 0x52 в программах предыдущей главы). Поэтому мы включаем это поле в CVT и считаем, что функция 0x52 возвращает адрес, на 2 больший начального адреса таблицы.

CVT имеет и поля, расположенные перед MCB_segment, таблица продолжается и за заголовком NUL-драйвера, но содержащаяся в этих частях информация весьма специфична, существенно зависит от версии DOS (не только от старшего, но и от младшего номера версии) и в нашем пособии рассматриваться не будут.




- Начало -  - Назад -  - Вперед -