컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴-
                     Prostota a primitivnost sama      /
                                 DoSfS                /
                   컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴컴

      Zdravm  v퉑chny  'vh賑ky'  i  nhodn ten壽e. Tak copak se dneska
      dozvme?  Asi si povme nco o souborovm systmu DOSu - jak vlastn
      pesn  funguje  to  ukldn  soubor,  a  kde a jak je ulo푘n FAT
      tabulka,   jak  jsou  ulo푘n  adres壽e,  atakdle  atakdle  neboli
      zkrcen atd. A jestli budu mt nladu tak zkusm sbastlit i njakou
      utilitku kter to pedvede v praxi. Tak se na to vrhnem!
                  휼st prvn - jak jsem rozplil harddisk
      Ne,  nezkou퉑l  jsem  ho  nijak  ezat  ani  jinak mechanicky plit.
      Jednodu퉑  jsem  editoval  partition  table podle mho gusta, i kdy
      jsem  mohl  tak bt lenoch a udlat to pomoc njak utilitky - pr
      se  jmenuje  fdisk  nebo  tak njak a dl pesn tohle - a existuje
      snad na ka푗m operanm systmu co jsem vidl.
      No jo, ale co to vlastn je? U jsem ekl, 푘 je to jaksi tabulka -
      ve  Wine퉡in  se  tomu 曝k tabulka oddl (co je kupodivu celkem
      pou푝teln  vraz, narozdl od mnoha jinch :-). A v t tabulce jsou
      popsan  diskov  oddly,  kter se chovaj vt퉕nou jako samostatn
      logick  disky (ov퉑m pokud to zrovna windows 퉝atn nepochop - pak
      msto  koprovn souboru na jednu partition ho zkopruje na za矮tek
      jin,  co  je  celkem  fatln  :)  - moje vlastn zku퉑nost ):. Ta
      tabulka  mus  bt  na  ka푗m  HDD  a  mus  v n bt alespo jedna
      partition  (diskov  oddl,  logick  disk). Cel tabulka je v pln
      prvnm  sektoru  harddisku  a m max. 4 polo푟y (ono jich m夏e bt i
      vce,  viz  dle).  Ti  kdo  u  o  harddisku  nco  vd, urit si
      uvdomili,  푘  je  ve  stejnm  sektoru  jako zavad麟 - holt se tam
      musej njak vejt... :) No, u toho nechm a rad퉕 vm rovnou uk瀟u
      jej formt:

旼컴컴컴컴컴컴컴컴컴컫컴컴쩡컴쩡컴쩡컴컴쩡컴컴컴컴컴컴
 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푘  to bude chtt
      vysvtlen.
AI = indiktor aktivnosti oblasti - to znamen ze kter oblasti se zavd
     systm.
     00h : oblast je neaktivn
     80h : oblast  je  aktivn  -  tento  flag  m夏e  mt  nastavena  max.
           jedna oblast.
SI = indiktor systmu - uruje OS, kter danou oblast vlastn.
     00h : nikoho to nenapadlo urit aneb nespecifikovan
     01h : DOS 12-bit FAT
     04h : DOS 16-bit FAT
     05h : DOSEXT  -  tak toto je velice dle푝t typ. Slou얩 k vytv壽en
     	   tzv.  roz蔣ench  oblast  (extended partitions).  Ty maj  ten
	   vznam,  푘 v nich m夏ou bt zapouzden dal뱁 partition - tzn.
	   v  prvnm sektoru  takov partition  je dal뱁  partition table,
	   obsahujc  zznam  o jedn oblasti  v tto  roz뱁en  oblasti
	   (stle s nmi? ;)  a p曝padn odkaz na dal뱁 roz뱁enou oblast,
	   atakdle a do nekonena... - pozor! nezapomete 푘 zapouzden
           partitions m夏ou bt  jenom  v mezch  jejich matesk oblasti!
	   Nzev je mrn matouc,  ponvad  takovto roz뱁en partition
	   lze pou얩t i teba na Linux, a snad na ka푗 OS...
     06h : BIGDOS  -  netu뱁m rozdl mezi 06h a 04h -  porate mi nkdo...
     	   (vce ne 512Mb?)
     82h : Linux SWAP
     83h : Linux Native
     DBh : CP/M :o)
     samozejm 푘 tch typ je daleko vce - tohle byl jenom zk vbr.
CYL= Dolnch 8 bit 妖sla cylindru. Horn dva byty jsou ukraden z vr퉗u S
S  = Dolnch 퉑st byt obsahuje 妖slo sektoru
H  = 妖slo hlavy
      Tak푘  H+S+CYL  uruje  jednoznan  konec  oblasti  (ale je tu mal
      problm  s  妖sly  cylindr  nad  1023  -  ten  problm  jsem  je퉡
      nerozlu퉡il   -   jakmile   to  nkdo  rozkduje,  dejte  mi  prosm
      vdt...  Jedin zchrana 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퉡 k tomu organizovan  tak,  푘  sta妖  pouze  dv instrukce MOV
      aby se vhodn nastavily  AX  a  CX ped zavolnm INT 13h, kterm se
      nate  aktuln  zavdc  zznam   (pozn.:  modern  zavad麟e  jako
      LILO,  BOOT  MANAGER  apod.  pracuj  tro퉗u  jinak,  v  podstat  v
      souasnosti ji nem AI tak nebetyn vznam).  Jo,  a  ka푗 oblast
      za妖n hlavou 0 a sektorem 1. Ov퉑m푘 vyjmka  potvrzuje  pravidlo -
      oblast na za矮tku disku,  kter za妖n sektorem  2,  ponvad sektor
      jedna  zabr  hlavn  zavad麟  a partition  table.  Nejsem  si  te
      jist  proto푘  to  u  jsem  njakou  dobu nezkoumal, ale takt榕 by
      to mlo bt s DOSEXT...
      Relativn  za矮tek  je  vpodstat  poet  sektor, kter pedchzej
      danou  oblast.  Je  velik  4  byty,  tzn.  DWORD (unsigned long pro
      Ckae,  pascalisti  maj  smlu,  proto푘  tpascal m jenom longint
      kter  je znamnkov). Tak푘 u disku se 4mi hlavami, 17ti sektory na
      stop  a  na퉑  oblast za妖n na cylindru 3, sektoru 1 a hlavice 0,
      tak   jej   rel.   za矮tek   m   hodnotu  204  (3*4*17)  na  tech
      pedchzejcch  cylindrech.  A  poet  sektor  kter  dan  oblast
      vlastn  je  v  poli  poet  sektor.  To  je  opt 4-bytov hodnota
      (DWORD). Prost jej velikost.
      Ale  je퉡 nesmme zapomenout na kontroln signaturu 55AAh, kter je
      na  ofsetu  1FEh - ta potvrzuje platnost tabulky. Pozor! Tenhle znak
      mus mt ka푗 zavad麟 OS!
      Tak - to bysme snad mli partition tabulku. Te pichz na adu ona
      MSDOS  뱁lenost  kter  se  曝k  Boot  Record.  Je to vlastn pole
      spousty  podivnch  daj,  jejich chybnost zpsobuje pomrn velk
      problmy a tehdy  nen radno  zapisovati na HDD :(  Ale nu, vrhnme
      se  na  to! To, zase by to chtlo njakou tabulku, 푘? Tedy zete 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 mn znal... (bude se vm hodit i jinde)

  Asm  Pascal   C
 쳐컴컴탠컴컴컴컴탠컴컴컴컴컴컴컴컴컴
  DD   longint  unsigned long
  DW   word     unsigned int
  DB   byte     char (unsigned :)
 Pozn.: pascalsk longint je znamnkov, tak bacha na to!!!
 LSB (L) = Less Significancy (kdo v jak se to p紫e :) Byte
         = Mn vznamn byt (ni씁 bity)
 MSB (M) = More Significancy Byte
         = Vce vznamn byt (vy뭐 bity)
      Hrmpf...  To  je  sice hezk, asi si 曝kte, ale chtlo by to njak
      popis. Budi, mte ho mt.
      Na  za矮tku  je  tzv.  OEM ID. To obsahuje nco jako jmno 'vrobce'
      partition  -  nap  na  mm  DRDOSu  je  to "IBM 3.1", u win95 je to
      "MSWIN4.1" apod. Nevidl jsem, 푘 by na tom nkdy nco zle푘lo...
      Potom  tu mme poet byt na sektor. To je doufm jasn - prost jak
      je   velik   jeden   sektor.   Poet   sektor  na  cluster  u  je
      zajmavj뱁.  Uruje,  kolik  sektor bude v jednom clusteru, pitom
      cluster  je  minimln  jednotka, ve kter se fyzicky udv velikost
      soubor.  Tedy pokud mme soubor velk teba jenom jeden znak, pesto
      zabr  (bytu  na  sektor)*(sektoru  na cluster)! Viz tak popis FAT
      tabulky.   Rezervovan  sektory  na  za矮tku  disku?  Vt퉕nou  bv
      jednika,  zejm  (asi, mo푣...) poet sektor, kter se vynechaj
      pi  妖slovn  a  jednika  je  a  za矮tek partition + rezervovan
      sektory,  nebo je to poet sektor po kterch zane FAT. Sm jsem to
      nikdy nepoteboval...
      Na  0Fh je nula a asi by tomu patila popiska "rezervovan" :) Poet
      kopi  FAT tabulky je v푗y 2 a DOSu i rznm diskovm utilitm byste
      asi  pkn zamotali hlavu pi pokusu to njak mnit ;) Poet polo푘k
      v  koenovm  (root,  ?:\  )  adres壽i.  흡m  vce polo푘k, tm vce
      soubor v nm m夏ete mt, ale tm vce msta tak zabere. Doporuuji
      zmen퉛vat  jenom  pro mimo脯dn po脯dkumilovn typy a zvy퉛vat pouze
      pro  ty  co  neuznvaj  mo푣ost  adres壽  v  DOSu  :)  Ale  i  tak
      nezaruuju,  푘 s tm DOS um korektn pracovat - ka푗opdn to chce
      pi   zvy퉛vn   samozejm  tak  zvt퉕t  odpovdajcm  zpsobem
      velikost  adres壽e  ve  FATce  (viz  daleko  daleko  dle...). Poet
      sektor  na  disku  no  comment, vjimku mte p曝mo v tabulce. Media
      descriptor type uruje typ mdia, 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푘 na zbytek se t移te p曝st! ek
      vs popis adres壽 a toho hlavnho, fyzicky nejjednodu뭐ho ale kdy
      o tom nevte nic tak nejnepochopitelnj뱁ho subjektu - FATky.
      A pokud jste nkdo zklamn, 푘 si je퉡 stle nem夏ete vytvoit svj
      vlastn adres壽, pro netrplivce tu mm jednu malou strukturu:

C:                 쿖oment壽e:        쿛ascal:
컴컴컴컴컴컴컴컴컴컵컴컴컴컴컴컴컴컴컴탠컴컴컴컴컴컴컴컴컴컴컴컴컴
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 쿗SB(L M) MSB(L M)  size:longint {neznamenkovy!}

      Dlouh  bdn  a  nakonec jenom apatick ekn na pokraovn v퉑m
      netrplivcm!
                                                   Pac a pusu, Pasky.
           e-mail: pasky@pruvodce.cz (teba ;)
           homepage: http://fly.to/pasky
           (mj. (srden zdravm, Martine :) tam bude pokraovn
            lnku hned jak ho sep紫u)
      (definitivn  dokoneno,  zformtovno  a  pipraveno  k  odesln v
      hvzdn datum 10012000/2059)

-->