Popis struktur a funkc IFFS
============================

#pragma pack(1)

Struktury: boot sektor FAT (nikoli FAT32!)

struct BootSect
{
	char Preskok[3];	//00 instrukce peskoku
	char OEMID[8];		//03 OEM ident.: jmno a verse oper. systmu
	WORD BytesPerSect;	//0B byt v sektoru
	BYTE SecPerCluster;	//0D sektor v clusteru
	WORD ResSectAtBegin;	//0E reserva sektor od za.svazku do 1.FAT
	BYTE FATCopies;		//10 poet kopi FAT
	WORD RootDirEntries;	//11 max. poet poloek koenovho adrese
	WORD TotalSecL;		//13 poet vech sektor (0 pi > 32MB)
	BYTE MediaDesc;		//15 popisova mdia (F8=HD,...)
	WORD SectPerFAT;	//16 poet sektor na FAT
	WORD SectPerTrack;	//18 poet sektor na stopu
	WORD Sides;		//1A poet stop na vlec
	DWORD HiddenSect;	//1C poet skrytch sektor
	DWORD TotalSectH;	//20 poet vech sektor (0 pi <= 32MB)
	char DrN;		//24 slo jednotky (80 - primary part.)
	char pad2;		//25 --- RESERVA ---
	char ExBootSign;	//26 extended boot signature = 0x29
	DWORD VOLIDNo;		//27 volume ID svazku
	char NameVOL[11];	//2B nzev svazku
	char FileSysType[8];	//36 typ filesystmu: FAT12, FAT16
} OpBoot;

Poloka adrese obsahujc dlouh jmno nebo jeho st:

struct DEntA {
	BYTE NumEnt;			//00 slo sti jmna; 0x40 posledn st
	WORD CastJm1[5];		//01 unicode znaky jmna
	BYTE AttrL;			//0B pznaky long name: 0x0F
	BYTE pad2;			//0C 0x00
	BYTE ChSum;			//0D kontroln souet odpov. krtkho jm (8.3)
	WORD CastJm2[6];		//0E unicode znaky jmna
	WORD Aif0;			//1A 0x0000 - v zkl. poloce nebude 0
	WORD CastJm3[2];		//1C unicode znaky jmna
	// pozn.: neobsazen znaky dlouhho jmna: 0xFFFF
	          ukonovac znak dlouhho jmna:  0x0000
};

Zkladn poloka adrese:

struct DEntZ {
	unsigned char Jm[8];		//00 jmno, celkem max.8
	unsigned char Prip[3];		//08 ppona 3 znaky
	BYTE AttrS;			//0B pznaky short name (0x20)
	BYTE NT;			//0C ???
	BYTE CrT[3];			//0D as vytvoen
	WORD CrD;			//10 datum vytvoen
	WORD LastAccD;			//12 datum poslednho pstupu
	WORD Zif0;			//14 0x0000: ve FAT32 horn 2B sla clusteru
	WORD LastModT;			//16 as posledn modifikace
	WORD LastModD;			//18 datum posledn modifikace
	WORD StartCl;			//1A poten cluster
	DWORD FileL;			//1C dlka souboru pesn na byte
	//datum: zleva 7 bit rok-1980, 4 bity msc, 5 bit den
	//as: zleva 5 bit hodina, 6 bit minuta, 5 bit vteina/2
	//     (je-li 3. byte, tak lev bit je posledn z vteiny)
	//atrib: 20-Arch, 10-Dir, 8-Vol, 4-Sys, 2-Hid, 1-RdOnly
};

Poloka nvt VOL1:

struct DEntV {
	unsigned char VolJm[11];//00 jmno svazku max 11 B
	BYTE AttrS;			//0B pznaky VOL (0x08)
	BYTE Zer0[10];			//0C nuly (?)
	WORD LastModT;			//16 as posledn modifikace
	WORD LastModD;			//18 datum posledn modifikace
	BYTE Zer1[6];			//1A nuly (?)
};

Jednotliv metody (funkce):

extern "C" int FAR PASCAL EXPORT OpenFDImg(CString Img, int Fat);
// vsl.kd(jmno_image_souboru,slo FAT[1 nebo 2])
// 10 - image nelze otevt (neexistuje apod.)
//  9 - nen alokovna prac. pam
//  8 - v boot sektoru jsou uvedeny chybn parametry mdia
//  7 - chybn/neznm typ mdia
//  6 - image pli krtk i na boot sektor
//  5 - boot sektor pli krtk, < 512B
//  4 - image soubor krat ne dle bootu
//  3 - image soubor del ne dle bootu a read-only
//  2 - image soubor del ne dle bootu
//  1 - read-only
//  0 - OK

extern "C" int FAR PASCAL EXPORT GetFDType(_DISK_GEOMETRY *dg, char *BS, int num=sizeof(BootSect));
// vsl.kd(uk.geom.k_naplnn,uk.boot_inf.k_naplnn[,poet B|stand.dlka datov sti boot sektoru])
//  9 - nen alokovna prac. pam, nen oteven soubor
//  0 - OK

extern "C" int FAR PASCAL EXPORT GetFWDirEntry(LONG Seq, char *poloz);
// d 32-bitovou poloku pracovnho adrese dle poad
// vsl.kd(slo_poloky,uk.pol.k_naplnn)
// 10 - image soubor nen oteven
//  9 - chyba ten poloky adr.
//  2 - EOF (konec adrese, tj. Seq mimo hranice adrese)
//  1 - EOF (poloka pln binrnch nul)
//  0 - OK

extern "C" int FAR PASCAL EXPORT GetFDirEntry(CString Path, DEntZ **poloz, int *poc, DWORD *pD);
// d plnou poloku zadanho adrese
// vsl.kd(cesta k adr.,uk.pol.k_naplnn,poet 32-bytovch st poloky,uk.pozice v adr.)
// uk. pozice v adr.: WORD slo poloky v clusteru od 0, WORD . clusteru
// (Path==NULL) -> dal poloku
// 10 - image soubor nen oteven
//  9 - chyba ten poloky adr.
//  5 - chyba cesty (nap. dv '\' po sob)
//  4 - nkter jmno uvnit cesty neoznauje adres, viz poloz
//  1 - nenalezeno
//  0 - OK

extern "C" int FAR PASCAL EXPORT CloseFDImg(void);
// vsl.kd()
//  1 - chyba close
//  0 - OK

extern "C" int FAR PASCAL EXPORT FindInDir(CString Name, DWORD DirCl, char **poloz, DWORD *pD);
// vsl.kd(jmno k nal.v jedn., 1 cl. adr., nalez.poloz.adr.,ukaz.pozice v adresari)
// uk. pozice v adr.: WORD slo poloky v clusteru od 0, WORD . clusteru
// (DirCl==0) -> pracovn adr., (DirCl==1) -> root adr.
// 10 - image soubor nen oteven
//  3 - nenalo se a vadn poloky v adresi
//  1 - nenalo se
//  0 - OK a poloka naplnna

extern "C" int FAR PASCAL EXPORT SetFWrkDir(CString Adrs);
// vsl.kd(jmno k nalezen v adr.) - nastav pracovn adres
// 10 - image soubor nen oteven
//  5 - zadn przdn . a nic se nemn
//  1 - adres se nenael
//  0 - OK a nastaveno

extern "C" int FAR PASCAL EXPORT FindMInDir(CString Patt,DWORD DirCl,char **poloz,int *poc);
// vsl.kd(sablona k nal.v adr., 1 cl. adr., nalez.poloz.adr.) - hled dle ablony
// (Sabl=="*") -> vechny platn poloky adrese
// (Sabl=="**") -> vechny i zruen poloky adr.
// (Sabl=="") -> dal poloka vyhovujc ablon
// (DirCl==0) -> pracovn adr., (DirCl==1) -> root adr.,atd.
// 10 - image soubor nen oteven
//  3 - nenalo se a vadn poloky v adr.
//  1 - nenalo se
//  0 - OK a poloka naplnna

extern "C" int FAR PASCAL EXPORT CopyF(CString FFrom,CString FTo);
// vsl.kd(soubor z adr.,klasick soubor) - kopruje soubor z image do bnho
// 10 - image soubor nen oteven
//  5 - From cesta neoznauje soubor
//  4 - From soubor se nenael
//  3 - chyba poloky adrese: cluster mimo limity
//  2 - chyba zpisu clovho souboru
//  1 - chyba ten souboru z image nebo chyba FAT filesystmu image atd.
//  0 - OK

extern "C" int FAR PASCAL EXPORT FreeSpace(DWORD *vm);
// vsl.kd(ukazatel potu volnch B) - pod voln msto na disketovm image
// 10 - image soubor nen oteven
//  0 - OK

extern "C" int FAR PASCAL EXPORT CopyT(CString FFrom,CString FTo);
// vsl.kd(soubor z adr.,klasick soubor) - kopruje soubor z bnho do image
// 10 - image soubor nen oteven
//  9 - To soubor u existuje
//  8 - image soubor je read-only
//  7 - From cesta neoznauje soubor
//  6 - From soubor se nenael
//  5 - chyba psan souboru do image nebo chyba FAT filesystmu image atd.
//  4 - To adres neexistuje
//  3 - chyba ten zdrojovho souboru
//  2 - poloku(y) adrese nelze pidat, pln adres nebo disk
//  1 - soubor se na image nevejde
//  0 - OK

extern "C" int FAR PASCAL EXPORT KillF(CString Name,bool force);
// vsl.kd(soubor nebo adr.s cestou,smazat i rdonly/sys) - smae soubor nebo adres z image
// 10 - image soubor nen oteven
//  8 - image je read-only
//  6 - chyba ten
//  5 - chyba zpisu
//  4 - soubor/adres na image nenalezen
//  3 - koenov adres nelze smazat
//  2 - neprzdn adres nelze smazat
//  1 - force=false a soubor/adres je read-only
//  0 - OK

extern "C" int FAR PASCAL EXPORT MkDir(CString Name);
// vsl.kd(adr. s cestou) - vytvo adres
// 10 - image soubor nen oteven
//  8 - image je read-only
//  7 - jmno pro nov adres obsahuje neppustn znaky
//  5 - chyba zpisu
//  4 - rodiovsk soubor/adres na image nenalezen
//  3 - adres se nevejde - je pln image
//  0 - OK

extern "C" int FAR PASCAL EXPORT BlockTestFol(BYTE oo);
// nvr.kd(stupe kontroly) - nastav stupe kontroly obsahu poloek adres
// Argument: 0x00 = test obsahu poloek adres
//           0x01 = obsah reserv pol v polokch dlouhho jmna nemus bt 0
//           0x02 = test obsahu poloek je vypnut (monost krachu programu na nekorektnm image)
// Nvratov kd:
//  9 - nen alokovna prac. pam, nen oteven soubor
//  0 - OK

extern "C" int FAR PASCAL EXPORT GetLastErr(int *vpl,char *polo,DWORD *pozice);
// vsl.kd(ukazatel hodnoty posledn chyby,chybn poloka,poloha v adresi)
// poloha v adr.: WORD slo poloky v clusteru od 0, WORD . clusteru
// Nvratov kd:
//  9 - nen alokovna prac. pam, nen oteven soubor
//  0 - OK

extern "C" int FAR PASCAL EXPORT SetAttrib(CString s,DWORD a);
// vsl.kd(cesta k soub/adresi-adr.kon\,atributy standard)
// Atributy nastav vechny najednou jako kombinaci hodnot.
// Atribut Normal je 0, kad jin ho pepe.
//  9 - nen alokovna prac. pam, nen oteven soubor
//  8 - image soubor je read-only
//  6 - zpis do image se nezdail
//  5 - chyba cesty (nap. dv \\ ihned po sob)
//  2 - v koenovm adresi nelze nastavit atributy
//  1 - chyba cesty (nap. neexistuje podadr.)
//  0 - OK
//  Standardn atributy:
//  0 - Normal
//  1 - ReadOnly
//  2 - Hidden
//  4 - System
// 32 - Archive

extern "C" int FAR PASCAL EXPORT WriteBoot(void *Boot);
// vsl. kd(ukazatel novho bootu)
// Pepe na image boot krom poloek geometrie a svazku,
// tj. krom 0Bh a 3Dh a 55AAh na konci; dle pepe VOLIDNo svazku (27h, 11 B)
// Nvratov kd:
//  9 - nen alokovna prac. pam, nen oteven soubor
//  8 - image soubor je read-only
//  5 - zpis do image se nezdail
//  0 - OK

extern "C" int FAR PASCAL EXPORT WriteVol(CString Vol);
// vsl. kd(nov VOL, i "" = smazat nvt VOL)
// Zape nov VOL do koenovho adrese
// Nvratov kd:
// 10 - nen alokovna prac. pam, nen oteven soubor
//  8 - image soubor je read-only
//  7 - jmno VOL obsahuje neppustn znaky
//  5 - zpis do image se nezdail
//  1 - VOL se nevejde
//  0 - OK

selnk chyb v polokch adres = promnn vpl po spnm proveden GetLastErr:
1 - poten cluster odkazovanho souboru nebo adrese je mimo obraz diskety
2 - dlka souboru je vt ne dlka celho obrazu diskety
3 - neppustn znaky v krtkm jmnu, tj. pod 0x20 a "/|\:*?[];=.,
4 - atribut poloky dlouhho jmna nen pesn 0x0F, ale m nenulu v levm plbyte
5 - slo sti dlouhho jmna s pp. pznakem pevyuje 20 => jmno by bylo del ne 1320=260 znak
6 - prvn reservovan st poloky dlouhho jmna nen 0x00
7 - druh reservovan st poloky dlouhho jmna nen 0x0000
8 - dlouh jmno obsahuje neppustn znaky, tj. "/|\:*?<>
9 - jmno VOL1 obsahuje neppustn znaky, tj. pod 0x20.

Speciln sla "cluster":
0 - pracovn (aktuln) adres,
1 - koenov adres.
