2.3. Системный контекст

Error message

Notice: Undefined index: add term path in hansel_get_breadcrumbs() (line 524 of /data/sites/msdosworld.ru/www/sites/all/modules/hansel/hansel.module).

      Системный контекст  -  это область  памяти, начинающаяся на

 границе  параграфа  и  занимающая  не  более  32  Кб,  в которой

 хранится последовательность ASCIIZ-строк. Эти строки заносятся в

 контекст  командами   SET,  APPEND,  PATH   и  PROMPT  и   могут

 использоваться  программами   для  поиска  файлов   на  диске  и

 получения   различной  системной   информации.  Контекст   имеет

 следуюую структуру:

 

      имя_1 = значение_1 <0>

      имя_2 = значение_2 <0>

             . . .

      имя_N = значение_N <0>

      <0>

      <М>                    \

      командная_строка_1 <0>  |

             . . .             > только в ДОС 3.x

      командная_строка_M <0>  |

      <0>                    /

 

 где  <0>  -  нулевой  байт,  а  <М>  -  двоичное слово, задающее

 количество командных строк. Типичный пример контекста:

 

      db  'COMSPEC=c:\command.com',0

      db  'PROMPT=$p$g',0

      db  'PATH=c:\dos;c:\utils',0

      db  0

      dw  1                      \  только в ДОС 3.x

      db  'C:\DBASE\DBASE.COM',0 /

      db  0

 

      При  запуске  каждой  программы  создается копия начального

 контекста  и   ее  адрес  заносится   в  поле  EnvSeg   префикса

 программного  сегмента.  Поэтому  любые  изменения,  которые  Вы

 вносите  в контекст,  окажут  влияние  на все  дочерние процессы

 Вашей   программы,  но   будут  утеряны   при  завершении  Вашей

 программы.  Не  существует  документированного  способа получить

 доступ к  "корневому" контексту, который  создается при загрузке

 ДОС. НЕДОКУМЕНТИРОВАННЫЙ метод см. в описании  Int 2Eh (п. 5.1).

 Вместо этого  можно запустить копию  COMMAND.COM; тогда все  его

 потомки получат копию его контекста (см. пример ниже).

 

      Как правило, окружение используется для поиска в нем строки

 с заданным  "именем".  Обычно,  "имя"  в  каждой строке записано

 прописными буквами, но это нигде не оговорено.

 

      Начиная с  ДОС 3.0, в конец  копии контекста, передаваемого

 программе, заносится ASCIIZ-строка,  содержащая полное имя этого

 программного файла, имеющая вид:

 

      db  'd:\путь\имя_файла.тип',0

 

 Спецификация  файла формируется  правильно, даже  если ДОС искал

 файл  программы   в  каталогах,  заданных   командой  PATH.  Это

 

позволяет  Вашей программе  определить имя  каталога, в  котором

 хранится  программа,  и  облегчает  поиск  файлов  перекрытий  и

 данных.

 

      В   заключение  приведем   фрагмент  программы, позволяющей

 получить сегментный адрес  контекста последней загруженной копии

 COMMAND.COM (мы предполагаем,  что пользовательская программа не

 подменяла Int 23h и регистр ES указывает на ее PSP):

 

      mov   dx,es:[10h]   ; сегмент обработчика Int 23h =

      mov   es,dx         ; сегментный адрес COMMAND.COM

      mov   ax,es:[2Ch]   ; адрес контекста COMMAND.COM

      or    ax,ax         ; это "первый" COMMAND.COM?

      jnz   secondary     ; нет, AX = адрес его контекста

      dec   dx            ; dx => MCB для COMMAND.COM

      mov   es,dx

      add   dx,es:[3]     ; dx = адрес следующего MCB

      add   dx,2          ; указатель на начало данных MCB

      mov   ax,dx         ; равен адресу "корневого" контекста!

 secondary:

      mov   es,ax         ; ES = сегмент контекста

 

      См. также: Пpефикс пpогpаммного сегмента

                 Функции упpавления пpоцессами

 

 

 

Вы находитесь в разделе: 

Добавить коментарий