ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ-
                     Prostota a primitivnost sama      /
                                 DoSfS                /
                   ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

      Zdravím  v¹echny  'výhòáky'  i  náhodné ètenáøe. Tak copak se dneska
      dozvíme?  Asi si povíme nìco o souborovém systému DOSu - jak vlastnì
      pøesnì  funguje  to  ukládání  souborù,  a  kde a jak je ulo¾ená FAT
      tabulka,   jak  jsou  ulo¾ené  adresáøe,  atakdále  atakdále  neboli
      zkrácenì atd. A jestli budu mít náladu tak zkusím sbastlit i nìjakou
      utilitku která to pøedvede v praxi. Tak se na to vrhnem!
                  Èást první - jak jsem rozpùlil harddisk
      Ne,  nezkou¹el  jsem  ho  nijak  øezat  ani  jinak mechanicky pùlit.
      Jednodu¹e  jsem  editoval  partition  table podle mého gusta, i kdy¾
      jsem  mohl  také být lenoch a udìlat to pomocí nìjaké utilitky - prý
      se  jmenuje  fdisk  nebo  tak nìjak a dìlá pøesnì tohle - a existuje
      snad na ka¾dém operaèním systému co jsem vidìl.
      No jo, ale co to vlastnì je? U¾ jsem øekl, ¾e je to jakási tabulka -
      ve  Winèe¹tinì  se  tomu øíká tabulka oddílù (co¾ je kupodivu celkem
      pou¾itelný  výraz, narozdíl od mnoha jiných :-). A v té tabulce jsou
      popsané  diskové  oddíly,  které se chovají vìt¹inou jako samostatné
      logické  disky (ov¹em pokud to zrovna windows ¹patnì nepochopí - pak
      místo  kopírování souboru na jednu partition ho zkopíruje na zaèátek
      jiné,  co¾  je  celkem  fatální  :)  - moje vlastní zku¹enost ):. Ta
      tabulka  musí  být  na  ka¾dém  HDD  a  musí  v ní být alespoò jedna
      partition  (diskový  oddíl,  logický  disk). Celá tabulka je v úplnì
      prvním  sektoru  harddisku  a má max. 4 polo¾ky (ono jich mù¾e být i
      více,  viz  dále).  Ti  kdo  u¾  o  harddisku  nìco  vìdí, urèitì si
      uvìdomili,  ¾e  je  ve  stejném  sektoru  jako zavadìè - holt se tam
      musejí nìjak vejít... :) No, u¾ toho nechám a rad¹i vám rovnou uká¾u
      její formát:

ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
³ Zaèátek partition  ³ AI ³ H ³ S ³ CYL ³ offset 1BEh ³
³ Konec partition    ³ SI ³ H ³ S ³ CYL ³ offset 1C2h ³
³ Partition          ³ Relativni zacatek³ offset 1C6h ³
³ Velikost partition ³   Pocet sektoru  ³ offset 1CAh ³
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
ÚZacatky popisovacu partition:¿
³ 1 ³ offset 1BEh ³  velikost ³
³ 2 ³ offset 1CEh ³   jedne   ³
³ 3 ³ offset 1DEh ³ partition ³
³ 4 ³ offset 1EEh ³   je 10h  ³
ÀÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÙ

                 Nakres I - partition table
      Hmm...  z  toho  asi  moc  moudøí  nebudete  -  tak¾e  to bude chtít
      vysvìtlení.
AI = indikátor aktivnosti oblasti - to znamená ze které oblasti se zavádí
     systém.
     00h : oblast je neaktivní
     80h : oblast  je  aktivní  -  tento  flag  mù¾e  mít  nastavena  max.
           jedna oblast.
SI = indikátor systému - urèuje OS, který danou oblast vlastní.
     00h : nikoho to nenapadlo urèit aneb nespecifikovaný
     01h : DOS 12-bit FAT
     04h : DOS 16-bit FAT
     05h : DOSEXT  -  tak toto je velice dùle¾itý typ. Slou¾í k vytváøení
     	   tzv.  rozíøených  oblastí  (extended partitions).  Ty mají  ten
	   význam,  ¾e v nich mù¾ou být zapouzdøené dal¹í partition - tzn.
	   v  prvním sektoru  takové partition  je dal¹í  partition table,
	   obsahující  záznam  o jedné oblasti  v této  roz¹íøené  oblasti
	   (stále s námi? ;)  a pøípadnì odkaz na dal¹í roz¹íøenou oblast,
	   atakdále a¾ do nekoneèna... - pozor! nezapomeòte ¾e zapouzdøené
           partitions mù¾ou být  jenom  v mezích  jejich mateøské oblasti!
	   Název je mírnì matoucí,  ponìvad¾  takováto roz¹íøená partition
	   lze pou¾ít i tøeba na Linux, a snad na ka¾dý OS...
     06h : BIGDOS  -  netu¹ím rozdíl mezi 06h a 04h -  poraïte mi nìkdo...
     	   (více ne¾ 512Mb?)
     82h : Linux SWAP
     83h : Linux Native
     DBh : CP/M :o)
     samozøejmì ¾e tìch typù je daleko více - tohle byl jenom úzký výbìr.
CYL= Dolních 8 bitù èísla cylindru. Horní dva byty jsou ukradené z vr¹ku S
S  = Dolních ¹est bytù obsahuje èíslo sektoru
H  = èíslo hlavy
      Tak¾e  H+S+CYL  urèuje  jednoznaènì  konec  oblasti  (ale je tu malý
      problém  s  èísly  cylindrù  nad  1023  -  ten  problém  jsem  je¹tì
      nerozlu¹til   -   jakmile   to  nìkdo  rozkóduje,  dejte  mi  prosím
      vìdìt...  Jediná záchrana aby  to pochopily  i Windoze 95,  ne jenom
      Linux,  je  nechat to  na  jejich  fdisku  nebo rucne  snizit  pocet
      cylindru na 512...  ;)  i  její  zaèátek.  Pole  AI, H, S a CYL jsou
      je¹tì k tomu organizované  tak,  ¾e  staèí  pouze  dvì instrukce MOV
      aby se vhodnì nastavily  AX  a  CX pøed zavoláním INT 13h, kterým se
      naète  aktuální  zavádìcí  záznam   (pozn.:  moderní  zavadìèe  jako
      LILO,  BOOT  MANAGER  apod.  pracují  tro¹ku  jinak,  v  podstatì  v
      souèasnosti ji¾ nemá AI tak nebetyèný význam).  Jo,  a  ka¾dá oblast
      zaèíná hlavou 0 a sektorem 1. Ov¹em¾e vyjímka  potvrzuje  pravidlo -
      oblast na zaèátku disku,  která zaèíná sektorem  2,  ponìvad¾ sektor
      jedna  zabírá  hlavní  zavadìè  a partition  table.  Nejsem  si  teï
      jistý  proto¾e  to  u¾  jsem  nìjakou  dobu nezkoumal, ale takté¾ by
      to mìlo být s DOSEXT...
      Relativní  zaèátek  je  vpodstatì  poèet  sektorù, které pøedcházejí
      danou  oblast.  Je  veliký  4  byty,  tzn.  DWORD (unsigned long pro
      Cèkaøe,  pascalisti  mají  smùlu,  proto¾e  tpascal má jenom longint
      který  je znaménkový). Tak¾e u disku se 4mi hlavami, 17ti sektory na
      stopì  a  na¹e  oblast zaèíná na cylindru 3, sektoru 1 a hlavièce 0,
      tak   její   rel.   zaèátek   má   hodnotu  204  (3*4*17)  na  tøech
      pøedcházejících  cylindrech.  A  poèet  sektorù  které  daná  oblast
      vlastní  je  v  poli  poèet  sektorù.  To  je  opìt 4-bytová hodnota
      (DWORD). Prostì její velikost.
      Ale  je¹tì nesmíme zapomenout na kontrolní signaturu 55AAh, která je
      na  ofsetu  1FEh - ta potvrzuje platnost tabulky. Pozor! Tenhle znak
      musí mít ka¾dý zavadìè OS!
      Tak - to bysme snad mìli partition tabulku. Teï pøichází na øadu ona
      MSDOSí  ¹ílenost  které  se  øíká  Boot  Record.  Je to vlastnì pole
      spousty  podivných  údajù,  jejich¾ chybnost zpùsobuje pomìrnì velké
      problémy a tehdy  není radno  zapisovati na HDD :(  Ale nu¾, vrhnìme
      se  na  to! To¾, zase by to chtìlo nìjakou tabulku, ¾e? Tedy zøete a
      radujte se!

Offset  ³  Velikost  ³  Popis
ÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
  +03h  ³    8xDB    ³  OEM ID
  +0Bh  ³  DW (L M)  ³  Pocet bytu na sektor (vetsinou 512)
  +0Dh  ³     DB     ³  Pocet sektoru na cluster (treba 16)
  +0Eh  ³     DB     ³  Rezervovane sektory na zacatku disku
  +0Fh  ³     DB     ³  ???
  +10h  ³     DB     ³  Pocet kopii FAT tabulky (vetsinou 2)
  +11h  ³     DW     ³  Pocet polozek v korenovem adresari
  +13h  ³     DW     ³  Pocet sektoru na disku (pokud je
        ³            ³  vyplnen velky pocet sektoru tak
        ³            ³  je toto nepouzito a musi to byt 0!)
  +15h  ³     DB     ³  Media descriptor byte - typ media
  +16h  ³  DW (L M)  ³  Pocet sektoru na FAT tabulku (190)
  +18h  ³  DW (L M)  ³  Pocet sektoru na stopu
  +1Ah  ³  DW (L M)  ³  "Stran" disku (hlav)
  +1Ch  ³     DD     ³  Specialnich "skrytych" sektoru (??)
  +20h  ³     DD     ³  Velky pocet sektoru na disku
  +24h  ³     DB     ³  Fyzicke cislo disku
  +25h  ³     DB     ³  ???
  +26h  ³     DB     ³  Extended Boot Record Signature
  +27h  ³     DD     ³  Seriove cislo svazku
  +2Bh  ³   11xDB    ³  Volume Label (vsak vy vite o co de)
  +36h  ³    8xDB    ³  Filesystem ID (FAT16/FAT32)

                        BootRecord
 Tabulka hodnot pro ty ménì znalé... (bude se vám hodit i jinde)

 ³ Asm ³ Pascal  ³ C
 ÃÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
 ³ DD  ³ longint ³ unsigned long
 ³ DW  ³ word    ³ unsigned int
 ³ DB  ³ byte    ³ char (unsigned :)
 Pozn.: pascalský longint je znaménkový, tak bacha na to!!!
 LSB (L) = Less Significancy (kdo ví jak se to pí¹e :) Byte
         = Ménì významný byt (ni¾¹í bity)
 MSB (M) = More Significancy Byte
         = Více významný byt (vy¹¹í bity)
      Hrmpf...  To  je  sice hezké, asi si øíkáte, ale chtìlo by to nìjaký
      popis. Budi¾, máte ho mít.
      Na  zaèátku  je  tzv.  OEM ID. To obsahuje nìco jako jméno 'výrobce'
      partition  -  napø  na  mém  DRDOSu  je  to "IBM 3.1", u win95 je to
      "MSWIN4.1" apod. Nevidìl jsem, ¾e by na tom nìkdy nìco zále¾elo...
      Potom  tu máme poèet bytù na sektor. To je doufám jasné - prostì jak
      je   veliký   jeden   sektor.   Poèet   sektorù  na  cluster  u¾  je
      zajímavìj¹í.  Urèuje,  kolik  sektorù bude v jednom clusteru, pøitom
      cluster  je  minimální  jednotka, ve které se fyzicky udává velikost
      soubor.  Tedy pokud máme soubor velký tøeba jenom jeden znak, pøesto
      zabírá  (bytu  na  sektor)*(sektoru  na cluster)! Viz také popis FAT
      tabulky.   Rezervované  sektory  na  zaèátku  disku?  Vìt¹inou  bývá
      jednièka,  zøejmì  (asi, mo¾ná...) poèet sektorù, které se vynechají
      pøi  èíslování  a  jednièka  je  a¾  zaèátek partition + rezervované
      sektory,  nebo je to poèet sektorù po kterých zaène FAT. Sám jsem to
      nikdy nepotøeboval...
      Na  0Fh je nula a asi by tomu patøila popiska "rezervované" :) Poèet
      kopií  FAT tabulky je v¾dy 2 a DOSu i rùzným diskovým utilitám byste
      asi  pìknì zamotali hlavu pøi pokusu to nìjak mìnit ;) Poèet polo¾ek
      v  koøenovém  (root,  ?:\  )  adresáøi.  Èím  více polo¾ek, tím více
      souborù v nìm mù¾ete mít, ale tím více místa také zabere. Doporuèuji
      zmen¹ovat  jenom  pro mimoøádnì poøádkumilovné typy a zvy¹ovat pouze
      pro  ty  co  neuznávají  mo¾nost  adresáøù  v  DOSu  :)  Ale  i  tak
      nezaruèuju,  ¾e s tím DOS umí korektnì pracovat - ka¾dopádnì to chce
      pøi   zvy¹ování   samozøejmì  také  zvìt¹it  odpovídajícím  zpùsobem
      velikost  adresáøe  ve  FATce  (viz  daleko  daleko  dále...). Poèet
      sektorù  na  disku  no  comment, výjimku máte pøímo v tabulce. Media
      descriptor type urèuje typ média, pro harddisk je to F8h.
      Pocet sektoru na FAT tabulku je dulezity - cislo je vypocitano podle
      velikosti disku - abysme to plne pochopili, musim dopredu prozradit,
      ze  jedna polozka v FAT ma 16 bitu (2 byte) a oznacuje jeden cluster
      na  disku.  Takze  kdyz jeden sektor ma 512 bytu tak se do nej vejde
      256  clusteru.  A  pokud  je  jich na disku treba 48640, tak logicky
      48640/256 = 190. Takze pocet sektoru/FAT je 190 (na __JEDNU__ FAT!).
      Pocet  sektoru  na stopu? Snad taky neni co dodat - ja jsem to nikdy
      nevyuzil,  ale  mozna  ze  nekomu  hodit  -  pouziva se to k vypoctu
      fyzickeho cislo sektoru (o tom zas nekdy jindy...)
      Pocet  hlav  ('stran'  :)  disku  -  take  pouzito k vypocitani fyz.
      sektoru.  Pocet  skrytych  sektoru?  Nejaka  tajemna informace DOSu,
      pokud  nekdo  prijdete  na to,  co to vlastne je,  napiste mi (Resp.
      k cemu  to slouzi,  na zacatku disku  je spousta prazdnych  sektoru,
      jejichz cislo  se podezrele shoduje s  udajem zde...  :-\ ). A velky
      pocet  sektoru  na  disku? Pouziva se kdyz nestaci ten maly. Fyzicke
      cislo  disku je... jeho fyzicke cislo :o) - blize viz INT 13h... 25h
      byva nula a ExtBoot Signature podle me soukrome teorie potvrzuje, ze
      nasledujici  informace jsou nastavene. To znamena ze volume label je
      i  (viz  adresare)  tady,  mate  tu  serial  number  (muzete  vyuzit
      treba  pro  ochranu  kopirovani  nejakeho  programu) a filesystem id
      (snad  vyuzivane jenom Windows9x aby poznal jestli tam ma FAT16 nebo
      FAT32.
      Uff... U¾ abych pomalu zalehl, tak¾e na zbytek se tì¹te pøístì! Èeká
      vás popis adresáøù a toho hlavního, fyzicky nejjednodu¹¹ího ale kdy¾
      o tom nevíte nic tak nejnepochopitelnìj¹ího subjektu - FATky.
      A pokud jste nìkdo zklamán, ¾e si je¹tì stále nemù¾ete vytvoøit svùj
      vlastní adresáø, pro netrpìlivce tu mám jednu malou strukturu:

C:                 ³Komentáøe:        ³Pascal:
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
filename[7]        ³                  ³ filename:array[0..7]of char
ext[2]             ³                  ³ ext:array[0..2]of char
char attr          ³                  ³ attr:byte
char reserved[8]   ³                  ³ reserved:array[0..8]of char
unsigned int time  ³         LSB MSB  ³ time:word
unsigned int date  ³         LSB MSB  ³ date:word
unsigned int abno  ³È. Alok. Bloku L M³ abno:word
unsigned long size ³LSB(L M) MSB(L M) ³ size:longint {neznamenkovy!}

      Dlouhé  bádání  a  nakonec jenom apatické èekání na pokraèování v¹em
      netrpìlivcùm!
                                                   Pac a pusu, Pasky.
           e-mail: pasky@pruvodce.cz (tøeba ;)
           homepage: http://fly.to/pasky
           (mj. (srdeènì zdravím, Martine :) tam bude pokraèování
            èlánku hned jak ho sepí¹u)
      (definitivnì  dokonèeno,  zformátováno  a  pøipraveno  k  odeslání v
      hvìzdné datum 10012000/2059)

-->