⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ffsdrv.h

📁 FSD file system driver
💻 H
📖 第 1 页 / 共 3 页
字号:

	// Identifier for this structure
	FFS_IDENTIFIER   Identifier;

	// Flags
	ULONG             Flags;

	// State that may need to be maintained
	ULONG             CurrentByteOffset;
	UNICODE_STRING    DirectorySearchPattern;

} FFS_CCB, *PFFS_CCB;

/*
 * Flags for CCB
 */

#define CCB_FROM_POOL               0x00000001

#define CCB_ALLOW_EXTENDED_DASD_IO  0x80000000


/*
 * FFS_IRP_CONTEXT
 *
 * Used to pass information about a request between the drivers functions
 */
typedef struct _FFS_IRP_CONTEXT {

	// Identifier for this structure
	FFS_IDENTIFIER      Identifier;

	// Pointer to the IRP this request describes
	PIRP                Irp;

	// Flags
	ULONG               Flags;

	// The major and minor function code for the request
	UCHAR               MajorFunction;
	UCHAR               MinorFunction;

	// The device object
	PDEVICE_OBJECT      DeviceObject;

	// The real device object
	PDEVICE_OBJECT      RealDevice;

	// The file object
	PFILE_OBJECT        FileObject;

	PFFS_FCB            Fcb;
	PFFS_CCB            Ccb;

	// If the request is synchronous (we are allowed to block)
	BOOLEAN             IsSynchronous;

	// If the request is top level
	BOOLEAN             IsTopLevel;

	// Used if the request needs to be queued for later processing
	WORK_QUEUE_ITEM     WorkQueueItem;

	// If an exception is currently in progress
	BOOLEAN             ExceptionInProgress;

	// The exception code when an exception is in progress
	NTSTATUS            ExceptionCode;

	// Repinned BCBs List
	FFS_REPINNED_BCBS  Repinned;

} FFS_IRP_CONTEXT, *PFFS_IRP_CONTEXT;


#define IRP_CONTEXT_FLAG_FROM_POOL       (0x00000001)
#define IRP_CONTEXT_FLAG_WAIT            (0x00000002)
#define IRP_CONTEXT_FLAG_WRITE_THROUGH   (0x00000004)
#define IRP_CONTEXT_FLAG_FLOPPY          (0x00000008)
#define IRP_CONTEXT_FLAG_RECURSIVE_CALL  (0x00000010)
#define IRP_CONTEXT_FLAG_DISABLE_POPUPS  (0x00000020)
#define IRP_CONTEXT_FLAG_DEFERRED        (0x00000040)
#define IRP_CONTEXT_FLAG_VERIFY_READ     (0x00000080)
#define IRP_CONTEXT_STACK_IO_CONTEXT     (0x00000100)
#define IRP_CONTEXT_FLAG_REQUEUED        (0x00000200)
#define IRP_CONTEXT_FLAG_USER_IO         (0x00000400)
#define IRP_CONTEXT_FLAG_DELAY_CLOSE     (0x00000800)


/*
 * FFS_ALLOC_HEADER
 *
 * In the checked version of the driver this header is put in the beginning of
 * every memory allocation
 */
typedef struct _FFS_ALLOC_HEADER {
    FFS_IDENTIFIER Identifier;
} FFS_ALLOC_HEADER, *PFFS_ALLOC_HEADER;

typedef struct _FCB_LIST_ENTRY {
    PFFS_FCB     Fcb;
    LIST_ENTRY   Next;
} FCB_LIST_ENTRY, *PFCB_LIST_ENTRY;


/* Block Description List */
typedef struct _FFS_BDL {
    LONGLONG    Lba;
    ULONG       Offset;
    ULONG       Length;
    PIRP        Irp;
} FFS_BDL, *PFFS_BDL;

#pragma pack()


/*
 *  The following macro is used to determine if an FSD thread can block
 *  for I/O or wait for a resource.  It returns TRUE if the thread can
 *  block and FALSE otherwise.  This attribute can then be used to call
 *  the FSD & FSP common work routine with the proper wait value.
 */

#define CanFFSWait(IRP) IoIsOperationSynchronous(Irp)


//
// Block.c
//

NTSTATUS
FFSLockUserBuffer(
	IN PIRP             Irp,
	IN ULONG            Length,
	IN LOCK_OPERATION   Operation);
PVOID
FFSGetUserBuffer(
	IN PIRP Irp);

NTSTATUS
FFSReadWriteBlocks(
	IN PFFS_IRP_CONTEXT IrpContext,
	IN PFFS_VCB         Vcb,
	IN PFFS_BDL         FFSBDL,
	IN ULONG            Length,
	IN ULONG            Count,
	IN BOOLEAN          bVerify);

NTSTATUS
FFSReadSync(
	IN PFFS_VCB         Vcb,
	IN ULONGLONG        Offset,
	IN ULONG            Length,
	OUT PVOID           Buffer,
	IN BOOLEAN          bVerify);

NTSTATUS
FFSReadDisk(
	IN PFFS_VCB        Vcb,
	IN ULONGLONG       Offset,
	IN ULONG           Size,
	IN PVOID           Buffer,
	IN BOOLEAN         bVerify);

NTSTATUS 
FFSDiskIoControl(
	IN PDEVICE_OBJECT   DeviceOjbect,
	IN ULONG            IoctlCode,
	IN PVOID            InputBuffer,
	IN ULONG            InputBufferSize,
	IN OUT PVOID        OutputBuffer,
	IN OUT PULONG       OutputBufferSize);

VOID
FFSMediaEjectControl(
	IN PFFS_IRP_CONTEXT IrpContext,
	IN PFFS_VCB Vcb,
	IN BOOLEAN bPrevent);

NTSTATUS
FFSDiskShutDown(
	PFFS_VCB Vcb);


//
// Cleanup.c
//

NTSTATUS
FFSCleanup(
	IN PFFS_IRP_CONTEXT IrpContext);


//
// Close.c
//

NTSTATUS
FFSClose(
	IN PFFS_IRP_CONTEXT IrpContext);

VOID
FFSQueueCloseRequest(
	IN PFFS_IRP_CONTEXT IrpContext);

VOID
FFSDeQueueCloseRequest(
	IN PVOID Context);


//
// Cmcb.c
//

BOOLEAN
FFSAcquireForLazyWrite(
	IN PVOID    Context,
	IN BOOLEAN  Wait);

VOID
FFSReleaseFromLazyWrite(
	IN PVOID Context);

BOOLEAN
FFSAcquireForReadAhead(
	IN PVOID    Context,
	IN BOOLEAN  Wait);

BOOLEAN
FFSNoOpAcquire(
	IN PVOID   Fcb,
	IN BOOLEAN Wait);

VOID
FFSNoOpRelease(
	IN PVOID Fcb);

VOID
FFSReleaseFromReadAhead(
	IN PVOID Context);


//
// Create.c
//

PFFS_FCB
FFSSearchFcbList(
	IN PFFS_VCB     Vcb,
	IN ULONG        inode);

NTSTATUS
FFSv1ScanDir(
	IN PFFS_VCB        Vcb,
	IN PFFS_MCB        ParentMcb,
	IN PUNICODE_STRING FileName,
	IN OUT PULONG      Index,
	IN PFFSv1_INODE    dinode1,
	IN PFFS_DIR_ENTRY  ffs_dir);

NTSTATUS
FFSv2ScanDir(
	IN PFFS_VCB        Vcb,
	IN PFFS_MCB        ParentMcb,
	IN PUNICODE_STRING FileName,
	IN OUT PULONG      Index,
	IN PFFSv2_INODE    dinode2,
	IN PFFS_DIR_ENTRY  ffs_dir);

NTSTATUS
FFSv1LookupFileName(
	IN PFFS_VCB            Vcb,
	IN PUNICODE_STRING     FullFileName,
	IN PFFS_MCB            ParentMcb,
	OUT PFFS_MCB*          FFSMcb,
	IN OUT PFFSv1_INODE    dinode1);


NTSTATUS
FFSv2LookupFileName(
	IN PFFS_VCB            Vcb,
	IN PUNICODE_STRING     FullFileName,
	IN PFFS_MCB            ParentMcb,
	OUT PFFS_MCB*          FFSMcb,
	IN OUT PFFSv2_INODE    dinode2);

NTSTATUS
FFSCreateFile(
	IN PFFS_IRP_CONTEXT IrpContext,
	IN PFFS_VCB         Vcb);

NTSTATUS
FFSCreateVolume(
	IN PFFS_IRP_CONTEXT IrpContext, 
	IN PFFS_VCB         Vcb);

NTSTATUS
FFSCreate(
	IN PFFS_IRP_CONTEXT IrpContext);

NTSTATUS
FFSCreateInode(
	PFFS_IRP_CONTEXT    IrpContext,
	PFFS_VCB            Vcb,
	PFFS_FCB            ParentFcb,
	ULONG               Type,
	ULONG               FileAttr,
	PUNICODE_STRING     FileName);

NTSTATUS
FFSSupersedeOrOverWriteFile(
	IN PFFS_IRP_CONTEXT IrpContext,
	IN PFFS_VCB         Vcb,
	IN PFFS_FCB         Fcb,
	IN ULONG            Disposition);


//
// Debug.c
//

#define DBG_VITAL 0
#define DBG_ERROR 1
#define DBG_USER  2
#define DBG_TRACE 3
#define DBG_INFO  4
#define DBG_FUNC  5

#if DBG
#define FFSPrint(arg)          FFSPrintf   arg
#define FFSPrintNoIndent(arg)  FFSNIPrintf arg

#define FFSCompleteRequest(Irp, bPrint, PriorityBoost) \
        FFSDbgPrintComplete(Irp, bPrint); \
        IoCompleteRequest(Irp, PriorityBoost)

#else

#define FFSPrint(arg)

#define FFSCompleteRequest(Irp, bPrint, PriorityBoost) \
        IoCompleteRequest(Irp, PriorityBoost)

#endif // DBG

VOID
__cdecl
FFSPrintf(
	LONG  DebugPrintLevel,
	PCHAR DebugMessage,
	...);

VOID
__cdecl
FFSNIPrintf(
	LONG  DebugPrintLevel,
	PCHAR DebugMessage,
	...);

extern ULONG ProcessNameOffset;

#define FFSGetCurrentProcessName() ( \
    (PUCHAR) PsGetCurrentProcess() + ProcessNameOffset \
)

ULONG 
FFSGetProcessNameOffset(
	VOID);

VOID
FFSDbgPrintCall(
	IN PDEVICE_OBJECT   DeviceObject,
	IN PIRP             Irp);

VOID
FFSDbgPrintComplete(
	IN PIRP Irp,
	IN BOOLEAN bPrint);

PUCHAR
FFSNtStatusToString(
	IN NTSTATUS Status);


//
// Devctl.c
//

NTSTATUS
FFSDeviceControlNormal(
	IN PFFS_IRP_CONTEXT IrpContext);

NTSTATUS
FFSPrepareToUnload(
	IN PFFS_IRP_CONTEXT IrpContext);

NTSTATUS
FFSDeviceControl(
	IN PFFS_IRP_CONTEXT IrpContext);


//
// Dirctl.c
//

ULONG
FFSGetInfoLength(
	IN FILE_INFORMATION_CLASS  FileInformationClass);

ULONG
FFSProcessDirEntry(
	IN PFFS_VCB                Vcb,
	IN FILE_INFORMATION_CLASS  FileInformationClass,
	IN ULONG                   in,
	IN PVOID                   Buffer,
	IN ULONG                   UsedLength,
	IN ULONG                   Length,
	IN ULONG                   FileIndex,
	IN PUNICODE_STRING         pName,
	IN BOOLEAN                 Single);

NTSTATUS
FFSQueryDirectory(
	IN PFFS_IRP_CONTEXT IrpContext);

NTSTATUS
FFSNotifyChangeDirectory(
    IN PFFS_IRP_CONTEXT IrpContext);

VOID
FFSNotifyReportChange(
	IN PFFS_IRP_CONTEXT  IrpContext,
	IN PFFS_VCB          Vcb,
	IN PFFS_FCB          Fcb,
	IN ULONG             Filter,
	IN ULONG             Action);

NTSTATUS
FFSDirectoryControl(
	IN PFFS_IRP_CONTEXT IrpContext);

BOOLEAN
FFSIsDirectoryEmpty(
	PFFS_VCB Vcb,
	PFFS_FCB Dcb);


//
// Dispatch.c
//

NTSTATUS
FFSQueueRequest(
	IN PFFS_IRP_CONTEXT IrpContext);

VOID
FFSDeQueueRequest(
	IN PVOID Context);

NTSTATUS
FFSDispatchRequest(
	IN PFFS_IRP_CONTEXT IrpContext);

NTSTATUS
FFSBuildRequest(
	PDEVICE_OBJECT   DeviceObject,
	PIRP             Irp);


//
// Except.c
//

NTSTATUS
FFSExceptionFilter(
	IN PFFS_IRP_CONTEXT    IrpContext,
	IN PEXCEPTION_POINTERS ExceptionPointer);

NTSTATUS
FFSExceptionHandler(
	IN PFFS_IRP_CONTEXT IrpContext);


//
// ffs.c
//

PFFS_SUPER_BLOCK
FFSLoadSuper(
	IN PFFS_VCB       Vcb,
	IN BOOLEAN        bVerify,
	IN ULONGLONG      SuperBlockOffset);

BOOLEAN
FFSSaveSuper(
	IN PFFS_IRP_CONTEXT    IrpContext,
	IN PFFS_VCB            Vcb);

BOOLEAN
FFSLoadGroup(
	IN PFFS_VCB Vcb);

BOOLEAN
FFSSaveGroup(
	IN PFFS_IRP_CONTEXT    IrpContext,
	IN PFFS_VCB            Vcb);

BOOLEAN
FFSv1GetInodeLba(
	IN PFFS_VCB   Vcb,
	IN  ULONG     inode,
	OUT PLONGLONG offset);

BOOLEAN
FFSv2GetInodeLba(
	IN PFFS_VCB   Vcb,
	IN  ULONG     inode,
	OUT PLONGLONG offset);

BOOLEAN
FFSv1LoadInode(
	IN PFFS_VCB     Vcb,
	IN ULONG        inode,
	IN PFFSv1_INODE dinode1);

BOOLEAN
FFSv2LoadInode(
	IN PFFS_VCB     Vcb,
	IN ULONG        inode,
	IN PFFSv2_INODE dinode2);

BOOLEAN
FFSv1SaveInode(
	IN PFFS_IRP_CONTEXT   IrpContext,
	IN PFFS_VCB           Vcb,
	IN ULONG              Inode,
	IN PFFSv1_INODE       dinode1);

BOOLEAN
FFSv2SaveInode(
	IN PFFS_IRP_CONTEXT   IrpContext,
	IN PFFS_VCB           Vcb,
	IN ULONG              Inode,
	IN PFFSv2_INODE       dinode2);

BOOLEAN
FFSv1LoadBlock(
	IN PFFS_VCB  Vcb,
	IN ULONG     dwBlk,
	IN PVOID     Buffer);

BOOLEAN
FFSv2LoadBlock(
	IN PFFS_VCB  Vcb,
	IN ULONGLONG dwBlk,
	IN PVOID     Buffer);

BOOLEAN
FFSSaveBlock(
	IN PFFS_IRP_CONTEXT IrpContext,
	IN PFFS_VCB         Vcb,
	IN ULONG            dwBlk,
	IN PVOID            Buf);

BOOLEAN
FFSSaveBuffer(
	IN PFFS_IRP_CONTEXT IrpContext,
	IN PFFS_VCB         Vcb,
	IN LONGLONG         Offset,
	IN ULONG            Size,
	IN PVOID            Buf);

ULONG
FFSv1GetBlock(
	IN PFFS_VCB Vcb,
	IN ULONG       dwContent,
	IN ULONG       Index,
	IN int         layer);

ULONGLONG
FFSv2GetBlock(
	IN PFFS_VCB Vcb,
	IN ULONGLONG   dwContent,
	IN ULONG       Index,
	IN int         layer);

ULONG
FFSv1BlockMap(
	IN PFFS_VCB     Vcb,
	IN PFFSv1_INODE dinode1,
	IN ULONG        Index);

ULONGLONG
FFSv2BlockMap(
	IN PFFS_VCB     Vcb,
	IN PFFSv2_INODE dinode2,
	IN ULONG        Index);

ULONG
FFSv1BuildBDL(
	IN PFFS_IRP_CONTEXT IrpContext,
	IN PFFS_VCB         Vcb,
	IN PFFSv1_INODE     dinode1,
	IN ULONGLONG        Offset, 
	IN ULONG            Size, 
	OUT PFFS_BDL        *ffs_bdl);

ULONG
FFSv2BuildBDL(
	IN PFFS_IRP_CONTEXT IrpContext,
	IN PFFS_VCB         Vcb,
	IN PFFSv2_INODE     dinode2,
	IN ULONGLONG        Offset, 
	IN ULONG            Size, 
	OUT PFFS_BDL        *ffs_bdl);

BOOLEAN
FFSNewBlock(
	PFFS_IRP_CONTEXT IrpContext,
	PFFS_VCB         Vcb,
	ULONG            GroupHint,
	ULONG            BlockHint,  
	PULONG           dwRet);

BOOLEAN
FFSFreeBlock(
	PFFS_IRP_CONTEXT IrpContext,
	PFFS_VCB         Vcb,
	ULONG            Block);

BOOLEAN
FFSExpandBlock(
	PFFS_IRP_CONTEXT IrpContext,
	PFFS_VCB         Vcb,
	PFFS_FCB         Fcb,
	ULONG            dwContent,
	ULONG            Index,
	ULONG            layer,
	BOOLEAN          bNew,
	ULONG            *dwRet);

BOOLEAN
FFSExpandInode(
	PFFS_IRP_CONTEXT IrpContext,
	PFFS_VCB         Vcb,
	PFFS_FCB         Fcb,
	ULONG            *dwRet);

NTSTATUS
FFSNewInode(
	PFFS_IRP_CONTEXT IrpContext,
	PFFS_VCB         Vcb,
	ULONG            GroupHint,
	ULONG            Type,
	PULONG           Inode);

BOOLEAN
FFSFreeInode(
	PFFS_IRP_CONTEXT IrpContext,
	PFFS_VCB         Vcb,
	ULONG            Inode,
	ULONG            Type);

NTSTATUS
FFSAddEntry(
	IN PFFS_IRP_CONTEXT IrpContext,
	IN PFFS_VCB         Vcb,
	IN PFFS_FCB         Dcb,
	IN ULONG            FileType,
	IN ULONG            Inode,

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -