From 4b8117cedc72246499e8433feb2cab91cec7a95b Mon Sep 17 00:00:00 2001 From: jean Date: Wed, 10 Feb 1999 12:48:37 +0000 Subject: [PATCH] completed write functions : write correct entries in directories svn path=/trunk/; revision=221 --- reactos/drivers/fs/vfat/dirwr.c | 69 +++++++++++++++------------------ 1 file changed, 32 insertions(+), 37 deletions(-) diff --git a/reactos/drivers/fs/vfat/dirwr.c b/reactos/drivers/fs/vfat/dirwr.c index 32638725947..d2020d357ec 100644 --- a/reactos/drivers/fs/vfat/dirwr.c +++ b/reactos/drivers/fs/vfat/dirwr.c @@ -19,23 +19,22 @@ #include "vfat.h" -NTSTATUS updEntry(PDEVICE_EXTENSION DeviceExt,PFILE_OBJECT pFileObject) + +NTSTATUS updEntry(PDEVICE_EXTENSION DeviceExt,PVfatFCB pFcb) /* update an existing FAT entry */ { WCHAR DirName[MAX_PATH],*FileName,*PathFileName; VfatFCB FileFcb; - ULONG Sector=0,Entry=0; - PUCHAR Buffer; - FATDirEntry * pEntries; + ULONG Entry=0; NTSTATUS status; FILE_OBJECT FileObject; PVfatCCB pDirCcb; - PVfatFCB pDirFcb,pFcb; + PVfatFCB pDirFcb; short i,posCar,NameLen; - PathFileName=pFileObject->FileName.Buffer; - pFcb=((PVfatCCB)pFileObject->FsContext2)->pFcb; + CHECKPOINT; + PathFileName=pFcb->PathName; //find last \ in PathFileName posCar=-1; for(i=0;PathFileName[i];i++) @@ -50,6 +49,8 @@ NTSTATUS updEntry(PDEVICE_EXTENSION DeviceExt,PFILE_OBJECT pFileObject) if(FileName[0]==0 && DirName[0]==0) return STATUS_SUCCESS;//root : nothing to do ? memset(&FileObject,0,sizeof(FILE_OBJECT)); + FileObject.FileName.Buffer=DirName; + FileObject.FileName.Length=posCar; DPRINT("open directory %w for update of entry %w\n",DirName,FileName); status=FsdOpenFile(DeviceExt,&FileObject,DirName); pDirCcb=(PVfatCCB)FileObject.FsContext2; @@ -57,18 +58,15 @@ DPRINT("open directory %w for update of entry %w\n",DirName,FileName); pDirFcb=pDirCcb->pFcb; assert(pDirFcb); FileFcb.ObjectName=&FileFcb.PathName[0]; - status=FindFile(DeviceExt,&FileFcb,pDirFcb,FileName,&Sector,&Entry); + status=FindFile(DeviceExt,&FileFcb,pDirFcb,FileName,&Entry); if(NT_SUCCESS(status)) { - Buffer=ExAllocatePool(NonPagedPool,BLOCKSIZE); - DPRINT("update entry: sector %d, entry %d\n",Sector,Entry); - VFATReadSectors(DeviceExt->StorageDevice,Sector,1,Buffer); - pEntries=(FATDirEntry *)Buffer; - memcpy(&pEntries[Entry],&pFcb->entry,sizeof(FATDirEntry)); - VFATWriteSectors(DeviceExt->StorageDevice,Sector,1,Buffer); - ExFreePool(Buffer); + DPRINT("update entry: entry %d\n",Entry); + status=FsdWriteFile(DeviceExt,pDirFcb,&pFcb->entry,sizeof(FATDirEntry) + ,Entry*sizeof(FATDirEntry)); } FsdCloseFile(DeviceExt,&FileObject); + CHECKPOINT; return status; } @@ -87,11 +85,12 @@ NTSTATUS addEntry(PDEVICE_EXTENSION DeviceExt slot *pSlots; ULONG LengthRead,Offset; short nbSlots=0,nbFree=0,i,j,posCar,NameLen; - PUCHAR Buffer,Buffer2; + PUCHAR Buffer; BOOLEAN needTilde=FALSE,needLong=FALSE; - PVfatFCB newFCB; - PVfatCCB newCCB; + PVfatFCB newFCB,pDirFCB; + PVfatCCB newCCB,pDirCCB; ULONG CurrentCluster; + CHECKPOINT; PathFileName=pFileObject->FileName.Buffer; DPRINT("addEntry: Pathname=%w\n",PathFileName); //find last \ in PathFileName @@ -108,6 +107,8 @@ NTSTATUS addEntry(PDEVICE_EXTENSION DeviceExt // open parent directory memset(&FileObject,0,sizeof(FILE_OBJECT)); status=FsdOpenFile(DeviceExt,&FileObject,DirName); + pDirCCB=FileObject.FsContext2; + pDirFCB=pDirCCB->pFcb; nbSlots=(NameLen+12)/13+1;//nb of entry needed for long name+normal entry DPRINT("NameLen= %d, nbSlots =%d\n",NameLen,nbSlots); Buffer=ExAllocatePool(NonPagedPool,(nbSlots+1)*sizeof(FATDirEntry)); @@ -126,7 +127,6 @@ NTSTATUS addEntry(PDEVICE_EXTENSION DeviceExt memset(pEntry,' ',11); for(i=0,j=0;j<8 && iFilename[7]='0'+i; status=FindFile(DeviceExt,&FileFcb - ,&DirFcb,DirName,NULL,NULL); + ,&DirFcb,DirName,NULL); if(status!=STATUS_SUCCESS)break; } //try second with xxxxx~yy.zzz @@ -179,7 +179,7 @@ NTSTATUS addEntry(PDEVICE_EXTENSION DeviceExt DirName[7]='0'+i; pEntry->Filename[7]='0'+i; status=FindFile(DeviceExt,&FileFcb - ,&DirFcb,DirName,NULL,NULL); + ,&DirFcb,DirName,NULL); if(status!=STATUS_SUCCESS)break; } } @@ -249,33 +249,28 @@ DPRINT("i=%d,j=%d,%d,%d\n",i,j,pEntry->Filename[i],FileName[i]); pSlots[i].id=nbSlots-i-1+0x40; pSlots[i].alias_checksum=pSlots[0].alias_checksum; //FIXME pSlots[i].start=; - memcpy(pSlots[i].name0_4 ,FileName+(nbSlots-i-2)*13 + memcpy(pSlots[i].name0_4 ,DirName+(nbSlots-i-2)*13 ,5*sizeof(WCHAR)); - memcpy(pSlots[i].name5_10 ,FileName+(nbSlots-i-2)*13+5 + memcpy(pSlots[i].name5_10 ,DirName+(nbSlots-i-2)*13+5 ,6*sizeof(WCHAR)); - memcpy(pSlots[i].name11_12,FileName+(nbSlots-i-2)*13+11 + memcpy(pSlots[i].name11_12,DirName+(nbSlots-i-2)*13+11 ,2*sizeof(WCHAR)); } //try to find nbSlots contiguous entries frees in directory for(i=0,status=STATUS_SUCCESS;status==STATUS_SUCCESS;i++) { - status=FsdReadFile(DeviceExt,&FileObject,&FatEntry + status=FsdReadFile(DeviceExt,pDirFCB,&FatEntry ,sizeof(FATDirEntry),i*sizeof(FATDirEntry),&LengthRead); - if(IsLastEntry(&FatEntry,0)) + if(IsLastEntry(&FatEntry)) break; - if(IsDeletedEntry(&FatEntry,0)) nbFree++; + if(IsDeletedEntry(&FatEntry)) nbFree++; else nbFree=0; if (nbFree==nbSlots) break; } DPRINT("NbFree %d, entry number %d\n",nbFree,i); if(RequestedOptions&FILE_DIRECTORY_FILE) - { + { // directory has always a first cluster CurrentCluster=GetNextWriteCluster(DeviceExt,0); - // zero the cluster - Buffer2=ExAllocatePool(NonPagedPool,DeviceExt->BytesPerCluster); - memset(Buffer2,0,DeviceExt->BytesPerCluster); - VFATWriteCluster(DeviceExt,Buffer2,CurrentCluster); - ExFreePool(Buffer2); if (DeviceExt->FatType == FAT32) { pEntry->FirstClusterHigh=CurrentCluster>>16; @@ -287,13 +282,13 @@ DPRINT("i=%d,j=%d,%d,%d\n",i,j,pEntry->Filename[i],FileName[i]); if(nbFree==nbSlots) {//use old slots Offset=(i-nbSlots+1)*sizeof(FATDirEntry); - status=FsdWriteFile(DeviceExt,&FileObject,Buffer + status=FsdWriteFile(DeviceExt,pDirFCB,Buffer ,sizeof(FATDirEntry)*nbSlots,Offset); } else {//write at end of directory Offset=(i-nbFree)*sizeof(FATDirEntry); - status=FsdWriteFile(DeviceExt,&FileObject,Buffer + status=FsdWriteFile(DeviceExt,pDirFCB,Buffer ,sizeof(FATDirEntry)*(nbSlots+1),Offset); } DPRINT("write entry offset %d status=%x\n",Offset,status); @@ -319,7 +314,7 @@ DPRINT("new : entry=%11.11s\n",pEntry->Filename); { // create . and .. memcpy(pEntry->Filename,". ",11); - status=FsdWriteFile(DeviceExt,pFileObject,pEntry + status=FsdWriteFile(DeviceExt,newFCB,pEntry ,sizeof(FATDirEntry),0L); pEntry->FirstCluster =((VfatCCB *)(FileObject.FsContext2))->pFcb->entry.FirstCluster; @@ -328,7 +323,7 @@ DPRINT("new : entry=%11.11s\n",pEntry->Filename); memcpy(pEntry->Filename,".. ",11); if(pEntry->FirstCluster==1 && DeviceExt->FatType!=FAT32) pEntry->FirstCluster=0; - status=FsdWriteFile(DeviceExt,pFileObject,pEntry + status=FsdWriteFile(DeviceExt,newFCB,pEntry ,sizeof(FATDirEntry),sizeof(FATDirEntry)); } FsdCloseFile(DeviceExt,&FileObject);