/* 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
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)
if (!RtlLeftChild(&NameLink->Links))
{
/* It's absent, insert here and break */
- RtlInsertAsLeftChild(&NameLink->Links, &NameLink->Links);
+ RtlInsertAsLeftChild(&NameLink->Links, &Name->Links);
break;
}
else
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)
/* 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;