2 * FFS File System Driver for Windows
8 * Lee Jae-Hong, http://www.pyrasis.com
20 #include <pseh/pseh2.h>
25 #include "disklabel.h"
32 #pragma warning(disable:4068)
34 #define __drv_mustHoldCriticalRegion
41 #define FFSBreakPoint() /*__asm int 3*/ //DbgBreakPoint()
43 #define FFSBreakPoint()
46 /* Structs & Consts */
48 #define FFSDRV_VERSION "0.5.2"
51 * ffsdrv build options
54 /* To build read-only driver */
56 #define FFS_READ_ONLY TRUE
59 /* To support driver dynamics unload */
61 #define FFS_UNLOAD TRUE
67 #define FFS_BLOCK_TYPES (0x04)
69 #define MAXIMUM_RECORD_LENGTH (0x10000)
71 #define SECTOR_BITS (Vcb->SectorBits)
72 #define SECTOR_SIZE (Vcb->DiskGeometry.BytesPerSector)
73 #define DEFAULT_SECTOR_SIZE (0x200)
75 #define SUPER_BLOCK_OFFSET (0x2000)
76 #define SUPER_BLOCK_SIZE SBLOCKSIZE
78 #define READ_AHEAD_GRANULARITY (0x10000)
80 #define SUPER_BLOCK (Vcb->ffs_super_block)
81 #define FS_VERSION (Vcb->FSVersion)
83 #define BLOCK_SIZE (Vcb->BlockSize)
84 #define BLOCK_BITS FFSLog2(Vcb->BlockSize)
86 #define INODES_COUNT (Vcb->ffs_super_block->s_inodes_count)
88 #define INODES_PER_GROUP (SUPER_BLOCK->fs_ipg)
89 #define BLOCKS_PER_GROUP (SUPER_BLOCK->fs_fpg)
90 #define TOTAL_BLOCKS (SUPER_BLOCK->fs_size)
94 /* File System Releated */
96 #define DRIVER_NAME "FFS"
98 #define DEVICE_NAME L"\\FileSystem\\FFS"
100 #define DEVICE_NAME L"\\FFS"
105 #define PARAMETERS_KEY L"\\Parameters"
107 #define WRITING_SUPPORT L"WritingSupport"
108 #define CHECKING_BITMAP L"CheckingBitmap"
109 #define PARTITION_NUMBER L"PartitionNumber"
111 /* To support select BSD partition and ffsdrv unload routine */
112 #define DOS_DEVICE_NAME L"\\DosDevices\\ffs"
115 * Private IOCTL to make the driver ready to unload
118 #define IOCTL_PREPARE_TO_UNLOAD \
119 CTL_CODE(FILE_DEVICE_UNKNOWN, 2048, METHOD_NEITHER, FILE_WRITE_ACCESS)
123 * Private IOCTL to select BSD partition.
125 #define IOCTL_SELECT_BSD_PARTITION \
126 CTL_CODE(FILE_DEVICE_UNKNOWN, 2049, METHOD_BUFFERED, FILE_WRITE_ACCESS)
130 #define SetFlag(x,f) ((x) |= (f))
134 #define ClearFlag(x,f) ((x) &= ~(f))
137 #define IsFlagOn(a,b) ((BOOLEAN)(FlagOn(a,b) == b))
139 #define FFSRaiseStatus(IRPCONTEXT,STATUS) { \
140 (IRPCONTEXT)->ExceptionCode = (STATUS); \
141 ExRaiseStatus( (STATUS) ); \
144 #define FFSNormalizeAndRaiseStatus(IRPCONTEXT,STATUS) { \
145 /* (IRPCONTEXT)->ExceptionStatus = (STATUS); */ \
146 if ((STATUS) == STATUS_VERIFY_REQUIRED) { ExRaiseStatus((STATUS)); } \
147 ExRaiseStatus(FsRtlNormalizeNtstatus((STATUS),STATUS_UNEXPECTED_IO_ERROR)); \
151 * Define IsEndofFile for read and write operations
154 #define FILE_WRITE_TO_END_OF_FILE 0xffffffff
155 #define FILE_USE_FILE_POINTER_POSITION 0xfffffffe
157 #define IsEndOfFile(Pos) ((Pos.LowPart == FILE_WRITE_TO_END_OF_FILE) && \
158 (Pos.HighPart == FILE_USE_FILE_POINTER_POSITION ))
160 #define IsDirectory(Fcb) IsFlagOn(Fcb->FFSMcb->FileAttr, FILE_ATTRIBUTE_DIRECTORY)
163 * Bug Check Codes Definitions
166 #define FFS_FILE_SYSTEM (FILE_SYSTEM)
168 #define FFS_BUGCHK_BLOCK (0x00010000)
169 #define FFS_BUGCHK_CLEANUP (0x00020000)
170 #define FFS_BUGCHK_CLOSE (0x00030000)
171 #define FFS_BUGCHK_CMCB (0x00040000)
172 #define FFS_BUGCHK_CREATE (0x00050000)
173 #define FFS_BUGCHK_DEBUG (0x00060000)
174 #define FFS_BUGCHK_DEVCTL (0x00070000)
175 #define FFS_BUGCHK_DIRCTL (0x00080000)
176 #define FFS_BUGCHK_DISPATCH (0x00090000)
177 #define FFS_BUGCHK_EXCEPT (0x000A0000)
178 #define FFS_BUGCHK_FFS (0x000B0000)
179 #define FFS_BUGCHK_FASTIO (0x000C0000)
180 #define FFS_BUGCHK_FILEINFO (0x000D0000)
181 #define FFS_BUGCHK_FLUSH (0x000E0000)
182 #define FFS_BUGCHK_FSCTL (0x000F0000)
183 #define FFS_BUGCHK_INIT (0x00100000)
184 #define FFS_BUGCHK_LOCK (0x0011000)
185 #define FFS_BUGCHK_MEMORY (0x0012000)
186 #define FFS_BUGCHK_MISC (0x0013000)
187 #define FFS_BUGCHK_READ (0x00140000)
188 #define FFS_BUGCHK_SHUTDOWN (0x00150000)
189 #define FFS_BUGCHK_VOLINFO (0x00160000)
190 #define FFS_BUGCHK_WRITE (0x00170000)
192 #define FFS_BUGCHK_LAST (0x00170000)
194 #define FFSBugCheck(A,B,C,D) { KeBugCheckEx(FFS_FILE_SYSTEM, A | __LINE__, B, C, D ); }
197 /* FFS file system definions */
200 * Structure of a directory entry
202 #define FFS_NAME_LEN 255
204 #define FFS_ROOT_INO 2 /* Root inode */
208 * FFS_DIR_PAD defines the directory entries boundaries
210 * NOTE: It must be a multiple of 4
212 #define FFS_DIR_PAD 4
213 #define FFS_DIR_ROUND (FFS_DIR_PAD - 1)
214 #define FFS_DIR_REC_LEN(name_len) (((name_len) + 8 + FFS_DIR_ROUND) & \
220 #define S_ISDIR(m) ((m & _S_IFMT) == _S_IFDIR) /* directory */
221 #define S_ISCHR(m) ((m & _S_IFMT) == _S_IFCHR) /* char special */
222 #define S_ISBLK(m) ((m & _S_IFMT) == _S_IFBLK) /* block special */
223 #define S_ISREG(m) ((m & _S_IFMT) == _S_IFREG) /* regular file */
224 #define S_ISFIFO(m) ((m & _S_IFMT) == _S_IFIFO) /* fifo */
225 #define S_ISLNK(m) ((m & _S_IFMT) == _S_IFLNK) /* symbolic link */
226 #define S_ISSOCK(m) ((m & _S_IFMT) == _S_IFSOCK) /* socket */
227 #define S_ISWHT(m) ((m & _S_IFMT) == _S_IFWHT) /* whiteout */
230 #define S_IPERMISSION_MASK 0x1FF /* */
232 #define S_IRWXU 0000700 /* RWX mask for owner */
233 #define S_IRUSR 0000400 /* R for owner */
234 #define S_IWUSR 0000200 /* W for owner */
235 #define S_IXUSR 0000100 /* X for owner */
237 #define S_IRWXG 0000070 /* RWX mask for group */
238 #define S_IRGRP 0000040 /* R for group */
239 #define S_IWGRP 0000020 /* W for group */
240 #define S_IXGRP 0000010 /* X for group */
242 #define S_IRWXO 0000007 /* RWX mask for other */
243 #define S_IROTH 0000004 /* R for other */
244 #define S_IWOTH 0000002 /* W for other */
245 #define S_IXOTH 0000001 /* X for other */
247 #define S_ISREADABLE(m) (((m) & S_IPERMISSION_MASK) == (S_IRUSR | S_IRGRP | S_IROTH))
248 #define S_ISWRITABLE(m) (((m) & S_IPERMISSION_MASK) == (S_IWUSR | S_IWGRP | S_IWOTH))
250 #define FFSSetReadable(m) (m) = ((m) | (S_IRUSR | S_IRGRP | S_IROTH))
251 #define FFSSetWritable(m) (m) = ((m) | (S_IWUSR | S_IWGRP | S_IWOTH))
253 #define FFSSetReadOnly(m) (m) = ((m) & (~(S_IWUSR | S_IWGRP | S_IWOTH)))
254 #define FFSIsReadOnly(m) (!((m) & (S_IWUSR | S_IWGRP | S_IWOTH)))
256 #define FFS_FIRST_DATA_BLOCK (Vcb->ffs_super_block->fs_dblkno)
258 typedef struct fs FFS_SUPER_BLOCK
, *PFFS_SUPER_BLOCK
;
260 typedef struct disklabel DISKLABEL
, *PDISKLABEL
;
262 typedef struct ufs1_dinode FFSv1_INODE
, *PFFSv1_INODE
;
263 typedef struct ufs2_dinode FFSv2_INODE
, *PFFSv2_INODE
;
265 typedef struct direct FFS_DIR_ENTRY
, *PFFS_DIR_ENTRY
;
269 * ffsdrv Driver Definitions
273 * FFS_IDENTIFIER_TYPE
275 * Identifiers used to mark the structures
278 typedef enum _FFS_IDENTIFIER_TYPE
{
286 } FFS_IDENTIFIER_TYPE
;
291 * Header used to mark the structures
293 typedef struct _FFS_IDENTIFIER
{
294 FFS_IDENTIFIER_TYPE Type
;
296 } FFS_IDENTIFIER
, *PFFS_IDENTIFIER
;
299 #define NodeType(Ptr) (*((FFS_IDENTIFIER_TYPE *)(Ptr)))
301 typedef struct _FFS_MCB FFS_MCB
, *PFFS_MCB
;
310 #define FFS_REPINNED_BCBS_ARRAY_SIZE (8)
312 typedef struct _FFS_REPINNED_BCBS
{
315 // A pointer to the next structure contains additional repinned bcbs
318 struct _FFS_REPINNED_BCBS
*Next
;
321 // A fixed size array of pinned bcbs. Whenever a new bcb is added to
322 // the repinned bcb structure it is added to this array. If the
323 // array is already full then another repinned bcb structure is allocated
324 // and pointed to with Next.
327 PBCB Bcb
[ FFS_REPINNED_BCBS_ARRAY_SIZE
];
329 } FFS_REPINNED_BCBS
, *PFFS_REPINNED_BCBS
;
335 typedef struct _FFS_BSD_PARTITION
338 } FFS_BSD_PARTITION
, *PFFS_BSD_PARTITION
;
344 * Data that is not specific to a mounted volume
346 typedef struct _FFS_GLOBAL
{
348 // Identifier for this structure
349 FFS_IDENTIFIER Identifier
;
351 // Syncronization primitive for this structure
354 // Syncronization primitive for Counting
355 ERESOURCE CountResource
;
357 // Syncronization primitive for LookAside Lists
358 ERESOURCE LAResource
;
360 // Table of pointers to the fast I/O entry points
361 FAST_IO_DISPATCH FastIoDispatch
;
363 // Table of pointers to the Cache Manager callbacks
364 CACHE_MANAGER_CALLBACKS CacheManagerCallbacks
;
365 CACHE_MANAGER_CALLBACKS CacheManagerNoOpCallbacks
;
367 // Pointer to the driver object
368 PDRIVER_OBJECT DriverObject
;
370 // Pointer to the main device object
371 PDEVICE_OBJECT DeviceObject
;
373 // List of mounted volumes
376 // Look Aside table of IRP_CONTEXT, FCB, MCB, CCB
378 NPAGED_LOOKASIDE_LIST FFSIrpContextLookasideList
;
379 NPAGED_LOOKASIDE_LIST FFSFcbLookasideList
;
380 NPAGED_LOOKASIDE_LIST FFSCcbLookasideList
;
381 PAGED_LOOKASIDE_LIST FFSMcbLookasideList
;
390 // IRP_MJ_CLOSE : FCB
391 USHORT IRPCloseCount
;
394 // Global flags for the driver
397 ULONG PartitionNumber
;
399 } FFS_GLOBAL
, *PFFS_GLOBAL
;
402 * Flags for FFS_GLOBAL_DATA
404 #define FFS_UNLOAD_PENDING 0x00000001
405 #define FFS_SUPPORT_WRITING 0x00000002
406 #define FFS_CHECKING_BITMAP 0x00000008
409 * Driver Extension define
412 FFS_GLOBAL FFSGlobal
;
413 } FFS_EXT
, *PFFS_EXT
;
416 typedef struct _FFS_FCBVCB
{
418 // FCB header required by NT
419 FSRTL_COMMON_FCB_HEADER CommonFCBHeader
;
420 SECTION_OBJECT_POINTERS SectionObject
;
421 ERESOURCE MainResource
;
422 ERESOURCE PagingIoResource
;
423 // end FCB header required by NT
425 // Identifier for this structure
426 FFS_IDENTIFIER Identifier
;
427 } FFS_FCBVCB
, *PFFS_FCBVCB
;
430 * FFS_VCB Volume Control Block
432 * Data that represents a mounted logical volume
433 * It is allocated as the device extension of the volume device object
435 typedef struct _FFS_VCB
{
437 // FCB header required by NT
438 // The VCB is also used as an FCB for file objects
439 // that represents the volume itself
440 FSRTL_COMMON_FCB_HEADER Header
;
441 SECTION_OBJECT_POINTERS SectionObject
;
442 ERESOURCE MainResource
;
443 ERESOURCE PagingIoResource
;
444 // end FCB header required by NT
446 // Identifier for this structure
447 FFS_IDENTIFIER Identifier
;
451 // Share Access for the file object
452 SHARE_ACCESS ShareAccess
;
454 // Incremented on IRP_MJ_CREATE, decremented on IRP_MJ_CLEANUP
455 // for files on this volume.
456 ULONG OpenFileHandleCount
;
458 // Incremented on IRP_MJ_CREATE, decremented on IRP_MJ_CLOSE
459 // for both files on this volume and open instances of the
461 ULONG ReferenceCount
;
462 ULONG OpenHandleCount
;
470 // Pointer to the VPB in the target device object
473 // The FileObject of Volume used to lock the volume
474 PFILE_OBJECT LockFile
;
476 // List of FCBs for open files on this volume
479 // List of IRPs pending on directory change notify requests
480 LIST_ENTRY NotifyList
;
482 // Pointer to syncronization primitive for this list
483 PNOTIFY_SYNC NotifySync
;
485 // This volumes device object
486 PDEVICE_OBJECT DeviceObject
;
488 // The physical device object (the disk)
489 PDEVICE_OBJECT TargetDeviceObject
;
491 // The physical device object (the disk)
492 PDEVICE_OBJECT RealDevice
;
494 // Information about the physical device object
495 DISK_GEOMETRY DiskGeometry
;
496 PARTITION_INFORMATION PartitionInformation
;
498 // File System Super Block
499 PFFS_SUPER_BLOCK ffs_super_block
;
501 // File System version
504 // Number of Group Decsciptions
507 // Bitmap Block per group
508 PRTL_BITMAP BlockBitMaps;
509 PRTL_BITMAP InodeBitMaps;
511 // Block / Cluster size
514 // Sector size in bits
517 ULONG dwData
[FFS_BLOCK_TYPES
];
518 ULONG dwMeta
[FFS_BLOCK_TYPES
];
520 // Flags for the volume
523 // Streaming File Object
524 PFILE_OBJECT StreamObj
;
526 // Resource Lock for Mcb
527 ERESOURCE McbResource
;
529 // Dirty Mcbs of modifications for volume stream
532 // Entry of Mcb Tree (Root Node)
536 ULONGLONG FSOffset
[MAXPARTITIONS
];
540 ULONG PartitionNumber
;
542 } FFS_VCB
, *PFFS_VCB
;
547 #define VCB_INITIALIZED 0x00000001
548 #define VCB_VOLUME_LOCKED 0x00000002
549 #define VCB_MOUNTED 0x00000004
550 #define VCB_DISMOUNT_PENDING 0x00000008
551 #define VCB_READ_ONLY 0x00000010
553 #define VCB_WRITE_PROTECTED 0x10000000
554 #define VCB_FLOPPY_DISK 0x20000000
555 #define VCB_REMOVAL_PREVENTED 0x40000000
556 #define VCB_REMOVABLE_MEDIA 0x80000000
559 #define IsMounted(Vcb) (IsFlagOn(Vcb->Flags, VCB_MOUNTED))
563 * FFS_FCB File Control Block
565 * Data that represents an open file
566 * There is a single instance of the FCB for every open file
568 typedef struct _FFS_FCB
{
570 // FCB header required by NT
571 FSRTL_COMMON_FCB_HEADER Header
;
572 SECTION_OBJECT_POINTERS SectionObject
;
573 ERESOURCE MainResource
;
574 ERESOURCE PagingIoResource
;
575 // end FCB header required by NT
577 // Identifier for this structure
578 FFS_IDENTIFIER Identifier
;
580 // List of FCBs for this volume
583 // Share Access for the file object
584 SHARE_ACCESS ShareAccess
;
586 // List of byte-range locks for this file
587 FILE_LOCK FileLockAnchor
;
589 // Incremented on IRP_MJ_CREATE, decremented on IRP_MJ_CLEANUP
590 ULONG OpenHandleCount
;
592 // Incremented on IRP_MJ_CREATE, decremented on IRP_MJ_CLOSE
593 ULONG ReferenceCount
;
595 // Incremented on IRP_MJ_CREATE, decremented on IRP_MJ_CLEANUP
596 // But only for Files with FO_NO_INTERMEDIATE_BUFFERING flag
597 ULONG NonCachedOpenCount
;
602 // Pointer to the inode
603 PFFSv1_INODE dinode1
;
604 PFFSv2_INODE dinode2
;
606 // Hint block for next allocation
617 UNICODE_STRING LongName
;
620 // The Ansi Filename for debugging
621 OEM_STRING AnsiFileName
;
625 } FFS_FCB
, *PFFS_FCB
;
631 #define FCB_FROM_POOL 0x00000001
632 #define FCB_PAGE_FILE 0x00000002
633 #define FCB_DELETE_ON_CLOSE 0x00000004
634 #define FCB_DELETE_PENDING 0x00000008
635 #define FCB_FILE_DELETED 0x00000010
636 #define FCB_FILE_MODIFIED 0x00000020
642 // Identifier for this structure
643 FFS_IDENTIFIER Identifier
;
650 PFFS_MCB Parent
; // Parent
651 PFFS_MCB Child
; // Children
652 PFFS_MCB Next
; // Brothers
660 UNICODE_STRING ShortName
;
665 // Dir entry offset in parent
671 // List Link to Vcb->McbList
678 #define MCB_FROM_POOL 0x00000001
679 #define MCB_IN_TREE 0x00000002
680 #define MCB_IN_USE 0x00000004
682 #define IsMcbUsed(Mcb) IsFlagOn(Mcb->Flags, MCB_IN_USE)
686 * FFS_CCB Context Control Block
688 * Data that represents one instance of an open file
689 * There is one instance of the CCB for every instance of an open file
691 typedef struct _FFS_CCB
{
693 // Identifier for this structure
694 FFS_IDENTIFIER Identifier
;
699 // State that may need to be maintained
700 ULONG CurrentByteOffset
;
701 UNICODE_STRING DirectorySearchPattern
;
703 } FFS_CCB
, *PFFS_CCB
;
709 #define CCB_FROM_POOL 0x00000001
711 #define CCB_ALLOW_EXTENDED_DASD_IO 0x80000000
717 * Used to pass information about a request between the drivers functions
719 typedef struct _FFS_IRP_CONTEXT
{
721 // Identifier for this structure
722 FFS_IDENTIFIER Identifier
;
724 // Pointer to the IRP this request describes
730 // The major and minor function code for the request
735 PDEVICE_OBJECT DeviceObject
;
737 // The real device object
738 PDEVICE_OBJECT RealDevice
;
741 PFILE_OBJECT FileObject
;
746 // If the request is synchronous (we are allowed to block)
747 BOOLEAN IsSynchronous
;
749 // If the request is top level
752 // Used if the request needs to be queued for later processing
753 WORK_QUEUE_ITEM WorkQueueItem
;
755 // If an exception is currently in progress
756 BOOLEAN ExceptionInProgress
;
758 // The exception code when an exception is in progress
759 NTSTATUS ExceptionCode
;
761 // Repinned BCBs List
762 FFS_REPINNED_BCBS Repinned
;
764 } FFS_IRP_CONTEXT
, *PFFS_IRP_CONTEXT
;
767 #define IRP_CONTEXT_FLAG_FROM_POOL (0x00000001)
768 #define IRP_CONTEXT_FLAG_WAIT (0x00000002)
769 #define IRP_CONTEXT_FLAG_WRITE_THROUGH (0x00000004)
770 #define IRP_CONTEXT_FLAG_FLOPPY (0x00000008)
771 #define IRP_CONTEXT_FLAG_RECURSIVE_CALL (0x00000010)
772 #define IRP_CONTEXT_FLAG_DISABLE_POPUPS (0x00000020)
773 #define IRP_CONTEXT_FLAG_DEFERRED (0x00000040)
774 #define IRP_CONTEXT_FLAG_VERIFY_READ (0x00000080)
775 #define IRP_CONTEXT_STACK_IO_CONTEXT (0x00000100)
776 #define IRP_CONTEXT_FLAG_REQUEUED (0x00000200)
777 #define IRP_CONTEXT_FLAG_USER_IO (0x00000400)
778 #define IRP_CONTEXT_FLAG_DELAY_CLOSE (0x00000800)
784 * In the checked version of the driver this header is put in the beginning of
785 * every memory allocation
787 typedef struct _FFS_ALLOC_HEADER
{
788 FFS_IDENTIFIER Identifier
;
789 } FFS_ALLOC_HEADER
, *PFFS_ALLOC_HEADER
;
791 typedef struct _FCB_LIST_ENTRY
{
794 } FCB_LIST_ENTRY
, *PFCB_LIST_ENTRY
;
797 /* Block Description List */
798 typedef struct _FFS_BDL
{
803 } FFS_BDL
, *PFFS_BDL
;
809 * The following macro is used to determine if an FSD thread can block
810 * for I/O or wait for a resource. It returns TRUE if the thread can
811 * block and FALSE otherwise. This attribute can then be used to call
812 * the FSD & FSP common work routine with the proper wait value.
815 #define CanFFSWait(IRP) IoIsOperationSynchronous(Irp)
817 #define FFS_POOL_TAG 'dsfF'
827 IN LOCK_OPERATION Operation
);
834 IN PFFS_IRP_CONTEXT IrpContext
,
859 IN PDEVICE_OBJECT DeviceOjbect
,
861 IN PVOID InputBuffer
,
862 IN ULONG InputBufferSize
,
863 IN OUT PVOID OutputBuffer
,
864 IN OUT PULONG OutputBufferSize
);
866 __drv_mustHoldCriticalRegion
868 FFSMediaEjectControl(
869 IN PFFS_IRP_CONTEXT IrpContext
,
871 IN BOOLEAN bPrevent
);
882 __drv_mustHoldCriticalRegion
885 IN PFFS_IRP_CONTEXT IrpContext
);
892 __drv_mustHoldCriticalRegion
895 IN PFFS_IRP_CONTEXT IrpContext
);
898 FFSQueueCloseRequest(
899 IN PFFS_IRP_CONTEXT IrpContext
);
902 IO_WORKITEM_ROUTINE FFSDeQueueCloseRequest
;
906 FFSDeQueueCloseRequest(
914 __drv_mustHoldCriticalRegion
916 FFSAcquireForLazyWrite(
920 __drv_mustHoldCriticalRegion
922 FFSReleaseFromLazyWrite(
925 __drv_mustHoldCriticalRegion
927 FFSAcquireForReadAhead(
940 __drv_mustHoldCriticalRegion
942 FFSReleaseFromReadAhead(
958 IN PFFS_MCB ParentMcb
,
959 IN PUNICODE_STRING FileName
,
961 IN PFFSv1_INODE dinode1
,
962 IN PFFS_DIR_ENTRY ffs_dir
);
967 IN PFFS_MCB ParentMcb
,
968 IN PUNICODE_STRING FileName
,
970 IN PFFSv2_INODE dinode2
,
971 IN PFFS_DIR_ENTRY ffs_dir
);
976 IN PUNICODE_STRING FullFileName
,
977 IN PFFS_MCB ParentMcb
,
978 OUT PFFS_MCB
* FFSMcb
,
979 IN OUT PFFSv1_INODE dinode1
);
985 IN PUNICODE_STRING FullFileName
,
986 IN PFFS_MCB ParentMcb
,
987 OUT PFFS_MCB
* FFSMcb
,
988 IN OUT PFFSv2_INODE dinode2
);
990 __drv_mustHoldCriticalRegion
993 IN PFFS_IRP_CONTEXT IrpContext
,
996 __drv_mustHoldCriticalRegion
999 IN PFFS_IRP_CONTEXT IrpContext
,
1002 __drv_mustHoldCriticalRegion
1005 IN PFFS_IRP_CONTEXT IrpContext
);
1007 __drv_mustHoldCriticalRegion
1010 PFFS_IRP_CONTEXT IrpContext
,
1015 PUNICODE_STRING FileName
);
1017 __drv_mustHoldCriticalRegion
1019 FFSSupersedeOrOverWriteFile(
1020 IN PFFS_IRP_CONTEXT IrpContext
,
1023 IN ULONG Disposition
);
1038 #define FFSPrint(arg) FFSPrintf arg
1039 #define FFSPrintNoIndent(arg) FFSNIPrintf arg
1041 #define FFSCompleteRequest(Irp, bPrint, PriorityBoost) \
1042 FFSDbgPrintComplete(Irp, bPrint); \
1043 IoCompleteRequest(Irp, PriorityBoost)
1047 #define FFSPrint(arg)
1049 #define FFSCompleteRequest(Irp, bPrint, PriorityBoost) \
1050 IoCompleteRequest(Irp, PriorityBoost)
1057 LONG DebugPrintLevel
,
1064 LONG DebugPrintLevel
,
1068 extern ULONG ProcessNameOffset
;
1070 #define FFSGetCurrentProcessName() ( \
1071 (PCHAR) PsGetCurrentProcess() + ProcessNameOffset \
1075 FFSGetProcessNameOffset(
1080 IN PDEVICE_OBJECT DeviceObject
,
1084 FFSDbgPrintComplete(
1089 FFSNtStatusToString(
1090 IN NTSTATUS Status
);
1097 __drv_mustHoldCriticalRegion
1099 FFSDeviceControlNormal(
1100 IN PFFS_IRP_CONTEXT IrpContext
);
1102 __drv_mustHoldCriticalRegion
1105 IN PFFS_IRP_CONTEXT IrpContext
);
1107 __drv_mustHoldCriticalRegion
1110 IN PFFS_IRP_CONTEXT IrpContext
);
1119 IN FILE_INFORMATION_CLASS FileInformationClass
);
1124 IN FILE_INFORMATION_CLASS FileInformationClass
,
1127 IN ULONG UsedLength
,
1130 IN PUNICODE_STRING pName
,
1133 __drv_mustHoldCriticalRegion
1136 IN PFFS_IRP_CONTEXT IrpContext
);
1138 __drv_mustHoldCriticalRegion
1140 FFSNotifyChangeDirectory(
1141 IN PFFS_IRP_CONTEXT IrpContext
);
1144 FFSNotifyReportChange(
1145 IN PFFS_IRP_CONTEXT IrpContext
,
1151 __drv_mustHoldCriticalRegion
1153 FFSDirectoryControl(
1154 IN PFFS_IRP_CONTEXT IrpContext
);
1157 FFSIsDirectoryEmpty(
1168 IN PFFS_IRP_CONTEXT IrpContext
);
1171 IO_WORKITEM_ROUTINE FFSDeQueueRequest
;
1180 IN PFFS_IRP_CONTEXT IrpContext
);
1183 __drv_dispatchType(IRP_MJ_CREATE
)
1184 __drv_dispatchType(IRP_MJ_CLOSE
)
1185 __drv_dispatchType(IRP_MJ_READ
)
1186 __drv_dispatchType(IRP_MJ_WRITE
)
1187 __drv_dispatchType(IRP_MJ_QUERY_INFORMATION
)
1188 __drv_dispatchType(IRP_MJ_SET_INFORMATION
)
1189 __drv_dispatchType(IRP_MJ_FLUSH_BUFFERS
)
1190 __drv_dispatchType(IRP_MJ_QUERY_VOLUME_INFORMATION
)
1191 __drv_dispatchType(IRP_MJ_SET_VOLUME_INFORMATION
)
1192 __drv_dispatchType(IRP_MJ_DIRECTORY_CONTROL
)
1193 __drv_dispatchType(IRP_MJ_FILE_SYSTEM_CONTROL
)
1194 __drv_dispatchType(IRP_MJ_DEVICE_CONTROL
)
1195 __drv_dispatchType(IRP_MJ_SHUTDOWN
)
1196 __drv_dispatchType(IRP_MJ_LOCK_CONTROL
)
1197 __drv_dispatchType(IRP_MJ_CLEANUP
)
1198 __drv_dispatchType(IRP_MJ_PNP
)
1199 DRIVER_DISPATCH FFSBuildRequest
;
1204 PDEVICE_OBJECT DeviceObject
,
1214 IN PFFS_IRP_CONTEXT IrpContext
,
1215 IN PEXCEPTION_POINTERS ExceptionPointer
);
1218 FFSExceptionHandler(
1219 IN PFFS_IRP_CONTEXT IrpContext
);
1230 IN ULONGLONG SuperBlockOffset
);
1232 __drv_mustHoldCriticalRegion
1235 IN PFFS_IRP_CONTEXT IrpContext
,
1244 IN PFFS_IRP_CONTEXT IrpContext
,
1251 OUT PLONGLONG offset
);
1257 OUT PLONGLONG offset
);
1263 IN PFFSv1_INODE dinode1
);
1269 IN PFFSv2_INODE dinode2
);
1271 __drv_mustHoldCriticalRegion
1274 IN PFFS_IRP_CONTEXT IrpContext
,
1277 IN PFFSv1_INODE dinode1
);
1279 __drv_mustHoldCriticalRegion
1282 IN PFFS_IRP_CONTEXT IrpContext
,
1285 IN PFFSv2_INODE dinode2
);
1299 __drv_mustHoldCriticalRegion
1302 IN PFFS_IRP_CONTEXT IrpContext
,
1307 __drv_mustHoldCriticalRegion
1310 IN PFFS_IRP_CONTEXT IrpContext
,
1326 IN ULONGLONG dwContent
,
1333 IN PFFSv1_INODE dinode1
,
1339 IN PFFSv2_INODE dinode2
,
1344 IN PFFS_IRP_CONTEXT IrpContext
,
1346 IN PFFSv1_INODE dinode1
,
1347 IN ULONGLONG Offset
,
1349 OUT PFFS_BDL
*ffs_bdl
);
1353 IN PFFS_IRP_CONTEXT IrpContext
,
1355 IN PFFSv2_INODE dinode2
,
1356 IN ULONGLONG Offset
,
1358 OUT PFFS_BDL
*ffs_bdl
);
1362 PFFS_IRP_CONTEXT IrpContext
,
1370 PFFS_IRP_CONTEXT IrpContext
,
1374 __drv_mustHoldCriticalRegion
1377 PFFS_IRP_CONTEXT IrpContext
,
1388 PFFS_IRP_CONTEXT IrpContext
,
1395 PFFS_IRP_CONTEXT IrpContext
,
1403 PFFS_IRP_CONTEXT IrpContext
,
1408 __drv_mustHoldCriticalRegion
1411 IN PFFS_IRP_CONTEXT IrpContext
,
1416 IN PUNICODE_STRING FileName
);
1418 __drv_mustHoldCriticalRegion
1421 IN PFFS_IRP_CONTEXT IrpContext
,
1427 __drv_mustHoldCriticalRegion
1430 IN PFFS_IRP_CONTEXT IrpContext
,
1434 IN ULONG NewParent
);
1436 __drv_mustHoldCriticalRegion
1439 IN PFFS_IRP_CONTEXT IrpContext
,
1445 OUT BOOLEAN
*bFreed
);
1449 IN PFFS_IRP_CONTEXT IrpContext
,
1453 __drv_mustHoldCriticalRegion
1458 IN LONGLONG Length
);
1460 __drv_mustHoldCriticalRegion
1465 IN LONGLONG Length
);
1467 __drv_mustHoldCriticalRegion
1473 OUT PLONGLONG pLength
,
1474 OUT PLONGLONG RunStart
,
1475 OUT PLONGLONG RunLength
,
1494 FAST_IO_CHECK_IF_POSSIBLE FFSFastIoCheckIfPossible
;
1498 FFSFastIoCheckIfPossible(
1499 IN PFILE_OBJECT FileObject
,
1500 IN PLARGE_INTEGER FileOffset
,
1504 IN BOOLEAN CheckForReadOperation
,
1505 OUT PIO_STATUS_BLOCK IoStatus
,
1506 IN PDEVICE_OBJECT DeviceObject
);
1509 FAST_IO_READ FFSFastIoRead
;
1514 IN PFILE_OBJECT FileObject
,
1515 IN PLARGE_INTEGER FileOffset
,
1520 OUT PIO_STATUS_BLOCK IoStatus
,
1521 IN PDEVICE_OBJECT DeviceObject
);
1524 FAST_IO_WRITE FFSFastIoWrite
;
1529 IN PFILE_OBJECT FileObject
,
1530 IN PLARGE_INTEGER FileOffset
,
1535 OUT PIO_STATUS_BLOCK IoStatus
,
1536 IN PDEVICE_OBJECT DeviceObject
);
1539 FAST_IO_QUERY_BASIC_INFO FFSFastIoQueryBasicInfo
;
1542 __drv_mustHoldCriticalRegion
1544 FFSFastIoQueryBasicInfo(
1545 IN PFILE_OBJECT FileObject
,
1547 OUT PFILE_BASIC_INFORMATION Buffer
,
1548 OUT PIO_STATUS_BLOCK IoStatus
,
1549 IN PDEVICE_OBJECT DeviceObject
);
1552 FAST_IO_QUERY_STANDARD_INFO FFSFastIoQueryStandardInfo
;
1555 __drv_mustHoldCriticalRegion
1557 FFSFastIoQueryStandardInfo(
1558 IN PFILE_OBJECT FileObject
,
1560 OUT PFILE_STANDARD_INFORMATION Buffer
,
1561 OUT PIO_STATUS_BLOCK IoStatus
,
1562 IN PDEVICE_OBJECT DeviceObject
);
1565 FAST_IO_LOCK FFSFastIoLock
;
1570 IN PFILE_OBJECT FileObject
,
1571 IN PLARGE_INTEGER FileOffset
,
1572 IN PLARGE_INTEGER Length
,
1573 IN PEPROCESS Process
,
1575 IN BOOLEAN FailImmediately
,
1576 IN BOOLEAN ExclusiveLock
,
1577 OUT PIO_STATUS_BLOCK IoStatus
,
1578 IN PDEVICE_OBJECT DeviceObject
);
1581 FAST_IO_UNLOCK_SINGLE FFSFastIoUnlockSingle
;
1585 FFSFastIoUnlockSingle(
1586 IN PFILE_OBJECT FileObject
,
1587 IN PLARGE_INTEGER FileOffset
,
1588 IN PLARGE_INTEGER Length
,
1589 IN PEPROCESS Process
,
1591 OUT PIO_STATUS_BLOCK IoStatus
,
1592 IN PDEVICE_OBJECT DeviceObject
);
1595 FAST_IO_UNLOCK_ALL FFSFastIoUnlockAll
;
1600 IN PFILE_OBJECT FileObject
,
1601 IN PEPROCESS Process
,
1602 OUT PIO_STATUS_BLOCK IoStatus
,
1603 IN PDEVICE_OBJECT DeviceObject
);
1606 FAST_IO_UNLOCK_ALL_BY_KEY FFSFastIoUnlockAllByKey
;
1610 FFSFastIoUnlockAllByKey(
1611 IN PFILE_OBJECT FileObject
,
1613 IN PEPROCESS Process
,
1618 OUT PIO_STATUS_BLOCK IoStatus
,
1619 IN PDEVICE_OBJECT DeviceObject
);
1622 FAST_IO_QUERY_NETWORK_OPEN_INFO FFSFastIoQueryNetworkOpenInfo
;
1625 __drv_mustHoldCriticalRegion
1627 FFSFastIoQueryNetworkOpenInfo(
1628 IN PFILE_OBJECT FileObject
,
1630 OUT PFILE_NETWORK_OPEN_INFORMATION Buffer
,
1631 OUT PIO_STATUS_BLOCK IoStatus
,
1632 IN PDEVICE_OBJECT DeviceObject
);
1638 __drv_mustHoldCriticalRegion
1640 FFSQueryInformation(
1641 IN PFFS_IRP_CONTEXT IrpContext
);
1643 __drv_mustHoldCriticalRegion
1646 IN PFFS_IRP_CONTEXT IrpContext
);
1650 PFFS_IRP_CONTEXT IrpContext
,
1653 PLARGE_INTEGER AllocationSize
);
1657 PFFS_IRP_CONTEXT IrpContext
,
1660 PLARGE_INTEGER AllocationSize
);
1663 FFSSetDispositionInfo(
1664 PFFS_IRP_CONTEXT IrpContext
,
1669 __drv_mustHoldCriticalRegion
1672 PFFS_IRP_CONTEXT IrpContext
,
1676 __drv_mustHoldCriticalRegion
1679 PFFS_IRP_CONTEXT IrpContext
,
1688 __drv_mustHoldCriticalRegion
1694 __drv_mustHoldCriticalRegion
1704 __drv_mustHoldCriticalRegion
1707 IN PFFS_IRP_CONTEXT IrpContext
);
1726 IN PDEVICE_OBJECT DeviceObject
,
1727 OUT ULONGLONG
*StartOffset
);
1731 PDEVICE_OBJECT DeviceObject
,
1734 __drv_mustHoldCriticalRegion
1737 IN PFFS_IRP_CONTEXT IrpContext
,
1741 __drv_mustHoldCriticalRegion
1745 IN BOOLEAN FlushBeforePurge
);
1747 __drv_mustHoldCriticalRegion
1751 IN BOOLEAN FlushBeforePurge
);
1754 FFSIsHandleCountZero(
1760 IN PFILE_OBJECT FileObject
);
1762 __drv_mustHoldCriticalRegion
1765 IN PFFS_IRP_CONTEXT IrpContext
);
1770 IN PFILE_OBJECT FileObject
);
1772 __drv_mustHoldCriticalRegion
1775 IN PFFS_IRP_CONTEXT IrpContext
);
1777 __drv_mustHoldCriticalRegion
1779 FFSAllowExtendedDasdIo(
1780 IN PFFS_IRP_CONTEXT IrpContext
);
1782 __drv_mustHoldCriticalRegion
1785 IN PFFS_IRP_CONTEXT IrpContext
);
1787 __drv_mustHoldCriticalRegion
1790 IN PFFS_IRP_CONTEXT IrpContext
);
1792 __drv_mustHoldCriticalRegion
1795 IN PFFS_IRP_CONTEXT IrpContext
);
1797 __drv_mustHoldCriticalRegion
1800 IN PFFS_IRP_CONTEXT IrpContext
);
1802 __drv_mustHoldCriticalRegion
1805 IN PFFS_IRP_CONTEXT IrpContext
);
1807 __drv_mustHoldCriticalRegion
1809 FFSSelectBSDPartition(
1810 IN PFFS_IRP_CONTEXT IrpContext
);
1812 __drv_mustHoldCriticalRegion
1814 FFSFileSystemControl(
1815 IN PFFS_IRP_CONTEXT IrpContext
);
1824 IN PUNICODE_STRING RegistryPath
);
1827 DRIVER_INITIALIZE DriverEntry
;
1831 DRIVER_UNLOAD DriverUnload
;
1836 IN PDRIVER_OBJECT DriverObject
);
1843 __drv_mustHoldCriticalRegion
1846 IN PFFS_IRP_CONTEXT IrpContext
);
1853 __drv_mustHoldCriticalRegion
1855 FFSAllocateIrpContext(
1856 IN PDEVICE_OBJECT DeviceObject
,
1859 __drv_mustHoldCriticalRegion
1862 IN PFFS_IRP_CONTEXT IrpContext
);
1864 __drv_mustHoldCriticalRegion
1869 IN PFFSv1_INODE dinode1
);
1871 __drv_mustHoldCriticalRegion
1876 IN PFFSv2_INODE dinode2
);
1878 __drv_mustHoldCriticalRegion
1883 __drv_mustHoldCriticalRegion
1888 __drv_mustHoldCriticalRegion
1893 __drv_mustHoldCriticalRegion
1895 FFSCreateFcbFromMcb(
1899 __drv_mustHoldCriticalRegion
1907 PUNICODE_STRING FileName
,
1920 PUNICODE_STRING FileName
);
1925 PUNICODE_STRING FileName
);
1929 PFFS_VCB Vcb
, PFFS_MCB Mcb
);
1943 __drv_mustHoldCriticalRegion
1950 PFFS_IRP_CONTEXT IrpContext
,
1955 FFSCheckBitmapConsistency(
1956 PFFS_IRP_CONTEXT IrpContext
,
1967 __drv_mustHoldCriticalRegion
1970 IN PFFS_IRP_CONTEXT IrpContext
,
1972 IN PFFS_SUPER_BLOCK FFSSb
,
1973 IN PDEVICE_OBJECT TargetDevice
,
1974 IN PDEVICE_OBJECT VolumeDevice
,
1977 __drv_mustHoldCriticalRegion
1984 IN PFFS_IRP_CONTEXT IrpContext
,
1988 FFSUnpinRepinnedBcbs(
1989 IN PFFS_IRP_CONTEXT IrpContext
);
1992 __drv_mustHoldCriticalRegion
1994 FFSCompleteIrpContext(
1995 IN PFFS_IRP_CONTEXT IrpContext
,
1996 IN NTSTATUS Status
);
1999 FFSSyncUninitializeCacheMap(
2000 IN PFILE_OBJECT FileObject
);
2017 IN LARGE_INTEGER SysTime
);
2021 IN OUT PUNICODE_STRING Unicode
,
2022 IN POEM_STRING Oem
);
2026 IN OUT POEM_STRING Oem
,
2027 IN PUNICODE_STRING Unicode
);
2034 __drv_mustHoldCriticalRegion
2037 IN PFFS_IRP_CONTEXT IrpContext
);
2039 __drv_mustHoldCriticalRegion
2042 PFFS_IRP_CONTEXT IrpContext
,
2045 __drv_mustHoldCriticalRegion
2048 PFFS_IRP_CONTEXT IrpContext
,
2051 __drv_mustHoldCriticalRegion
2054 PFFS_IRP_CONTEXT IrpContext
,
2057 __drv_mustHoldCriticalRegion
2059 FFSPnpSurpriseRemove(
2060 PFFS_IRP_CONTEXT IrpContext
,
2070 IN PFILE_OBJECT FileObject
,
2071 IN PLARGE_INTEGER FileOffset
,
2075 OUT PIO_STATUS_BLOCK IoStatus
);
2079 IN PFFS_IRP_CONTEXT IrpContext
,
2081 IN PFFSv1_INODE dinode1
,
2082 IN ULONGLONG offset
,
2089 IN PFFS_IRP_CONTEXT IrpContext
,
2091 IN PFFSv2_INODE dinode2
,
2092 IN ULONGLONG offset
,
2097 __drv_mustHoldCriticalRegion
2100 IN PFFS_IRP_CONTEXT IrpContext
);
2107 __drv_mustHoldCriticalRegion
2110 IN PFFS_IRP_CONTEXT IrpContext
);
2117 __drv_mustHoldCriticalRegion
2119 FFSQueryVolumeInformation(
2120 IN PFFS_IRP_CONTEXT IrpContext
);
2122 __drv_mustHoldCriticalRegion
2124 FFSSetVolumeInformation(
2125 IN PFFS_IRP_CONTEXT IrpContext
);
2134 IN PFFS_IRP_CONTEXT IrpContext
,
2136 IN PFFSv1_INODE dinode1
,
2137 IN ULONGLONG offset
,
2140 IN BOOLEAN bWriteToDisk
,
2145 IN PFFS_IRP_CONTEXT IrpContext
,
2147 IN PFFSv2_INODE dinode2
,
2148 IN ULONGLONG offset
,
2151 IN BOOLEAN bWriteToDisk
,
2155 FFSStartFloppyFlushDpc(
2158 PFILE_OBJECT FileObject
);
2162 IN PFFS_IRP_CONTEXT IrpContext
,
2164 IN PFILE_OBJECT FileObject
,
2168 __drv_mustHoldCriticalRegion
2171 IN PFFS_IRP_CONTEXT IrpContext
);
2175 IN PDEVICE_OBJECT pDeviceObject
,
2178 #endif /* _FFS_HEADER_ */