From 045a3dfdd2971e6a295657018b8daececf11d6b5 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Mon, 13 Mar 2000 17:58:06 +0000 Subject: [PATCH] Unused characters in long file name buffers (directory slots) must be filled with 0xFFFF. svn path=/trunk/; revision=1054 --- reactos/drivers/fs/vfat/dirwr.c | 102 ++++++++++++++++++++++++++------ 1 file changed, 84 insertions(+), 18 deletions(-) diff --git a/reactos/drivers/fs/vfat/dirwr.c b/reactos/drivers/fs/vfat/dirwr.c index df1fef9f9f1..d1ac875afa8 100644 --- a/reactos/drivers/fs/vfat/dirwr.c +++ b/reactos/drivers/fs/vfat/dirwr.c @@ -1,4 +1,4 @@ -/* $Id: dirwr.c,v 1.10 2000/03/12 23:28:59 ekohl Exp $ +/* $Id: dirwr.c,v 1.11 2000/03/13 17:58:06 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -19,23 +19,87 @@ #include "vfat.h" + +/* + * Copies a file name into a directory slot (long file name entry) + * and fills trailing slot space with 0xFFFF. This keeps scandisk + * from complaining. + */ +static VOID +FillSlot (slot *Slot, WCHAR *FileName) +{ + BOOLEAN fill = FALSE; + WCHAR *src = FileName; + WCHAR *dst; + int i; + + i = 5; + dst = Slot->name0_4; + while (i-- > 0) + { + if (fill == FALSE) + *dst = *src; + else + *dst = 0xffff; + + if (fill == FALSE && (*src == 0)) + fill = TRUE; + dst++; + src++; + } + + i = 6; + dst = Slot->name5_10; + while (i-- > 0) + { + if (fill == FALSE) + *dst = *src; + else + *dst = 0xffff; + + if (fill == FALSE && (*src == 0)) + fill = TRUE; + dst++; + src++; + } + + i = 2; + dst = Slot->name11_12; + while (i-- > 0) + { + if (fill == FALSE) + *dst = *src; + else + *dst = 0xffff; + + if (fill == FALSE && (*src == 0)) + fill = TRUE; + dst++; + src++; + } +} + + NTSTATUS updEntry(PDEVICE_EXTENSION DeviceExt,PFILE_OBJECT pFileObject) /* update an existing FAT entry */ { - WCHAR DirName[MAX_PATH],*FileName,*PathFileName; - VFATFCB FileFcb; - ULONG Sector=0,Entry=0; - PUCHAR Buffer; - FATDirEntry * pEntries; - NTSTATUS status; - FILE_OBJECT FileObject; - PVFATCCB pDirCcb; - PVFATFCB pDirFcb,pFcb; - short i,posCar,NameLen; + WCHAR DirName[MAX_PATH],*FileName,*PathFileName; + VFATFCB FileFcb; + ULONG Sector=0,Entry=0; + PUCHAR Buffer; + FATDirEntry * pEntries; + NTSTATUS status; + FILE_OBJECT FileObject; + PVFATCCB pDirCcb; + PVFATFCB pDirFcb,pFcb; + short i,posCar,NameLen; + PathFileName=pFileObject->FileName.Buffer; pFcb=((PVFATCCB)pFileObject->FsContext2)->pFcb; + DPRINT("PathFileName \'%S\'\n", PathFileName); + //find last \ in PathFileName posCar=-1; for(i=0;PathFileName[i];i++) @@ -44,14 +108,20 @@ NTSTATUS updEntry(PDEVICE_EXTENSION DeviceExt,PFILE_OBJECT pFileObject) return STATUS_UNSUCCESSFUL; FileName=&PathFileName[posCar+1]; for(NameLen=0;FileName[NameLen];NameLen++); + // extract directory name from pathname memcpy(DirName,PathFileName,posCar*sizeof(WCHAR)); DirName[posCar]=0; if(FileName[0]==0 && DirName[0]==0) return STATUS_SUCCESS;//root : nothing to do ? memset(&FileObject,0,sizeof(FILE_OBJECT)); -DPRINT("open directory %S for update of entry %S\n",DirName,FileName); + DPRINT("open directory \'%S\' for update of entry \'%S\'\n",DirName,FileName); status=FsdOpenFile(DeviceExt,&FileObject,DirName); + if (!NT_SUCCESS(status)) + { + DbgPrint ("Failed to open \'%S\'. Status %lx\n", DirName, status); + return status; + } pDirCcb=(PVFATCCB)FileObject.FsContext2; assert(pDirCcb); pDirFcb=pDirCcb->pFcb; @@ -72,6 +142,7 @@ DPRINT("open directory %S for update of entry %S\n",DirName,FileName); return status; } + NTSTATUS addEntry(PDEVICE_EXTENSION DeviceExt, PFILE_OBJECT pFileObject, ULONG RequestedOptions, @@ -264,12 +335,7 @@ 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 - ,5*sizeof(WCHAR)); - memcpy(pSlots[i].name5_10 ,FileName+(nbSlots-i-2)*13+5 - ,6*sizeof(WCHAR)); - memcpy(pSlots[i].name11_12,FileName+(nbSlots-i-2)*13+11 - ,2*sizeof(WCHAR)); + FillSlot (&pSlots[i], FileName+(nbSlots-i-2)*13); } //try to find nbSlots contiguous entries frees in directory