bug 1457: patch by w3seek : VFAT: Implement FileEaInformation for FAT32

svn path=/trunk/; revision=21839
This commit is contained in:
Magnus Olsen 2006-05-07 18:50:18 +00:00
parent 661ec874b7
commit f3bf535104
3 changed files with 91 additions and 7 deletions

View file

@ -21,8 +21,8 @@ vfatDirEntryGetFirstCluster (PDEVICE_EXTENSION pDeviceExt,
if (pDeviceExt->FatInfo.FatType == FAT32) if (pDeviceExt->FatInfo.FatType == FAT32)
{ {
cluster = pFatDirEntry->Fat.FirstCluster + cluster = pFatDirEntry->Fat.FirstCluster |
pFatDirEntry->Fat.FirstClusterHigh * 65536; (pFatDirEntry->Fat.FirstClusterHigh << 16);
} }
else if (pDeviceExt->Flags & VCB_IS_FATX) else if (pDeviceExt->Flags & VCB_IS_FATX)
{ {

View file

@ -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 static NTSTATUS
VfatGetAllInformation(PFILE_OBJECT FileObject, VfatGetAllInformation(PFILE_OBJECT FileObject,
PVFATFCB Fcb, PVFATFCB Fcb,
@ -585,8 +607,16 @@ VfatSetAllocationSizeInformation(PFILE_OBJECT FileObject,
} }
else else
{ {
Fcb->entry.Fat.FirstCluster = (unsigned short)(FirstCluster & 0x0000FFFF); if (DeviceExt->FatInfo.FatType == FAT32)
Fcb->entry.Fat.FirstClusterHigh = (unsigned short)((FirstCluster & 0xFFFF0000) >> 16); {
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 else
@ -670,8 +700,15 @@ VfatSetAllocationSizeInformation(PFILE_OBJECT FileObject,
} }
else else
{ {
Fcb->entry.Fat.FirstCluster = 0; if (DeviceExt->FatInfo.FatType == FAT32)
Fcb->entry.Fat.FirstClusterHigh = 0; {
Fcb->entry.Fat.FirstCluster = 0;
Fcb->entry.Fat.FirstClusterHigh = 0;
}
else
{
Fcb->entry.Fat.FirstCluster = 0;
}
} }
NCluster = Cluster = FirstCluster; NCluster = Cluster = FirstCluster;
@ -780,6 +817,14 @@ NTSTATUS VfatQueryInformation(PVFAT_IRP_CONTEXT IrpContext)
&BufferLength); &BufferLength);
break; break;
case FileEaInformation:
RC = VfatGetEaInformation(IrpContext->FileObject,
FCB,
IrpContext->DeviceObject,
SystemBuffer,
&BufferLength);
break;
case FileAlternateNameInformation: case FileAlternateNameInformation:
RC = STATUS_NOT_IMPLEMENTED; RC = STATUS_NOT_IMPLEMENTED;
break; break;

View file

@ -97,13 +97,52 @@ struct _FATDirEntry
unsigned char lCase; unsigned char lCase;
unsigned char CreationTimeMs; unsigned char CreationTimeMs;
unsigned short CreationTime,CreationDate,AccessDate; 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 UpdateTime; //time create/update
unsigned short UpdateDate; //date create/update unsigned short UpdateDate; //date create/update
unsigned short FirstCluster; unsigned short FirstCluster;
unsigned long FileSize; 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; typedef struct _FATDirEntry FAT_DIR_ENTRY, *PFAT_DIR_ENTRY;
struct _FATXDirEntry struct _FATXDirEntry