Gestione File System e I/O in Windows 2000 Implementazione del File System FAT-12, FAT-16, FAT-32...

Post on 01-May-2015

219 views 0 download

Transcript of Gestione File System e I/O in Windows 2000 Implementazione del File System FAT-12, FAT-16, FAT-32...

Gestione File System e I/O in Windows 2000

•Implementazione del File System

•FAT-12, FAT-16, FAT-32

• NTFS

•API relative al File System

•Gestione dei dispositivi di I/O

Il File System MS-DOS

• Rappresentazione di una directory in MS-DOS

• Attributi : file nascosto, file di sistema, ecc.

Il File System DOS in Windows 95/98

• massima ampiezza delle partizioni per diverse ampiezze dei blocchi • FAT32 utilizza in realtà 28 bit e permette una minore frammentazione• Si ha una File Allocation Table mantenuta in memoria (solo in parte per FAT32).

Il File System di Windows 98 (FAT32)

La rappresentazione estesa di una directory MS-DOS utilizzata in Windows 98

Bytes

Il File System di Windows 98 (2)

La rappresentazione di (parte di) un nome di file “lungo” in Windows 98

Bytes

Checksum

NTFS (Windows NT/2000)

•Indirizzi a 64 bit

•Nomi dei file in codifica Unicode

• Case-sensitive

•Stream multipli e attibuti associati ad un file

•I blocchi vanno da 512 bytes a 64K (standard 4 Kb)

•Supporta compressione e crittografia dei file

Struttura del File System NTFS

La master file table di NTFS (1024 record da 1K)

Struttura del File System NTFS

Gli attributi usati nei record MFT

partizioni

Struttura del File System NTFS

Un record MFT per un file di 3 run e 9 blocchi

Struttura del File System NTFS

Un file che richiede 3 MFT record per memorizzare i suoi run

File System API in Windows 2000

• Principali chiamate della Win32 API relative ai file con il loro equivalente Unix più vicino

Creazione di un File

CreateFile ( nome, // nome del file accesso , // modo accesso (lettura, scrittura o entrambi)condivisione, // condivisione del file (0 nessuna condivisione)security, // attributi di sicurezzacreazione, // creare il file o no se non esisteAttributi, // attributi vari (compressione, nascosto, ecc..)oldFile // handle di un file da cui copiare gli attributi (NULL

indica nessun file));

System Call per la gestione dei file accesso: GENERIC_READ GENERIC_WRITE

condivis.: FILE_SHARE_READ FILE_SHARE_WRITE 0

creazione: CREATE_NEW CREATE_ALWAYS OPEN_EXISTING OPEN_ALWAYS

INVALID_HANDLE_VALUE indica fallimento nella create

Esempio:

Handle hfile;

hfile = CreateFile (“pippo”, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);

If (hfile==INVALID_HANDLE_VALUE)

printf (“errore nella creazione file \n”);

System Call per la gestione dei file S= WriteFile (handle, buffer, lung, &bytescritti,NULL);

S= ReadFile (handle, buffer, lung, &byteletti,NULL);

S vale 1 in caso di successo

Esempio:

{HANDLE hfile; DWORD bytescritti; int s;

char buffer[]=“buonasera”;

hfile = CreateFile (“pippo”, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL);

s = WriteFile (hfile, buffer, 9,&bytescritti,NULL);

CloseHandle (hfile);

}

System Call per la gestione dei file pos=SetFilePointer (handle, offset, offsetAlto, puntoPartenza);

puntoPartenza:FILE_BEGIN inizio fileFILE_CURRENT posizione correnteFILE_END fine filepos = posizione dall’inizio del file.Esempio:hfile=CreateFile(“topo”,…);pos=SetFilePointer(hfile, 12, NULL,FILE_BEGIN);/* si sposta nella posizione 12 del file topo */

System Call per la gestione dei file s=LockFile (handle, offset, offsetAlto, lung, lungAlto);

s=UnLockFile (handle, offset, offsetAlto, lung, lungAlto);

Lock non permette a nessun altro processo di accedere alla porzione di file a partire dalla posizione offset fino alla posizione offset+lung.

Unlock rilascia l’accesso.

Scriviamo 5 interi su file e li leggiamoHANDLE hfile; DWORD bytescritti,byteletti; int s,i;int buffer[]={5,7,12,8,9};int bufferLett[5];

hfile = CreateFile ("pippo", GENERIC_WRITE|GENERIC_READ, 0, NULL, CREATE_ALWAYS, 0, NULL);

s = WriteFile (hfile, buffer, 5*sizeof(int),&bytescritti,NULL);

SetFilePointer(hfile,0,NULL,FILE_BEGIN);s = ReadFile (hfile, bufferLett, 5*sizeof(int),&byteletti,NULL);for (i=0;i<5;i++) printf ("%d\n",bufferLett[i]);CloseHandle (hfile);

Driver dei dispositivi di I/O

Un driver deve essere conforme al Windows Driver Model, cioè deve, fra l’altro:

•Gestire le richieste di I/O standard (I/O Request Packet)

•Essere basato su oggetti

•Essere rientrante nel caso di sistemi multiprocessore

•Essere compatibile fra Windows 98 e 2000

Gestione dell’I/O (es. di utilizzo di porta seriale)

#include <windows.h>

#include <stdio.h>

#include <conio.h>

int main() {

HANDLE handle;

char buffer[40] = “……………..";

DWORD bytescritti;

handle = CreateFile("COM1", GENERIC_READ, GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

SetCommState(….); // setta alcuni parametri della porta

SetCommTimeouts (…); / setta i timeout della porta

WriteFile(handle, buffer, 40, &bytescritti, 0);

CloseHandle (handle); }// fine main