1999-01-17 17:45:20 +00:00
|
|
|
|
A Faire :
|
|
|
|
|
finir FsdDirectoryControl.
|
|
|
|
|
tester les <20>critures.
|
|
|
|
|
FsdCreate doit cr<63>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<78>rieur (appel<65>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)
|
2021-09-13 01:33:14 +00:00
|
|
|
|
unsigned long ClusterToSector(PDEVICE_EXTENSION DeviceExt,
|
1999-01-17 17:45:20 +00:00
|
|
|
|
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.
|
2021-09-13 01:33:14 +00:00
|
|
|
|
NTSTATUS FsdOpenFile(PDEVICE_EXTENSION DeviceExt, PFILE_OBJECT FileObject,
|
1999-01-17 17:45:20 +00:00
|
|
|
|
PWSTR FileName)
|
|
|
|
|
parcourt l'arborescence pour trouver le fichier(appelle FindFile <20> chaque niveau)
|
|
|
|
|
si trouv<75> : 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);
|
2021-09-13 01:33:14 +00:00
|
|
|
|
|