From f3bf535104a6413b46ab5bb2d5ed1b8e0aba9d1a Mon Sep 17 00:00:00 2001 From: Magnus Olsen Date: Sun, 7 May 2006 18:50:18 +0000 Subject: [PATCH] bug 1457: patch by w3seek : VFAT: Implement FileEaInformation for FAT32 svn path=/trunk/; revision=21839 --- reactos/drivers/filesystems/vfat/direntry.c | 4 +- reactos/drivers/filesystems/vfat/finfo.c | 53 +++++++++++++++++++-- reactos/drivers/filesystems/vfat/vfat.h | 41 +++++++++++++++- 3 files changed, 91 insertions(+), 7 deletions(-) diff --git a/reactos/drivers/filesystems/vfat/direntry.c b/reactos/drivers/filesystems/vfat/direntry.c index f18d6b29c09..3dda26a5db0 100644 --- a/reactos/drivers/filesystems/vfat/direntry.c +++ b/reactos/drivers/filesystems/vfat/direntry.c @@ -21,8 +21,8 @@ vfatDirEntryGetFirstCluster (PDEVICE_EXTENSION pDeviceExt, if (pDeviceExt->FatInfo.FatType == FAT32) { - cluster = pFatDirEntry->Fat.FirstCluster + - pFatDirEntry->Fat.FirstClusterHigh * 65536; + cluster = pFatDirEntry->Fat.FirstCluster | + (pFatDirEntry->Fat.FirstClusterHigh << 16); } else if (pDeviceExt->Flags & VCB_IS_FATX) { diff --git a/reactos/drivers/filesystems/vfat/finfo.c b/reactos/drivers/filesystems/vfat/finfo.c index 1b593e10d0a..055e097d6ec 100644 --- a/reactos/drivers/filesystems/vfat/finfo.c +++ b/reactos/drivers/filesystems/vfat/finfo.c @@ -444,6 +444,28 @@ VfatGetNetworkOpenInformation(PVFATFCB Fcb, } +static NTSTATUS +VfatGetEaInformation(PFILE_OBJECT FileObject, + PVFATFCB Fcb, + PDEVICE_OBJECT DeviceObject, + PFILE_EA_INFORMATION Info, + PULONG BufferLength) +{ + PDEVICE_EXTENSION DeviceExt = DeviceObject->DeviceExtension; + + /* FIXME - use SEH to access the buffer! */ + Info->EaSize = 0; + *BufferLength -= sizeof(*Info); + if (DeviceExt->FatInfo.FatType == FAT12 || + DeviceExt->FatInfo.FatType == FAT16) + { + /* FIXME */ + DPRINT1("VFAT: FileEaInformation not implemented!\n"); + } + return STATUS_SUCCESS; +} + + static NTSTATUS VfatGetAllInformation(PFILE_OBJECT FileObject, PVFATFCB Fcb, @@ -585,8 +607,16 @@ VfatSetAllocationSizeInformation(PFILE_OBJECT FileObject, } else { - Fcb->entry.Fat.FirstCluster = (unsigned short)(FirstCluster & 0x0000FFFF); - Fcb->entry.Fat.FirstClusterHigh = (unsigned short)((FirstCluster & 0xFFFF0000) >> 16); + if (DeviceExt->FatInfo.FatType == FAT32) + { + Fcb->entry.Fat.FirstCluster = (unsigned short)(FirstCluster & 0x0000FFFF); + Fcb->entry.Fat.FirstClusterHigh = FirstCluster >> 16; + } + else + { + ASSERT((FirstCluster >> 16) == 0); + Fcb->entry.Fat.FirstCluster = (unsigned short)(FirstCluster & 0x0000FFFF); + } } } else @@ -670,8 +700,15 @@ VfatSetAllocationSizeInformation(PFILE_OBJECT FileObject, } else { - Fcb->entry.Fat.FirstCluster = 0; - Fcb->entry.Fat.FirstClusterHigh = 0; + if (DeviceExt->FatInfo.FatType == FAT32) + { + Fcb->entry.Fat.FirstCluster = 0; + Fcb->entry.Fat.FirstClusterHigh = 0; + } + else + { + Fcb->entry.Fat.FirstCluster = 0; + } } NCluster = Cluster = FirstCluster; @@ -780,6 +817,14 @@ NTSTATUS VfatQueryInformation(PVFAT_IRP_CONTEXT IrpContext) &BufferLength); break; + case FileEaInformation: + RC = VfatGetEaInformation(IrpContext->FileObject, + FCB, + IrpContext->DeviceObject, + SystemBuffer, + &BufferLength); + break; + case FileAlternateNameInformation: RC = STATUS_NOT_IMPLEMENTED; break; diff --git a/reactos/drivers/filesystems/vfat/vfat.h b/reactos/drivers/filesystems/vfat/vfat.h index d1f8f1d86a6..ec7a1dfc0f2 100644 --- a/reactos/drivers/filesystems/vfat/vfat.h +++ b/reactos/drivers/filesystems/vfat/vfat.h @@ -97,13 +97,52 @@ struct _FATDirEntry unsigned char lCase; unsigned char CreationTimeMs; unsigned short CreationTime,CreationDate,AccessDate; - unsigned short FirstClusterHigh; // higher + union + { + unsigned short FirstClusterHigh; // FAT32 + unsigned short ExtendedAttributes; // FAT12/FAT16 + }; unsigned short UpdateTime; //time create/update unsigned short UpdateDate; //date create/update unsigned short FirstCluster; unsigned long FileSize; }; +#define FAT_EAFILE "EA DATA. SF" + +typedef struct _EAFileHeader FAT_EA_FILE_HEADER, *PFAT_EA_FILE_HEADER; + +struct _EAFileHeader +{ + unsigned short Signature; // ED + unsigned short Unknown[15]; + unsigned short EASetTable[240]; +}; + +typedef struct _EASetHeader FAT_EA_SET_HEADER, *PFAT_EA_SET_HEADER; + +struct _EASetHeader +{ + unsigned short Signature; // EA + unsigned short Offset; // relative offset, same value as in the EASetTable + unsigned short Unknown1[2]; + char TargetFileName[12]; + unsigned short Unknown2[3]; + unsigned int EALength; + // EA Header +}; + +typedef struct _EAHeader FAT_EA_HEADER, *PFAT_EA_HEADER; + +struct _EAHeader +{ + unsigned char Unknown; + unsigned char EANameLength; + unsigned short EAValueLength; + // Name Data + // Value Data +}; + typedef struct _FATDirEntry FAT_DIR_ENTRY, *PFAT_DIR_ENTRY; struct _FATXDirEntry