mirror of
https://github.com/reactos/reactos.git
synced 2025-02-24 17:34:57 +00:00
[fastfat_new]
- Increase FCB's OpenCount when opening existing FCB too. - Properly compare prefixes in FatInsertName. - Fix a copypaste bug which resulted in an infinite loop while traversing a splay tree of FCB names. - Implement FatiQueryFsSizeInfo. svn path=/trunk/; revision=43654
This commit is contained in:
parent
ca9d484be7
commit
64b8e965ef
2 changed files with 50 additions and 4 deletions
|
@ -423,7 +423,8 @@ SuccComplete:
|
|||
/* Clear the delay close */
|
||||
ClearFlag(Fcb->State, FCB_STATE_DELAY_CLOSE);
|
||||
|
||||
/* Increase global volume counter */
|
||||
/* Increase counters */
|
||||
Fcb->OpenCount++;
|
||||
Vcb->OpenFileCount++;
|
||||
|
||||
// TODO: Handle DeleteOnClose and OpenedAsDos by storing those flags in CCB
|
||||
|
@ -895,8 +896,19 @@ FatInsertName(IN PFAT_IRP_CONTEXT IrpContext,
|
|||
NameLink = CONTAINING_RECORD(*RootNode, FCB_NAME_LINK, Links);
|
||||
while (TRUE)
|
||||
{
|
||||
/* Compare prefixes */
|
||||
Comparison = FatiCompareNames(&NameLink->Name.Ansi, &Name->Name.Ansi);
|
||||
/* Compare the prefix */
|
||||
if (*(PUCHAR)NameLink->Name.Ansi.Buffer != *(PUCHAR)&Name->Name.Ansi.Buffer)
|
||||
{
|
||||
if (*(PUCHAR)NameLink->Name.Ansi.Buffer < *(PUCHAR)&Name->Name.Ansi.Buffer)
|
||||
Comparison = LessThan;
|
||||
else
|
||||
Comparison = GreaterThan;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Perform real comparison */
|
||||
Comparison = FatiCompareNames(&NameLink->Name.Ansi, &Name->Name.Ansi);
|
||||
}
|
||||
|
||||
/* Check the bad case first */
|
||||
if (Comparison == EqualTo)
|
||||
|
@ -912,7 +924,7 @@ FatInsertName(IN PFAT_IRP_CONTEXT IrpContext,
|
|||
if (!RtlLeftChild(&NameLink->Links))
|
||||
{
|
||||
/* It's absent, insert here and break */
|
||||
RtlInsertAsLeftChild(&NameLink->Links, &NameLink->Links);
|
||||
RtlInsertAsLeftChild(&NameLink->Links, &Name->Links);
|
||||
break;
|
||||
}
|
||||
else
|
||||
|
|
|
@ -53,6 +53,36 @@ FatiQueryFsVolumeInfo(PVCB Vcb,
|
|||
return Status;
|
||||
}
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
FatiQueryFsSizeInfo(PVCB Vcb,
|
||||
PFILE_FS_SIZE_INFORMATION Buffer,
|
||||
PLONG Length)
|
||||
{
|
||||
FF_PARTITION *Partition;
|
||||
NTSTATUS Status = STATUS_SUCCESS;
|
||||
|
||||
/* Deduct the minimum written length */
|
||||
*Length -= sizeof(FILE_FS_SIZE_INFORMATION);
|
||||
|
||||
/* Zero it */
|
||||
RtlZeroMemory(Buffer, sizeof(FILE_FS_SIZE_INFORMATION));
|
||||
|
||||
/* Reference FullFAT's partition */
|
||||
Partition = Vcb->Ioman->pPartition;
|
||||
|
||||
/* Set values */
|
||||
Buffer->AvailableAllocationUnits.LowPart = Partition->FreeClusterCount;
|
||||
Buffer->TotalAllocationUnits.LowPart = Partition->NumClusters;
|
||||
Buffer->SectorsPerAllocationUnit = Vcb->Bpb.SectorsPerCluster;
|
||||
Buffer->BytesPerSector = Vcb->Bpb.BytesPerSector;
|
||||
|
||||
DPRINT1("Total %d, free %d, SPC %d, BPS %d\n", Partition->FreeClusterCount,
|
||||
Partition->NumClusters, Vcb->Bpb.SectorsPerCluster, Vcb->Bpb.BytesPerSector);
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
FatiQueryVolumeInfo(PFAT_IRP_CONTEXT IrpContext, PIRP Irp)
|
||||
|
@ -105,6 +135,10 @@ FatiQueryVolumeInfo(PFAT_IRP_CONTEXT IrpContext, PIRP Irp)
|
|||
/* Call FsVolumeInfo handler */
|
||||
Status = FatiQueryFsVolumeInfo(Vcb, Buffer, &Length);
|
||||
break;
|
||||
case FileFsSizeInformation:
|
||||
/* Call FsVolumeInfo handler */
|
||||
Status = FatiQueryFsSizeInfo(Vcb, Buffer, &Length);
|
||||
break;
|
||||
default:
|
||||
DPRINT1("Volume information class %d is not supported!\n", InfoClass);
|
||||
UNIMPLEMENTED;
|
||||
|
|
Loading…
Reference in a new issue