2 * COPYRIGHT: See COPYRIGHT.TXT
3 * PROJECT: Ext2 File System Driver for WinNT/2K/XP
5 * PURPOSE: Header file: ext2 structures
6 * PROGRAMMER: Matt Wu <mattwu@163.com>
7 * HOMEPAGE: http://www.ext2fsd.com
14 /* INCLUDES *************************************************************/
15 #include <linux/module.h>
18 #include <ndk/rtlfuncs.h>
19 #include <pseh/pseh2.h>
24 #include <linux/ext2_fs.h>
25 #include <linux/ext3_fs.h>
26 #include <linux/ext3_fs_i.h>
27 #include <linux/ext4.h>
29 /* DEBUG ****************************************************************/
36 #define EXT_DEBUG_BREAKPOINT FALSE
38 #if EXT2_DEBUG && EXT_DEBUG_BREAKPOINT
40 //#define DbgBreak() __asm int 3
42 #define DbgBreak() KdBreakPoint()
48 /* STRUCTS & CONSTS******************************************************/
50 #define EXT2FSD_VERSION "0.68"
53 /* WDK DEFINITIONS ******************************************************/
56 /* COMPILER SWITCH / OPTIONS ********************************************/
59 // Ext2Fsd build options
62 // To support driver dynamics unload
64 #define EXT2_UNLOAD FALSE
66 // To support inode size expansion (fallocate)
68 #define EXT2_PRE_ALLOCATION_SUPPORT TRUE
74 #define EXT2_MAX_NESTED_LINKS (8)
75 #define EXT2_LINKLEN_IN_INODE (60)
76 #define EXT2_BLOCK_TYPES (0x04)
78 #define MAXIMUM_RECORD_LENGTH (0x10000)
80 #define SECTOR_BITS (Vcb->SectorBits)
81 #define SECTOR_SIZE (Vcb->DiskGeometry.BytesPerSector)
82 #define DEFAULT_SECTOR_SIZE (0x200)
84 #define SUPER_BLOCK_OFFSET (0x400)
85 #define SUPER_BLOCK_SIZE (0x400)
87 #define READ_AHEAD_GRANULARITY (0x10000)
89 #define SUPER_BLOCK (Vcb->SuperBlock)
91 #define INODE_SIZE (Vcb->InodeSize)
92 #define BLOCK_SIZE (Vcb->BlockSize)
93 #define BLOCK_BITS (SUPER_BLOCK->s_log_block_size + 10)
94 #define GROUP_DESC_SIZE (Vcb->sbi.s_desc_size)
96 #define INODES_COUNT (Vcb->SuperBlock->s_inodes_count)
98 #define INODES_PER_GROUP (SUPER_BLOCK->s_inodes_per_group)
99 #define BLOCKS_PER_GROUP (SUPER_BLOCK->s_blocks_per_group)
100 #define TOTAL_BLOCKS (ext3_blocks_count(SUPER_BLOCK))
102 #define EXT2_FIRST_DATA_BLOCK (SUPER_BLOCK->s_first_data_block)
104 typedef struct ext3_super_block EXT2_SUPER_BLOCK
, *PEXT2_SUPER_BLOCK
;
105 typedef struct ext3_inode EXT2_INODE
, *PEXT2_INODE
;
106 typedef struct ext4_group_desc EXT2_GROUP_DESC
, *PEXT2_GROUP_DESC
;
107 typedef struct ext3_dir_entry EXT2_DIR_ENTRY
, *PEXT2_DIR_ENTRY
;
108 typedef struct ext3_dir_entry_2 EXT2_DIR_ENTRY2
, *PEXT2_DIR_ENTRY2
;
110 #define CEILING_ALIGNED(T, A, B) (((A) + (B) - 1) & (~((T)(B) - 1)))
111 #define COCKLOFT_ALIGNED(T, A, B) (((A) + (B)) & (~((T)(B) - 1)))
116 * Compile-time assertion: (Lustre version)
118 * Check an invariant described by a constant expression at compile time by
119 * forcing a compiler error if it does not hold. \a cond must be a constant
120 * expression as defined by the ISO C Standard:
122 * 6.8.4.2 The switch statement
124 * [#3] The expression of each case label shall be an integer
125 * constant expression and no two of the case constant
126 * expressions in the same switch statement shall have the same
127 * value after conversion...
131 #define CL_ASSERT(cond) do {switch('x') {case (cond): case 0: break;}} while (0)
133 /* File System Releated *************************************************/
135 #define DRIVER_NAME "Ext2Fsd"
136 #define DEVICE_NAME L"\\Ext2Fsd"
137 #define CDROM_NAME L"\\Ext2CdFsd"
141 #define PARAMETERS_KEY L"\\Parameters"
142 #define VOLUMES_KEY L"\\Volumes"
144 #define READING_ONLY L"Readonly"
145 #define WRITING_SUPPORT L"WritingSupport"
146 #define CHECKING_BITMAP L"CheckingBitmap"
147 #define EXT3_FORCEWRITING L"Ext3ForceWriting"
148 #define CODEPAGE_NAME L"CodePage"
149 #define HIDING_PREFIX L"HidingPrefix"
150 #define HIDING_SUFFIX L"HidingSuffix"
151 #define AUTO_MOUNT L"AutoMount"
152 #define MOUNT_POINT L"MountPoint"
158 #define DOS_DEVICE_NAME L"\\DosDevices\\Ext2Fsd"
160 // To support ext2fsd unload routine
163 // Private IOCTL to make the driver ready to unload
165 #define IOCTL_PREPARE_TO_UNLOAD \
166 CTL_CODE(FILE_DEVICE_UNKNOWN, 2048, METHOD_NEITHER, FILE_WRITE_ACCESS)
168 #endif // EXT2_UNLOAD
173 typedef IO_STACK_LOCATION EXTENDED_IO_STACK_LOCATION
, *PEXTENDED_IO_STACK_LOCATION
;
176 #define IsFlagOn(a,b) ((BOOLEAN)(FlagOn(a,b) == b))
178 #define FlagOn(_F,_SF) ((_F) & (_SF))
181 #ifndef BooleanFlagOn
182 #define BooleanFlagOn(F,SF) ((BOOLEAN)(((F) & (SF)) != 0))
186 #define SetFlag(_F,_SF) ((_F) |= (_SF))
190 #define ClearFlag(_F,_SF) ((_F) &= ~(_SF))
194 #define min(a,b) (((a) < (b)) ? (a) : (b))
198 #define max(a,b) (((a) > (b)) ? (a) : (b))
201 #ifdef _WIN2K_TARGET_
202 #define InterlockedOr _InterlockedOr
205 IN OUT LONG
volatile *Target
,
209 #pragma intrinsic (_InterlockedAnd)
210 #define InterlockedAnd _InterlockedAnd
214 IN OUT LONG
volatile *Target
,
218 #pragma intrinsic (_InterlockedXor)
219 #define InterlockedXor _InterlockedXor
221 #endif /* only for win2k */
225 #define SetLongFlag(_F,_SF) Ext2SetFlag((PULONG)&(_F), (ULONG)(_SF))
226 #define ClearLongFlag(_F,_SF) Ext2ClearFlag((PULONG)&(_F), (ULONG)(_SF))
233 Ext2SetFlag(PULONG Flags
, ULONG FlagBit
)
235 ULONG _ret
= InterlockedOr(Flags
, FlagBit
);
236 ASSERT(*Flags
== (_ret
| FlagBit
));
244 Ext2ClearFlag(PULONG Flags
, ULONG FlagBit
)
246 ULONG _ret
= InterlockedAnd(Flags
, ~FlagBit
);
247 ASSERT(*Flags
== (_ret
& (~FlagBit
)));
252 #define SetLongFlag(_F,_SF) InterlockedOr(&(_F), (ULONG)(_SF))
253 #define ClearLongFlag(_F,_SF) InterlockedAnd(&(_F), ~((ULONG)(_SF)))
257 #define Ext2RaiseStatus(IRPCONTEXT,STATUS) { \
258 (IRPCONTEXT)->ExceptionCode = (STATUS); \
259 ExRaiseStatus((STATUS)); \
262 #define Ext2NormalizeAndRaiseStatus(IRPCONTEXT,STATUS) { \
263 (IRPCONTEXT)->ExceptionCode = STATUS; \
264 if ((STATUS) == STATUS_VERIFY_REQUIRED) { ExRaiseStatus((STATUS)); } \
265 ExRaiseStatus(FsRtlNormalizeNtstatus((STATUS),STATUS_UNEXPECTED_IO_ERROR)); \
269 // Define IsWritingToEof for write (append) operations
272 #define FILE_WRITE_TO_END_OF_FILE 0xffffffff
274 #define IsWritingToEof(Pos) (((Pos).LowPart == FILE_WRITE_TO_END_OF_FILE) && \
275 ((Pos).HighPart == -1 ))
277 #define IsDirectory(Fcb) IsMcbDirectory((Fcb)->Mcb)
278 #define IsSpecialFile(Fcb) IsMcbSpecialFile((Fcb)->Mcb)
279 #define IsSymLink(Fcb) IsMcbSymLink((Fcb)->Mcb)
280 #define IsInodeSymLink(I) S_ISLNK((I)->i_mode)
281 #define IsRoot(Fcb) IsMcbRoot((Fcb)->Mcb)
287 #define TAG_VPB ' bpV'
288 #define VPB_SIZE sizeof(VPB)
290 #define EXT2_DATA_MAGIC 'BD2E'
291 #define EXT2_INAME_MAGIC 'NI2E'
292 #define EXT2_FNAME_MAGIC 'NF2E'
293 #define EXT2_VNAME_MAGIC 'NV2E'
294 #define EXT2_DENTRY_MAGIC 'ED2E'
295 #define EXT2_DIRSP_MAGIC 'SD2E'
296 #define EXT2_SB_MAGIC 'BS2E'
297 #define EXT2_GD_MAGIC 'DG2E'
298 #define EXT2_FLIST_MAGIC 'LF2E'
299 #define EXT2_PARAM_MAGIC 'PP2E'
300 #define EXT2_RWC_MAGIC 'WR2E'
303 // Bug Check Codes Definitions
306 #define EXT2_FILE_SYSTEM (FILE_SYSTEM)
308 #define EXT2_BUGCHK_BLOCK (0x00010000)
309 #define EXT2_BUGCHK_CLEANUP (0x00020000)
310 #define EXT2_BUGCHK_CLOSE (0x00030000)
311 #define EXT2_BUGCHK_CMCB (0x00040000)
312 #define EXT2_BUGCHK_CREATE (0x00050000)
313 #define EXT2_BUGCHK_DEBUG (0x00060000)
314 #define EXT2_BUGCHK_DEVCTL (0x00070000)
315 #define EXT2_BUGCHK_DIRCTL (0x00080000)
316 #define EXT2_BUGCHK_DISPATCH (0x00090000)
317 #define EXT2_BUGCHK_EXCEPT (0x000A0000)
318 #define EXT2_BUGCHK_EXT2 (0x000B0000)
319 #define EXT2_BUGCHK_FASTIO (0x000C0000)
320 #define EXT2_BUGCHK_FILEINFO (0x000D0000)
321 #define EXT2_BUGCHK_FLUSH (0x000E0000)
322 #define EXT2_BUGCHK_FSCTL (0x000F0000)
323 #define EXT2_BUGCHK_INIT (0x00100000)
324 #define EXT2_BUGCHK_LOCK (0x0011000)
325 #define EXT2_BUGCHK_MEMORY (0x0012000)
326 #define EXT2_BUGCHK_MISC (0x0013000)
327 #define EXT2_BUGCHK_READ (0x00140000)
328 #define EXT2_BUGCHK_SHUTDOWN (0x00150000)
329 #define EXT2_BUGCHK_VOLINFO (0x00160000)
330 #define EXT2_BUGCHK_WRITE (0x00170000)
332 #define EXT2_BUGCHK_LAST (0x00170000)
334 #define Ext2BugCheck(A,B,C,D) { KeBugCheckEx(EXT2_FILE_SYSTEM, A | __LINE__, B, C, D ); }
337 /* Ext2 file system definions *******************************************/
340 // The second extended file system magic number
343 #define EXT2_SUPER_MAGIC 0xEF53
345 #define EXT2_MIN_BLOCK 1024
346 #define EXT2_MIN_FRAG 1024
347 #define EXT2_MAX_USER_BLKSIZE 65536
349 // Inode flags (Linux uses octad number, but why ? strange!!!)
352 #define S_IFMT 0x0F000 /* 017 0000 */
353 #define S_IFSOCK 0x0C000 /* 014 0000 */
354 #define S_IFLNK 0x0A000 /* 012 0000 */
355 #define S_IFREG 0x08000 /* 010 0000 */
356 #define S_IFBLK 0x06000 /* 006 0000 */
357 #define S_IFDIR 0x04000 /* 004 0000 */
358 #define S_IFCHR 0x02000 /* 002 0000 */
359 #define S_IFIFO 0x01000 /* 001 0000 */
361 #define S_ISUID 0x00800 /* 000 4000 */
362 #define S_ISGID 0x00400 /* 000 2000 */
363 #define S_ISVTX 0x00200 /* 000 1000 */
365 #define S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
366 #define S_ISSOCK(m) (((m) & S_IFMT) == S_IFSOCK)
367 #define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK)
368 #define S_ISFIL(m) (((m) & S_IFMT) == S_IFFIL)
369 #define S_ISBLK(m) (((m) & S_IFMT) == S_IFBLK)
370 #define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
371 #define S_ISCHR(m) (((m) & S_IFMT) == S_IFCHR)
372 #define S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO)
374 #define S_IPERMISSION_MASK 0x1FF /* */
376 #define S_IRWXU 0x1C0 /* 0 0700 */
377 #define S_IRWNU 0x180 /* 0 0600 */
378 #define S_IRUSR 0x100 /* 0 0400 */
379 #define S_IWUSR 0x080 /* 0 0200 */
380 #define S_IXUSR 0x040 /* 0 0100 */
382 #define S_IRWXG 0x038 /* 0 0070 */
383 #define S_IRWNG 0x030 /* 0 0060 */
384 #define S_IRGRP 0x020 /* 0 0040 */
385 #define S_IWGRP 0x010 /* 0 0020 */
386 #define S_IXGRP 0x008 /* 0 0010 */
388 #define S_IRWXO 0x007 /* 0 0007 */
389 #define S_IRWNO 0x006 /* 0 0006 */
390 #define S_IROTH 0x004 /* 0 0004 */
391 #define S_IWOTH 0x002 /* 0 0002 */
392 #define S_IXOTH 0x001 /* 0 0001 */
394 #define S_IRWXUGO (S_IRWXU|S_IRWXG|S_IRWXO)
395 #define S_IALLUGO (S_ISUID|S_ISGID|S_ISVTX|S_IRWXUGO)
396 #define S_IRUGO (S_IRUSR|S_IRGRP|S_IROTH)
397 #define S_IWUGO (S_IWUSR|S_IWGRP|S_IWOTH)
398 #define S_IXUGO (S_IXUSR|S_IXGRP|S_IXOTH)
399 #define S_IFATTR (S_IRWNU|S_IRWNG|S_IRWNO)
401 #define S_ISREADABLE(m) (((m) & S_IPERMISSION_MASK) == (S_IRUSR | S_IRGRP | S_IROTH))
402 #define S_ISWRITABLE(m) (((m) & S_IPERMISSION_MASK) == (S_IWUSR | S_IWGRP | S_IWOTH))
404 #define Ext2SetReadable(m) do {(m) = (m) | (S_IRUSR | S_IRGRP | S_IROTH);} while(0)
405 #define Ext2SetWritable(m) do {(m) = (m) | (S_IWUSR | S_IWGRP | S_IWOTH);} while(0)
407 #define Ext2SetOwnerWritable(m) do {(m) |= S_IWUSR;} while(0)
408 #define Ext2SetOwnerReadOnly(m) do {(m) &= ~S_IWUSR;} while(0)
410 #define Ext2IsOwnerWritable(m) (((m) & S_IWUSR) == S_IWUSR)
411 #define Ext2IsOwnerReadable(m) (((m) & S_IRUSR) == S_IRUSR)
412 #define Ext2IsOwnerReadOnly(m) (!(Ext2IsOwnerWritable(m)) && Ext2IsOwnerReadable(m))
414 #define Ext2IsGroupWritable(m) (((m) & S_IWGRP) == S_IWGRP)
415 #define Ext2IsGroupReadable(m) (((m) & S_IRGRP) == S_IRGRP)
416 #define Ext2IsGroupReadOnly(m) (!(Ext2IsGroupWritable(m)) && Ext2IsGroupReadable(m))
418 #define Ext2IsOtherWritable(m) (((m) & S_IWOTH) == S_IWOTH)
419 #define Ext2IsOtherReadable(m) (((m) & S_IROTH) == S_IROTH)
420 #define Ext2IsOtherReadOnly(m) (!(Ext2IsOtherWritable(m)) && Ext2IsOtherReadable(m))
422 #define Ext2SetReadOnly(m) do {(m) &= ~(S_IWUSR | S_IWGRP | S_IWOTH);} while(0)
425 #define Ext2FileCanRead (0x1)
426 #define Ext2FileCanWrite (0x2)
427 #define Ext2FileCanExecute (0x4)
431 * We need 8-bytes aligned for all the sturctures
432 * It's a must for all ERESOURCE allocations
436 // Ext2Fsd Driver Definitions
440 // EXT2_IDENTIFIER_TYPE
442 // Identifiers used to mark the structures
445 typedef enum _EXT2_IDENTIFIER_TYPE
{
455 EXT2FGD
= 0xE2FD0001,
456 EXT2VCB
= 0xE2FD0002,
457 EXT2FCB
= 0xE2FD0003,
458 EXT2CCB
= 0xE2FD0004,
459 EXT2ICX
= 0xE2FD0005,
460 EXT2FSD
= 0xE2FD0006,
463 } EXT2_IDENTIFIER_TYPE
;
468 // Header used to mark the structures
470 typedef struct _EXT2_IDENTIFIER
{
471 EXT2_IDENTIFIER_TYPE Type
;
473 } EXT2_IDENTIFIER
, *PEXT2_IDENTIFIER
;
476 #define NodeType(Ptr) (*((EXT2_IDENTIFIER_TYPE *)(Ptr)))
478 typedef struct _EXT2_MCB EXT2_MCB
, *PEXT2_MCB
;
488 // Data that is not specific to a mounted volume
491 typedef VOID (NTAPI
*EXT2_REAPER_RELEASE
)(PVOID
);
493 typedef struct _EXT2_REAPER
{
497 EXT2_REAPER_RELEASE Free
;
499 } EXT2_REAPER
, *PEXT2_REAPER
;
501 #define EXT2_REAPER_FLAG_STOP (1 << 0)
503 typedef struct _EXT2_GLOBAL
{
505 /* Identifier for this structure */
506 EXT2_IDENTIFIER Identifier
;
508 /* Syncronization primitive for this structure */
511 /* Global flags for the driver: I put it since
512 FastIoDispatch isn't 8bytes aligned. */
515 /* Table of pointers to the fast I/O entry points */
516 FAST_IO_DISPATCH FastIoDispatch
;
518 /* Filter callbacks */
519 FS_FILTER_CALLBACKS FilterCallbacks
;
521 /* Table of pointers to the Cache Manager callbacks */
522 CACHE_MANAGER_CALLBACKS CacheManagerCallbacks
;
523 CACHE_MANAGER_CALLBACKS CacheManagerNoOpCallbacks
;
525 /* Pointer to the driver object */
526 PDRIVER_OBJECT DriverObject
;
528 /* Pointer to the disk device object */
529 PDEVICE_OBJECT DiskdevObject
;
531 /* Pointer to the cdrom device object */
532 PDEVICE_OBJECT CdromdevObject
;
534 /* List of mounted volumes */
537 /* Cleaning thread related: resource cleaner */
538 EXT2_REAPER FcbReaper
;
539 EXT2_REAPER McbReaper
;
540 EXT2_REAPER bhReaper
;
542 /* Look Aside table of IRP_CONTEXT, FCB, MCB, CCB */
543 NPAGED_LOOKASIDE_LIST Ext2IrpContextLookasideList
;
544 NPAGED_LOOKASIDE_LIST Ext2FcbLookasideList
;
545 NPAGED_LOOKASIDE_LIST Ext2CcbLookasideList
;
546 NPAGED_LOOKASIDE_LIST Ext2McbLookasideList
;
547 NPAGED_LOOKASIDE_LIST Ext2ExtLookasideList
;
548 NPAGED_LOOKASIDE_LIST Ext2DentryLookasideList
;
551 /* User specified global codepage name */
553 WCHAR PageName
[CODEPAGE_MAXLEN
];
554 UCHAR AnsiName
[CODEPAGE_MAXLEN
];
555 struct nls_table
* PageTable
;
558 /* global hiding patterns */
559 WCHAR wHidingPrefix
[HIDINGPAT_LEN
];
560 WCHAR wHidingSuffix
[HIDINGPAT_LEN
];
561 BOOLEAN bHidingPrefix
;
562 CHAR sHidingPrefix
[HIDINGPAT_LEN
];
563 BOOLEAN bHidingSuffix
;
564 CHAR sHidingSuffix
[HIDINGPAT_LEN
];
567 UNICODE_STRING RegistryPath
;
569 /* global memory and i/o statistics and memory allocations
570 of various sturctures */
572 EXT2_PERF_STATISTICS_V2 PerfStat
;
574 } EXT2_GLOBAL
, *PEXT2_GLOBAL
;
577 // Flags for EXT2_GLOBAL_DATA
580 #define EXT2_UNLOAD_PENDING 0x00000001
581 #define EXT2_SUPPORT_WRITING 0x00000002
582 #define EXT3_FORCE_WRITING 0x00000004
583 #define EXT2_CHECKING_BITMAP 0x00000008
584 #define EXT2_AUTO_MOUNT 0x00000010
587 // Glboal Ext2Fsd Memory Block
590 extern PEXT2_GLOBAL Ext2Global
;
593 // memory allocation statistics
597 #define INC_MEM_COUNT(_i, _p, _s) do { ASSERT(_p); Ext2TraceMemory(TRUE, (int) (_i), (PVOID)(_p), (LONG)(_s)); } while(0)
598 #define DEC_MEM_COUNT(_i, _p, _s) do { ASSERT(_p); Ext2TraceMemory(FALSE, (int) (_i), (PVOID)(_p), (LONG)(_s)); } while(0)
599 #define INC_IRP_COUNT(IrpContext) Ext2TraceIrpContext(TRUE, (IrpContext))
600 #define DEC_IRP_COUNT(IrpContext) Ext2TraceIrpContext(FALSE, (IrpContext))
603 // Driver Extension define
606 #define IsExt2FsDevice(DO) ((DO == Ext2Global->DiskdevObject) || \
607 (DO == Ext2Global->CdromdevObject) )
609 #ifdef _WIN2K_TARGET_
610 #define FSRTL_ADVANCED_FCB_HEADER FSRTL_COMMON_FCB_HEADER
613 typedef struct _EXT2_FCBVCB
{
615 // Command header for Vcb and Fcb
616 FSRTL_ADVANCED_FCB_HEADER Header
;
618 #ifndef _WIN2K_TARGET_
622 // Ext2Fsd identifier
623 EXT2_IDENTIFIER Identifier
;
627 ERESOURCE MainResource
;
628 ERESOURCE PagingIoResource
;
630 } EXT2_FCBVCB
, *PEXT2_FCBVCB
;
633 // EXT2_VCB Volume Control Block
635 // Data that represents a mounted logical volume
636 // It is allocated as the device extension of the volume device object
638 typedef struct _EXT2_VCB
{
643 // Resource for metadata (inode)
646 // Resource for metadata (block)
649 // Resource for Mcb (Meta data control block)
652 // List of FCBs for open files on this volume
661 // Entry of Mcb Tree (Root Node)
664 // Link list to Global
668 SECTION_OBJECT_POINTERS SectionObject
;
670 // Dirty Mcbs of modifications for volume stream
674 // Share Access for the file object
675 SHARE_ACCESS ShareAccess
;
677 // Incremented on IRP_MJ_CREATE, decremented on IRP_MJ_CLOSE
678 // for both files on this volume and open instances of the
680 ULONG ReferenceCount
; /* total ref count */
681 ULONG OpenHandleCount
; /* all handles */
683 ULONG OpenVolumeCount
; /* volume handle */
688 // Pointer to the VPB in the target device object
692 // The FileObject of Volume used to lock the volume
693 PFILE_OBJECT LockFile
;
695 // List of IRPs pending on directory change notify requests
696 LIST_ENTRY NotifyList
;
698 // Pointer to syncronization primitive for this list
699 PNOTIFY_SYNC NotifySync
;
701 // This volumes device object
702 PDEVICE_OBJECT DeviceObject
;
704 // The physical device object (the disk)
705 PDEVICE_OBJECT TargetDeviceObject
;
707 // The physical device object (the disk)
708 PDEVICE_OBJECT RealDevice
;
710 // Information about the physical device object
711 DISK_GEOMETRY DiskGeometry
;
712 PARTITION_INFORMATION PartitionInformation
;
715 PEXT2_SUPER_BLOCK SuperBlock
;
717 // Block / Cluster size
720 // Sector size in bits
723 // Aligned size (Page or Block)
724 ULONGLONG IoUnitSize
;
726 // Bits of aligned size
732 // Inode lookaside list
733 NPAGED_LOOKASIDE_LIST InodeLookasideList
;
735 // Flags for the volume
738 // Streaming File Object
741 // User specified codepage name per volume
743 UCHAR AnsiName
[CODEPAGE_MAXLEN
];
744 struct nls_table
* PageTable
;
747 /* patterns to hiding files */
748 BOOLEAN bHidingPrefix
;
749 CHAR sHidingPrefix
[HIDINGPAT_LEN
];
750 BOOLEAN bHidingSuffix
;
751 CHAR sHidingSuffix
[HIDINGPAT_LEN
];
753 /* User to impersanate */
761 /* mountpoint: symlink to DesDevices */
764 struct block_device bd
;
765 struct super_block sb
;
766 struct ext3_sb_info sbi
;
768 /* Maximum file size in blocks ... */
769 ULONG max_blocks_per_layer
[EXT2_BLOCK_TYPES
];
770 ULONG max_data_blocks
;
771 loff_t max_bitmap_bytes
;
773 } EXT2_VCB
, *PEXT2_VCB
;
776 // Flags for EXT2_VCB
778 #define VCB_INITIALIZED 0x00000001
779 #define VCB_VOLUME_LOCKED 0x00000002
780 #define VCB_MOUNTED 0x00000004
781 #define VCB_DISMOUNT_PENDING 0x00000008
782 #define VCB_NEW_VPB 0x00000010
783 #define VCB_BEING_CLOSED 0x00000020
784 #define VCB_USER_IDS 0x00000040 /* uid/gid specified by user */
785 #define VCB_USER_EIDS 0x00000080 /* euid/egid specified by user */
787 #define VCB_BEING_DROPPED 0x00002000
788 #define VCB_FORCE_WRITING 0x00004000
789 #define VCB_DEVICE_REMOVED 0x00008000
790 #define VCB_JOURNAL_RECOVER 0x00080000
791 #define VCB_ARRIVAL_NOTIFIED 0x00800000
792 #define VCB_READ_ONLY 0x08000000
793 #define VCB_WRITE_PROTECTED 0x10000000
794 #define VCB_FLOPPY_DISK 0x20000000
795 #define VCB_REMOVAL_PREVENTED 0x40000000
796 #define VCB_REMOVABLE_MEDIA 0x80000000
799 #define IsVcbInited(Vcb) (IsFlagOn((Vcb)->Flags, VCB_INITIALIZED))
800 #define IsMounted(Vcb) (IsFlagOn((Vcb)->Flags, VCB_MOUNTED))
801 #define IsDispending(Vcb) (IsFlagOn((Vcb)->Flags, VCB_DISMOUNT_PENDING))
802 #define IsVcbReadOnly(Vcb) (IsFlagOn((Vcb)->Flags, VCB_READ_ONLY) || \
803 IsFlagOn((Vcb)->Flags, VCB_WRITE_PROTECTED))
806 #define IsExt3ForceWrite() (IsFlagOn(Ext2Global->Flags, EXT3_FORCE_WRITING))
807 #define IsVcbForceWrite(Vcb) (IsFlagOn((Vcb)->Flags, VCB_FORCE_WRITING))
808 #define CanIWrite(Vcb) (IsExt3ForceWrite() || (!IsVcbReadOnly(Vcb) && IsVcbForceWrite(Vcb)))
809 #define IsLazyWriter(Fcb) ((Fcb)->LazyWriterThread == PsGetCurrentThread())
811 // EXT2_FCB File Control Block
813 // Data that represents an open file
814 // There is a single instance of the FCB for every open file
816 typedef struct _EXT2_FCB
{
821 // List of FCBs for this volume
823 LARGE_INTEGER TsDrop
; /* drop time */
825 SECTION_OBJECT_POINTERS SectionObject
;
827 // Share Access for the file object
828 SHARE_ACCESS ShareAccess
;
830 // List of byte-range locks for this file
831 FILE_LOCK FileLockAnchor
;
833 // oplock information management structure
836 // Lazy writer thread context
837 PETHREAD LazyWriterThread
;
839 // Incremented on IRP_MJ_CREATE, decremented on IRP_MJ_CLEANUP
840 ULONG OpenHandleCount
;
842 // Incremented on IRP_MJ_CREATE, decremented on IRP_MJ_CLOSE
843 ULONG ReferenceCount
;
845 // Incremented on IRP_MJ_CREATE, decremented on IRP_MJ_CLEANUP
846 // But only for Files with FO_NO_INTERMEDIATE_BUFFERING flag
847 ULONG NonCachedOpenCount
;
852 // Pointer to the inode
861 } EXT2_FCB
, *PEXT2_FCB
;
864 // Flags for EXT2_FCB
867 #define FCB_FROM_POOL 0x00000001
868 #define FCB_PAGE_FILE 0x00000002
869 #define FCB_FILE_MODIFIED 0x00000020
871 #define FCB_ALLOC_IN_CREATE 0x00000080
872 #define FCB_ALLOC_IN_WRITE 0x00000100
873 #define FCB_ALLOC_IN_SETINFO 0x00000200
875 #define FCB_DELETE_PENDING 0x80000000
883 // Identifier for this structure
884 EXT2_IDENTIFIER Identifier
;
890 PEXT2_MCB Parent
; // Parent
891 PEXT2_MCB Next
; // Siblings
894 PEXT2_MCB Child
; // Children Mcb nodes
895 PEXT2_MCB Target
; // Target Mcb of symlink
904 UNICODE_STRING ShortName
;
906 // Full name with path
907 UNICODE_STRING FullName
;
922 LARGE_INTEGER CreationTime
;
923 LARGE_INTEGER LastWriteTime
;
924 LARGE_INTEGER ChangeTime
;
925 LARGE_INTEGER LastAccessTime
;
927 // List Link to Vcb->McbList
937 #define MCB_FROM_POOL 0x00000001
938 #define MCB_VCB_LINK 0x00000002
939 #define MCB_ENTRY_TREE 0x00000004
940 #define MCB_FILE_DELETED 0x00000008
942 #define MCB_ZONE_INITED 0x20000000
943 #define MCB_TYPE_SPECIAL 0x40000000 /* unresolved symlink + device node */
944 #define MCB_TYPE_SYMLINK 0x80000000
946 #define IsMcbUsed(Mcb) ((Mcb)->Refercount > 0)
947 #define IsMcbSymLink(Mcb) IsFlagOn((Mcb)->Flags, MCB_TYPE_SYMLINK)
948 #define IsZoneInited(Mcb) IsFlagOn((Mcb)->Flags, MCB_ZONE_INITED)
949 #define IsMcbSpecialFile(Mcb) IsFlagOn((Mcb)->Flags, MCB_TYPE_SPECIAL)
950 #define IsMcbRoot(Mcb) ((Mcb)->Inode.i_ino == EXT2_ROOT_INO)
951 #define IsMcbReadonly(Mcb) IsFlagOn((Mcb)->FileAttr, FILE_ATTRIBUTE_READONLY)
952 #define IsMcbDirectory(Mcb) IsFlagOn((Mcb)->FileAttr, FILE_ATTRIBUTE_DIRECTORY)
953 #define IsFileDeleted(Mcb) IsFlagOn((Mcb)->Flags, MCB_FILE_DELETED)
955 #define IsLinkInvalid(Mcb) (IsMcbSymLink(Mcb) && IsFileDeleted(Mcb->Target))
958 * routines for reference count management
961 #define Ext2ReferXcb(_C) InterlockedIncrement(_C)
962 #define Ext2DerefXcb(_C) DEC_OBJ_CNT(_C)
967 __inline ULONG
DEC_OBJ_CNT(PULONG _C
) {
971 return InterlockedDecrement(_C
);
976 Ext2TraceMcb(PCHAR fn
, USHORT lc
, USHORT add
, PEXT2_MCB Mcb
);
977 #define Ext2ReferMcb(Mcb) Ext2TraceMcb(__FUNCTION__, __LINE__, TRUE, Mcb)
978 #define Ext2DerefMcb(Mcb) Ext2TraceMcb(__FUNCTION__, __LINE__, FALSE, Mcb)
980 #define Ext2ReferMcb(Mcb) Ext2ReferXcb(&Mcb->Refercount)
981 #define Ext2DerefMcb(Mcb) Ext2DerefXcb(&Mcb->Refercount)
985 // EXT2_CCB Context Control Block
987 // Data that represents one instance of an open file
988 // There is one instance of the CCB for every instance of an open file
990 typedef struct _EXT2_CCB
{
992 // Identifier for this structure
993 EXT2_IDENTIFIER Identifier
;
998 // Mcb of it's symbol link
1001 // State that may need to be maintained
1002 UNICODE_STRING DirectorySearchPattern
;
1004 /* Open handle control block */
1007 } EXT2_CCB
, *PEXT2_CCB
;
1013 #define CCB_FROM_POOL 0x00000001
1014 #define CCB_VOLUME_DASD_PURGE 0x00000002
1015 #define CCB_LAST_WRITE_UPDATED 0x00000004
1016 #define CCB_OPEN_REPARSE_POINT 0x00000008
1017 #define CCB_DELETE_ON_CLOSE 0x00000010
1019 #define CCB_ALLOW_EXTENDED_DASD_IO 0x80000000
1024 // Used to pass information about a request between the drivers functions
1026 typedef struct ext2_icb
{
1028 // Identifier for this structure
1029 EXT2_IDENTIFIER Identifier
;
1031 // Pointer to the IRP this request describes
1037 // The major and minor function code for the request
1038 UCHAR MajorFunction
;
1039 UCHAR MinorFunction
;
1041 // The device object
1042 PDEVICE_OBJECT DeviceObject
;
1044 // The real device object
1045 PDEVICE_OBJECT RealDevice
;
1048 PFILE_OBJECT FileObject
;
1053 // If the request is top level
1056 // Used if the request needs to be queued for later processing
1057 WORK_QUEUE_ITEM WorkQueueItem
;
1059 // If an exception is currently in progress
1060 BOOLEAN ExceptionInProgress
;
1062 // The exception code when an exception is in progress
1063 NTSTATUS ExceptionCode
;
1065 } EXT2_IRP_CONTEXT
, *PEXT2_IRP_CONTEXT
;
1068 #define IRP_CONTEXT_FLAG_FROM_POOL (0x00000001)
1069 #define IRP_CONTEXT_FLAG_WAIT (0x00000002)
1070 #define IRP_CONTEXT_FLAG_WRITE_THROUGH (0x00000004)
1071 #define IRP_CONTEXT_FLAG_FLOPPY (0x00000008)
1072 #define IRP_CONTEXT_FLAG_DISABLE_POPUPS (0x00000020)
1073 #define IRP_CONTEXT_FLAG_DEFERRED (0x00000040)
1074 #define IRP_CONTEXT_FLAG_VERIFY_READ (0x00000080)
1075 #define IRP_CONTEXT_STACK_IO_CONTEXT (0x00000100)
1076 #define IRP_CONTEXT_FLAG_REQUEUED (0x00000200)
1077 #define IRP_CONTEXT_FLAG_USER_IO (0x00000400)
1078 #define IRP_CONTEXT_FLAG_DELAY_CLOSE (0x00000800)
1079 #define IRP_CONTEXT_FLAG_FILE_BUSY (0x00001000)
1082 #define Ext2CanIWait() (!IrpContext || IsFlagOn(IrpContext->Flags, IRP_CONTEXT_FLAG_WAIT))
1085 // EXT2_ALLOC_HEADER
1087 // In the checked version of the driver this header is put in the beginning of
1088 // every memory allocation
1090 typedef struct _EXT2_ALLOC_HEADER
{
1091 EXT2_IDENTIFIER Identifier
;
1092 } EXT2_ALLOC_HEADER
, *PEXT2_ALLOC_HEADER
;
1094 typedef struct _FCB_LIST_ENTRY
{
1097 } FCB_LIST_ENTRY
, *PFCB_LIST_ENTRY
;
1100 // Block Description List
1101 typedef struct _EXT2_EXTENT
{
1106 struct _EXT2_EXTENT
* Next
;
1107 } EXT2_EXTENT
, *PEXT2_EXTENT
;
1110 /* FUNCTIONS DECLARATION *****************************************************/
1112 // Include this so we don't need the latest WDK to build the driver.
1113 #ifndef FSCTL_GET_RETRIEVAL_POINTER_BASE
1114 #define FSCTL_GET_RETRIEVAL_POINTER_BASE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 141, METHOD_BUFFERED, FILE_ANY_ACCESS) // RETRIEVAL_POINTER_BASE
1118 // The following macro is used to determine if an FSD thread can block
1119 // for I/O or wait for a resource. It returns TRUE if the thread can
1120 // block and FALSE otherwise. This attribute can then be used to call
1121 // the FSD & FSP common work routine with the proper wait value.
1124 #define CanExt2Wait(IRP) IoIsOperationSynchronous(Irp)
1127 // memory allocation statistics
1135 Ext2TraceMemory(BOOLEAN _n
, int _i
, PVOID _p
, LONG _s
)
1138 InterlockedIncrement(&Ext2Global
->PerfStat
.Current
.Slot
[_i
]);
1139 InterlockedIncrement(&Ext2Global
->PerfStat
.Total
.Slot
[_i
]);
1140 InterlockedExchangeAdd(&Ext2Global
->PerfStat
.Size
.Slot
[_i
], _s
);
1142 InterlockedDecrement(&Ext2Global
->PerfStat
.Current
.Slot
[_i
]);
1143 InterlockedExchangeAdd(&Ext2Global
->PerfStat
.Size
.Slot
[_i
], -1 * _s
);
1152 Ext2TraceIrpContext(BOOLEAN _n
, PEXT2_IRP_CONTEXT IrpContext
)
1155 INC_MEM_COUNT(PS_IRP_CONTEXT
, IrpContext
, sizeof(EXT2_IRP_CONTEXT
));
1156 InterlockedIncrement(&(Ext2Global
->PerfStat
.Irps
[IrpContext
->MajorFunction
].Current
));
1158 DEC_MEM_COUNT(PS_IRP_CONTEXT
, IrpContext
, sizeof(EXT2_IRP_CONTEXT
));
1159 InterlockedIncrement(&Ext2Global
->PerfStat
.Irps
[IrpContext
->MajorFunction
].Processed
);
1160 InterlockedDecrement(&Ext2Global
->PerfStat
.Irps
[IrpContext
->MajorFunction
].Current
);
1164 typedef struct _EXT2_FILLDIR_CONTEXT
{
1165 PEXT2_IRP_CONTEXT efc_irp
;
1170 NTSTATUS efc_status
;
1171 FILE_INFORMATION_CLASS efc_fi
;
1173 } EXT2_FILLDIR_CONTEXT
, *PEXT2_FILLDIR_CONTEXT
;
1180 int Ext2CheckInodeAccess(PEXT2_VCB Vcb
, struct inode
*in
, int attempt
);
1181 int Ext2CheckFileAccess (PEXT2_VCB Vcb
, PEXT2_MCB Mcb
, int attempt
);
1191 IN LOCK_OPERATION Operation
1195 Ext2DestroyMdl (IN PMDL Mdl
);
1198 Ext2LockUserBuffer (
1201 IN LOCK_OPERATION Operation
);
1203 Ext2GetUserBuffer (IN PIRP Irp
);
1207 Ext2ReadWriteBlocks(
1208 IN PEXT2_IRP_CONTEXT IrpContext
,
1210 IN PEXT2_EXTENT Extent
,
1217 IN ULONGLONG Offset
,
1220 IN BOOLEAN bVerify
);
1225 IN ULONGLONG Offset
,
1228 IN BOOLEAN bVerify
);
1232 IN PDEVICE_OBJECT DeviceOjbect
,
1234 IN PVOID InputBuffer
,
1235 IN ULONG InputBufferSize
,
1236 IN OUT PVOID OutputBuffer
,
1237 IN OUT PULONG OutputBufferSize
);
1240 Ext2MediaEjectControl (
1241 IN PEXT2_IRP_CONTEXT IrpContext
,
1243 IN BOOLEAN bPrevent
);
1246 Ext2DiskShutDown(PEXT2_VCB Vcb
);
1254 Ext2Cleanup (IN PEXT2_IRP_CONTEXT IrpContext
);
1261 Ext2Close (IN PEXT2_IRP_CONTEXT IrpContext
);
1264 Ext2QueueCloseRequest (IN PEXT2_IRP_CONTEXT IrpContext
);
1267 Ext2DeQueueCloseRequest (IN PVOID Context
);
1274 Ext2AcquireForLazyWrite (
1278 Ext2ReleaseFromLazyWrite (IN PVOID Context
);
1281 Ext2AcquireForReadAhead (
1286 Ext2ReleaseFromReadAhead (IN PVOID Context
);
1294 Ext2NoOpRelease (IN PVOID Fcb
);
1302 Ext2IsNameValid(PUNICODE_STRING FileName
);
1306 IN PEXT2_IRP_CONTEXT IrpContext
,
1308 IN PEXT2_MCB Parent
,
1315 IN PEXT2_IRP_CONTEXT IrpContext
,
1317 IN PEXT2_MCB Parent
,
1318 IN PUNICODE_STRING FileName
,
1320 struct dentry
**dentry
1324 Ext2IsSpecialSystemFile(
1325 IN PUNICODE_STRING FileName
,
1326 IN BOOLEAN bDirectory
1329 #define EXT2_LOOKUP_FLAG_MASK (0xFF00000)
1330 #define EXT2_LOOKUP_NOT_FOLLOW (0x8000000)
1334 IN PEXT2_IRP_CONTEXT IrpContext
,
1336 IN PUNICODE_STRING FullName
,
1337 IN PEXT2_MCB Parent
,
1338 OUT PEXT2_MCB
* Ext2Mcb
,
1344 IN PEXT2_IRP_CONTEXT IrpContext
,
1346 OUT PBOOLEAN OpPostIrp
1351 IN PEXT2_IRP_CONTEXT IrpContext
,
1355 Ext2Create (IN PEXT2_IRP_CONTEXT IrpContext
);
1359 IN PEXT2_IRP_CONTEXT IrpContext
,
1361 IN PEXT2_FCB pParentFcb
,
1364 IN PUNICODE_STRING FileName
);
1368 Ext2SupersedeOrOverWriteFile(
1369 IN PEXT2_IRP_CONTEXT IrpContext
,
1370 IN PFILE_OBJECT FileObject
,
1373 IN PLARGE_INTEGER AllocationSize
,
1374 IN ULONG Disposition
1383 #define DL_VIT 0x00000001
1384 #define DL_ERR 0x00000002
1385 #define DL_DBG 0x00000004
1386 #define DL_INF 0x00000008
1387 #define DL_FUN 0x00000010
1388 #define DL_LOW 0x00000020
1389 #define DL_REN 0x00000040 /* renaming operation */
1390 #define DL_RES 0x00000080 /* entry reference managment */
1391 #define DL_BLK 0x00000100 /* data block allocation / free */
1392 #define DL_CP 0x00000200 /* code pages (create, querydir) */
1393 #define DL_EXT 0x00000400 /* mcb extents */
1394 #define DL_MAP 0x00000800 /* retrieval points */
1395 #define DL_JNL 0x00001000 /* dump journal operations */
1396 #define DL_HTI 0x00002000 /* htree index */
1397 #define DL_WRN 0x00004000 /* warning */
1398 #define DL_BH 0x00008000 /* buffer head */
1399 #define DL_PNP 0x00010000 /* pnp */
1400 #define DL_IO 0x00020000 /* file i/o */
1402 #define DL_DEFAULT (DL_ERR|DL_VIT)
1405 extern ULONG DebugFilter
;
1414 #define DEBUG(_DL, arg) do {if ((_DL) & DebugFilter) Ext2Printf arg;} while(0)
1415 #define DEBUGNI(_DL, arg) do {if ((_DL) & DebugFilter) Ext2NiPrintf arg;} while(0)
1417 #define Ext2CompleteRequest(Irp, bPrint, PriorityBoost) \
1418 Ext2DbgPrintComplete(Irp, bPrint); \
1419 IoCompleteRequest(Irp, PriorityBoost)
1423 #define DEBUG(_DL, arg) do {if ((_DL) & DL_ERR) DbgPrint arg;} while(0)
1425 #define Ext2CompleteRequest(Irp, bPrint, PriorityBoost) \
1426 IoCompleteRequest(Irp, PriorityBoost)
1428 #endif // EXT2_DEBUG
1437 extern ULONG ProcessNameOffset
;
1439 #define Ext2GetCurrentProcessName() ( \
1440 (PUCHAR) PsGetCurrentProcess() + ProcessNameOffset \
1444 Ext2GetProcessNameOffset (VOID
);
1448 IN PDEVICE_OBJECT DeviceObject
,
1452 Ext2DbgPrintComplete (
1458 Ext2NtStatusToString (IN NTSTATUS Status
);
1460 PVOID
Ext2AllocatePool(
1461 IN POOL_TYPE PoolType
,
1462 IN SIZE_T NumberOfBytes
,
1477 Ext2ProcessGlobalProperty(
1478 IN PDEVICE_OBJECT DeviceObject
,
1479 IN PEXT2_VOLUME_PROPERTY3 Property
,
1484 Ext2ProcessVolumeProperty(
1486 IN PEXT2_VOLUME_PROPERTY3 Property
,
1491 Ext2ProcessUserProperty(
1492 IN PEXT2_IRP_CONTEXT IrpContext
,
1493 IN PEXT2_VOLUME_PROPERTY3 Property
,
1498 Ex2ProcessUserPerfStat(
1499 IN PEXT2_IRP_CONTEXT IrpContext
,
1500 IN PEXT2_QUERY_PERFSTAT QueryPerf
,
1505 Ex2ProcessMountPoint(
1506 IN PEXT2_IRP_CONTEXT IrpContext
,
1507 IN PEXT2_MOUNT_POINT MountPoint
,
1512 Ext2DeviceControlNormal (IN PEXT2_IRP_CONTEXT IrpContext
);
1515 Ext2PrepareToUnload (IN PEXT2_IRP_CONTEXT IrpContext
);
1518 Ext2DeviceControl (IN PEXT2_IRP_CONTEXT IrpContext
);
1525 Ext2GetInfoLength(IN FILE_INFORMATION_CLASS FileInformationClass
);
1529 IN PEXT2_IRP_CONTEXT IrpContext
,
1532 IN FILE_INFORMATION_CLASS FileInformationClass
,
1535 IN ULONG UsedLength
,
1538 IN PUNICODE_STRING pName
,
1539 OUT PULONG EntrySize
,
1546 IN POEM_STRING OeName
1549 NTSTATUS
Ext2QueryDirectory (IN PEXT2_IRP_CONTEXT IrpContext
);
1552 Ext2NotifyChangeDirectory (
1553 IN PEXT2_IRP_CONTEXT IrpContext
1557 Ext2NotifyReportChange (
1558 IN PEXT2_IRP_CONTEXT IrpContext
,
1566 Ext2DirectoryControl (IN PEXT2_IRP_CONTEXT IrpContext
);
1569 Ext2IsDirectoryEmpty (
1570 IN PEXT2_IRP_CONTEXT IrpContext
,
1580 Ext2OplockComplete (
1592 Ext2QueueRequest (IN PEXT2_IRP_CONTEXT IrpContext
);
1595 Ext2DeQueueRequest (IN PVOID Context
);
1598 Ext2DispatchRequest (IN PEXT2_IRP_CONTEXT IrpContext
);
1602 IN PDEVICE_OBJECT DeviceObject
,
1611 Ext2ExceptionFilter (
1612 IN PEXT2_IRP_CONTEXT IrpContext
,
1613 IN PEXCEPTION_POINTERS ExceptionPointer
1617 Ext2ExceptionHandler (IN PEXT2_IRP_CONTEXT IrpContext
);
1627 IN PEXT2_IRP_CONTEXT IrpContext
,
1638 PEXT2_IRP_CONTEXT IrpContext
,
1648 PEXT2_IRP_CONTEXT IrpContext
,
1659 static inline ext3_fsblk_t
ext3_blocks_count(struct ext3_super_block
*es
)
1661 return ((ext3_fsblk_t
)le32_to_cpu(es
->s_blocks_count_hi
) << 32) |
1662 le32_to_cpu(es
->s_blocks_count
);
1665 static inline ext3_fsblk_t
ext3_r_blocks_count(struct ext3_super_block
*es
)
1667 return ((ext3_fsblk_t
)le32_to_cpu(es
->s_r_blocks_count_hi
) << 32) |
1668 le32_to_cpu(es
->s_r_blocks_count
);
1671 static inline ext3_fsblk_t
ext3_free_blocks_count(struct ext3_super_block
*es
)
1673 return ((ext3_fsblk_t
)le32_to_cpu(es
->s_free_blocks_count_hi
) << 32) |
1674 le32_to_cpu(es
->s_free_blocks_count
);
1677 static inline void ext3_blocks_count_set(struct ext3_super_block
*es
,
1680 es
->s_blocks_count
= cpu_to_le32((u32
)blk
);
1681 es
->s_blocks_count_hi
= cpu_to_le32(blk
>> 32);
1684 static inline void ext3_free_blocks_count_set(struct ext3_super_block
*es
,
1687 es
->s_free_blocks_count
= cpu_to_le32((u32
)blk
);
1688 es
->s_free_blocks_count_hi
= cpu_to_le32(blk
>> 32);
1691 static inline void ext3_r_blocks_count_set(struct ext3_super_block
*es
,
1694 es
->s_r_blocks_count
= cpu_to_le32((u32
)blk
);
1695 es
->s_r_blocks_count_hi
= cpu_to_le32(blk
>> 32);
1698 blkcnt_t
ext3_inode_blocks(struct ext3_inode
*raw_inode
,
1699 struct inode
*inode
);
1701 int ext3_inode_blocks_set(struct ext3_inode
*raw_inode
,
1702 struct inode
* inode
);
1703 ext4_fsblk_t
ext4_block_bitmap(struct super_block
*sb
,
1704 struct ext4_group_desc
*bg
);
1706 ext4_fsblk_t
ext4_inode_bitmap(struct super_block
*sb
,
1707 struct ext4_group_desc
*bg
);
1708 ext4_fsblk_t
ext4_inode_table(struct super_block
*sb
,
1709 struct ext4_group_desc
*bg
);
1710 __u32
ext4_free_blks_count(struct super_block
*sb
,
1711 struct ext4_group_desc
*bg
);
1712 __u32
ext4_free_inodes_count(struct super_block
*sb
,
1713 struct ext4_group_desc
*bg
);
1714 __u32
ext4_used_dirs_count(struct super_block
*sb
,
1715 struct ext4_group_desc
*bg
);
1716 __u32
ext4_itable_unused_count(struct super_block
*sb
,
1717 struct ext4_group_desc
*bg
);
1718 void ext4_block_bitmap_set(struct super_block
*sb
,
1719 struct ext4_group_desc
*bg
, ext4_fsblk_t blk
);
1720 void ext4_inode_bitmap_set(struct super_block
*sb
,
1721 struct ext4_group_desc
*bg
, ext4_fsblk_t blk
);
1722 void ext4_inode_table_set(struct super_block
*sb
,
1723 struct ext4_group_desc
*bg
, ext4_fsblk_t blk
);
1724 void ext4_free_blks_set(struct super_block
*sb
,
1725 struct ext4_group_desc
*bg
, __u32 count
);
1726 void ext4_free_inodes_set(struct super_block
*sb
,
1727 struct ext4_group_desc
*bg
, __u32 count
);
1728 void ext4_used_dirs_set(struct super_block
*sb
,
1729 struct ext4_group_desc
*bg
, __u32 count
);
1730 void ext4_itable_unused_set(struct super_block
*sb
,
1731 struct ext4_group_desc
*bg
, __u32 count
);
1733 int ext3_bg_has_super(struct super_block
*sb
, ext3_group_t group
);
1734 unsigned long ext4_bg_num_gdb(struct super_block
*sb
, ext4_group_t group
);
1735 unsigned ext4_init_inode_bitmap(struct super_block
*sb
, struct buffer_head
*bh
,
1736 ext4_group_t block_group
,
1737 struct ext4_group_desc
*gdp
);
1738 unsigned ext4_init_block_bitmap(struct super_block
*sb
, struct buffer_head
*bh
,
1739 ext4_group_t block_group
, struct ext4_group_desc
*gdp
);
1740 struct ext4_group_desc
* ext4_get_group_desc(struct super_block
*sb
,
1741 ext4_group_t block_group
, struct buffer_head
**bh
);
1742 ext4_fsblk_t
ext4_count_free_blocks(struct super_block
*sb
);
1743 unsigned long ext4_count_free_inodes(struct super_block
*sb
);
1744 int ext4_check_descriptors(struct super_block
*sb
);
1750 OUT PEXT2_SUPER_BLOCK
* Sb
1756 IN PEXT2_IRP_CONTEXT IrpContext
,
1762 IN PEXT2_IRP_CONTEXT IrpContext
,
1767 Ext2LoadGroup(IN PEXT2_VCB Vcb
);
1770 Ext2PutGroup(IN PEXT2_VCB Vcb
);
1773 Ext2DropBH(IN PEXT2_VCB Vcb
);
1777 IN PEXT2_IRP_CONTEXT IrpContext
,
1784 IN PEXT2_IRP_CONTEXT IrpContext
,
1792 OUT PLONGLONG offset
1798 IN
struct inode
*Inode
1803 IN PEXT2_IRP_CONTEXT IrpContext
,
1810 IN PEXT2_IRP_CONTEXT IrpContext
,
1812 IN
struct inode
*Inode
1824 IN PEXT2_IRP_CONTEXT IrpContext
,
1832 IN PEXT2_IRP_CONTEXT IrpContext
,
1840 IN PEXT2_IRP_CONTEXT IrpContext
,
1849 IN PEXT2_IRP_CONTEXT IrpContext
,
1856 IN PULONG BlockArray
,
1865 IN PEXT2_IRP_CONTEXT IrpContext
,
1876 IN PEXT2_IRP_CONTEXT IrpContext
,
1882 IN PEXT2_IRP_CONTEXT IrpContext
,
1887 IN OUT PULONG Number
1892 IN PEXT2_IRP_CONTEXT IrpContext
,
1901 IN PEXT2_IRP_CONTEXT IrpContext
,
1909 Ext2UpdateGroupDirStat(
1910 IN PEXT2_IRP_CONTEXT IrpContext
,
1917 IN PEXT2_IRP_CONTEXT IrpContext
,
1925 IN PEXT2_IRP_CONTEXT IrpContext
,
1928 IN
struct inode
*Inode
,
1929 IN PUNICODE_STRING FileName
,
1930 OUT
struct dentry
**dentry
1935 IN PEXT2_IRP_CONTEXT IrpContext
,
1944 IN PEXT2_IRP_CONTEXT IrpContext
,
1951 Ext2SetParentEntry (
1952 IN PEXT2_IRP_CONTEXT IrpContext
,
1956 IN ULONG NewParent
);
1961 IN PEXT2_IRP_CONTEXT IrpContext
,
1968 IN PULONG BlockArray
,
1972 struct ext3_dir_entry_2
*ext3_next_entry(struct ext3_dir_entry_2
*p
);
1974 int ext3_check_dir_entry (const char * function
, struct inode
* dir
,
1975 struct ext3_dir_entry_2
* de
,
1976 struct buffer_head
* bh
,
1977 unsigned long offset
);
1979 loff_t
ext3_max_size(int blkbits
, int has_huge_files
);
1980 loff_t
ext3_max_bitmap_size(int bits
, int has_huge_files
);
1983 __le16
ext4_group_desc_csum(struct ext3_sb_info
*sbi
, __u32 block_group
,
1984 struct ext4_group_desc
*gdp
);
1985 int ext4_group_desc_csum_verify(struct ext3_sb_info
*sbi
, __u32 block_group
,
1986 struct ext4_group_desc
*gdp
);
1988 ext3_fsblk_t
descriptor_loc(struct super_block
*sb
,
1989 ext3_fsblk_t logical_sb_block
, unsigned int nr
);
1990 struct ext4_group_desc
* ext4_get_group_desc(struct super_block
*sb
,
1991 ext4_group_t block_group
, struct buffer_head
**bh
);
1992 int ext4_check_descriptors(struct super_block
*sb
);
1999 Ext2IsFastIoPossible(
2004 Ext2FastIoCheckIfPossible (
2005 IN PFILE_OBJECT FileObject
,
2006 IN PLARGE_INTEGER FileOffset
,
2010 IN BOOLEAN CheckForReadOperation
,
2011 OUT PIO_STATUS_BLOCK IoStatus
,
2012 IN PDEVICE_OBJECT DeviceObject
2017 Ext2FastIoRead (IN PFILE_OBJECT FileObject
,
2018 IN PLARGE_INTEGER FileOffset
,
2023 OUT PIO_STATUS_BLOCK IoStatus
,
2024 IN PDEVICE_OBJECT DeviceObject
);
2028 IN PFILE_OBJECT FileObject
,
2029 IN PLARGE_INTEGER FileOffset
,
2034 OUT PIO_STATUS_BLOCK IoStatus
,
2035 IN PDEVICE_OBJECT DeviceObject
);
2038 Ext2FastIoQueryBasicInfo (
2039 IN PFILE_OBJECT FileObject
,
2041 OUT PFILE_BASIC_INFORMATION Buffer
,
2042 OUT PIO_STATUS_BLOCK IoStatus
,
2043 IN PDEVICE_OBJECT DeviceObject
);
2046 Ext2FastIoQueryStandardInfo (
2047 IN PFILE_OBJECT FileObject
,
2049 OUT PFILE_STANDARD_INFORMATION Buffer
,
2050 OUT PIO_STATUS_BLOCK IoStatus
,
2051 IN PDEVICE_OBJECT DeviceObject
);
2055 IN PFILE_OBJECT FileObject
,
2056 IN PLARGE_INTEGER FileOffset
,
2057 IN PLARGE_INTEGER Length
,
2058 IN PEPROCESS Process
,
2060 IN BOOLEAN FailImmediately
,
2061 IN BOOLEAN ExclusiveLock
,
2062 OUT PIO_STATUS_BLOCK IoStatus
,
2063 IN PDEVICE_OBJECT DeviceObject
2067 Ext2FastIoUnlockSingle (
2068 IN PFILE_OBJECT FileObject
,
2069 IN PLARGE_INTEGER FileOffset
,
2070 IN PLARGE_INTEGER Length
,
2071 IN PEPROCESS Process
,
2073 OUT PIO_STATUS_BLOCK IoStatus
,
2074 IN PDEVICE_OBJECT DeviceObject
2078 Ext2FastIoUnlockAll (
2079 IN PFILE_OBJECT FileObject
,
2080 IN PEPROCESS Process
,
2081 OUT PIO_STATUS_BLOCK IoStatus
,
2082 IN PDEVICE_OBJECT DeviceObject
2086 Ext2FastIoUnlockAllByKey (
2087 IN PFILE_OBJECT FileObject
,
2091 IN PEPROCESS Process
,
2094 OUT PIO_STATUS_BLOCK IoStatus
,
2095 IN PDEVICE_OBJECT DeviceObject
2100 Ext2FastIoQueryNetworkOpenInfo (
2101 IN PFILE_OBJECT FileObject
,
2103 OUT PFILE_NETWORK_OPEN_INFORMATION Buffer
,
2104 OUT PIO_STATUS_BLOCK IoStatus
,
2105 IN PDEVICE_OBJECT DeviceObject
);
2108 Ext2FastIoQueryNetworkOpenInfo (
2109 IN PFILE_OBJECT FileObject
,
2111 OUT PFILE_NETWORK_OPEN_INFORMATION Buffer
,
2112 OUT PIO_STATUS_BLOCK IoStatus
,
2113 IN PDEVICE_OBJECT DeviceObject
);
2117 Ext2AcquireForCreateSection (
2118 IN PFILE_OBJECT FileObject
2123 Ext2ReleaseForCreateSection (
2124 IN PFILE_OBJECT FileObject
2129 Ext2AcquireFileForModWrite (
2130 IN PFILE_OBJECT FileObject
,
2131 IN PLARGE_INTEGER EndingOffset
,
2132 OUT PERESOURCE
*ResourceToRelease
,
2133 IN PDEVICE_OBJECT DeviceObject
2138 Ext2ReleaseFileForModWrite (
2139 IN PFILE_OBJECT FileObject
,
2140 IN PERESOURCE ResourceToRelease
,
2141 IN PDEVICE_OBJECT DeviceObject
2146 Ext2AcquireFileForCcFlush (
2147 IN PFILE_OBJECT FileObject
,
2148 IN PDEVICE_OBJECT DeviceObject
2153 Ext2ReleaseFileForCcFlush (
2154 IN PFILE_OBJECT FileObject
,
2155 IN PDEVICE_OBJECT DeviceObject
2161 Ext2PreAcquireForCreateSection(
2162 IN PFS_FILTER_CALLBACK_DATA cd
,
2172 Ext2QueryFileInformation (IN PEXT2_IRP_CONTEXT IrpContext
);
2175 Ext2SetFileInformation (IN PEXT2_IRP_CONTEXT IrpContext
);
2180 PLARGE_INTEGER Size
,
2186 PEXT2_IRP_CONTEXT IrpContext
,
2194 PEXT2_IRP_CONTEXT IrpContext
,
2197 PLARGE_INTEGER AllocationSize
);
2200 Ext2IsFileRemovable(
2201 IN PEXT2_IRP_CONTEXT IrpContext
,
2208 Ext2SetDispositionInfo(
2209 PEXT2_IRP_CONTEXT IrpContext
,
2218 PEXT2_IRP_CONTEXT IrpContext
,
2226 PEXT2_IRP_CONTEXT IrpContext
,
2233 Ext2InodeType(PEXT2_MCB Mcb
);
2237 PEXT2_IRP_CONTEXT IrpContext
,
2250 IN PEXT2_IRP_CONTEXT IrpContext
,
2252 IN BOOLEAN bShutDown
2257 IN PEXT2_IRP_CONTEXT IrpContext
,
2259 IN BOOLEAN bShutDown
2264 IN PEXT2_IRP_CONTEXT IrpContext
,
2270 Ext2Flush (IN PEXT2_IRP_CONTEXT IrpContext
);
2279 IN PEXT2_IRP_CONTEXT IrpContext
,
2284 OUT PULONG BytesRead
2289 IN PEXT2_IRP_CONTEXT IrpContext
,
2294 OUT PULONG BytesWritten
2298 Ext2TruncateSymlink(
2299 PEXT2_IRP_CONTEXT IrpContext
,
2306 // MountPoint process workitem
2310 Ext2SetVpbFlag (IN PVPB Vpb
,
2314 Ext2ClearVpbFlag (IN PVPB Vpb
,
2319 IN PEXT2_IRP_CONTEXT IrpContext
,
2321 IN BOOLEAN bForce
);
2324 Ext2PurgeVolume (IN PEXT2_VCB Vcb
,
2325 IN BOOLEAN FlushBeforePurge
);
2328 Ext2PurgeFile (IN PEXT2_FCB Fcb
,
2329 IN BOOLEAN FlushBeforePurge
);
2332 Ext2IsHandleCountZero(IN PEXT2_VCB Vcb
);
2335 Ext2LockVcb (IN PEXT2_VCB Vcb
,
2336 IN PFILE_OBJECT FileObject
);
2339 Ext2LockVolume (IN PEXT2_IRP_CONTEXT IrpContext
);
2342 Ext2UnlockVcb (IN PEXT2_VCB Vcb
,
2343 IN PFILE_OBJECT FileObject
);
2346 Ext2UnlockVolume (IN PEXT2_IRP_CONTEXT IrpContext
);
2349 Ext2AllowExtendedDasdIo(IN PEXT2_IRP_CONTEXT IrpContext
);
2352 Ext2OplockRequest (IN PEXT2_IRP_CONTEXT IrpContext
);
2355 Ext2QueryExtentMappings(
2356 IN PEXT2_IRP_CONTEXT IrpContext
,
2359 IN PLARGE_INTEGER RequestVbn
,
2360 OUT PLARGE_INTEGER
* pMappedRuns
2364 Ext2QueryRetrievalPointers(IN PEXT2_IRP_CONTEXT IrpContext
);
2367 Ext2GetRetrievalPointers(IN PEXT2_IRP_CONTEXT IrpContext
);
2370 Ext2GetRetrievalPointerBase(IN PEXT2_IRP_CONTEXT IrpContext
);
2373 Ext2UserFsRequest (IN PEXT2_IRP_CONTEXT IrpContext
);
2376 Ext2IsMediaWriteProtected (
2377 IN PEXT2_IRP_CONTEXT IrpContext
,
2378 IN PDEVICE_OBJECT TargetDevice
2382 Ext2MountVolume (IN PEXT2_IRP_CONTEXT IrpContext
);
2385 Ext2VerifyVcb (IN PEXT2_IRP_CONTEXT IrpContext
,
2388 Ext2VerifyVolume (IN PEXT2_IRP_CONTEXT IrpContext
);
2391 Ext2IsVolumeMounted (IN PEXT2_IRP_CONTEXT IrpContext
);
2394 Ext2DismountVolume (IN PEXT2_IRP_CONTEXT IrpContext
);
2397 Ext2FileSystemControl (IN PEXT2_IRP_CONTEXT IrpContext
);
2403 struct buffer_head
*ext3_append(struct ext2_icb
*icb
, struct inode
*inode
,
2404 ext3_lblk_t
*block
, int *err
);
2406 void ext3_set_de_type(struct super_block
*sb
,
2407 struct ext3_dir_entry_2
*de
,
2410 __u32
ext3_current_time(struct inode
*in
);
2411 void ext3_warning (struct super_block
* sb
, const char * function
,
2413 #define ext3_error ext3_warning
2414 #define ext4_error ext3_error
2416 void ext3_update_dx_flag(struct inode
*inode
);
2417 int ext3_mark_inode_dirty(struct ext2_icb
*icb
, struct inode
*in
);
2419 void ext3_inc_count(struct inode
*inode
);
2420 void ext3_dec_count(struct inode
*inode
);
2422 struct buffer_head
*
2423 ext3_find_entry (struct ext2_icb
*icb
, struct dentry
*dentry
,
2424 struct ext3_dir_entry_2
** res_dir
);
2425 struct buffer_head
*
2426 ext3_dx_find_entry(struct ext2_icb
*, struct dentry
*dentry
,
2427 struct ext3_dir_entry_2
**res_dir
, int *err
);
2429 typedef int (*filldir_t
)(void *, const char *, int, unsigned long, __u32
, unsigned);
2430 int ext3_dx_readdir(struct file
*filp
, filldir_t filldir
, void * context
);
2432 struct buffer_head
*ext3_bread(struct ext2_icb
*icb
, struct inode
*inode
,
2433 unsigned long block
, int *err
);
2434 int add_dirent_to_buf(struct ext2_icb
*icb
, struct dentry
*dentry
,
2435 struct inode
*inode
, struct ext3_dir_entry_2
*de
,
2436 struct buffer_head
*bh
);
2437 #if !defined(__REACTOS__) || defined(_MSC_VER)
2438 struct ext3_dir_entry_2
*
2439 do_split(struct ext2_icb
*icb
, struct inode
*dir
,
2440 struct buffer_head
**bh
,struct dx_frame
*frame
,
2441 struct dx_hash_info
*hinfo
, int *error
);
2444 int ext3_add_entry(struct ext2_icb
*icb
, struct dentry
*dentry
, struct inode
*inode
);
2446 int ext3_delete_entry(struct ext2_icb
*icb
, struct inode
*dir
,
2447 struct ext3_dir_entry_2
*de_del
,
2448 struct buffer_head
*bh
);
2450 int ext3_is_dir_empty(struct ext2_icb
*icb
, struct inode
*inode
);
2457 Ext2QueryGlobalParameters(IN PUNICODE_STRING RegistryPath
);
2459 Ext2QueryRegistrySettings(IN PUNICODE_STRING RegistryPath
);
2462 DriverUnload (IN PDRIVER_OBJECT DriverObject
);
2470 IN PEXT2_IRP_CONTEXT IrpContext
,
2481 PEXT2_IRP_CONTEXT IrpContext
,
2490 Ext2TruncateIndirect(
2491 PEXT2_IRP_CONTEXT IrpContext
,
2499 // linux.c: linux lib implemenation
2506 ext2_destroy_linux();
2514 Ext2LockControl (IN PEXT2_IRP_CONTEXT IrpContext
);
2523 Ext2FcbReaperThread(
2529 Ext2McbReaperThread(
2541 Ext2AllocateIrpContext (IN PDEVICE_OBJECT DeviceObject
,
2545 Ext2FreeIrpContext (IN PEXT2_IRP_CONTEXT IrpContext
);
2555 Ext2UnlinkFcb(IN PEXT2_FCB Fcb
);
2558 Ext2FreeFcb (IN PEXT2_FCB Fcb
);
2560 Ext2ReleaseFcb (IN PEXT2_FCB Fcb
);
2563 Ext2InsertFcb(PEXT2_VCB Vcb
, PEXT2_FCB Fcb
);
2566 Ext2AllocateCcb (ULONG Flags
, PEXT2_MCB SymLink
);
2575 Ext2FreeCcb (IN PEXT2_VCB Vcb
, IN PEXT2_CCB Ccb
);
2578 Ext2AllocateInode (PEXT2_VCB Vcb
);
2581 Ext2DestroyInode (IN PEXT2_VCB Vcb
, IN PEXT2_INODE inode
);
2583 struct dentry
* Ext2AllocateEntry();
2584 VOID
Ext2FreeEntry (IN
struct dentry
*de
);
2585 struct dentry
*Ext2BuildEntry(PEXT2_VCB Vcb
, PEXT2_MCB Dcb
, PUNICODE_STRING FileName
);
2588 Ext2AllocateExtent();
2591 Ext2FreeExtent (IN PEXT2_EXTENT Extent
);
2594 Ext2CountExtents(IN PEXT2_EXTENT Chain
);
2598 IN PEXT2_EXTENT Chain
,
2599 IN PEXT2_EXTENT Extent
2603 Ext2DestroyExtentChain(IN PEXT2_EXTENT Chain
);
2607 IN PEXT2_IRP_CONTEXT IrpContext
,
2610 IN ULONGLONG Offset
,
2613 OUT PEXT2_EXTENT
* Chain
2617 Ext2ListExtents(PLARGE_MCB Extents
);
2629 Ext2ClearAllExtents(PLARGE_MCB Zone
);
2639 Ext2RemoveVcbExtent (
2646 Ext2LookupVcbExtent (
2650 OUT PLONGLONG Length
2663 Ext2RemoveMcbExtent (
2671 Ext2LookupMcbExtent (
2676 OUT PLONGLONG Length
2680 Ext2AddMcbMetaExts (
2688 Ext2RemoveMcbMetaExts (
2705 Ext2LookupBlockExtent(
2714 Ext2RemoveBlockExtent(
2723 IN PEXT2_IRP_CONTEXT IrpContext
,
2730 IN OUT PUNICODE_STRING Target
,
2731 IN PUNICODE_STRING File
,
2732 IN PUNICODE_STRING Parent
2739 IN PUNICODE_STRING FileName
,
2740 IN PUNICODE_STRING Parent
,
2748 PUNICODE_STRING FileName
2752 Ext2SearchMcbWithoutLock(
2754 PUNICODE_STRING FileName
2777 PEXT2_IRP_CONTEXT IrpContext
,
2778 PEXT2_VCB Vcb
, LONGLONG Block
2782 Ext2CheckBitmapConsistency(
2783 PEXT2_IRP_CONTEXT IrpContext
,
2788 Ext2InsertVcb(PEXT2_VCB Vcb
);
2791 Ext2RemoveVcb(PEXT2_VCB Vcb
);
2794 Ext2InitializeLabel(
2796 IN PEXT2_SUPER_BLOCK Sb
2801 PEXT2_IRP_CONTEXT IrpContext
,
2803 PEXT2_SUPER_BLOCK Ext2Sb
,
2804 PDEVICE_OBJECT TargetDevice
,
2805 PDEVICE_OBJECT VolumeDevice
,
2809 Ext2TearDownStream (IN PEXT2_VCB Vcb
);
2812 Ext2DestroyVcb (IN PEXT2_VCB Vcb
);
2815 Ext2CompleteIrpContext (
2816 IN PEXT2_IRP_CONTEXT IrpContext
,
2817 IN NTSTATUS Status
);
2820 Ext2SyncUninitializeCacheMap (
2821 IN PFILE_OBJECT FileObject
);
2824 Ext2LinkTailMcb(PEXT2_VCB Vcb
, PEXT2_MCB Mcb
);
2828 Ext2LinkHeadMcb(PEXT2_VCB Vcb
, PEXT2_MCB Mcb
);
2831 Ext2UnlinkMcb(PEXT2_VCB Vcb
, PEXT2_MCB Mcb
);
2846 Ext2StartReaper(PEXT2_REAPER
, EXT2_REAPER_RELEASE
);
2849 Ext2StopReaper(PEXT2_REAPER Reaper
);
2856 Ext2Log2(ULONG Value
);
2859 Ext2NtTime (IN ULONG i_time
);
2862 Ext2LinuxTime (IN LARGE_INTEGER SysTime
);
2865 Ext2OEMToUnicodeSize(
2873 IN OUT PUNICODE_STRING Oem
,
2874 IN POEM_STRING Unicode
2878 Ext2UnicodeToOEMSize(
2880 IN PUNICODE_STRING Unicode
2886 IN OUT POEM_STRING Oem
,
2887 IN PUNICODE_STRING Unicode
2891 Ext2Sleep(ULONG ms
);
2893 int Ext2LinuxError (NTSTATUS Status
);
2894 NTSTATUS
Ext2WinntError(int rc
);
2896 BOOLEAN
Ext2IsDot(PUNICODE_STRING name
);
2897 BOOLEAN
Ext2IsDotDot(PUNICODE_STRING name
);
2913 Ext2Pnp(IN PEXT2_IRP_CONTEXT IrpContext
);
2917 PEXT2_IRP_CONTEXT IrpContext
,
2922 PEXT2_IRP_CONTEXT IrpContext
,
2926 Ext2PnpCancelRemove(
2927 PEXT2_IRP_CONTEXT IrpContext
,
2931 Ext2PnpSurpriseRemove(
2932 PEXT2_IRP_CONTEXT IrpContext
,
2942 IN PEXT2_IRP_CONTEXT IrpContext
,
2945 IN ULONGLONG Offset
,
2948 IN BOOLEAN bDirectIo
,
2953 Ext2Read (IN PEXT2_IRP_CONTEXT IrpContext
);
2961 Ext2LoadInternalJournal(
2974 PEXT2_IRP_CONTEXT IrpContext
,
2984 Ext2ShutDown (IN PEXT2_IRP_CONTEXT IrpContext
);
2992 Ext2QueryVolumeInformation (IN PEXT2_IRP_CONTEXT IrpContext
);
2995 Ext2SetVolumeInformation (IN PEXT2_IRP_CONTEXT IrpContext
);
3001 typedef struct _EXT2_RW_CONTEXT
{
3006 PERESOURCE Resource
;
3007 ERESOURCE_THREAD ThreadId
;
3008 PFILE_OBJECT FileObject
;
3012 } EXT2_RW_CONTEXT
, *PEXT2_RW_CONTEXT
;
3014 #define EXT2_RW_CONTEXT_WRITE 1
3018 IN PEXT2_IRP_CONTEXT IrpContext
,
3021 IN ULONGLONG Offset
,
3024 IN BOOLEAN bDirectIo
,
3030 Ext2StartFloppyFlushDpc (
3033 PFILE_OBJECT FileObject
);
3037 IN PEXT2_IRP_CONTEXT IrpContext
,
3039 IN PFILE_OBJECT FileObject
,
3040 IN PLARGE_INTEGER Start
,
3041 IN PLARGE_INTEGER End
);
3044 Ext2Write (IN PEXT2_IRP_CONTEXT IrpContext
);
3046 #endif /* _EXT2_HEADER_ */