1*14c39362SHervé PoussineauA Faire : 2*14c39362SHervé Poussineau finir FsdDirectoryControl. 3*14c39362SHervé Poussineau tester les �critures. 4*14c39362SHervé Poussineau FsdCreate doit cr�er le fichier s'il n'existe pas et que le r�pertoire parent existe, 5*14c39362SHervé Poussineau et que les options d'appel lee demandent. 6*14c39362SHervé Poussineau 7*14c39362SHervé Poussineau 8*14c39362SHervé Poussineaufichiers sources : 9*14c39362SHervé Poussineau 10*14c39362SHervé Poussineauiface.c 11*14c39362SHervé Poussineaudir.c 12*14c39362SHervé Poussineaublockdev.c 13*14c39362SHervé Poussineauvfat.h 14*14c39362SHervé Poussineau 15*14c39362SHervé Poussineau 16*14c39362SHervé Poussineau 17*14c39362SHervé Poussineaufonctions visibles de l'ext�rieur (appel�es par IoCallDriver): 18*14c39362SHervé Poussineau DriverEntry : iface.c 19*14c39362SHervé Poussineau initialisation du driver 20*14c39362SHervé Poussineau rend visibles les fonctions suivantes : 21*14c39362SHervé Poussineau FsdFileSystemControl 22*14c39362SHervé Poussineau r�pond aux demandes IRP_MJ_FILE_SYSTEM_CONTROL 23*14c39362SHervé Poussineau monte les filesystems qu'il reconnait 24*14c39362SHervé Poussineau appelle FsdHasFileSystem pour voir si le driver reconnait le filesystem. 25*14c39362SHervé Poussineau puis appelle FsdMount. 26*14c39362SHervé Poussineau NTSTATUS FsdCreate(PDEVICE_OBJECT DeviceObject, PIRP Irp) 27*14c39362SHervé Poussineau r�pond aux demandes IRP_MJ_CREATE : 28*14c39362SHervé Poussineau appelle FsdOpenFile, qui remplit IoGetCurrentIrpStackLocation(Irp)->FileObject->Fcb 29*14c39362SHervé Poussineau remplit Irp->IoStatus 30*14c39362SHervé Poussineau appelle IoCompleteRequest 31*14c39362SHervé Poussineau FsdClose 32*14c39362SHervé Poussineau r�pond aux demandes IRP_MJ_CLOSE 33*14c39362SHervé Poussineau appelle FsdCloseFile, qui ne fait rien actuellement. 34*14c39362SHervé Poussineau remplit Irp->IoStatus 35*14c39362SHervé Poussineau appelle IoCompleteRequest 36*14c39362SHervé Poussineau FsdRead 37*14c39362SHervé Poussineau r�pond aux demandes IRP_MJ_READ 38*14c39362SHervé Poussineau FsdWrite 39*14c39362SHervé Poussineau r�pond aux demandes IRP_MJ_WRITE 40*14c39362SHervé Poussineau FsdQueryInformation 41*14c39362SHervé Poussineau r�pond aux demandes IRP_MJ_QUERY_INFORMATION 42*14c39362SHervé Poussineau FsdDirectoryControl 43*14c39362SHervé Poussineau r�pond aux demandes IRP_MJ_DIRECTORY_CONTROL 44*14c39362SHervé Poussineau 45*14c39362SHervé Poussineau 46*14c39362SHervé Poussineaufonctions strictement internes dans iface.c : 47*14c39362SHervé Poussineau ULONG Fat32GetNextCluster(PDEVICE_EXTENSION DeviceExt, ULONG CurrentCluster) 48*14c39362SHervé Poussineau ULONG Fat16GetNextCluster(PDEVICE_EXTENSION DeviceExt, ULONG CurrentCluster) 49*14c39362SHervé Poussineau ULONG Fat12GetNextCluster(PDEVICE_EXTENSION DeviceExt, ULONG CurrentCluster) 50*14c39362SHervé Poussineau ULONG GetNextCluster(PDEVICE_EXTENSION DeviceExt, ULONG CurrentCluster) 51*14c39362SHervé Poussineau ULONG FAT16FindAvailableCluster(PDEVICE_EXTENSION DeviceExt) 52*14c39362SHervé Poussineau void FAT16WriteCluster(PDEVICE_EXTENSION DeviceExt, ULONG ClusterToWrite, 53*14c39362SHervé Poussineau ULONG NewValue) 54*14c39362SHervé Poussineau void WriteCluster(PDEVICE_EXTENSION DeviceExt, ULONG ClusterToWrite, 55*14c39362SHervé Poussineau ULONG NewValue) 56*14c39362SHervé Poussineau ULONG GetNextWriteCluster(PDEVICE_EXTENSION DeviceExt, ULONG CurrentCluster) 57*14c39362SHervé Poussineau unsigned long ClusterToSector(PDEVICE_EXTENSION DeviceExt, 58*14c39362SHervé Poussineau unsigned long Cluster) 59*14c39362SHervé Poussineau void RtlAnsiToUnicode(PWSTR Dest, PCH Source, ULONG Length) 60*14c39362SHervé Poussineau void vfat_initstr(wchar_t *wstr, ULONG wsize) 61*14c39362SHervé Poussineau wchar_t * vfat_wcsncat(wchar_t * dest, const wchar_t * src,size_t wstart, size_t wcount) 62*14c39362SHervé Poussineau wchar_t * vfat_wcsncpy(wchar_t * dest, const wchar_t *src,size_t wcount) 63*14c39362SHervé Poussineau wchar_t * vfat_movstr(wchar_t * dest, const wchar_t *src, ULONG dpos, 64*14c39362SHervé Poussineau ULONG spos, ULONG len) 65*14c39362SHervé Poussineau BOOLEAN IsLastEntry(PVOID Block, ULONG Offset) 66*14c39362SHervé Poussineau BOOLEAN IsDeletedEntry(PVOID Block, ULONG Offset) 67*14c39362SHervé Poussineau BOOLEAN GetEntryName(PVOID Block, PULONG _Offset, PWSTR Name, PULONG _jloop, 68*14c39362SHervé Poussineau PDEVICE_EXTENSION DeviceExt, PULONG _StartingSector) 69*14c39362SHervé Poussineau BOOLEAN wstrcmpi(PWSTR s1, PWSTR s2) 70*14c39362SHervé Poussineau BOOLEAN wstrcmpjoki(PWSTR s1, PWSTR s2) 71*14c39362SHervé Poussineau NTSTATUS FindFile(PDEVICE_EXTENSION DeviceExt, PFCB Fcb, 72*14c39362SHervé Poussineau PFCB Parent, PWSTR FileToFind) 73*14c39362SHervé Poussineau parcourt le r�pertoire d�crit par Parent pour trouver un fichier dans le filesystem 74*14c39362SHervé Poussineau d�crit par DeviceExt.Si Parent==NULL : part de la racine du filesystem. 75*14c39362SHervé Poussineau remplit Fcb si trouve elle le fichier, et renvoie STATUS_SUCCESS. 76*14c39362SHervé Poussineau renvoie STATUS_UNSUCCESSFUL sinon. 77*14c39362SHervé Poussineau NTSTATUS FsdCloseFile(PDEVICE_EXTENSION DeviceExt, PFILE_OBJECT FileObject) 78*14c39362SHervé Poussineau ne fait rien, renvoie STATUS_SUCCESS. 79*14c39362SHervé Poussineau NTSTATUS FsdOpenFile(PDEVICE_EXTENSION DeviceExt, PFILE_OBJECT FileObject, 80*14c39362SHervé Poussineau PWSTR FileName) 81*14c39362SHervé Poussineau parcourt l'arborescence pour trouver le fichier(appelle FindFile � chaque niveau) 82*14c39362SHervé Poussineau si trouv� : FileObject->FsContext = Fcb du fichier, renvoie STATUS_SUCCESS 83*14c39362SHervé Poussineau sinon : renvoie STATUS_UNSUCCESSFULL 84*14c39362SHervé Poussineau BOOLEAN FsdHasFileSystem(PDEVICE_OBJECT DeviceToMount) 85*14c39362SHervé Poussineau NTSTATUS FsdMountDevice(PDEVICE_EXTENSION DeviceExt, 86*14c39362SHervé Poussineau PDEVICE_OBJECT DeviceToMount) 87*14c39362SHervé Poussineau void VFATLoadCluster(PDEVICE_EXTENSION DeviceExt, PVOID Buffer, ULONG Cluster) 88*14c39362SHervé Poussineau void VFATWriteCluster(PDEVICE_EXTENSION DeviceExt, PVOID Buffer, ULONG Cluster) 89*14c39362SHervé Poussineau NTSTATUS FsdReadFile(PDEVICE_EXTENSION DeviceExt, PFILE_OBJECT FileObject, 90*14c39362SHervé Poussineau PVOID Buffer, ULONG Length, ULONG ReadOffset) 91*14c39362SHervé Poussineau lit Length octets d'un fichier 92*14c39362SHervé Poussineau NTSTATUS FsdWriteFile(PDEVICE_EXTENSION DeviceExt, PFILE_OBJECT FileObject, 93*14c39362SHervé Poussineau PVOID Buffer, ULONG Length, ULONG WriteOffset) 94*14c39362SHervé Poussineau NTSTATUS FsdMount(PDEVICE_OBJECT DeviceToMount) 95*14c39362SHervé Poussineau NTSTATUS FsdGetStandardInformation(PFCB FCB, PDEVICE_OBJECT DeviceObject, 96*14c39362SHervé Poussineau PFILE_STANDARD_INFORMATION StandardInfo); 97*14c39362SHervé Poussineau 98