mirror of
https://github.com/reactos/reactos.git
synced 2024-10-04 08:25:53 +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)
|
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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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,
|
||||||
|
@ -584,9 +606,17 @@ VfatSetAllocationSizeInformation(PFILE_OBJECT FileObject,
|
||||||
Fcb->entry.FatX.FirstCluster = FirstCluster;
|
Fcb->entry.FatX.FirstCluster = FirstCluster;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
|
if (DeviceExt->FatInfo.FatType == FAT32)
|
||||||
{
|
{
|
||||||
Fcb->entry.Fat.FirstCluster = (unsigned short)(FirstCluster & 0x0000FFFF);
|
Fcb->entry.Fat.FirstCluster = (unsigned short)(FirstCluster & 0x0000FFFF);
|
||||||
Fcb->entry.Fat.FirstClusterHigh = (unsigned short)((FirstCluster & 0xFFFF0000) >> 16);
|
Fcb->entry.Fat.FirstClusterHigh = FirstCluster >> 16;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ASSERT((FirstCluster >> 16) == 0);
|
||||||
|
Fcb->entry.Fat.FirstCluster = (unsigned short)(FirstCluster & 0x0000FFFF);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -669,10 +699,17 @@ VfatSetAllocationSizeInformation(PFILE_OBJECT FileObject,
|
||||||
Fcb->entry.FatX.FirstCluster = 0;
|
Fcb->entry.FatX.FirstCluster = 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
|
if (DeviceExt->FatInfo.FatType == FAT32)
|
||||||
{
|
{
|
||||||
Fcb->entry.Fat.FirstCluster = 0;
|
Fcb->entry.Fat.FirstCluster = 0;
|
||||||
Fcb->entry.Fat.FirstClusterHigh = 0;
|
Fcb->entry.Fat.FirstClusterHigh = 0;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Fcb->entry.Fat.FirstCluster = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
NCluster = Cluster = FirstCluster;
|
NCluster = Cluster = FirstCluster;
|
||||||
Status = STATUS_SUCCESS;
|
Status = STATUS_SUCCESS;
|
||||||
|
@ -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;
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue