57 BitmapRecord = ExAllocateFromNPagedLookasideList(&DeviceExt->FileRecLookasideList);
58 if (BitmapRecord ==
NULL)
68 ExFreeToNPagedLookasideList(&DeviceExt->FileRecLookasideList, BitmapRecord);
73 DeviceExt->BitmapContext =
NULL;
79 BitmapSize * 8 < DeviceExt->NtfsInfo.ClusterCount ||
80 DeviceExt->NtfsInfo.ClusterCount >
MAXULONG)
82 DPRINT1(
"$Bitmap size %I64u does not cover %I64u clusters\n",
83 BitmapSize, DeviceExt->NtfsInfo.ClusterCount);
91 if (DeviceExt->BitmapBuffer ==
NULL)
100 DPRINT1(
"Unable to read $Bitmap\n");
105 DeviceExt->BitmapSize = (
ULONG)BitmapSize;
113 DPRINT(
"Volume bitmap loaded: %I64u of %I64u clusters free\n",
114 DeviceExt->FreeClusterCount, DeviceExt->NtfsInfo.ClusterCount);
135 if (DeviceExt->BitmapBuffer !=
NULL)
138 DeviceExt->BitmapBuffer =
NULL;
141 if (DeviceExt->BitmapContext !=
NULL)
144 DeviceExt->BitmapContext =
NULL;
177 ASSERT(ClusterCount != 0);
184 DeviceExt->BitmapContext,
197 DPRINT(
"NtfsGetFreeClusters(%p)\n", DeviceExt);
214 ULONG FirstDesiredCluster,
215 ULONG DesiredClusters,
216 PULONG FirstAssignedCluster,
223 DPRINT(
"NtfsAllocateClusters(%p, %lu, %lu, %p, %p)\n", DeviceExt, FirstDesiredCluster, DesiredClusters, FirstAssignedCluster, AssignedClusters);
225 *AssignedClusters = 0;
231 if (DeviceExt->FreeClusterCount < DesiredClusters)
238 if (FirstDesiredCluster >=
Bitmap->SizeOfBitMap)
239 FirstDesiredCluster = 0;
246 if (AssignedRun != 0xFFFFFFFF)
248 *FirstAssignedCluster = AssignedRun;
249 *AssignedClusters = DesiredClusters;
256 if (*AssignedClusters == 0)
262 if (*AssignedClusters == 0)
269 *AssignedClusters =
min(*AssignedClusters, DesiredClusters);
276 DeviceExt->FreeClusterCount -= *AssignedClusters;
282 *AssignedClusters = 0;
298 DPRINT(
"NtfsGetFsVolumeInformation() called\n");
304 DPRINT(
"Required length %lu\n",
306 DPRINT(
"LabelLength %hu\n",
332 DPRINT(
"NtfsGetFsVolumeInformation() done\n");
346 DPRINT(
"NtfsGetFsAttributeInformation()\n");
347 DPRINT(
"FsAttributeInfo = %p\n", FsAttributeInfo);
364 DPRINT(
"Finished NtfsGetFsAttributeInformation()\n");
382 DPRINT(
"NtfsGetFsSizeInformation()\n");
383 DPRINT(
"FsSizeInfo = %p\n", FsSizeInfo);
395 DPRINT(
"Finished NtfsGetFsSizeInformation()\n");
409 DPRINT(
"NtfsGetFsDeviceInformation()\n");
410 DPRINT(
"FsDeviceInfo = %p\n", FsDeviceInfo);
420 DPRINT(
"NtfsGetFsDeviceInformation() finished.\n");
441 DPRINT(
"NtfsQueryVolumeInformation() called\n");
458 SystemBuffer =
Irp->AssociatedIrp.SystemBuffer;
462 DPRINT(
"SystemBuffer %p\n", SystemBuffer);
497 Irp->IoStatus.Information =
500 Irp->IoStatus.Information = 0;
511 DPRINT(
"NtfsSetVolumeInformation() called\n");
517 Irp->IoStatus.Information = 0;
static _Out_opt_ PULONGLONG Start
#define STATUS_NOT_SUPPORTED
#define RtlInitializeBitMap
#define RtlFindNextForwardRunClear
#define RtlFindClearBitsAndSet
#define RtlFindLongestRunClear
#define RtlNumberOfClearBits
#define NT_SUCCESS(StatCode)
NTSTATUS FreeClusters(PNTFS_VCB Vcb, PNTFS_ATTR_CONTEXT AttrContext, ULONG AttrOffset, PFILE_RECORD_HEADER FileRecord, ULONG ClustersToFree)
FORCEINLINE NTSTATUS NtfsMarkIrpContextForQueue(PNTFS_IRP_CONTEXT IrpContext)
#define IRPCONTEXT_CANWAIT
#define ExAllocatePoolWithTag(hernya, size, tag)
#define ExAcquireResourceExclusiveLite(res, wait)
#define ExAcquireResourceSharedLite(res, wait)
#define ROUND_UP(n, align)
#define ROUND_DOWN(n, align)
#define BooleanFlagOn(F, SF)
_Must_inspect_result_ _In_ PFILE_OBJECT _In_ ULONG _In_ FS_INFORMATION_CLASS FsInformationClass
#define FILE_READ_ONLY_VOLUME
struct _FILE_FS_ATTRIBUTE_INFORMATION FILE_FS_ATTRIBUTE_INFORMATION
@ FileFsDeviceInformation
@ FileFsAttributeInformation
@ FileFsVolumeInformation
struct _FILE_FS_SIZE_INFORMATION FILE_FS_SIZE_INFORMATION
enum _FSINFOCLASS FS_INFORMATION_CLASS
#define FILE_CASE_PRESERVED_NAMES
#define FILE_UNICODE_ON_DISK
#define KeLeaveCriticalRegion()
#define KeEnterCriticalRegion()
NTSTATUS ReadFileRecord(PDEVICE_EXTENSION Vcb, ULONGLONG index, PFILE_RECORD_HEADER file)
VOID ReleaseAttributeContext(PNTFS_ATTR_CONTEXT Context)
ULONGLONG AttributeDataLength(PNTFS_ATTR_RECORD AttrRecord)
NTSTATUS FindAttribute(PDEVICE_EXTENSION Vcb, PFILE_RECORD_HEADER MftRecord, ULONG Type, PCWSTR Name, ULONG NameLength, PNTFS_ATTR_CONTEXT *AttrCtx, PULONG Offset)
ULONG ReadAttribute(PDEVICE_EXTENSION Vcb, PNTFS_ATTR_CONTEXT Context, ULONGLONG Offset, PCHAR Buffer, ULONG Length)
NTSTATUS WriteAttribute(PDEVICE_EXTENSION Vcb, PNTFS_ATTR_CONTEXT Context, ULONGLONG Offset, const PUCHAR Buffer, ULONG Length, PULONG RealLengthWritten, PFILE_RECORD_HEADER FileRecord)
#define memcpy(s1, s2, n)
#define ExFreePoolWithTag(_P, _T)
static FsInfoType * FsVolumeInfo(char *fpath)
struct _FILE_FS_DEVICE_INFORMATION FILE_FS_DEVICE_INFORMATION
#define UNREFERENCED_PARAMETER(P)
NTSTATUS NtfsWriteVolumeBitmap(_In_ PDEVICE_EXTENSION DeviceExt, _In_ ULONG FirstCluster, _In_ ULONG ClusterCount)
static NTSTATUS NtfsGetFsDeviceInformation(PDEVICE_OBJECT DeviceObject, PFILE_FS_DEVICE_INFORMATION FsDeviceInfo, PULONG BufferLength)
NTSTATUS NtfsLoadVolumeBitmap(_In_ PDEVICE_EXTENSION DeviceExt)
ULONGLONG NtfsGetFreeClusters(PDEVICE_EXTENSION DeviceExt)
static NTSTATUS NtfsGetFsVolumeInformation(PDEVICE_OBJECT DeviceObject, PFILE_FS_VOLUME_INFORMATION FsVolumeInfo, PULONG BufferLength)
static NTSTATUS NtfsGetFsAttributeInformation(PDEVICE_EXTENSION DeviceExt, PFILE_FS_ATTRIBUTE_INFORMATION FsAttributeInfo, PULONG BufferLength)
NTSTATUS NtfsQueryVolumeInformation(PNTFS_IRP_CONTEXT IrpContext)
NTSTATUS NtfsSetVolumeInformation(PNTFS_IRP_CONTEXT IrpContext)
VOID NtfsFreeVolumeBitmap(_In_ PDEVICE_EXTENSION DeviceExt)
static NTSTATUS NtfsGetFsSizeInformation(PDEVICE_OBJECT DeviceObject, PFILE_FS_SIZE_INFORMATION FsSizeInfo, PULONG BufferLength)
NTSTATUS NtfsAllocateClusters(PDEVICE_EXTENSION DeviceExt, ULONG FirstDesiredCluster, ULONG DesiredClusters, PULONG FirstAssignedCluster, PULONG AssignedClusters)
VOID FASTCALL ExReleaseResourceLite(IN PERESOURCE Resource)
#define STATUS_BUFFER_OVERFLOW
PDEVICE_OBJECT DeviceObject
#define RtlZeroMemory(Destination, Length)
#define STATUS_UNSUCCESSFUL
#define STATUS_INFO_LENGTH_MISMATCH
#define STATUS_FILE_CORRUPT_ERROR
#define STATUS_INSUFFICIENT_RESOURCES
_In_ PDEVICE_OBJECT DeviceObject
_Must_inspect_result_ _In_ WDFDEVICE _In_ DEVICE_REGISTRY_PROPERTY _In_ ULONG BufferLength
_In_ WDFREQUEST _In_ PIO_STACK_LOCATION Stack
struct _FILE_FS_VOLUME_INFORMATION FILE_FS_VOLUME_INFORMATION