PFILE_RECORD_HEADER BitmapRecord;
PNTFS_ATTR_CONTEXT DataContext;
ULONGLONG BitmapDataSize;
- PCHAR BitmapData;
+ PUCHAR BitmapData;
ULONGLONG FreeClusters = 0;
RTL_BITMAP Bitmap;
+ ULONG AssignedRun;
+ ULONG LengthWritten;
DPRINT1("NtfsAllocateClusters(%p, %lu, %lu, %p, %p)\n", DeviceExt, FirstDesiredCluster, DesiredClusters, FirstAssignedCluster, AssignedClusters);
RtlInitializeBitMap(&Bitmap, (PULONG)BitmapData, DeviceExt->NtfsInfo.ClusterCount);
FreeClusters = RtlNumberOfClearBits(&Bitmap);
- if (FreeClusters >= DesiredClusters)
+ if (FreeClusters < DesiredClusters)
{
- // TODO: Observe MFT reservation zone
+ ReleaseAttributeContext(DataContext);
+
+ ExFreePoolWithTag(BitmapData, TAG_NTFS);
+ ExFreePoolWithTag(BitmapRecord, TAG_NTFS);
+ return STATUS_DISK_FULL;
+ }
+
+ // TODO: Observe MFT reservation zone
- // Can we get one contiguous run?
- ULONG AssignedRun = RtlFindClearBitsAndSet(&Bitmap, DesiredClusters, FirstDesiredCluster);
- ULONG LengthWritten;
+ // Can we get one contiguous run?
+ AssignedRun = RtlFindClearBitsAndSet(&Bitmap, DesiredClusters, FirstDesiredCluster);
- if (AssignedRun != 0xFFFFFFFF)
+ if (AssignedRun != 0xFFFFFFFF)
+ {
+ *FirstAssignedCluster = AssignedRun;
+ *AssignedClusters = DesiredClusters;
+ }
+ else
+ {
+ // we can't get one contiguous run
+ *AssignedClusters = RtlFindNextForwardRunClear(&Bitmap, FirstDesiredCluster, FirstAssignedCluster);
+
+ if (*AssignedClusters == 0)
{
- *FirstAssignedCluster = AssignedRun;
- *AssignedClusters = DesiredClusters;
+ // we couldn't find any runs starting at DesiredFirstCluster
+ *AssignedClusters = RtlFindLongestRunClear(&Bitmap, FirstAssignedCluster);
}
- else
- {
- // we can't get one contiguous run
- *AssignedClusters = RtlFindNextForwardRunClear(&Bitmap, FirstDesiredCluster, FirstAssignedCluster);
-
- if (*AssignedClusters == 0)
- {
- // we couldn't find any runs starting at DesiredFirstCluster
- *AssignedClusters = RtlFindLongestRunClear(&Bitmap, FirstAssignedCluster);
- }
- }
-
- Status = WriteAttribute(DeviceExt, DataContext, 0, BitmapData, (ULONG)BitmapDataSize, &LengthWritten);
}
- else
- Status = STATUS_DISK_FULL;
-
-
+
+ Status = WriteAttribute(DeviceExt, DataContext, 0, BitmapData, (ULONG)BitmapDataSize, &LengthWritten);
+
ReleaseAttributeContext(DataContext);
ExFreePoolWithTag(BitmapData, TAG_NTFS);