In timpul exploatarii sistemului de catre un program, apar foarte multe cazuri in care programul nu foloseste in mod optim resursele sistemului, sau 
  chiar esueaza datorita unei configurari inadecvate. Singura posibilitate de a scapa 
  de probleme pare sa fie modificarea fisierului CONFIG.SYS si repornirea calculatorului. x3b1bi
  Reconfigurarea se poate rezolva si fara abandonarea activitatilor prin asa numita reconfigurare dinamica.
 Generalitati
 Configurarea dinamica a sistemului DOS din punctul de vedere al unui  program, ar insemna ca programul contine parti de cod prin care el insusi poate 
   sa modifice, in caz de nevoie in timpul executiei, unii parametri ai sistemului. 
  
  Astfel de cazuri ar fi : nevoia de memorie, nevoia de a folosi mai multe fisiere, 
   un acces mai rapid la disc, cresterea dimensiunii stivei sistem, folosirea de 
   drivere diferite de cele instalate initial in sistem, etc. La pornirea calculatorului se realizeaza o configurare initiala a sistemului, dar o configuratie optima 
   executiei unui program poate fi inadecvata pentru executia unui alt program. 
  
  Este de dorit, ca un program care modifica parametrii sistemului, sa refaca 
  parametrii la valorile lor initiale inainte de terminarea executiei. Deoarece nu intotdeauna 
   avem acces la sursele programelor pentru a putea face aceste modificari, va 
  trebui  sa fie folosita o alta metoda. Aceasta ar consta in redirectarea unor intreruperi 
   ale sistemului.
 Tabela de control a sistemului
 La majoritatea sistemelor de operare nu se pot modifica parametrii sistemului fiind pastrati intr-o zona inaccesibila programelor utilizator. Sistemul DOS 
  nu  are o asemenea protectie, putindu-i-se modifica acesti parametri. Pentru a realiza 
   modificari vor trebui cunoscute: adresele la care pune sistemul tabelele sale 
   interne, organizarea acestora si modul de folosire de catre sistem a continutului 
   tabelelor. Managerul de memorie al sistemului DOS administreaza o tabela interna 
   nedocumentata numita DCB(DOS-Control-Block), care pe linga adresa de inceput 
  a  listei MCB(Memory-Control-Block) contine si alte adrese spre alte tabele folosite 
   de sistem precum si date obisnuite. Conform tabelei DCB se pot reconstitui toate 
   informatiile referitoare la organizarea interna a memoriei. Adresa de inceput 
   a acestei tabele se poate obtine cu ajutorul functiei DOS 52h (INT 21h)  nedocumentata de catre Microsoft, care in perechea de registrii ES:BX intoarce 
   adresa tabelei DCB. Constructia tabelei este la fel de nedocumentata si variaza 
   in functie de versiunea sistemului. Ca lucrurile sa fie si mai misterioase adresa 
   intoarsa de functia DOS indica spre mijlocul tabelei, astfel unele informatii 
  din  tabela se acceseaza cu offset negativ.
  Continutul tabelei DCB este prezentat mai jos cu mentiunea ca valoarea  xxh(hexa) de la inceput reprezinta offset-ul(deplasamentul) care poate fi + 
   sau -:
 
 -0Ch: numarul de repetari al operatiei de acces la disc in caz de esec 
  (se poate seta cu functia DOS 440Bh(INT 21h))
  -0Ah: timpul de asteptare intre doua operatii de repetare acces la disc
  -08h: adresa bufferului de disc actual
  -04h: indexul bufferului folosit de unitatea CON, daca asteapta caractere la 
   citire, in caz contrar contine valoarea 0000h
  -02h: adresa primului MCB(MCB-urile sint organizate intr-o lista)
  -00h: adresa tabelei DPB(DOS-Disk-Parameter-Block)
  04h: adresa tabelei SFT(DOS-System-File-Table)
  08h: adresa de inceput a driverului CLOCK$
  0ch: adresa de inceput a driverului CON
  10h: numarul maxim de octeti pe sector folosit la accesul periferiilor  de tip bloc
  12h: adresa DIR(DOS-Diskbuffer-Info-record)
  16h: adresa unui tabel cu actuala structura de directore
  1ah: adresa tabelei FCB(File-Control-Blok)
  1eh: numarul de FCB-uri admise in sistem
  20h: numarul de drivere bloc instalate in sistem
  21h: numarul LASTDRIVE (default 5)
  22h: antetul driverului NUL
  34h: numarul de drive-uri la care s-a aplicat comanda JOIN
  35h: 0000h
  37h: adresa tabelei SETVER
  3bh: necunoscut/rezervat
  3dh: necunoscut/rezervat
  3fh: numarul bufferelor
  41h: dimensiunea bufferelor
  43h: unitatea pe care s-a incarcat sistemul(1=A:,259=C: harddisc)
  44h: indicator procesor(01h 80386+)
  45h: marimea memoriei EMS in ko.
 Orice modificare in acest tabel va fi luata imediat in considerare de catre sistemul DOS. Continutul tabelei descrise se refera la versiunea
  DOS 5.0. La versiunile mai noi se pastreza vechile semnificatii, cu eventuale 
   mici extinderi ale tabelului spre adrese pozitive. Aceste extinderi insa  nu sunt esentiale pentru noi. Daca vrem de exemplu sa marim numarul de fisiere ce pot fi deschise simultan, trebuie sa inlocuim toate tabelele care contin informatii referitoare la fisiere, respectiv trebuie sa schimbam adresa  continuta in tabela DCB catre noua tabela SFT. La fel se procedeaza si in cazul tabelelor directoarelor curente. Daca se modifica locul in memorie a unei tabele, atunci vor trebui actualizate toate referintele existente in alte tabele spre aceasta. In continuare se trateaza pe rand tabelele mai importante.
  
  Tabelele de parametri disc
 In tabela DCB la offsetul 00h se afla adresa de inceput a primei tabele 
  DPB(Disk-Parameter-Block), tabela care este folosita de catre DOS pentru lucru cu periferice de tip bloc. Aceasta adresa poate fi obtinuta si cu ajutorul  functiei DOS 1Fh, care a fost mai amanuntit documentata prima data de Microsoft 
   la aparitia versiunii DOS 5.0. Aceste tabele DPB sunt inlantuite intr-o lista liniara. Ultimul tabel contine adresa FFFFh:FFFFh.
  
  Continutul tabelei DPB:
 -00h: numarul de drive dat de DOS la instalare
  -01h: numarul de subunitati
  -02h: numarul de octeti pe sector(sistemul DOS rezerva in mod standard
  512 octeti)
  -04h: numarul de sectoare pe cluster - 1
  -05h: numarul n,daca avem 2^n sectoare pe cluster
  -06h: numarul de sectoare BOOT rezervate
  -08h: numarul de tabele de alocare pentru fisiere (FAT)
  -09h: numarul de intrari in directorul radacina(o discheta de capacitatea
  360Ko are 112 intrari etc., un harddisc cu capacitatea 20Mo are 512 intrari in directorul radacina)
  -0bh: numarul de sector cu care incepe primul cluster
  -0dh: numarul de sector cu care incepe ultimul cluster
  -0fh: numarul de sectore pentru FAT
  -11h: numarul sectorului cu care incepe directorul radacina
  -13h: adresa antetului driverului de periferic care deserveste unitatea
  -17h: octetul descriptor unitate
  -18h: se refera la ultima operatie: valoarea 00h indica un acces obisnuit, valoarea FFh indica faptul ca a fost schimmbat discul in unitate si tabela a fost reinnoita cu datele referitoare la noul disc
  -19h: adresa urmatorului tabel DPB(FFFFh:FFFFh daca acest tabel a fost  ultimul in lant)
  -1dh: numarul ultimului cluster scris pe disc, adica clusterul dupa care  vor fi cautate clustere libere la un nou acces de scriere pe periferic
  (la pornirea sistemului se pune pe 0), cu aceasta tehnica incercindu-se evitarea fragmentarii informatiei pe disc;la versiunile mai vechi ale sistemului noua alocare se facea intoeauna de la primul cluster liber
  
  Tabelele driverelor de periferice
  
  La pornirea sistemului de operare modulul SYSINIT (situat in fisierul
  IO.SYS) incarca in memorie driverele din CONFIG.SYS respectiv din antetul rezident al lui IO.SYS. Primul driver incarcat este driverul NUL. Cu el incepe lista driverelor instalate in sistem. In antetul fiecarui driver se afla adresa  urmatorului driver, antetul ultimului driver continind adresa FFFFh:FFFFh. In 
   tabela DCB la offsetul 22h se situeaza antetul driverului NUL. Cu ajutorul  adresei continute in acest antet se pot accesa si celelalte drivere. Driverele 
   de tip bloc sunt accesate conform listei DPB. Fiecare DPB contine adresa antetului 
   unui driver. Driverele CLOCK$ si CON sunt accesate cu ajutorul adresei antetului lor, continuta in DCB la offsetele 08h respectiv 0ch.
 Tabelele bufferelor DOS
 Sistemul DOS transfera datele intre periferice si programe utilizator  cu ajutorul driverelor de periferice. Unitatea de transfer fiind sectorul, daca un program cere transferarea unui numar de octeti inferior numarului de octeti 
   pe sector, datele se pastreaza intr-o zona intermediara numita buffer. Zonele 
   din buffer se scriu pe disc numai la o operatie de inchidere de fisier sau la 
   umplerea bufferului. In cazul fisierelor de tranzactii (de ex. intr-o baza de 
   date) prin duplicarea handler-ului fisierului, cel initial se poate inchide, 
   salvandu-se astfel continutul bufferelor folosite de acesta. Numarul de buffere este initial stabilit in CONFIG.SYS cu o linie BUFFERS=x,y unde x  reprezinta numarul de buffere iar y numarul de sectoare consecutive citite suplimentar in buffere la o operatie de citire (folositoare pentru editoare 
  de text in general). Nr de buffere cu care programul lucreaza eficient cu discul depinde atat de politica de gestiune a bufferelor, cat si de felul aplicatiei.
  La offsetul 12h in DCB se situeaza adresa DIR. Tabela DIR ne informeaza despre structura bufferelor.
 Componentele tabelei DIR:
 -00h: adresa listei antetelor de buffer
  -04h: trebuie sa fie 0000h
  -06h: adresa bufferului lookahead (0 nu este prezent)
  -0Ah: numarul de sectoare consecutive citite suplimentar la o operatie de citire (folosita si de catre SMARTDRIVE.EXE)
  -OCh: locul unde se afla bufferele. Valoarea:00h-in memoria conventionala, nu se foloseste zona de lucru, 01h-in memoria inalta UMB (Upper Memory
  Block), se foloseste zona de lucru in memoria conventionala
  -ODh: adresa primului segment de lucru in memoria conventionala
  -11h: nefolosit
  -14h: rezervat
  -1Ch: Bit 0=1, UMB MCB spre o lista normala MCB
  -1Dh: necunoscut
  -1Fh: primul segment MCB in UMB sau FFFFh
  -21h: adresa de start a listei MCB (2 octeti)
 Un antet de buffer are urmatorul continut:
 -00h: pagina logica EMS(-1 nu este in EMS)
  -02h: adresa antet de buffer folosit anterior
  -06: 0000h(2 octeti) 
 Pentru regasirea rapida a bufferelor, DOS utilizeaza o tehnica de tip 
  'hash': antetele de buffer contin o lista de adrese spre buffere care au acelasi numar hash (numarul de sector disc MODULO numarul de antete). Bufferele cu  acelasi antet se situeaza in acelasi segment. Primul buffer se situeaza imediat 
   dupa antet.
  Descrierea bufferelor:
 -00h: adresa bufferului mai putin recent folosit (primul in lista este cel 
   mai recent folosit)
  -02h: adresa precedentului buffer
  -04h: discul de care apartine sectorul(0=A, 1=B, FFh=buffer nefolosit)
  -05h: tipul datei din buffer
  -bit 5 setat: remote buffer
  -bit 4 setat: buffer cu date de cautare
  -bit 3 setat: bufferul contine un sector din zona de fisiere
  -bit 2 setat: bufferul contine un sector din director
  -bit 1 setat: bufferul contine un sector din FAT
  -bit 0: rezervat
  -06h: numarul logic de sector
  -0Ah: numarul de copii pentru FAT (continutul bufferului trebuie trecut in  fiecare FAT)
  -0Bh: deplasamentul dintre doua sectoare aflate in FAT-uri consecutive si care contin aceleasi informatii
  -0Dh: adresa tabeleiDPB
  -11h: numarul buffer(pentru remote buffer)
  -13h: nefolosit
  -14h: zona de date pentru buffer(dimensiunea sectorului);
 
 Primul UMB-MCB se afla la adresa 9FFFh:0000h in mod predefinit. Aici se rezerva
  RAM-ul video pentru DOS. (la adresa A000h:0000h-incepe zona video si nu e indicat 
   sa fie folosit de catre programe utilizator).
 Tabelele stivelor sistem
  
  In fisierul CONFIG.SYS se poate seta initial numarul stivelor sistem, cu o linie STACKS=x, y unde x inseamna numarul de stive folosite (intre 8-64), iar 
  y inseamna nr. de octeti pentru o stiva (intre 32-512). Stivele sint folosite 
  la  apeluri interne. DOS incarca la initializarea sistemelor un manager de stive 
  si redirecteaza intreruperile 2h, 8h, 9h, 70h spre acest manager. La apelul respectivelor intreruperi managerul de stive aloca o noua stiva, salveaza adresa vechii stive 
  
  (SS:SP) in zona de date a noii stive, seteaza noile valori pentru SS:SP, apeleaza 
   rutina de intrerupere originala. La revenire din intrerupere, se reface vechea 
   valoare SS:SP, se elibereaza stiva alocata. Problemele apar in general la revenire 
   cind se poate intimpla sa nu poate elibera stiva. In asemenea cazuri sistemul se blocheaza si trebuie repornit. Adresa de segment a stivelor coincide cu adresa 
   de segment al managerului.
  Stivele au urmatoarea structura:
 -00h:starea stivei:valoarea 0-stiva libera,1-stiva ocupata, 3-stiva blocata 
  
  (este suprascrisa de stiva urmatoare deci nu se poate elibera)
  -02h: neutilizat
  -03h: SS:SP salvat
  -07h: offsetul cuvintului cel mai de sus folosit de stiva
  -09h: zona stiva... (depinde de valoarea y folosita in CONFIG.SYS )
 Cuvintul din virful stivei contine offsetul inceputului zonei stivei,  prin care sistemul testeaza consistenta stivei. Daca stiva nu este consistenta se blocheaza. Stivele se depun una dupa alta in memorie. Managerul de stiva 
  se  situeaza dupa tabela DCB iar la offsetul 00h fata de inceput contine o zona 
  cu urmatoarele informatii despre stive:
 -00h: rezervat
  -02h: valoarea x
  -04h: valoarea 8*x
  -06h: valoarea y
  -0Ah: adresa zonelor de stive
  -0Ch: cadrul stiva cel mai de sus
  -0Eh: cadrul stiva cel mai de jos
  -10h: cadrul stiva cel mai recent eliberat
 Tabelele directoarelor curente
  
  In tabela de control DCB la offsetul 16h se afla adresa spre tabela CDS
  (Current-Directory-Structure). Tabela CDS contine subtabele pentru fiecare unitate de disc, referitoare la directoarele curente.
  Structura unei subtabele:
 -00h: litera de drive(ex: a:\) si calea 
  -40h: rezervat(00h-00h-00h)
  -43h: atribuirea unitatii
  -bitul 15=1-unitate de retea
  -bitul 14=1-unitate fizica
  -bitul 13=1-unitate la care s-a folosit JOIN
  -bitul 12=1-unitate la care s-a folosit SUBST
  -45h: adresa DPB-ului
  -49h: (pentru disc local) 2 octeti-clusterul de start pentru directorul curent
  (0000h pentru directorul radacina, FFFFh-cluster de start nefolosit) 
  4 octeti-FFFFh
  -49h: (pentru disc retea) adresa remote directorului sau adresa recordului  de redirectare sau FFFFh: FFFFh (inregistrare nefolosita)
  -4Dh: necunoscut
  -4Fh: offsetul in calea actuala dupa \
  -51h: necunoscut
  -52h: adresa driverului IFS
  -56h: (2 octeti ) octeti necunoscuti
 Programele JOIN si SUBST modifica litera discului curent si adresa si  adresa spre DPB.
  
  Tabelele fisierelor
 Numarul de fisiere se poate stabili cu linia FILES=x in CONFIG.SYS,  unde x reprezinta nr. de fisiere ce pot fi deschise simultan. Adresa de inceput 
   a listei de tabele de fisiere (SFT), se afla la deplasamentul 043h din DCB.
  Structura tabelei SFT: 
 -00h: adresa urmatorului tabel (ultimul contine adresa FFFFh:FFFFh)
  -04h: nr. de fisiere gestionate in acest tabel ptr. fiecare fisier  avind 3Bh octeti
  -05h: zona inregistrarilor ptr. fisiere 
 Structura unei inregistrari pentru un fisier:
 00h:numarul handlerelor care se refera la fisier 
  02h:modul de deschidere al fisierului cu functia DOS 3Dh daca bitul 15=1, fisierul a fost deschis cu FCB.
  04h:atributul fisierului 
  05h:informatii referitoare la drive :  bitul 15=1:fisier indepartat (remote)  bitul 14=1:nu se modifica data si timpul la inchidere bitul 13=1:pipe cu nume  bitul 12=1:no inherit  bitul 11=1:spoolerul de retea 
  07h:adresa antetului driver la periferice de tip caracter respectiv adresa 
  DOS-Bios Paramater-Block la periferice de tip bloc 
  0Bh:clusterul de inceput pentru date
  0Dh:timpul crearii fisierului (impachetat)
  0Fh:data crearii (impachetat)
  11h:lungimea fisierului
  15h: deplasamentul actual in fisier
  19h:(pentru fisiere locale) numarul de cluster al ultimului acces de scriere 
  
  (2 octeti)+numarul de sector al inregistrarii fisierului in directorul  radacina (4 octeti)
  19h:(pentru fisiere de retea) adresa recordului REDIRIFS (4 octeti)+ necunoscut (3 octeti)
  20h:numele fisierului in format FCB
  2Bh:adresa tabelei SHARE Share-File-Tabel
  2Fh:numarul SHARE al fisierului deschis
  31h:segmentul PSP pentru procese propietare
  33h:deplasamentul in segment al recordului share (valoarea 0000h indica  faptul ca recordul nu exista)
  35h:numarul absolut al ultimului cluster folosit
  37h:adresa driverului IFS (Instalable-File-System)(4 octeti)
 Aplicatie
 Desi numarul de fisiere deschise simultan in sistem poate sa fie mai  mult de 20 (vezi linia FILES din CONFIG.SYS), un program utilizator nu poate 
   sa utilizeze in mod obisnuit mai mult de 20 de fisiere deschise simultan. 
  Exemplul de program care urmeaza va arata modul in care se poate depasi aceasta 
   bariera. Fisierele sunt accesate de sistemul DOS cu ajutorul unor handlere de 
   fisier. Aceste handlere sunt numere intregi care indica numarul inregistrarii 
   fisierului in lista SFT unde se gaseste de fapt descrierea datelor referitoare la fisier. Primele 3 handlere sunt ocupate pentru unitatea auxiliara (00h), 
   unitatea CON (01h) umitatea PRINTER (02h). Insa sistemul nu lucreaza direct 
  cu  aceste handlere ci foloseste un tabel nedocumentat, cu indirectare dubla, in 
   zona PSP a programului utilizator cu 20 de intrari (numite handlere virtuale), 
   unde la fiecare intrare retine valoarea adevarata a handlerului (aceasta  reprezinta un index in tabela SFT ). O valoare FFFFh pentru handlerul real  indica faptul ca handlerul virtual nu este folosit. Aceasta virtualizare  permite DOS-ului de fapt folosirea fisierelor standard de iesire (handlerul 
   virtual 0000-handlerul real 01h ), de intrare (0001,01), de eroare(0002,01), auxiliare (0003,00), de imprimare (0004,02).
  Tabela din PSP arata in felul urmator:
 18h:tabela cu handlere
  32h:marimea tabelei de handlere
  34h:adresa de deplasament al tabelei de handlere
  36h:adresa de segment a tabelei de handlere
 Programul rezerva spatiu pentru o tabela mai mare copiind primele 20 de  valori din vechea tabela si schimbind valorile continute la deplasamentele 
  32h, 34h, 36h, in PSP. 
  
  
  A$X+S program f20;
  (* programul arata modul prin care putem deschide mai mult de 20 de fisiere 
   in program, practic am putea deschide 65520 de fisiere*) uses crt,dos; const 
  A5*2+50*2=110, 5 fisiere standard, deschise predefinit + 50 de fisiere,  pe care programul le poate deschideS marime_tabel=110; var virtual_handle_tabel:arraya1..marime_tabeli of byte ; f:arraya1..50i of file; reg:registers; adr:word: ss:string; i:integer; begin clrscr;
  (* initializare tabel *) for i:=1 to marime_tabel do virtual_handle_tabelaii:=$FF;
  (* obtine PSP program *)
  whith reg do begin ax:=$6200;
  MSDOS(reg); adr:=bx; end;
  (* copiaza handlerele vechi *) for i:=1 to 20 do virtual_handle_tabelaii:=MEMaadr:$17+ii;
  (* numarul de handlere *)
  Memwaadr:$32i:=marime_tabel;
  (* adresa de deplasament si de segment a tabelei noi *)
  Memwaadr:$34i:=ofs(virtual_handle_tabela1i);
  Memvaadr:$36i:=seg(virtual_handle_tabela1i);
  (* testare, prin incercarea de a deschide cate fisiere se poate, numarul maxim de fisiere deschise simultan este fixat de linia FILES=xxx, in CONFIG.SYS *) i:=1;
  while ioresult=0 do begin str(i,ss);
  writeln(i); assign(faii,ss+'.111');
  A$I-S rewrite(faii);
  A$I+S i:=i+1; end; readkey; end.