- if (Fcb != NULL && Fcb->Flags & FCB_IS_PAGE_FILE)
- {
- ULONG i;
- PULONG FatChain;
- NTSTATUS Status;
- DPRINT("NextCluster(Fcb %x, FirstCluster %x, Extend %d)\n", Fcb,
- FirstCluster, Extend);
- if (Fcb->FatChainSize == 0)
- {
- /* Paging file with zero length. */
- *CurrentCluster = 0xffffffff;
- if (Extend)
- {
- Fcb->FatChain = ExAllocatePool(NonPagedPool, sizeof(ULONG));
- if (Fcb->FatChain == NULL)
- {
- return(STATUS_NO_MEMORY);
- }
- Status = GetNextCluster(DeviceExt, 0, CurrentCluster, TRUE);
- if (!NT_SUCCESS(Status))
- {
- ExFreePool(Fcb->FatChain);
- return(Status);
- }
- Fcb->FatChain[0] = *CurrentCluster;
- Fcb->FatChainSize = 1;
- return Status;
- }
- else
- {
- return STATUS_UNSUCCESSFUL;
- }
- }
- else
- {
- for (i = 0; i < Fcb->FatChainSize; i++)
- {
- if (Fcb->FatChain[i] == *CurrentCluster)
- break;
- }
- if (i >= Fcb->FatChainSize)
- {
- return STATUS_UNSUCCESSFUL;
- }
- if (i == Fcb->FatChainSize - 1)
- {
- if (Extend)
- {
- FatChain = ExAllocatePool(NonPagedPool,
- (i + 2) * sizeof(ULONG));
- if (!FatChain)
- {
- *CurrentCluster = 0xffffffff;
- return STATUS_NO_MEMORY;
- }
- Status = GetNextCluster(DeviceExt, *CurrentCluster,
- CurrentCluster, TRUE);
- if (NT_SUCCESS(Status) && *CurrentCluster != 0xffffffff)
- {
- memcpy(FatChain, Fcb->FatChain, (i + 1) * sizeof(ULONG));
- FatChain[i + 1] = *CurrentCluster;
- ExFreePool(Fcb->FatChain);
- Fcb->FatChain = FatChain;
- Fcb->FatChainSize = i + 2;
- }
- else
- {
- ExFreePool(FatChain);
- }
- return Status;
- }
- else
- {
- *CurrentCluster = 0xffffffff;
- return STATUS_SUCCESS;
- }
- }
- *CurrentCluster = Fcb->FatChain[i + 1];
- return STATUS_SUCCESS;
- }
- }
- if (FirstCluster == 1)