A Faire :
	finir FsdDirectoryControl.
	tester les écritures.
	FsdCreate doit créer le fichier s'il n'existe pas et que le répertoire parent existe,
         et que les options d'appel lee demandent.


fichiers sources :

iface.c
dir.c
blockdev.c
vfat.h



fonctions visibles de l'extérieur (appelées par IoCallDriver):
  DriverEntry : iface.c
    initialisation du driver
    rend visibles les fonctions suivantes :
  FsdFileSystemControl
    répond aux demandes IRP_MJ_FILE_SYSTEM_CONTROL
    monte les filesystems qu'il reconnait
    appelle FsdHasFileSystem pour voir si le driver reconnait le filesystem.
    puis appelle FsdMount.
 NTSTATUS FsdCreate(PDEVICE_OBJECT DeviceObject, PIRP Irp)
    répond aux demandes IRP_MJ_CREATE :
	appelle FsdOpenFile, qui remplit IoGetCurrentIrpStackLocation(Irp)->FileObject->Fcb
	remplit Irp->IoStatus
	appelle IoCompleteRequest
  FsdClose
    répond aux demandes IRP_MJ_CLOSE
	appelle FsdCloseFile, qui ne fait rien actuellement.
	remplit Irp->IoStatus
	appelle IoCompleteRequest
  FsdRead
    répond aux demandes IRP_MJ_READ
  FsdWrite
    répond aux demandes IRP_MJ_WRITE
  FsdQueryInformation
    répond aux demandes IRP_MJ_QUERY_INFORMATION
  FsdDirectoryControl
    répond aux demandes IRP_MJ_DIRECTORY_CONTROL


fonctions strictement internes dans iface.c :
 ULONG Fat32GetNextCluster(PDEVICE_EXTENSION DeviceExt, ULONG CurrentCluster)
 ULONG Fat16GetNextCluster(PDEVICE_EXTENSION DeviceExt, ULONG CurrentCluster)
 ULONG Fat12GetNextCluster(PDEVICE_EXTENSION DeviceExt, ULONG CurrentCluster)
 ULONG GetNextCluster(PDEVICE_EXTENSION DeviceExt, ULONG CurrentCluster)
 ULONG FAT16FindAvailableCluster(PDEVICE_EXTENSION DeviceExt)
 void  FAT16WriteCluster(PDEVICE_EXTENSION DeviceExt, ULONG ClusterToWrite,
                        ULONG NewValue)
 void  WriteCluster(PDEVICE_EXTENSION DeviceExt, ULONG ClusterToWrite,
                   ULONG NewValue)
 ULONG GetNextWriteCluster(PDEVICE_EXTENSION DeviceExt, ULONG CurrentCluster)
 unsigned long ClusterToSector(PDEVICE_EXTENSION DeviceExt,
			      unsigned long Cluster)
 void RtlAnsiToUnicode(PWSTR Dest, PCH Source, ULONG Length)
 void vfat_initstr(wchar_t *wstr, ULONG wsize)
 wchar_t * vfat_wcsncat(wchar_t * dest, const wchar_t * src,size_t wstart, size_t wcount)
 wchar_t * vfat_wcsncpy(wchar_t * dest, const wchar_t *src,size_t wcount)
 wchar_t * vfat_movstr(wchar_t * dest, const wchar_t *src, ULONG dpos,
                      ULONG spos, ULONG len)
 BOOLEAN IsLastEntry(PVOID Block, ULONG Offset)
 BOOLEAN IsDeletedEntry(PVOID Block, ULONG Offset)
 BOOLEAN GetEntryName(PVOID Block, PULONG _Offset, PWSTR Name, PULONG _jloop,
  PDEVICE_EXTENSION DeviceExt, PULONG _StartingSector)
 BOOLEAN wstrcmpi(PWSTR s1, PWSTR s2)
 BOOLEAN wstrcmpjoki(PWSTR s1, PWSTR s2)
 NTSTATUS FindFile(PDEVICE_EXTENSION DeviceExt, PFCB Fcb,
		  PFCB Parent, PWSTR FileToFind)
	parcourt le répertoire décrit par Parent pour trouver un fichier dans le filesystem
	décrit par DeviceExt.Si Parent==NULL : part de la racine du filesystem.
	remplit Fcb si trouve elle le fichier, et renvoie STATUS_SUCCESS.
	renvoie STATUS_UNSUCCESSFUL sinon.
 NTSTATUS FsdCloseFile(PDEVICE_EXTENSION DeviceExt, PFILE_OBJECT FileObject)
	ne fait rien, renvoie STATUS_SUCCESS.
 NTSTATUS FsdOpenFile(PDEVICE_EXTENSION DeviceExt, PFILE_OBJECT FileObject,
		     PWSTR FileName)
	parcourt l'arborescence pour trouver le fichier(appelle FindFile à chaque niveau)
	si trouvé : FileObject->FsContext = Fcb du fichier, renvoie STATUS_SUCCESS
	sinon : renvoie STATUS_UNSUCCESSFULL
 BOOLEAN FsdHasFileSystem(PDEVICE_OBJECT DeviceToMount)
 NTSTATUS FsdMountDevice(PDEVICE_EXTENSION DeviceExt,
			PDEVICE_OBJECT DeviceToMount)
 void VFATLoadCluster(PDEVICE_EXTENSION DeviceExt, PVOID Buffer, ULONG Cluster)
 void VFATWriteCluster(PDEVICE_EXTENSION DeviceExt, PVOID Buffer, ULONG Cluster)
 NTSTATUS FsdReadFile(PDEVICE_EXTENSION DeviceExt, PFILE_OBJECT FileObject,
		     PVOID Buffer, ULONG Length, ULONG ReadOffset)
	lit Length octets d'un fichier
 NTSTATUS FsdWriteFile(PDEVICE_EXTENSION DeviceExt, PFILE_OBJECT FileObject,
                      PVOID Buffer, ULONG Length, ULONG WriteOffset)
 NTSTATUS FsdMount(PDEVICE_OBJECT DeviceToMount)
 NTSTATUS FsdGetStandardInformation(PFCB FCB, PDEVICE_OBJECT DeviceObject,
                                   PFILE_STANDARD_INFORMATION StandardInfo);

