📄 ffsdrv.h
字号:
// 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 + -