mirror of
https://github.com/reactos/reactos.git
synced 2024-07-03 03:04:22 +00:00
bug 1457: patch by w3seek : VFAT: Implement FileEaInformation for FAT32
svn path=/trunk/; revision=21839
This commit is contained in:
parent
661ec874b7
commit
f3bf535104
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue