Операционная система MSDOS


текущий путь доступа для диска



Таблица 9



(0) 64path текущий путь доступа для диска
(+64) 2reserv1 зарезервировано
(+66) 2reserv2 зарезервировано
(+68) 1reserv3 зарезервировано
(+69) 4ddcb адрес соответствующего DDCB
(+73) 2cdir_clu первый кластер текущего каталога на диске. 0 соответствует корневому каталогу, -1 - если к диску еще не обращались
(+75) 2reserv4 зарезервировано
(+77) 2reserv5 зарезервировано
(+79) 2reserv6 зарезервировано
---------------- для DOS 4.х -----------------
(+81) 7reserv7 зарезервировано
Приводимое ниже определение типа DINFO соответствует формату MS-DOS 4.х. #pragma pack(1) typedef struct _DINFO_ { char path[64]; unsigned reserv1; unsigned reserv2; unsigned char reserv3; DDCB far *ddcb; unsigned cdir_clu; unsigned reserv4; unsigned reserv5; unsigned reserv6; unsigned char reserv7[7]; } DINFO; #pragma pack()
Как пример использования этой информации приведем программу, которая выводит содержимое массива на экран: #include <dos.h> #include <stdio.h> #include <stdlib.h> #include "sysp.h" void main(void); void main(void) { CVT far *cvt; DINFO far *dinfo; unsigned i,j,k; printf("Информация о дисковых устройствах\n" "Copyright Frolov A. (C),1990\n"); cvt=get_mcvt(); // Адрес векторной таблицы связи dinfo=cvt->drv_info; // Адрес таблицы дисковых // устройств i=cvt->num_bdev; // Количество дисковых устройств for(j=0;j<i;j++) { printf("Адрес: %Fp,путь: %Fs\n" "Первый кластер каталога: %d\n\n", dinfo, dinfo->path, dinfo->cdir_clu); dinfo = dinfo+1; } exit(0); }
На этом мы завершаем изучение векторной таблицы связи MS-DOS. Еще раз уместно напомнить, что вся приведенная выше информация отсутствует в документации и может меняться (и действительно меняется!) от версии к версии. Если вы хотите использовать описанные выше средства, вам необходимо динамически определять версию DOS и использовать соответствующие форматы управляющих блоков.


Таблица 9

P_WAIT выполнение родительской программы задерживается до завершения дочерней программы.
P_NOWAITродительская программа продолжает выполнение сразу после запуска дочерней. Этот параметр имеет смысл только для операционных систем OS/2, UNIX, в которых поддерживается мультизадачность.
P_OVERLAYзагружает программу как оверлей и передает ей управление. Этот режим соответствует функции exec в том смысле, что родительская программа не получит управления после завершения дочерней.
В качестве примера использования функций запуска программы рассмотрим возможное решение проблемы создания HELP-системы для прикладной программы.
С помощью текстового редактора можно создать справочную базу данных в формате утилиты Microsoft HELPMAKE, затем, запуская в нужный момент диалоговую утилиту работы с базой данных Microsoft Quick Help QH.EXE, можно получить нужную справку.
Утилита QH использует базы данных, описанные в переменной среды HELPFILES. Мы будем использовать либо родительскую среду, где находится значение переменной HELPFILES по умолчанию, либо указывать новое значение для этой переменной.
Приведенная ниже программа используется для получения справки о функции стандартной библиотеки printf, поиск производится в HELP-базе QuickC: #include <stdio.h> #include <conio.h> #include <process.h> main() { int r; // Получаем справку о функции printf, // справочная база данных расположена // в каталоге d:\qc2\bin r = help("HELPFILES=d:\\qc2\\bin;","printf"); if( r == -1 ) printf( "Невозможно запустить процесс" ); else printf( "\nПроцесс завершен" ); exit(r); } /** *.Name help * *.Title Получить справку по заданному контексту * *.Descr Функция получает в качестве параметров * переменную среды, указывающую на путь * к справочной базе данных и указатель * на строку контекста для поиска в базе. * Затем запускается как дочерний процесс * утилита Microsoft Quick Help QH.EXE, для * которой формируются среда и параметры. * *.Params int help(char *help_file, char *help_topic); * * help_file - переменная среды, указывающая * на путь к справочной базе * * help_topic - контекст для поиска в базе * * *.Return 0 при успешном запуске процесса * -1 не удалось запустить процесс **/ int help(char *help_file, char *help_topic) { char *env[] = { "", NULL }; // Среда, которую // получит QH при запуске if(*help_file != 0) { env[0] = help_file; // Формируем среду для QH // Запускаем утилиту return(spawnlpe(P_WAIT,"QH","QH", "-u",help_topic,NULL,env)); } else { // Если переменная среды не задана, // используем родительскую среду return(spawnlp(P_WAIT,"QH","QH", "-u",help_topic,NULL)); } }
Подробная информация об использовании утилит HELPMAKE и QH приводится в документации на Microsoft C 6.0.



Таблица 9

(0) 13headerЗаголовок запроса.
(+13) 1media В этом поле драйверу передается байт-описатель среды носителя данных, с которым DOS работала раньше.
(+14) 1replyВ это поле драйвер должен поместить ответ о факте замены среды: 1 - диск не заменялся;
0 - неизвестно;
-1 - диск был заменен.
(+15) 4vol_idУказатель на предыдущую метку тома (если установлен бит 11 слова атрибута устройства и диск был заменен)
Если драйвер поддерживает функцию проверки замены среды носителя данных (бит 11 слова атрибута установлен в 1) и оказалось, что произошла замена диска, драйвер должен вернуть в поле vol_id указатель на область памяти, содержащую предыдущую метку тома в формате ASCIIZ. Если метка тома не используется драйвером, а бит 11 слова атрибутов установлен, необходимо вернуть указатель на строку "NO_NAME", закрытую двоичным нулем.
Байт-описатель среды media классифицирует используемую среду носителя данных, но делает это неоднозначно. Мы приведем характерные для этого байта параметры дисков:

Содержание раздела