📄 fsctrl.c
字号:
/*++
Copyright (c) 1989-2000 Microsoft Corporation
Module Name:
FsCtrl.c
Abstract:
This module implements the File System Control routines for Fat called
by the dispatch driver.
--*/
#include "FatProcs.h"
//
// The Bug check file id for this module
//
#define BugCheckFileId (FAT_BUG_CHECK_FSCTRL)
//
// The local debug trace level
//
#define Dbg (DEBUG_TRACE_FSCTRL)
//
// Local procedure prototypes
//
NTSTATUS
FatMountVolume (
IN PIRP_CONTEXT IrpContext,
IN PDEVICE_OBJECT TargetDeviceObject,
IN PVPB Vpb,
IN PDEVICE_OBJECT FsDeviceObject
);
NTSTATUS
FatVerifyVolume (
IN PIRP_CONTEXT IrpContext,
IN PIRP Irp
);
BOOLEAN
FatIsMediaWriteProtected (
IN PIRP_CONTEXT IrpContext,
IN PDEVICE_OBJECT TargetDeviceObject
);
NTSTATUS
FatUserFsCtrl (
IN PIRP_CONTEXT IrpContext,
IN PIRP Irp
);
NTSTATUS
FatOplockRequest (
IN PIRP_CONTEXT IrpContext,
IN PIRP Irp
);
NTSTATUS
FatLockVolume (
IN PIRP_CONTEXT IrpContext,
IN PIRP Irp
);
NTSTATUS
FatUnlockVolume (
IN PIRP_CONTEXT IrpContext,
IN PIRP Irp
);
NTSTATUS
FatDismountVolume (
IN PIRP_CONTEXT IrpContext,
IN PIRP Irp
);
NTSTATUS
FatDirtyVolume (
IN PIRP_CONTEXT IrpContext,
IN PIRP Irp
);
NTSTATUS
FatIsVolumeDirty (
IN PIRP_CONTEXT IrpContext,
IN PIRP Irp
);
NTSTATUS
FatIsVolumeMounted (
IN PIRP_CONTEXT IrpContext,
IN PIRP Irp
);
NTSTATUS
FatIsPathnameValid (
IN PIRP_CONTEXT IrpContext,
IN PIRP Irp
);
NTSTATUS
FatInvalidateVolumes (
IN PIRP Irp
);
VOID
FatScanForDismountedVcb (
IN PIRP_CONTEXT IrpContext
);
BOOLEAN
FatPerformVerifyDiskRead (
IN PIRP_CONTEXT IrpContext,
IN PVCB Vcb,
IN PVOID Buffer,
IN LBO Lbo,
IN ULONG NumberOfBytesToRead,
IN BOOLEAN ReturnOnError
);
NTSTATUS
FatQueryRetrievalPointers (
IN PIRP_CONTEXT IrpContext,
IN PIRP Irp
);
NTSTATUS
FatQueryBpb (
IN PIRP_CONTEXT IrpContext,
IN PIRP Irp
);
NTSTATUS
FatGetStatistics (
IN PIRP_CONTEXT IrpContext,
IN PIRP Irp
);
NTSTATUS
FatAllowExtendedDasdIo (
IN PIRP_CONTEXT IrpContext,
IN PIRP Irp
);
//
// Local support routine prototypes
//
NTSTATUS
FatGetVolumeBitmap (
IN PIRP_CONTEXT IrpContext,
IN PIRP Irp
);
NTSTATUS
FatGetRetrievalPointers (
IN PIRP_CONTEXT IrpContext,
IN PIRP Irp
);
NTSTATUS
FatMoveFile (
IN PIRP_CONTEXT IrpContext,
IN PIRP Irp
);
VOID
FatComputeMoveFileSplicePoints (
PIRP_CONTEXT IrpContext,
PFCB FcbOrDcb,
ULONG FileOffset,
ULONG TargetCluster,
ULONG BytesToReallocate,
PULONG FirstSpliceSourceCluster,
PULONG FirstSpliceTargetCluster,
PULONG SecondSpliceSourceCluster,
PULONG SecondSpliceTargetCluster,
PLARGE_MCB SourceMcb
);
VOID
FatComputeMoveFileParameter (
IN PIRP_CONTEXT IrpContext,
IN PFCB FcbOrDcb,
IN ULONG BufferSize,
IN ULONG FileOffset,
IN OUT PULONG ByteCount,
OUT PULONG BytesToReallocate,
OUT PULONG BytesToWrite,
OUT PLARGE_INTEGER SourceLbo
);
NTSTATUS
FatSearchBufferForLabel(
IN PIRP_CONTEXT IrpContext,
IN PVPB Vpb,
IN PVOID Buffer,
IN ULONG Size,
OUT PBOOLEAN LabelFound
);
VOID
FatVerifyLookupFatEntry (
IN PIRP_CONTEXT IrpContext,
IN PVCB Vcb,
IN ULONG FatIndex,
IN OUT PULONG FatEntry
);
#ifdef ALLOC_PRAGMA
#pragma alloc_text(PAGE, FatAddMcbEntry)
#pragma alloc_text(PAGE, FatAllowExtendedDasdIo)
#pragma alloc_text(PAGE, FatCommonFileSystemControl)
#pragma alloc_text(PAGE, FatComputeMoveFileParameter)
#pragma alloc_text(PAGE, FatComputeMoveFileSplicePoints)
#pragma alloc_text(PAGE, FatDirtyVolume)
#pragma alloc_text(PAGE, FatDismountVolume)
#pragma alloc_text(PAGE, FatFsdFileSystemControl)
#pragma alloc_text(PAGE, FatGetRetrievalPointers)
#pragma alloc_text(PAGE, FatGetStatistics)
#pragma alloc_text(PAGE, FatGetVolumeBitmap)
#pragma alloc_text(PAGE, FatIsMediaWriteProtected)
#pragma alloc_text(PAGE, FatIsPathnameValid)
#pragma alloc_text(PAGE, FatIsVolumeDirty)
#pragma alloc_text(PAGE, FatIsVolumeMounted)
#pragma alloc_text(PAGE, FatLockVolume)
#pragma alloc_text(PAGE, FatLookupLastMcbEntry)
#pragma alloc_text(PAGE, FatMountVolume)
#pragma alloc_text(PAGE, FatMoveFile)
#pragma alloc_text(PAGE, FatOplockRequest)
#pragma alloc_text(PAGE, FatPerformVerifyDiskRead)
#pragma alloc_text(PAGE, FatQueryBpb)
#pragma alloc_text(PAGE, FatQueryRetrievalPointers)
#pragma alloc_text(PAGE, FatRemoveMcbEntry)
#pragma alloc_text(PAGE, FatScanForDismountedVcb)
#pragma alloc_text(PAGE, FatSearchBufferForLabel)
#pragma alloc_text(PAGE, FatUnlockVolume)
#pragma alloc_text(PAGE, FatUserFsCtrl)
#pragma alloc_text(PAGE, FatVerifyLookupFatEntry)
#pragma alloc_text(PAGE, FatVerifyVolume)
#endif
#if DBG
BOOLEAN FatMoveFileDebug = 0;
#endif
//
// These wrappers go around the MCB package; we scale the LBO's passed
// in (which can be bigger than 32 bits on fat32) by the volume's sector
// size.
//
// Note we now use the real large mcb package. This means these shims
// now also convert the -1 unused LBN number to the 0 of the original
// mcb package.
//
#define MCB_SCALE_LOG2 (Vcb->AllocationSupport.LogOfBytesPerSector)
#define MCB_SCALE (1 << MCB_SCALE_LOG2)
#define MCB_SCALE_MODULO (MCB_SCALE - 1)
BOOLEAN
FatAddMcbEntry (
IN PVCB Vcb,
IN PLARGE_MCB Mcb,
IN VBO Vbo,
IN LBO Lbo,
IN ULONG SectorCount
)
{
PAGED_CODE();
if (SectorCount) {
//
// Round up sectors, but be careful as SectorCount approaches 4Gb.
// Note that for x>0, (x+m-1)/m = ((x-1)/m)+(m/m) = ((x-1)/m)+1
//
SectorCount--;
SectorCount >>= MCB_SCALE_LOG2;
SectorCount++;
}
Vbo >>= MCB_SCALE_LOG2;
Lbo >>= MCB_SCALE_LOG2;
return FsRtlAddLargeMcbEntry( Mcb,
((LONGLONG) Vbo),
((LONGLONG) Lbo),
((LONGLONG) SectorCount) );
}
BOOLEAN
FatLookupMcbEntry (
IN PVCB Vcb,
IN PLARGE_MCB Mcb,
IN VBO Vbo,
OUT PLBO Lbo,
OUT PULONG SectorCount OPTIONAL,
OUT PULONG Index OPTIONAL
)
{
BOOLEAN Results;
LONGLONG LiLbo;
LONGLONG LiSectorCount;
ULONG Remainder;
LiLbo = 0;
LiSectorCount = 0;
Remainder = Vbo & MCB_SCALE_MODULO;
Results = FsRtlLookupLargeMcbEntry( Mcb,
(Vbo >> MCB_SCALE_LOG2),
&LiLbo,
ARGUMENT_PRESENT(SectorCount) ? &LiSectorCount : NULL,
NULL,
NULL,
Index );
if ((ULONG) LiLbo != -1) {
*Lbo = (((LBO) LiLbo) << MCB_SCALE_LOG2);
if (Results) {
*Lbo += Remainder;
}
} else {
*Lbo = 0;
}
if (ARGUMENT_PRESENT(SectorCount)) {
*SectorCount = (ULONG) LiSectorCount;
if (*SectorCount) {
*SectorCount <<= MCB_SCALE_LOG2;
if (*SectorCount == 0) {
*SectorCount = (ULONG) -1;
}
if (Results) {
*SectorCount -= Remainder;
}
}
}
return Results;
}
//
// NOTE: Vbo/Lbn undefined if MCB is empty & return code false.
//
BOOLEAN
FatLookupLastMcbEntry (
IN PVCB Vcb,
IN PLARGE_MCB Mcb,
OUT PVBO Vbo,
OUT PLBO Lbo,
OUT PULONG Index
)
{
BOOLEAN Results;
LONGLONG LiVbo;
LONGLONG LiLbo;
ULONG LocalIndex;
PAGED_CODE();
LiVbo = LiLbo = 0;
LocalIndex = 0;
Results = FsRtlLookupLastLargeMcbEntryAndIndex( Mcb,
&LiVbo,
&LiLbo,
&LocalIndex );
*Vbo = ((VBO) LiVbo) << MCB_SCALE_LOG2;
if (((ULONG) LiLbo) != -1) {
*Lbo = ((LBO) LiLbo) << MCB_SCALE_LOG2;
*Lbo += (MCB_SCALE - 1);
*Vbo += (MCB_SCALE - 1);
} else {
*Lbo = 0;
}
if (Index) {
*Index = LocalIndex;
}
return Results;
}
BOOLEAN
FatGetNextMcbEntry (
IN PVCB Vcb,
IN PLARGE_MCB Mcb,
IN ULONG RunIndex,
OUT PVBO Vbo,
OUT PLBO Lbo,
OUT PULONG SectorCount
)
{
BOOLEAN Results;
LONGLONG LiVbo;
LONGLONG LiLbo;
LONGLONG LiSectorCount;
PAGED_CODE();
LiVbo = LiLbo = 0;
Results = FsRtlGetNextLargeMcbEntry( Mcb,
RunIndex,
&LiVbo,
&LiLbo,
&LiSectorCount );
if (Results) {
*Vbo = ((VBO) LiVbo) << MCB_SCALE_LOG2;
if (((ULONG) LiLbo) != -1) {
*Lbo = ((LBO) LiLbo) << MCB_SCALE_LOG2;
} else {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -