a cura di Fernando Carello
I nomi lunghi di Windows 95: un trucco ingombrante
di Francesco Sileno
Una delle innovazioni introdotte con Windows 95 è la VFAT, ovvero la FAT che supporta i nomi lunghi, fino a 255 caratteri per nome file, inclusi spazi e alcuni caratteri estesi.
Qualcuno potrebbe pensare che questa incredibile, stupenda, rivoluzionaria,
innovazione (che Windows NT, OS/2, Amiga e altri supportano già da tempo) renda di
fatto impossibile la compatibilità con la vetusta FAT, invece così non è.
Riassumendo brevemente il funzionamento della FAT: questo file system usa
una lista di concatenazione per sapere dove sono dislocati i vari frammenti
di un file. Non necessariamente un file è memorizzato in un solo blocco, ma
può essere spezzettato per riempire i vari buchi che si creano con l'uso.
Usa un indirizzamento a 16 bit (12 bit per i dischetti), limitando a 65.535
(in realtà qualcosa di meno) i settori indirizzabili. Quindi si usano i
cluster, dei settori logici che racchiudono in se uno o più settori fisici
dell'HD (che hanno dimensione fissa di 512 byte).
La dimensione del cluster varia pressapoco come indicato nella seguente
tabella:
Dim. Partizione Dim. Cluster fino a 128 Mb 2048 byte fino a 256 Mb 4096 byte fino a 512 Mb 8192 byte fino a 1 Gb 16384 byte fino a 2 Gb 32768 byte e oltre non so cosa succede...
In teoria dovrebbero essere possibili anche cluster di dimensioni minori, in pratica sembra che 2048 è il minimo utilizzato. Poichè un cluster è ora la minima entità indirizzabile dal file system, significa che la sua dimensione è la minima quantità allocabile. Per esempio, prendiamo un HD da 850 MB, formattato in un'unica partizione. Questo avrà dei cluster da 16 KB, che vuol dire che anche il vostro autoexec.bat, nonostante sia di un paio di KB al massimo, occuperà comunque 16 KB. Non ci credete? Fate un CHKDSK, e annotate il valore alla dicitura 'byte disponibili su disco'. Adesso create un file di testo di 6 byte. Rieseguite CHKDSK e gioite.
Però da qualche parte, non nella FAT, devono venir memorizzate le
informazioni sui file, dimensione, cluster di partenza, data, ora,
attributi... a ogni directory è associata una directory entry, ed è in
quest'ultima che vengono messe tutte le informazioni relative ai file e
sottodirectory in essa contenuti.
A sua volta la directory entry è suddivisa in entry, con dimensione fissa
di 32 byte, che vengono usati per i file, le directory e la label (ecco
perchè l'etichetta di volume è al massimo lunga 11 caratteri: 8+3).
La stuttura di un entry è sifatta:
Offset Dim. Contenuto ------ ---- ---------------------------------------------------------------- +-------------------------------+ +0 8 |'N' 'O' 'M' 'E' 'F' 'I' 'L' 'E'| |---+---+---+---+---+---+---+---+ +8 3 |'E' 'S' 'T'| il punto non è memorizzato! |---+---+---+ +0bH 1 |atr| attributi (vedi sotto). |---+-------- - - ----+ +0cH 0aH | riservati | |---+---+---+ - - ----+ +16H 2 | ora | ora creazione o ultima modifica. |---+---| +18H 2 | data | data creazione o ultima modidica. |---+---| +1aH 2 |ClstrNo| cluster di partenza. |-------+-------+ +1cH 4 | dim. file | dimensione file. +---------------+ Attributi: +7+6+5+4+3+2+1+0+ | |a|d|v|s|h|r| +-+-+-+-+-+-+-+-+ bit Maschera | | | | | +-> 0: 1=Read Only (01H) | | | | +---> 1: 1=File nascosto (02H) | | | +-----> 2: 1=File di sistema (04H) | | +-------> 3: 1=Etichetta di volume (08H) | +---------> 4: 1=Sub directory (10H) +-----------> 5: Bit di archivio (usato nei backup) (20H) Come esempio, ecco l'estratto di una directory entry relativa alla directory C:\DEP\TEMP del mio HD: 00000 2E 20 20 20 | 20 20 20 20 | 20 20 20 10 | 00 00 00 00 . ..... 00010 00 00 00 00 | 00 00 23 B4 | E9 1E F9 19 | 00 00 00 00 ................ 00020 2E 2E 20 20 | 20 20 20 20 | 20 20 20 10 | 00 00 00 00 .. ..... 00030 00 00 00 00 | 00 00 23 B4 | E9 1E FC 17 | 00 00 00 00 ................ 00040 57 41 54 43 | 4F 4D 20 20 | 20 20 20 20 | 00 00 00 00 WATCOM .... 00050 00 00 00 00 | 00 00 BD 85 | 48 1F 2B 0B | 02 09 00 00 ................ 00060 53 43 48 45 | 44 45 20 20 | 4E 46 4F 20 | 00 00 00 00 SCHEDE NFO .... 00070 00 00 00 00 | 00 00 39 9D | 03 1F 31 05 | E8 02 00 00 ................ 00080 4D 42 53 20 | 20 20 20 20 | 42 45 54 20 | 00 00 00 00 MBS BET .... 00090 00 00 00 00 | 00 00 60 9B | DB 1E 62 01 | 71 3C 00 00 ................ 000A0 49 4E 54 45 | 52 4E 45 54 | 20 20 20 20 | 00 00 00 00 INTERNET .... 000B0 00 00 00 00 | 00 00 28 67 | 3E 1F 19 09 | FF 01 00 00 ................ 000C0 43 4F 4D 20 | 20 20 20 20 | 42 45 54 20 | 00 00 00 00 COM BET .... 000D0 00 00 00 00 | 00 00 67 8D | 48 1F D5 11 | B4 54 00 00 ................ 000E0 46 4C 4F 50 | 50 59 20 20 | 20 20 20 20 | 00 00 00 00 FLOPPY .... 000F0 00 00 00 00 | 00 00 52 A2 | 4A 1F 0D 03 | 94 08 00 00 ................ 00100 56 46 41 54 | 20 20 20 20 | 42 45 54 20 | 00 00 00 00 VFAT BET .... 00110 00 00 00 00 | 00 00 C0 A1 | 4D 1F BA 01 | A2 0B 00 00 ................ 00120 44 49 52 20 | 20 20 20 20 | 48 45 58 20 | 00 00 00 00 DIR HEX .... 00130 00 00 00 00 | 00 00 36 A2 | 4D 1F 00 00 | 00 00 00 00 ................ 00140 53 43 52 45 | 45 4E 20 20 | 54 58 54 20 | 00 00 00 00 SCREEN TXT .... 00150 00 00 00 00 | 00 00 6A 9D | 4D 1F 00 08 | 62 17 00 00 ................ 00160 41 54 54 52 | 20 20 20 20 | 54 58 54 20 | 00 00 00 00 ċTTR TXT .... 00170 00 00 00 00 | 00 00 19 9E | 4D 1F 66 09 | 86 03 00 00 ................ 00180 00 00 00 00 | 00 00 00 00 | 00 00 00 00 | 00 00 00 00 ................Vedete, le speciali directory "." e ".." hanno una loro directory entry, mentre come ultima voce c'è un file cancellato (in origine era ATTR.TXT, il DOS mette il carattere ċ sui file cancellati).
Bene, adesso vediamo cosa succede con la VFAT. Abbiamo creato un file, in una directory vuota, chiamato "Questa sembra proprio essere una prova di Cthulhu, e ancora non siamo arrivati.txt", ed ecco cosa compariva nella directory entry:
00000 2E 20 20 20 | 20 20 20 20 | 20 20 20 10 | 00 00 00 00 . ..... 00010 00 00 00 00 | 00 00 CD 12 | 43 1F EF B8 | 00 00 00 00 ................ 00020 2E 2E 20 20 | 20 20 20 20 | 20 20 20 10 | 00 00 00 00 .. ..... 00030 00 00 00 00 | 00 00 CD 12 | 43 1F 00 00 | 00 00 00 00 ................ 00040 47 2E 00 74 | 00 78 00 74 | 00 00 00 0F | 00 68 FF FF G..t.x.t.....h˙˙ 00050 FF FF FF FF | FF FF FF FF | FF FF 00 00 | FF FF FF FF ˙˙˙˙˙˙˙˙˙˙..˙˙˙˙ 00060 06 69 00 61 | 00 6D 00 6F | 00 20 00 0F | 00 68 61 00 .i.a.m.o. ...ha. 00070 72 00 72 00 | 69 00 76 00 | 61 00 00 00 | 74 00 69 00 r.r.i.v.a...t.i. 00080 05 20 00 61 | 00 6E 00 63 | 00 6F 00 0F | 00 68 72 00 . .a.n.c.o...hr. 00090 61 00 20 00 | 6E 00 6F 00 | 6E 00 00 00 | 20 00 73 00 a. .n.o.n... .s. 000A0 04 64 00 69 | 00 20 00 43 | 00 74 00 0F | 00 68 68 00 .d.i. .C.t...hh. 000B0 75 00 6C 00 | 68 00 75 00 | 2C 00 00 00 | 20 00 65 00 u.l.h.u.,... .e. 000C0 03 72 00 65 | 00 20 00 75 | 00 6E 00 0F | 00 68 61 00 .r.e. .u.n...ha. 000D0 20 00 70 00 | 72 00 6F 00 | 76 00 00 00 | 61 00 20 00 .p.r.o.v...a. . 000E0 02 20 00 70 | 00 72 00 6F | 00 70 00 0F | 00 68 72 00 . .p.r.o.p...hr. 000F0 69 00 6F 00 | 20 00 65 00 | 73 00 00 00 | 73 00 65 00 i.o. .e.s...s.e. 00100 01 51 00 75 | 00 65 00 73 | 00 74 00 0F | 00 68 61 00 .Q.u.e.s.t...ha. 00110 20 00 73 00 | 65 00 6D 00 | 62 00 00 00 | 72 00 61 00 .s.e.m.b...r.a. 00120 51 55 45 53 | 54 41 7E 31 | 54 58 54 20 | 00 61 01 AC QUESTA~1TXT .... 00130 4C 1F 4C 1F | 00 00 01 AC | 4C 1F 7D B0 | 05 00 00 00 ................ 00140 00 00 00 00 | 00 00 00 00 | 00 00 00 00 | 00 00 00 00 ................ 00150 00 00 00 00 | 00 00 00 00 | 00 00 00 00 | 00 00 00 00 ................ 00160 00 00 00 00 | 00 00 00 00 | 00 00 00 00 | 00 00 00 00 ................L'ultima voce, QUESTA~1.TXT, è il riferimento reale al file, e contiene il nome che mantiene la compatibilità con la vecchia FAT, tuttavia alcuni byte dei 10 riservati sono usati, probabilmente per rendere noto al S.O. che il file è dotato anche di un nome lungo.
Quest' ultimo viene memorizzato PRIMA del nome breve (abbiamo fatto altre prove), in questo caso a partire dall'offset 0x40.
Si notano subito alcune cose:
Adesso supponiamo che voi avete 100 file da memorizzare. Se usate il vecchio metodo 8+3, vi servirà una sola directory entry. Se vi divertite coi nomi lunghi, diciamo 100 caratteri per nome, vi serviranno
100/12 = 9 entry per ciascun file
9*100 = 900 entry totali
900/128 = 8 directory entry.
Il che vuol dire che portate via 8*4096 = 32768 byte (32 KB) per memorizzare dei nomi lunghi che in totale occupano 100*100 = 10000 byte (meno di 10 KB). Avete cioè triplicato lo spazio usato per i nomi lunghi, e non parliamo di cosa succede se usate nomi da 200 caratteri... anzi si, parliamone: vi ritrovate con 64 KB usati per memorizzare 20 KB di nomi lunghi.
Chi lavora con dei bei clusteroni da 32 KB, sarà tutto felice che può far entrare più entry in un solo cluster... se vi rende felici sapere che il vostro AUTOEXEC.BAT da 1 KB si porta via 32 KB, allora gioite pure.
Come dicevo prima, anche Windows NT usa questo metodo, ma mi faceva giustamente notare Luciano che NT ha un piccolo optional in più, il file system NTFS. OS/2 non permette i nomi lunghi su FAT, ma anche lui ha il suo piccolo optional, noto come HPFS. Linux ha l'EXT2FS, e così via...
Insomma, vi si frammenta, spreca spazio coi cluster, li perde, li incrocia, ora spreca spazio anche memorizzando il nome di un file... ma forse è meglio fare finta di niente e premere START.
innovativamente, Cthulhu(TM)