24#define BugCheckFileId (FAT_BUG_CHECK_FSCTRL)
30#define Dbg (DEBUG_TRACE_FSCTRL)
119FatInvalidateVolumes (
125FatScanForDismountedVcb (
141FatQueryRetrievalPointers (
173FatGetRetrievalPointerBase (
193FatSetPurgeFailureMode (
211FatGetRetrievalPointers (
218FatMoveFileNeedsWriteThrough (
237 ULONG BytesToReallocate,
238 PULONG FirstSpliceSourceCluster,
239 PULONG FirstSpliceTargetCluster,
240 PULONG SecondSpliceSourceCluster,
241 PULONG SecondSpliceTargetCluster,
247FatComputeMoveFileParameter (
276#pragma alloc_text(PAGE, FatAddMcbEntry)
277#pragma alloc_text(PAGE, FatAllowExtendedDasdIo)
278#pragma alloc_text(PAGE, FatCommonFileSystemControl)
279#pragma alloc_text(PAGE, FatComputeMoveFileParameter)
280#pragma alloc_text(PAGE, FatComputeMoveFileSplicePoints)
281#pragma alloc_text(PAGE, FatDirtyVolume)
282#pragma alloc_text(PAGE, FatFsdFileSystemControl)
283#pragma alloc_text(PAGE, FatGetRetrievalPointerBase)
284#pragma alloc_text(PAGE, FatGetBootAreaInfo)
285#pragma alloc_text(PAGE, FatMarkHandle)
286#pragma alloc_text(PAGE, FatGetRetrievalPointers)
287#pragma alloc_text(PAGE, FatGetStatistics)
288#pragma alloc_text(PAGE, FatGetVolumeBitmap)
289#pragma alloc_text(PAGE, FatIsMediaWriteProtected)
290#pragma alloc_text(PAGE, FatIsPathnameValid)
291#pragma alloc_text(PAGE, FatIsVolumeDirty)
292#pragma alloc_text(PAGE, FatIsVolumeMounted)
293#pragma alloc_text(PAGE, FatLockVolume)
294#pragma alloc_text(PAGE, FatLookupLastMcbEntry)
295#pragma alloc_text(PAGE, FatGetNextMcbEntry)
296#pragma alloc_text(PAGE, FatMountVolume)
297#pragma alloc_text(PAGE, FatMoveFileNeedsWriteThrough)
298#pragma alloc_text(PAGE, FatMoveFile)
299#pragma alloc_text(PAGE, FatOplockRequest)
300#pragma alloc_text(PAGE, FatPerformVerifyDiskRead)
301#pragma alloc_text(PAGE, FatQueryBpb)
302#pragma alloc_text(PAGE, FatQueryRetrievalPointers)
303#pragma alloc_text(PAGE, FatRemoveMcbEntry)
304#pragma alloc_text(PAGE, FatScanForDismountedVcb)
305#pragma alloc_text(PAGE, FatFlushAndCleanVolume)
306#pragma alloc_text(PAGE, FatSearchBufferForLabel)
307#pragma alloc_text(PAGE, FatSetPurgeFailureMode)
308#pragma alloc_text(PAGE, FatUnlockVolume)
309#pragma alloc_text(PAGE, FatUserFsCtrl)
310#pragma alloc_text(PAGE, FatVerifyLookupFatEntry)
311#pragma alloc_text(PAGE, FatVerifyVolume)
330#define MCB_SCALE_LOG2 (Vcb->AllocationSupport.LogOfBytesPerSector)
331#define MCB_SCALE (1 << MCB_SCALE_LOG2)
332#define MCB_SCALE_MODULO (MCB_SCALE - 1)
398 if (
Mcb != &
Vcb->DirtyFatMcb) {
399 NT_ASSERT( FatNonSparseMcb(
Vcb,
Mcb, &SparseVbo, &SparseByteCount ) ||
408 if (
Mcb != &
Vcb->DirtyFatMcb) {
409 NT_ASSERT( FatNonSparseMcb(
Vcb,
Mcb, &SparseVbo, &SparseByteCount ) ||
445 if ((
ULONG) LiLbo != -1) {
520 if (((
ULONG) LiLbo) != -1) {
570 if (((
ULONG) LiLbo) != -1) {
581 if ((*
ByteCount == 0) && (LiSectorCount != 0)) {
639FatFsdFileSystemControl (
720 Status = FatCommonFileSystemControl( IrpContext,
Irp );
751FatCommonFileSystemControl (
799 Status = FatUserFsCtrl( IrpContext,
Irp );
804 Status = FatMountVolume( IrpContext,
824 Status = FatVerifyVolume( IrpContext,
Irp );
920 ULONG ChangeCount = 0;
927#if (NTDDI_VERSION > NTDDI_WIN8)
928 GUID VolumeGuid = {0};
1016 &PartitionInformation,
1032 FatScanForDismountedVcb( IrpContext );
1044 MountNewVolume =
FALSE;
1053#pragma prefast( push )
1054#pragma prefast( disable: 28137, "prefast wants the wait to be a constant, but that isn't possible for the way fastfat is designed" )
1055#pragma prefast( disable: 28193, "this will always wait" )
1061#pragma prefast( pop )
1095 VolDo->OverflowQueueCount = 0;
1098 VolDo->PostedRequestCount = 0;
1133#pragma prefast( suppress: 28175, "this is a filesystem driver, touching SectorSize is fine" )
1157 RealDevice =
Vpb->RealDevice;
1163 WeClearedVerifyRequiredBit =
TRUE;
1170 FatInitializeVcb( IrpContext,
1221#if (NTDDI_VERSION > NTDDI_WIN8)
1226 if (
NT_SUCCESS( IoVolumeDeviceToGuid(
Vcb->TargetDeviceObject, &VolumeGuid ))) {
1242 if (
Vcb->VolumeGuidPath.Buffer) {
1244 Vcb->VolumeGuidPath.Buffer =
NULL;
1245 Vcb->VolumeGuidPath.Length =
Vcb->VolumeGuidPath.MaximumLength = 0;
1248 IoVolumeDeviceToGuidPath(
Vcb->TargetDeviceObject, &
Vcb->VolumeGuidPath );
1284 (
Vcb->Bpb.Sectors != 0 &&
1285 Vcb->Bpb.Sectors < 0x80)) {
1287 DebugTrace( 0,
Dbg,
"OS/2 Boot Manager volume detected, volume not mounted. \n", 0 );
1315 if (
Vcb->Bpb.Sectors != 0) {
Vcb->Bpb.LargeSectors = 0; }
1332 Vcb->First0x24BytesOfBootSector =
1366 if (
Vcb->Bpb.FsInfoSector >=
Vcb->Bpb.ReservedSectors) {
1368 Vcb->Bpb.FsInfoSector = 0;
1386 FatCreateRootDcb( IrpContext,
Vcb );
1417 FatLocateVolumeLabel( IrpContext,
1425 UCHAR OemBuffer[11];
1471 Vpb->VolumeLabelLength = 0;
1480 Vcb->ChangeCount = ChangeCount;
1490 Links = Links->
Flink) {
1493 OldVpb = OldVcb->
Vpb;
1499 if (OldVpb ==
Vpb) {
continue; }
1515 &
Vpb->VolumeLabel[0],
1516 Vpb->VolumeLabelLength)) &&
1522 LargeSectorsPerFat) ))) {
1562#pragma prefast( suppress: 28175, "touching Vpb is ok for a filesystem" )
1579 if (*IrpVpb ==
Vpb) {
1606 DebugTrace(0,
Dbg,
"Truncate and reinitialize the volume file\n", 0);
1724 MountNewVolume =
TRUE;
1736 RootDirectoryFile =
Vcb->RootDcb->Specific.Dcb.DirectoryFile;
1762 if ( !MountNewVolume ) {
1770 FatCheckForDismount( IrpContext,
1774 IrpContext->Vcb =
NULL;
1776 }
else if (VolDo !=
NULL) {
1796 FatCheckForDismount( IrpContext,
1802 if ( WeClearedVerifyRequiredBit ==
TRUE ) {
1818 if (RootDirectoryFile !=
NULL) {
1820#if (NTDDI_VERSION >= NTDDI_WIN8)
1913 LBO RootDirectoryLbo;
1914 ULONG RootDirectorySize;
1917 ULONG ChangeCount = 0;
1940 IrpContext->Vcb =
Vcb = &VolDo->
Vcb;
1965#pragma prefast( push )
1966#pragma prefast( disable: 28137, "prefast wants the wait to be a constant, but that isn't possible for the way fastfat is designed" )
1967#pragma prefast( disable: 28193, "this will always wait" )
1973#pragma prefast( pop )
1999 DebugTrace(0,
Dbg,
"RealDevice has already been verified\n", 0);
2001 VerifyAlreadyDone =
TRUE;
2014 Vcb->TargetDeviceObject,
2017 &PartitionInformation,
2036 Vcb->TargetDeviceObject,
2052 if (AllowRawMount) {
2062 if (
Iosb.Information !=
sizeof(
ULONG)) {
2076 Vcb->ChangeCount = ChangeCount;
2097 Vcb->TargetDeviceObject,
2113 if (AllowRawMount) {
2200 LargeSectorsPerFat) )) {
2255 if (!LabelFound &&
Vpb->VolumeLabelLength > 0) {
2262 ULONG RootDirectoryCluster;
2303 RootDirectoryCluster,
2304 &RootDirectoryCluster );
2327 Vpb->VolumeLabelLength > 0) {
2354 if (!VerifyAlreadyDone) {
2357 ReleaseEntireVolume =
TRUE;
2383 if (!ReleaseEntireVolume) {
2385 ReleaseEntireVolume =
TRUE;
2392 FatPurgeReferencedFileObjects( IrpContext,
Vcb->RootDcb,
NoFlush );
2411 }
else if (!VerifyAlreadyDone) {
2418 if (!ReleaseEntireVolume) {
2420 ReleaseEntireVolume =
TRUE;
2432 FatPurgeReferencedFileObjects( IrpContext,
Vcb->RootDcb,
Flush );
2493 if (ReleaseEntireVolume) {
2607 }
else if (Bpb.
Fats == 0) {
2630 }
else if ((Bpb.
Media != 0xf0) &&
2631 (Bpb.
Media != 0xf8) &&
2632 (Bpb.
Media != 0xf9) &&
2633 (Bpb.
Media != 0xfb) &&
2634 (Bpb.
Media != 0xfc) &&
2635 (Bpb.
Media != 0xfd) &&
2636 (Bpb.
Media != 0xfe) &&
2637 (Bpb.
Media != 0xff) &&
2639 (Bpb.
Media != 0x01) &&
2640 (Bpb.
Media != 0xfa)))) {
2829#if (NTDDI_VERSION >= NTDDI_WIN7)
2830 case FSCTL_REQUEST_OPLOCK:
2832 Status = FatOplockRequest( IrpContext,
Irp );
2837 Status = FatLockVolume( IrpContext,
Irp );
2847 Status = FatDismountVolume( IrpContext,
Irp );
2852 Status = FatDirtyVolume( IrpContext,
Irp );
2870 Status = FatQueryRetrievalPointers( IrpContext,
Irp );
2881#if (NTDDI_VERSION >= NTDDI_WIN7)
2883 Status = FatGetRetrievalPointerBase( IrpContext,
Irp );
2886 case FSCTL_GET_BOOT_AREA_INFO:
2887 Status = FatGetBootAreaInfo( IrpContext,
Irp );
2892 Status = FatGetVolumeBitmap( IrpContext,
Irp );
2896 Status = FatGetRetrievalPointers( IrpContext,
Irp );
2900 Status = FatMoveFile( IrpContext,
Irp );
2908 Status = FatMarkHandle( IrpContext,
Irp );
2911#if (NTDDI_VERSION >= NTDDI_WIN8)
2913 case FSCTL_SET_PURGE_FAILURE_MODE:
2914 Status = FatSetPurgeFailureMode( IrpContext,
Irp );
2920#if (NTDDI_VERSION >= NTDDI_WIN7)
2976 ULONG OplockCount = 0;
2983#if (NTDDI_VERSION >= NTDDI_WIN7)
3016 DebugTrace(-1,
Dbg,
"FatOplockRequest -> STATUS_INVALID_PARAMETER\n", 0);
3020#if (NTDDI_VERSION >= NTDDI_WIN7)
3029 InputBuffer = (PREQUEST_OPLOCK_INPUT_BUFFER)
Irp->AssociatedIrp.SystemBuffer;
3041 DebugTrace(-1,
Dbg,
"FatOplockRequest -> STATUS_BUFFER_TOO_SMALL\n", 0);
3053 !FsRtlOplockIsSharedRequest(
Irp ))) {
3056 DebugTrace(-1,
Dbg,
"FatOplockRequest -> STATUS_INVALID_PARAMETER\n", 0);
3090 FatAcquireSharedVcb( IrpContext,
Fcb->
Vcb );
3092 FatAcquireExclusiveFcb( IrpContext,
Fcb );
3095#if (NTDDI_VERSION >= NTDDI_WIN7)
3096 if (FsRtlOplockIsSharedRequest(
Irp )) {
3112#if (NTDDI_VERSION >= NTDDI_WIN8)
3114#elif (NTDDI_VERSION >= NTDDI_WIN7)
3115 OplockCount = (
ULONG) FsRtlAreThereCurrentOrInProgressFileLocks( &
Fcb->
Specific.
Fcb.FileLock );
3137 FatAcquireSharedFcb( IrpContext,
Fcb );
3139#if (NTDDI_VERSION >= NTDDI_WIN7)
3155#pragma prefast( suppress:28159, "things are seriously wrong if we get here" )
3433FatLockVolumeInternal (
3495 FatPurgeReferencedFileObjects( IrpContext,
Vcb->RootDcb,
Flush );
3530 FatPurgeReferencedFileObjects( IrpContext,
Vcb->RootDcb,
Flush );
3567 (
Vcb->Vpb->ReferenceCount <= 2 + RemainingUserReferences) &&
3646 Vcb->FileObjectWithVcbLocked =
NULL;
3774#pragma prefast( push )
3775#pragma prefast( disable: 28137, "prefast wants the wait to be a constant, but that isn't possible for the way fastfat is designed" )
3776#pragma prefast( disable: 28193, "this will always wait" )
3782#pragma prefast( pop )
3836#if (NTDDI_VERSION >= NTDDI_WIN8)
3838 FsRtlDismountComplete(
Vcb->TargetDeviceObject,
Status );
3954 DebugTrace(-1,
Dbg,
"FatDirtyVolume -> STATUS_SUCCESS\n", 0);
4010 if (
Irp->AssociatedIrp.SystemBuffer !=
NULL) {
4014 }
else if (
Irp->MdlAddress !=
NULL) {
4084 Irp->IoStatus.Information =
sizeof(
ULONG );
4254 if (
Vcb->First0x24BytesOfBootSector ==
NULL) {
4283 Vcb->First0x24BytesOfBootSector,
4286 Irp->IoStatus.Information = 0x24;
4300FatInvalidateVolumes (
4357#if defined(_WIN64) && defined(BUILD_WOW64_ENABLED)
4358 if (IoIs32bitProcess(
Irp )) {
4380#
if defined(_WIN64) && defined(BUILD_WOW64_ENABLED)
4392 (
PVOID *)&FileToMarkBad,
4415 DeviceToMarkBad = FileToMarkBad->DeviceObject;
4425#pragma prefast( push )
4426#pragma prefast( disable: 28137, "prefast wants the wait to be a constant, but that isn't possible for the way fastfat is designed" )
4427#pragma prefast( disable: 28193, "this will always wait" )
4433#pragma prefast( pop )
4452 Links = Links->
Flink;
4473#pragma prefast( push )
4474#pragma prefast( disable: 28175, "touching Vpb is ok for a filesystem" )
4477 if (ExistingVcb->
Vpb == DeviceToMarkBad->Vpb) {
4487 NewVpb = ExistingVcb->
SwapVpb;
4497 DeviceToMarkBad->Vpb = NewVpb;
4503#pragma prefast( pop )
4534 FatPurgeReferencedFileObjects( &IrpContext,
4540 VcbDeleted = FatCheckForDismount( &IrpContext, ExistingVcb,
FALSE );
4558 DebugTrace(-1,
Dbg,
"FatInvalidateVolumes -> STATUS_SUCCESS\n", 0);
4631 Vcb->TargetDeviceObject,
4633 NumberOfBytesToRead,
4676 if (ReturnOnError) {
4700FatQueryRetrievalPointers (
4787 MappingPairs =
Irp->UserBuffer;
4793 FatAcquireExclusiveFcb( IrpContext,
Fcb );
4801 FatVerifyFcb( IrpContext,
Fcb );
4807 if ((*RequestedMapSize).QuadPart >
Fcb->
Header.FileSize.QuadPart) {
4821 RequestedMapSize->
LowPart - 1,
4842 MapSize = RequestedMapSize->
LowPart;
4853 (*MappingPairs)[
i*2 + 1 ].QuadPart =
Lbo;
4858 (*MappingPairs)[
i*2 + 0 ].QuadPart = 0;
4940 Buffer =
Irp->AssociatedIrp.SystemBuffer;
5036 ULONG TotalClusters;
5037 ULONG DesiredClusters;
5038 ULONG StartingCluster;
5039 ULONG EndingCluster;
5053 DebugTrace(+1,
Dbg,
"FatGetVolumeBitmap, FsControlCode = %08lx\n",
5101 TotalClusters =
Vcb->AllocationSupport.NumberOfClusters;
5136 StartingCluster = StartingLcn.
LowPart & ~7;
5146 DesiredClusters = TotalClusters - StartingCluster;
5180 if (
Vcb->NumberOfWindows == 1) {
5189 (
PUCHAR)
Vcb->FreeClusterBitMap.Buffer + StartingCluster/8,
5205 EndingCluster = StartingCluster + (
BytesToCopy * 8);
5211 if (EndingCluster > TotalClusters) {
5213 EndingCluster = TotalClusters;
5218 StartingCluster + 2,
5219 EndingCluster + 2 - 1,
5256FatGetRetrievalPointers (
5292 ULONG ClusterShift = 0;
5318 DebugTrace(+1,
Dbg,
"FatGetRetrievalPointers, FsControlCode = %08lx\n",
5397 FatVerifyFcb( IrpContext,
FcbOrDcb );
5405 FatLookupFileAllocationSize( IrpContext,
FcbOrDcb );
5421 ClusterShift =
Vcb->AllocationSupport.LogOfBytesPerCluster;
5424#pragma prefast( suppress:28931, "calculate it anyway, in case someone adds code that uses this in the future" )
5445 ClusterShift =
Vcb->AllocationSupport.LogOfBytesPerCluster;
5459 McbToUse = &
Vcb->BadBlockMcb;
5503 StartingVcn.
LowPart << ClusterShift,
5509#pragma prefast( suppress:28159, "things are seriously wrong if we get here" )
5564#pragma prefast( suppress:28159, "things are seriously wrong if we get here" )
5584 OutputBuffer->StartingVcn.QuadPart = Vcn >> ClusterShift;
5631 DebugTrace(-1,
Dbg,
"FatGetRetrievalPointers -> VOID\n", 0);
5644FatMoveFileNeedsWriteThrough (
5664 IrpContext->Flags |= OldWriteThroughFlags;
5717 ULONG TargetCluster;
5723 ULONG BytesToReallocate;
5725 ULONG FirstSpliceSourceCluster;
5726 ULONG FirstSpliceTargetCluster;
5727 ULONG SecondSpliceSourceCluster;
5728 ULONG SecondSpliceTargetCluster;
5750#if defined(_WIN64) && defined(BUILD_WOW64_ENABLED)
5752 PMOVE_FILE_DATA32 MoveFileData32;
5755 ULONG LocalAbnormalTermination = 0;
5802#
if defined(_WIN64) && defined(BUILD_WOW64_ENABLED)
5803 if (IoIs32bitProcess(
Irp )) {
5814 LocalMoveFileData.
StartingVcn = MoveFileData32->StartingVcn;
5815 LocalMoveFileData.
StartingLcn = MoveFileData32->StartingLcn;
5816 LocalMoveFileData.
ClusterCount = MoveFileData32->ClusterCount;
5827#if defined(_WIN64) && defined(BUILD_WOW64_ENABLED)
5831 MaxClusters =
Vcb->AllocationSupport.NumberOfClusters;
5832 TargetCluster =
InputBuffer->StartingLcn.LowPart + 2;
5836 (TargetCluster < 2) ||
5837 (TargetCluster +
InputBuffer->ClusterCount < TargetCluster) ||
5838 (TargetCluster +
InputBuffer->ClusterCount > MaxClusters + 2) ||
5839 (
InputBuffer->StartingVcn.LowPart >= MaxClusters) ||
5930 FatMoveFileNeedsWriteThrough(IrpContext,
FcbOrDcb, OldWriteThroughFlags);
5945 ClusterShift =
Vcb->AllocationSupport.LogOfBytesPerCluster;
5958 LargeTargetLbo.
QuadPart = TargetLbo;
5978 SourceMcbInitialized =
TRUE;
5981 TargetMcbInitialized =
TRUE;
6003 FatVerifyFcb( IrpContext,
FcbOrDcb );
6005 FatOpenDirectoryFile( IrpContext,
FcbOrDcb );
6024 FcbAcquired =
FALSE;
6042 ULONG TempByteCount;
6059 if (FcbAcquired ==
FALSE) {
6064 FatVerifyFcb( IrpContext,
FcbOrDcb );
6099 FatComputeMoveFileParameter( IrpContext,
6127 &FirstSpliceSourceCluster,
6128 &FirstSpliceTargetCluster,
6129 &SecondSpliceSourceCluster,
6130 &SecondSpliceTargetCluster,
6138 TempByteCount = BytesToReallocate;
6139 FatAllocateDiskSpace( IrpContext,
6146 DiskSpaceAllocated =
TRUE;
6155 (TempByteCount != BytesToReallocate)) {
6168 if (FatMoveFileDebug) {
6169 DbgPrint(
"0x%p: Vcn 0x%lx, Lcn 0x%lx, Count 0x%lx.\n",
6173 BytesToReallocate >> ClusterShift );
6195 BytesToReallocate >> ClusterShift );
6243 Vcb->TargetDeviceObject,
6250 if (IoIrp ==
NULL) {
6282 Vcb->TargetDeviceObject,
6289 if (IoIrp ==
NULL) {
6333 FatSetFatEntry( IrpContext,
6335 SecondSpliceSourceCluster,
6349 if (FirstSpliceSourceCluster == 0) {
6358 FatGetDirentFromFcbOrDcb( IrpContext,
6368 Dirent->FirstClusterOfFileHi =
6369 (
USHORT)(FirstSpliceTargetCluster >> 16);
6373 FatSetDirtyBcb( IrpContext, DirentBcb,
Vcb,
TRUE );
6384 FatSetFatEntry( IrpContext,
6386 FirstSpliceSourceCluster,
6400 DiskSpaceAllocated =
FALSE;
6406 FatMoveFileNeedsWriteThrough(IrpContext,
FcbOrDcb, OldWriteThroughFlags);
6414 FatDeallocateDiskSpace( IrpContext,
Vcb, &SourceMcb,
FALSE );
6420 Vcb->TargetDeviceObject );
6434 BytesToReallocate );
6439 BytesToReallocate );
6473 FcbAcquired =
FALSE;
6479 TargetCluster += BytesToReallocate >> ClusterShift;
6482 TargetLbo += BytesToReallocate;
6485 LargeTargetLbo.
QuadPart += BytesToReallocate;
6535 if (DiskSpaceAllocated) {
6536 FatDeallocateDiskSpace( IrpContext,
Vcb, &TargetMcb,
FALSE );
6548 if (DirentBcb !=
NULL) {
6556 if (SourceMcbInitialized) {
6560 if (TargetMcbInitialized) {
6578 if (LocalAbnormalTermination && FcbAcquired) {
6641FatComputeMoveFileParameter (
6689 ULONG ValidDataLength;
6690 ULONG ClusterAlignedVDL;
6705 FatLookupFileAllocationSize( IrpContext,
FcbOrDcb );
6733 *BytesToReallocate = 0;
6761 FatLookupFileAllocation( IrpContext,
6776 if (RunByteCount < *BytesToReallocate) {
6778 *BytesToReallocate = RunByteCount;
6785 SourceLbo->QuadPart = RunLbo;
6799 (
FileOffset + *BytesToReallocate > ClusterAlignedVDL)) {
6807 *BytesToWrite = ClusterAlignedVDL -
FileOffset;
6812 *BytesToWrite = *BytesToReallocate;
6878 ULONG SourceBytesInRun;
6879 ULONG SourceBytesRemaining;
6881 ULONG SourceMcbVbo = 0;
6882 ULONG SourceMcbBytesInRun = 0;
6899 *FirstSpliceSourceCluster = 0;
6904 &SourceBytesInRun );
6916 if ((
Result) && (SourceBytesInRun == 1)) {
6929 SourceBytesInRun -= 1;
6953 *FirstSpliceTargetCluster = TargetCluster;
6955 *SecondSpliceSourceCluster =
6956 *FirstSpliceTargetCluster +
6957 (BytesToReallocate >>
Vcb->AllocationSupport.LogOfBytesPerCluster) - 1;
6959 for (SourceBytesRemaining = BytesToReallocate, SourceMcbVbo = 0;
6961 SourceBytesRemaining > 0;
6964 SourceBytesRemaining -= SourceMcbBytesInRun,
6965 SourceMcbVbo += SourceMcbBytesInRun) {
6967 if (SourceMcbVbo != 0) {
6969#pragma prefast( suppress:28931, "needed for debug build" )
6975 &SourceBytesInRun );
6981 SourceMcbBytesInRun =
6982 SourceBytesInRun < SourceBytesRemaining ?
6983 SourceBytesInRun : SourceBytesRemaining;
6988 SourceMcbBytesInRun );
6998 if (SourceMcbBytesInRun < SourceBytesInRun) {
7000 *SecondSpliceTargetCluster =
7009 &SourceBytesInRun )) {
7081#if (NTDDI_VERSION >= NTDDI_WIN7)
7085FatGetRetrievalPointerBase (
7111 PRETRIEVAL_POINTER_BASE RetrievalPointerBase =
NULL;
7137 RetrievalPointerBase =
Irp->AssociatedIrp.SystemBuffer;
7170 FatAcquireSharedVcb(IrpContext,
Vcb);
7173 RetrievalPointerBase->FileAreaOffset.QuadPart =
Vcb->AllocationSupport.FileAreaLbo >>
Vcb->AllocationSupport.LogOfBytesPerSector;
7174 Irp->IoStatus.Information =
sizeof( RETRIEVAL_POINTER_BASE );
7217 PBOOT_AREA_INFO BootAreaInfo =
NULL;
7243 BootAreaInfo =
Irp->AssociatedIrp.SystemBuffer;
7276 FatAcquireSharedVcb(IrpContext,
Vcb);
7281 BootAreaInfo->BootSectorCount = 2;
7282 BootAreaInfo->BootSectors[0].Offset.QuadPart = 0;
7283 BootAreaInfo->BootSectors[1].Offset.QuadPart = 6;
7286 BootAreaInfo->BootSectorCount = 1;
7287 BootAreaInfo->BootSectors[0].Offset.QuadPart = 0;
7290 Irp->IoStatus.Information =
sizeof( BOOT_AREA_INFO );
7335 PMARK_HANDLE_INFO HandleInfo =
NULL;
7339#if defined(_WIN64) && defined(BUILD_WOW64_ENABLED)
7340 MARK_HANDLE_INFO LocalMarkHandleInfo = {0};
7370#if defined(_WIN64) && defined(BUILD_WOW64_ENABLED)
7376 if (IoIs32bitProcess(
Irp )) {
7378 PMARK_HANDLE_INFO32 MarkHandle32;
7386 MarkHandle32 = (PMARK_HANDLE_INFO32)
Irp->AssociatedIrp.SystemBuffer;
7387 LocalMarkHandleInfo.HandleInfo = MarkHandle32->HandleInfo;
7388 LocalMarkHandleInfo.UsnSourceInfo = MarkHandle32->UsnSourceInfo;
7391 HandleInfo = &LocalMarkHandleInfo;
7407 HandleInfo = (PMARK_HANDLE_INFO)
Irp->AssociatedIrp.SystemBuffer;
7409#
if defined(_WIN64) && defined(BUILD_WOW64_ENABLED)
7421 if (
FlagOn( HandleInfo->HandleInfo,
7422 ~(MARK_HANDLE_PROTECT_CLUSTERS)) ||
7423 (
FlagOn( HandleInfo->HandleInfo,
7426 FlagOn(HandleInfo->UsnSourceInfo,
7427 ~(USN_SOURCE_DATA_MANAGEMENT |
7428 USN_SOURCE_AUXILIARY_DATA |
7429 USN_SOURCE_REPLICATION_MANAGEMENT) ) ) {
7446 (
FlagOn( HandleInfo->HandleInfo, MARK_HANDLE_PROTECT_CLUSTERS ) || (HandleInfo->UsnSourceInfo != 0) )) {
7448 if (HandleInfo->VolumeHandle == 0) {
7460 (
PVOID *)&DasdFileObject,
7475 if (DasdFileObject->Vpb !=
Vcb->Vpb) {
7490#pragma prefast( suppress:28931, "convenient for debugging" )
7506 FatAcquireExclusiveFcb(IrpContext,
Fcb);
7509 FatVerifyFcb( IrpContext,
Fcb );
7511 if (HandleInfo->HandleInfo & MARK_HANDLE_PROTECT_CLUSTERS) {
7545FatFlushAndCleanVolume(
7620 (
VOID) FatPurgeReferencedFileObjects( IrpContext,
Vcb->RootDcb,
NoFlush );
7664#if (NTDDI_VERSION >= NTDDI_WIN8)
7669FatSetPurgeFailureMode (
7704 PSET_PURGE_FAILURE_MODE_INPUT SetPurgeInput;
7756 SetPurgeInput = (PSET_PURGE_FAILURE_MODE_INPUT)
Irp->AssociatedIrp.SystemBuffer;
7758 if (!
FlagOn( SetPurgeInput->Flags, SET_PURGE_FAILURE_MODE_ENABLED | SET_PURGE_FAILURE_MODE_DISABLED )) {
7771 FatAcquireExclusiveFcb( IrpContext,
Fcb );
7774 FatVerifyFcb( IrpContext,
Fcb );
7776 if (
FlagOn( SetPurgeInput->Flags, SET_PURGE_FAILURE_MODE_ENABLED )) {
7787 ASSERT(
FlagOn( SetPurgeInput->Flags, SET_PURGE_FAILURE_MODE_DISABLED ));
7859 WCHAR UnicodeBuffer[11];
7863 ULONG VolumeLabelLength;
7864 UCHAR OemBuffer[11];
7876 while (
Dirent < TerminationDirent ) {
7880 Dirent = TerminationDirent;
7900 if (
Dirent >= TerminationDirent) {
7906 *LabelFound =
FALSE;
7951 if ( (VolumeLabelLength != (
ULONG)
Vpb->VolumeLabelLength) ||
7953 &
Vpb->VolumeLabel[0],
7954 VolumeLabelLength)) ) {
7976 ULONG PageEntryOffset;
7977 ULONG OffsetIntoVolumeFile;
7982 NT_ASSERT(
Vcb->AllocationSupport.FatIndexBitSize == 32);
7991 PageEntryOffset = (OffsetIntoVolumeFile %
PAGE_SIZE) /
sizeof(
ULONG);
7998 OffsetIntoVolumeFile & ~(
PAGE_SIZE - 1),
8016FatScanForDismountedVcb (
8051#pragma prefast( push )
8052#pragma prefast( disable: 28137, "prefast wants the wait to be a constant, but that isn't possible for the way fastfat is designed" )
8053#pragma prefast( disable: 28193, "this will always wait" )
8059#pragma prefast( pop )
8072 Links = Links->
Flink;
8080#pragma prefast( push )
8081#pragma prefast( disable:28103,"prefast cannot work out that Vcb->Resource will be released below." )
8082#pragma prefast( disable:28109,"prefast cannot work out the Vcb is not already held" );
8091#pragma prefast( pop )
8097 VcbDeleted = FatCheckForDismount( IrpContext,
8116#if (NTDDI_VERSION >= NTDDI_WIN7)
8171 FatAcquireExclusiveFcb(IrpContext,
FcbOrDcb);
static PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(PIRP Irp)
static CC_FILE_SIZES FileSizes
#define STATUS_PRIVILEGE_NOT_HELD
#define PARTITION_OS2BOOTMGR
#define CC_ENABLE_DISK_IO_ACCOUNTING
_In_ PFCB _In_ LONGLONG FileOffset
_In_ PFCB _In_ PDIRENT_ENUM_CONTEXT _Inout_ PDIRENT Dirent
_Inout_ PFILE_OBJECT _In_ TYPE_OF_OPEN TypeOfOpen
#define CopyUchar4(Dst, Src)
_Inout_ PFILE_OBJECT _In_ TYPE_OF_OPEN PFCB _In_opt_ PCCB Ccb
enum _TYPE_OF_OPEN TYPE_OF_OPEN
#define IOCTL_DISK_CHECK_VERIFY
#define IOCTL_DISK_GET_DRIVE_GEOMETRY
#define IOCTL_DISK_IS_WRITABLE
#define CCB_FLAG_ALLOW_EXTENDED_DASD_IO
#define VCB_STATE_VPB_NOT_ON_DEVICE
#define IRP_CONTEXT_FLAG_WAIT
VOLUME_DEVICE_OBJECT * PVOLUME_DEVICE_OBJECT
#define IRP_CONTEXT_FLAG_DISABLE_POPUPS
#define _Requires_lock_held_(lock)
#define NT_SUCCESS(StatCode)
BOOLEAN NTAPI KeRemoveQueueDpc(IN PKDPC Dpc)
_In_ PIO_STACK_LOCATION IrpSp
#define FatGetIndexFromLbo(VCB, LBO)
#define FAT_DIRENT_ATTR_ARCHIVE
#define FatUnpackBios(Bios, Pbios)
#define FatRootDirectoryLbo(B)
#define FAT_DIRENT_ATTR_VOLUME_ID
#define FatVerifyIndexIsValid(IC, V, I)
#define FatReservedBytes(B)
#define FAT_DIRENT_REALLY_0E5
#define FAT_DIRENT_DELETED
#define FatBytesPerCluster(B)
#define FAT_DIRENT_NEVER_USED
#define FatGetLboFromIndex(VCB, FAT_INDEX)
#define FatRootDirectorySize(B)
#define TAG_OUTPUT_MAPPINGPAIRS
#define TAG_DEFRAG_BUFFER
#define TAG_VERIFY_BOOTSECTOR
#define FatBugCheck(A, B, C)
#define TAG_VERIFY_ROOTDIR
#define TAG_ENTRY_LOOKUP_BUFFER
#define PsGetCurrentThread()
#define KeWaitForSingleObject(pEvt, foo, a, b, c)
struct _DEVICE_OBJECT * PDEVICE_OBJECT
#define KeInitializeEvent(pEvt, foo, foo2)
#define KeSetEvent(pEvt, foo, foo2)
#define ExAcquireResourceExclusiveLite(res, wait)
#define DO_DEVICE_INITIALIZING
#define DO_SYSTEM_BOOT_PARTITION
#define InitializeListHead(ListHead)
#define KeInitializeSpinLock(sl)
VOID NTAPI KeClearEvent(IN PKEVENT Event)
VOID NTAPI ProbeForRead(IN CONST VOID *Address, IN SIZE_T Length, IN ULONG Alignment)
VOID NTAPI ProbeForWrite(IN PVOID Address, IN SIZE_T Length, IN ULONG Alignment)
#define ClearFlag(_F, _SF)
#define IRP_CONTEXT_FLAG_WRITE_THROUGH
#define FSCTL_GET_RETRIEVAL_POINTER_BASE
#define BooleanFlagOn(F, SF)
VOID FatExamineFatEntries(IN PIRP_CONTEXT IrpContext, IN PVCB Vcb, IN ULONG StartIndex OPTIONAL, IN ULONG EndIndex OPTIONAL, IN BOOLEAN SetupWindows, IN PFAT_WINDOW SwitchToWindow OPTIONAL, IN PULONG BitMapBuffer OPTIONAL)
CLUSTER_TYPE FatInterpretClusterType(IN PVCB Vcb, IN FAT_ENTRY Entry)
VOID FatTearDownAllocationSupport(IN PIRP_CONTEXT IrpContext, IN PVCB Vcb)
VOID FatSetupAllocationSupport(IN PIRP_CONTEXT IrpContext, IN PVCB Vcb)
VOID FatCloseEaFile(IN PIRP_CONTEXT IrpContext, IN PVCB Vcb, IN BOOLEAN FlushFirst)
VOID FatUnpinRepinnedBcbs(IN PIRP_CONTEXT IrpContext)
VOID FatInitializeCacheMap(_In_ PFILE_OBJECT FileObject, _In_ PCC_FILE_SIZES FileSizes, _In_ BOOLEAN PinAccess, _In_ PCACHE_MANAGER_CALLBACKS Callbacks, _In_ PVOID LazyWriteContext)
VOID FatReadVolumeFile(IN PIRP_CONTEXT IrpContext, IN PVCB Vcb, IN VBO StartingVbo, IN ULONG ByteCount, OUT PBCB *Bcb, OUT PVOID *Buffer)
NTSTATUS FatToggleMediaEjectDisable(IN PIRP_CONTEXT IrpContext, IN PVCB Vcb, IN BOOLEAN PreventRemoval)
NTSTATUS FatPerformDevIoCtrl(IN PIRP_CONTEXT IrpContext, IN ULONG IoControlCode, IN PDEVICE_OBJECT Device, IN PVOID InputBuffer OPTIONAL, IN ULONG InputBufferLength, OUT PVOID OutputBuffer OPTIONAL, IN ULONG OutputBufferLength, IN BOOLEAN InternalDeviceIoControl, IN BOOLEAN OverrideVerify, OUT PIO_STATUS_BLOCK Iosb OPTIONAL)
PVOID FatMapUserBuffer(IN PIRP_CONTEXT IrpContext, IN OUT PIRP Irp)
NTSTATUS FatIsPathnameValid(IN PIRP_CONTEXT IrpContext, IN PIRP Irp)
NTSTATUS FatAllowExtendedDasdIo(IN PIRP_CONTEXT IrpContext, IN PIRP Irp)
NTSTATUS FatGetStatistics(IN PIRP_CONTEXT IrpContext, IN PIRP Irp)
NTSTATUS FatQueryBpb(IN PIRP_CONTEXT IrpContext, IN PIRP Irp)
NTSTATUS FatUnlockVolumeInternal(IN PIRP_CONTEXT IrpContext, IN PVCB Vcb, IN PFILE_OBJECT FileObject OPTIONAL)
VOID FatVerifyLookupFatEntry(IN PIRP_CONTEXT IrpContext, IN PVCB Vcb, IN ULONG FatIndex, IN OUT PULONG FatEntry)
NTSTATUS FatUnlockVolume(IN PIRP_CONTEXT IrpContext, IN PIRP Irp)
VOID FatComputeMoveFileSplicePoints(IN PIRP_CONTEXT IrpContext, IN PFCB FcbOrDcb, IN ULONG FileOffset, IN ULONG TargetCluster, IN ULONG BytesToReallocate, OUT PULONG FirstSpliceSourceCluster, OUT PULONG FirstSpliceTargetCluster, OUT PULONG SecondSpliceSourceCluster, OUT PULONG SecondSpliceTargetCluster, IN OUT PLARGE_MCB SourceMcb)
BOOLEAN FatLookupMcbEntry(IN PVCB Vcb, IN PLARGE_MCB Mcb, IN VBO Vbo, OUT PLBO Lbo, OUT PULONG ByteCount OPTIONAL, OUT PULONG Index OPTIONAL)
BOOLEAN FatPerformVerifyDiskRead(IN PIRP_CONTEXT IrpContext, IN PVCB Vcb, IN PVOID Buffer, IN LBO Lbo, IN ULONG NumberOfBytesToRead, IN BOOLEAN ReturnOnError)
NTSTATUS FatIsVolumeMounted(IN PIRP_CONTEXT IrpContext, IN PIRP Irp)
NTSTATUS FatSetZeroOnDeallocate(__in PIRP_CONTEXT IrpContext, __in PIRP Irp)
BOOLEAN FatGetNextMcbEntry(IN PVCB Vcb, IN PLARGE_MCB Mcb, IN ULONG RunIndex, OUT PVBO Vbo, OUT PLBO Lbo, OUT PULONG ByteCount)
VOID FatRemoveMcbEntry(IN PVCB Vcb, IN PLARGE_MCB Mcb, IN VBO Vbo, IN ULONG SectorCount)
BOOLEAN FatAddMcbEntry(IN PVCB Vcb, IN PLARGE_MCB Mcb, IN VBO Vbo, IN LBO Lbo, IN ULONG SectorCount)
NTSTATUS FatIsVolumeDirty(IN PIRP_CONTEXT IrpContext, IN PIRP Irp)
BOOLEAN FatLookupLastMcbEntry(IN PVCB Vcb, IN PLARGE_MCB Mcb, OUT PVBO Vbo, OUT PLBO Lbo, OUT PULONG Index)
BOOLEAN FatIsBootSectorFat(IN PPACKED_BOOT_SECTOR BootSector)
NTSTATUS FatSearchBufferForLabel(IN PIRP_CONTEXT IrpContext, IN PVPB Vpb, IN PVOID Buffer, IN ULONG Size, OUT PBOOLEAN LabelFound)
BOOLEAN FatIsMediaWriteProtected(IN PIRP_CONTEXT IrpContext, IN PDEVICE_OBJECT TargetDeviceObject)
LOGICAL FatDiskAccountingEnabled
ULONG FatExceptionFilter(IN PIRP_CONTEXT IrpContext, IN PEXCEPTION_POINTERS ExceptionPointer)
LARGE_INTEGER FatMaxLarge
BOOLEAN FatIsIrpTopLevel(IN PIRP Irp)
LARGE_INTEGER FatLargeZero
#define DebugTrace(INDENT, LEVEL, X, Y)
#define FAT_DEFAULT_DEFRAG_CHUNK_IN_BYTES
VOID FatQuickVerifyVcb(IN PIRP_CONTEXT IrpContext, IN PVCB Vcb)
#define FatVcbAcquiredExclusive(IRPCONTEXT, VCB)
IN OUT PVCB IN PDEVICE_OBJECT TargetDeviceObject
#define FatAcquireExclusiveGlobal(IRPCONTEXT)
#define FatUnpinBcb(IRPCONTEXT, BCB)
NTSTATUS FatFsdPostRequest(IN PIRP_CONTEXT IrpContext, IN PIRP Irp)
#define FatAcquireExclusiveVolume(IRPCONTEXT, VCB)
TYPE_OF_OPEN FatDecodeFileObject(_In_ PFILE_OBJECT FileObject, _Outptr_ PVCB *Vcb, _Outptr_ PFCB *FcbOrDcb, _Outptr_ PCCB *Ccb)
IN PFCB IN PCCB IN TYPE_OF_OPEN IN BOOLEAN IN BOOLEAN TopLevel
#define FatReleaseVolume(IRPCONTEXT, VCB)
#define FatCompleteRequest(IRPCONTEXT, IRP, STATUS)
IN PFCB IN VBO OUT PLBO Lbo
VOID FatFlushFatEntries(IN PIRP_CONTEXT IrpContext, IN PVCB Vcb, IN ULONG Cluster, IN ULONG Count)
#define FatReleaseFcb(IRPCONTEXT, Fcb)
#define FatReleaseGlobal(IRPCONTEXT)
NTSTATUS FatFlushFat(IN PIRP_CONTEXT IrpContext, IN PVCB Vcb)
PFCB FatCreateFcb(IN PIRP_CONTEXT IrpContext, IN PVCB Vcb, IN PDCB ParentDcb, IN ULONG LfnOffsetWithinDirectory, IN ULONG DirentOffsetWithinDirectory, IN PDIRENT Dirent, IN PUNICODE_STRING Lfn OPTIONAL, IN PUNICODE_STRING OrigLfn OPTIONAL, IN BOOLEAN IsPagingFile, IN BOOLEAN SingleResource)
#define FatSetVcbCondition(V, X)
#define FatDeviceIsFatFsdo(D)
IN OUT PVCB IN PDEVICE_OBJECT IN PVPB IN PDEVICE_OBJECT FsDeviceObject
#define FatAcquireExclusiveVcb(IC, V)
IN PFCB IN FAT_FLUSH_TYPE FlushType
VOID FatCheckDirtyBit(IN PIRP_CONTEXT IrpContext, IN PVCB Vcb)
enum _FAT_FLUSH_TYPE FAT_FLUSH_TYPE
IN OUT PVCB IN PDEVICE_OBJECT IN PVPB Vpb
VOID FatFlushDirentForFile(IN PIRP_CONTEXT IrpContext, IN PFCB Fcb)
BOOLEAN FatIsHandleCountZero(IN PIRP_CONTEXT IrpContext, IN PVCB Vcb)
#define FatIsFastIoPossible(FCB)
#define FatNormalizeAndRaiseStatus(IRPCONTEXT, STATUS)
VOID FatVerifyVcb(IN PIRP_CONTEXT IrpContext, IN PVCB Vcb)
#define FatRaiseStatus(IRPCONTEXT, STATUS)
IN PVCB IN ULONG FatIndex
#define FatGetFcbOplock(F)
IN PDCB IN PCCB IN VBO IN OUT PULONG OUT PDIRENT OUT PBCB OUT PVBO ByteOffset
IN PFCB IN PFILE_OBJECT FileObject IN ULONG AllocationSize
IN PVCB IN ULONG IN FAT_ENTRY FatEntry
IN PVCB IN FAT_VOLUME_STATE VolumeState
BOOLEAN FatScanForDataTrack(IN PIRP_CONTEXT IrpContext, IN PDEVICE_OBJECT TargetDeviceObject)
#define FatReleaseVcb(IRPCONTEXT, Vcb)
NTSTATUS FatHijackIrpAndFlushDevice(IN PIRP_CONTEXT IrpContext, IN PIRP Irp, IN PDEVICE_OBJECT TargetDeviceObject)
IN PVCB IN ULONG IN OUT PULONG IN BOOLEAN OUT PLARGE_MCB Mcb
VOID FatMarkFcbCondition(IN PIRP_CONTEXT IrpContext, IN PFCB Fcb, IN FCB_CONDITION FcbCondition, IN BOOLEAN Recursive)
PIRP_CONTEXT FatCreateIrpContext(IN PIRP Irp, IN BOOLEAN Wait)
#define VCB_STATE_FLAG_VOLUME_DIRTY
#define VCB_STATE_FLAG_LOCKED
#define CCB_FLAG_MANAGE_VOLUME_ACCESS
#define IRP_CONTEXT_FLAG_PARENT_BY_CHILD
#define VCB_STATE_FLAG_REMOVABLE_MEDIA
#define VCB_STATE_FLAG_BOOT_OR_PAGING_FILE
#define VCB_STATE_FLAG_BAD_BLOCKS_POPULATED
#define FCB_STATE_DENY_DEFRAG
#define FCB_STATE_ZERO_ON_DEALLOCATION
#define VCB_STATE_FLAG_MOUNTED_DIRTY
#define VCB_STATE_FLAG_MOUNT_IN_PROGRESS
#define VCB_STATE_FLAG_WRITE_PROTECTED
#define FCB_STATE_DELETE_ON_CLOSE
#define FCB_STATE_SYSTEM_FILE
#define FCB_LOOKUP_ALLOCATIONSIZE_HINT
#define VCB_STATE_FLAG_VPB_MUST_BE_FREED
#define VCB_STATE_FLAG_VOLUME_DISMOUNTED
#define FCB_STATE_PAGING_FILE
#define CCB_FLAG_DENY_DEFRAG
struct _FILE_SYSTEM_STATISTICS FILE_SYSTEM_STATISTICS
#define IRP_CONTEXT_FLAG_DISABLE_WRITE_THROUGH
#define CCB_FLAG_COMPLETE_DISMOUNT
#define IOCTL_DISK_GET_PARTITION_INFO_EX
_Must_inspect_result_ _In_ PFILE_OBJECT _In_ ULONG FsControlCode
#define FsRtlEnterFileSystem
_Must_inspect_result_ _In_ ULONG RunIndex
#define FsRtlExitFileSystem
#define FsRtlAreThereCurrentFileLocks(FL)
BOOLEAN NTAPI CcUninitializeCacheMap(IN PFILE_OBJECT FileObject, IN OPTIONAL PLARGE_INTEGER TruncateSize, IN OPTIONAL PCACHE_UNINITIALIZE_EVENT UninitializeEvent)
BOOLEAN NTAPI CcPurgeCacheSection(IN PSECTION_OBJECT_POINTERS SectionObjectPointer, IN OPTIONAL PLARGE_INTEGER FileOffset, IN ULONG Length, IN BOOLEAN UninitializeCacheMaps)
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
#define KeGetCurrentThread
#define EXCEPTION_EXECUTE_HANDLER
#define EXCEPTION_CONTINUE_SEARCH
POBJECT_TYPE IoFileObjectType
#define RtlEqualMemory(dst, src, len)
VOID NTAPI FsRtlRemoveLargeMcbEntry(IN PLARGE_MCB Mcb, IN LONGLONG Vbn, IN LONGLONG SectorCount)
BOOLEAN NTAPI FsRtlAddLargeMcbEntry(IN PLARGE_MCB Mcb, IN LONGLONG Vbn, IN LONGLONG Lbn, IN LONGLONG SectorCount)
BOOLEAN NTAPI FsRtlLookupLastLargeMcbEntryAndIndex(IN PLARGE_MCB OpaqueMcb, OUT PLONGLONG LargeVbn, OUT PLONGLONG LargeLbn, OUT PULONG Index)
VOID NTAPI FsRtlUninitializeLargeMcb(IN PLARGE_MCB Mcb)
VOID NTAPI FsRtlInitializeLargeMcb(IN PLARGE_MCB Mcb, IN POOL_TYPE PoolType)
BOOLEAN NTAPI FsRtlLookupLargeMcbEntry(IN PLARGE_MCB Mcb, IN LONGLONG Vbn, OUT PLONGLONG Lbn OPTIONAL, OUT PLONGLONG SectorCountFromLbn OPTIONAL, OUT PLONGLONG StartingLbn OPTIONAL, OUT PLONGLONG SectorCountFromStartingLbn OPTIONAL, OUT PULONG Index OPTIONAL)
ULONG NTAPI FsRtlNumberOfRunsInLargeMcb(IN PLARGE_MCB Mcb)
BOOLEAN NTAPI FsRtlGetNextLargeMcbEntry(IN PLARGE_MCB Mcb, IN ULONG RunIndex, OUT PLONGLONG Vbn, OUT PLONGLONG Lbn, OUT PLONGLONG SectorCount)
NTSTATUS NTAPI CcWaitForCurrentLazyWriterActivity(VOID)
BOOLEAN NTAPI CcIsThereDirtyData(IN PVPB Vpb)
_In_ UINT _In_ UINT BytesToCopy
DRIVER_DISPATCH(nfs41_FsdDispatch)
#define _Function_class_(n)
#define _Analysis_assume_
#define FSCTL_QUERY_RETRIEVAL_POINTERS
#define FSCTL_OPLOCK_BREAK_NOTIFY
#define FSCTL_LOCK_VOLUME
#define FSCTL_OPLOCK_BREAK_ACKNOWLEDGE
#define FSCTL_REQUEST_OPLOCK_LEVEL_1
#define FSCTL_REQUEST_FILTER_OPLOCK
#define FSCTL_MARK_VOLUME_DIRTY
#define FSCTL_INVALIDATE_VOLUMES
#define FSCTL_IS_PATHNAME_VALID
#define FSCTL_UNLOCK_VOLUME
#define FSCTL_REQUEST_BATCH_OPLOCK
#define FSCTL_QUERY_FAT_BPB
#define FSCTL_FILESYSTEM_GET_STATISTICS
#define FSCTL_OPBATCH_ACK_CLOSE_PENDING
#define FSCTL_OPLOCK_BREAK_ACK_NO_2
#define FSCTL_IS_VOLUME_MOUNTED
#define FSCTL_REQUEST_OPLOCK_LEVEL_2
#define FSCTL_DISMOUNT_VOLUME
#define FILE_REMOVABLE_MEDIA
#define UNREFERENCED_PARAMETER(P)
__GNU_EXTENSION typedef __int64 * PLONGLONG
#define ARGUMENT_PRESENT(ArgumentPointer)
#define FSRTL_VOLUME_UNLOCK
#define FSRTL_VOLUME_LOCK
#define FSRTL_VOLUME_DISMOUNT_FAILED
#define FSRTL_VOLUME_DISMOUNT
#define FSRTL_VOLUME_MOUNT
#define VPB_REMOVE_PENDING
#define FSRTL_VOLUME_LOCK_FAILED
BOOLEAN NTAPI CcCanIWrite(IN PFILE_OBJECT FileObject, IN ULONG BytesToWrite, IN BOOLEAN Wait, IN UCHAR Retrying)
VOID FASTCALL ExReleaseResourceLite(IN PERESOURCE Resource)
BOOLEAN NTAPI ExIsResourceAcquiredExclusiveLite(IN PERESOURCE Resource)
PVOID NTAPI FsRtlAllocatePoolWithTag(IN POOL_TYPE PoolType, IN ULONG NumberOfBytes, IN ULONG Tag)
BOOLEAN NTAPI FsRtlIsNtstatusExpected(IN NTSTATUS NtStatus)
NTSTATUS NTAPI FsRtlNotifyVolumeEvent(IN PFILE_OBJECT FileObject, IN ULONG EventCode)
NTSTATUS NTAPI IoCreateDevice(IN PDRIVER_OBJECT DriverObject, IN ULONG DeviceExtensionSize, IN PUNICODE_STRING DeviceName, IN DEVICE_TYPE DeviceType, IN ULONG DeviceCharacteristics, IN BOOLEAN Exclusive, OUT PDEVICE_OBJECT *DeviceObject)
VOID NTAPI IoDeleteDevice(IN PDEVICE_OBJECT DeviceObject)
PIRP NTAPI IoBuildSynchronousFsdRequest(IN ULONG MajorFunction, IN PDEVICE_OBJECT DeviceObject, IN PVOID Buffer, IN ULONG Length, IN PLARGE_INTEGER StartingOffset, IN PKEVENT Event, IN PIO_STATUS_BLOCK IoStatusBlock)
PIRP NTAPI IoBuildDeviceIoControlRequest(IN ULONG IoControlCode, IN PDEVICE_OBJECT DeviceObject, IN PVOID InputBuffer, IN ULONG InputBufferLength, IN PVOID OutputBuffer, IN ULONG OutputBufferLength, IN BOOLEAN InternalDeviceIoControl, IN PKEVENT Event, IN PIO_STATUS_BLOCK IoStatusBlock)
VOID NTAPI IoSetTopLevelIrp(IN PIRP Irp)
VOID NTAPI IoReleaseVpbSpinLock(IN KIRQL Irql)
VOID NTAPI IoAcquireVpbSpinLock(OUT PKIRQL Irql)
BOOLEAN NTAPI SeSinglePrivilegeCheck(_In_ LUID PrivilegeValue, _In_ KPROCESSOR_MODE PreviousMode)
Checks if a single privilege is present in the context of the calling thread.
#define STATUS_DELETE_PENDING
#define STATUS_VOLUME_DISMOUNTED
#define STATUS_NOT_LOCKED
NTSTATUS NTAPI ObReferenceObjectByHandle(IN HANDLE Handle, IN ACCESS_MASK DesiredAccess, IN POBJECT_TYPE ObjectType, IN KPROCESSOR_MODE AccessMode, OUT PVOID *Object, OUT POBJECT_HANDLE_INFORMATION HandleInformation OPTIONAL)
NTSTATUS NTAPI FsRtlOplockFsctrl(IN POPLOCK Oplock, IN PIRP Irp, IN ULONG OpenCount)
#define FILE_DEVICE_DISK_FILE_SYSTEM
struct STARTING_LCN_INPUT_BUFFER * PSTARTING_LCN_INPUT_BUFFER
struct VOLUME_BITMAP_BUFFER * PVOLUME_BITMAP_BUFFER
struct STARTING_VCN_INPUT_BUFFER * PSTARTING_VCN_INPUT_BUFFER
struct MOVE_FILE_DATA * PMOVE_FILE_DATA
#define FSCTL_IS_VOLUME_DIRTY
struct RETRIEVAL_POINTERS_BUFFER * PRETRIEVAL_POINTERS_BUFFER
#define FSCTL_GET_RETRIEVAL_POINTERS
#define FILE_DEVICE_CD_ROM
#define FSCTL_GET_VOLUME_BITMAP
#define _SEH2_AbnormalTermination()
#define _SEH2_GetExceptionCode()
#define _SEH2_EXCEPT(...)
#define _SEH2_GetExceptionInformation()
#define FSCTL_MARK_HANDLE
#define FSCTL_SET_ZERO_ON_DEALLOCATION
#define FSCTL_ALLOW_EXTENDED_DASD_IO
NTSTATUS NTAPI RtlOemStringToCountedUnicodeString(IN OUT PUNICODE_STRING UniDest, IN PCOEM_STRING OemSource, IN BOOLEAN AllocateDestinationString)
#define STATUS_END_OF_FILE
#define STATUS_BUFFER_TOO_SMALL
#define STATUS_BUFFER_OVERFLOW
PULONG MinorVersion OPTIONAL
ULONG32 LargeSectorsPerFat
ULONG32 RootDirFirstCluster
LARGE_INTEGER StartingLcn
LARGE_INTEGER StartingVcn
LARGE_INTEGER ValidDataLength
LARGE_INTEGER AllocationSize
ULONG AlignmentRequirement
CACHE_MANAGER_CALLBACKS CacheManagerNoOpCallbacks
PDRIVER_OBJECT DriverObject
union _FCB::@766 Specific
struct _FCB::@766::@769 Fcb
struct _FCB::@766::@768 Dcb
FSRTL_ADVANCED_FCB_HEADER Header
CLONG PurgeFailureModeEnableCount
UCHAR First0x24BytesOfBootSector[0x24]
struct _IO_STACK_LOCATION::@4104::@4119 FileSystemControl
struct _IO_STACK_LOCATION::@4104::@4124 MountVolume
struct _IO_STACK_LOCATION::@4104::@4125 VerifyVolume
PDEVICE_OBJECT DeviceObject
union _IO_STACK_LOCATION::@1619 Parameters
struct _LIST_ENTRY * Flink
struct _VCB::@764 AllocationSupport
VCB_CONDITION VcbCondition
PFILE_OBJECT VirtualVolumeFile
PDEVICE_OBJECT TargetDeviceObject
WCHAR VolumeLabel[MAXIMUM_VOLUME_LABEL_LENGTH/sizeof(WCHAR)]
struct _DEVICE_OBJECT * RealDevice
BOOLEAN NTAPI KeCancelTimer(IN OUT PKTIMER Timer)
#define FIELD_OFFSET(t, f)
#define RtlCopyMemory(Destination, Source, Length)
#define RtlZeroMemory(Destination, Length)
#define CONTAINING_RECORD(address, type, field)
#define STATUS_INVALID_DEVICE_REQUEST
#define STATUS_FILE_IS_A_DIRECTORY
#define STATUS_MEDIA_WRITE_PROTECTED
#define STATUS_ACCESS_DENIED
#define STATUS_INVALID_PARAMETER
#define STATUS_UNRECOGNIZED_VOLUME
#define STATUS_WRONG_VOLUME
#define STATUS_INVALID_USER_BUFFER
#define STATUS_VERIFY_REQUIRED
#define STATUS_FILE_CORRUPT_ERROR
#define STATUS_INSUFFICIENT_RESOURCES
_In_ WDFCOLLECTION _In_ ULONG Index
_In_ WDFREQUEST _In_ WDFFILEOBJECT FileObject
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
_Must_inspect_result_ _In_ WDFDEVICE _In_ DEVICE_REGISTRY_PROPERTY _In_ ULONG BufferLength
_In_ WDFDPC _In_ BOOLEAN Wait
_In_ WDFREQUEST _In_ size_t OutputBufferLength
_In_ WDFREQUEST _In_ size_t _In_ size_t InputBufferLength
_Must_inspect_result_ _In_ WDFIOTARGET _In_opt_ WDFREQUEST _In_opt_ PWDF_MEMORY_DESCRIPTOR OutputBuffer
_Must_inspect_result_ _In_ WDFIOTARGET _In_opt_ WDFREQUEST _In_opt_ PWDF_MEMORY_DESCRIPTOR InputBuffer
_In_ WDFMEMORY _Out_opt_ size_t * BufferSize
_At_(*)(_In_ PWSK_CLIENT Client, _In_opt_ PUNICODE_STRING NodeName, _In_opt_ PUNICODE_STRING ServiceName, _In_opt_ ULONG NameSpace, _In_opt_ GUID *Provider, _In_opt_ PADDRINFOEXW Hints, _Outptr_ PADDRINFOEXW *Result, _In_opt_ PEPROCESS OwningProcess, _In_opt_ PETHREAD OwningThread, _Inout_ PIRP Irp Result)(Mem)) NTSTATUS(WSKAPI *PFN_WSK_GET_ADDRESS_INFO
_Must_inspect_result_ _In_ ULONG Flags
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetNextIrpStackLocation(_In_ PIRP Irp)
struct _FSCTL_QUERY_FAT_BPB_BUFFER * PFSCTL_QUERY_FAT_BPB_BUFFER
#define SL_OVERRIDE_VERIFY_VOLUME
#define IRP_MJ_FILE_SYSTEM_CONTROL
#define IRP_MN_VERIFY_VOLUME
_Must_inspect_result_ typedef _In_ PHYSICAL_ADDRESS _In_ LARGE_INTEGER ByteCount
#define IRP_MN_USER_FS_REQUEST
#define SL_ALLOW_RAW_MOUNT
#define VPB_DIRECT_WRITES_ALLOWED
#define IRP_MN_KERNEL_CALL
#define MAXIMUM_VOLUME_LABEL_LENGTH
#define IRP_MN_MOUNT_VOLUME
_Requires_lock_held_ Interrupt _Releases_lock_ Interrupt _In_ _IRQL_restores_ KIRQL OldIrql
#define ROUND_TO_PAGES(Size)
#define MmGetSystemAddressForMdlSafe(_Mdl, _Priority)
#define ObDereferenceObject
#define ObReferenceObject
_In_ LARGE_INTEGER _Out_opt_ PLARGE_INTEGER Remainder
*BytesInOemString PCHAR OemString