completed write functions : write correct entries in directories

svn path=/trunk/; revision=221
This commit is contained in:
jean
1999-02-10 12:48:37 +00:00
parent b9da76d7ef
commit 4b8117cedc

View File

@@ -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 && i<posCar;i++)
{
//FIXME : is there other characters to ignore ?
if( FileName[i]!='.'
&& FileName[i]!=' '
&& FileName[i]!='+'
@@ -167,7 +167,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;
}
//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);