[EXT2]
[reactos.git] / reactos / drivers / filesystems / ext2 / inc / ext2fs.h
1 /*
2 * COPYRIGHT: See COPYRIGHT.TXT
3 * PROJECT: Ext2 File System Driver for WinNT/2K/XP
4 * FILE: Ext2fs.h
5 * PURPOSE: Header file: ext2 structures
6 * PROGRAMMER: Matt Wu <mattwu@163.com>
7 * HOMEPAGE: http://www.ext2fsd.com
8 * UPDATE HISTORY:
9 */
10
11 #ifndef _EXT2_HEADER_
12 #define _EXT2_HEADER_
13
14 /* INCLUDES *************************************************************/
15 #include <linux/module.h>
16 #include <ntdddisk.h>
17 #ifdef __REACTOS__
18 #include <ndk/rtlfuncs.h>
19 #include <pseh/pseh2.h>
20 #endif
21 #include <stdio.h>
22 #include <time.h>
23 #include <string.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>
28
29 /* DEBUG ****************************************************************/
30 #if DBG
31 # define EXT2_DEBUG 1
32 #else
33 # define EXT2_DEBUG 0
34 #endif
35
36 #define EXT_DEBUG_BREAKPOINT FALSE
37
38 #if EXT2_DEBUG && EXT_DEBUG_BREAKPOINT
39 //#if _X86_
40 //#define DbgBreak() __asm int 3
41 //#else
42 #define DbgBreak() KdBreakPoint()
43 //#endif
44 #else
45 #define DbgBreak()
46 #endif
47
48 /* STRUCTS & CONSTS******************************************************/
49
50 #define EXT2FSD_VERSION "0.66"
51
52
53 /* WDK DEFINITIONS ******************************************************/
54
55
56 /* COMPILER SWITCH / OPTIONS ********************************************/
57
58 //
59 // Ext2Fsd build options
60 //
61
62 // To support driver dynamics unload
63
64 #define EXT2_UNLOAD FALSE
65
66 // To support inode size expansion (fallocate)
67
68 #define EXT2_PRE_ALLOCATION_SUPPORT TRUE
69
70 //
71 // Constants
72 //
73
74 #define EXT2_MAX_NESTED_LINKS (8)
75 #define EXT2_LINKLEN_IN_INODE (60)
76 #define EXT2_BLOCK_TYPES (0x04)
77
78 #define MAXIMUM_RECORD_LENGTH (0x10000)
79
80 #define SECTOR_BITS (Vcb->SectorBits)
81 #define SECTOR_SIZE (Vcb->DiskGeometry.BytesPerSector)
82 #define DEFAULT_SECTOR_SIZE (0x200)
83
84 #define SUPER_BLOCK_OFFSET (0x400)
85 #define SUPER_BLOCK_SIZE (0x400)
86
87 #define READ_AHEAD_GRANULARITY (0x10000)
88
89 #define SUPER_BLOCK (Vcb->SuperBlock)
90
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)
95
96 #define INODES_COUNT (Vcb->SuperBlock->s_inodes_count)
97
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))
101
102 #define EXT2_FIRST_DATA_BLOCK (SUPER_BLOCK->s_first_data_block)
103
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;
109
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)))
112
113
114
115 /*
116 * Compile-time assertion: (Lustre version)
117 *
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:
121 *
122 * 6.8.4.2 The switch statement
123 * ....
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...
128 *
129 */
130
131 #define CL_ASSERT(cond) do {switch('x') {case (cond): case 0: break;}} while (0)
132
133 /* File System Releated *************************************************/
134
135 #define DRIVER_NAME "Ext2Fsd"
136 #define DEVICE_NAME L"\\Ext2Fsd"
137 #define CDROM_NAME L"\\Ext2CdFsd"
138
139 // Registry
140
141 #define PARAMETERS_KEY L"\\Parameters"
142 #define VOLUMES_KEY L"\\Volumes"
143
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"
153 #define UID L"uid"
154 #define GID L"gid"
155 #define EUID L"euid"
156 #define EGID L"egid"
157
158 #define DOS_DEVICE_NAME L"\\DosDevices\\Ext2Fsd"
159
160 // To support ext2fsd unload routine
161 #if EXT2_UNLOAD
162 //
163 // Private IOCTL to make the driver ready to unload
164 //
165 #define IOCTL_PREPARE_TO_UNLOAD \
166 CTL_CODE(FILE_DEVICE_UNKNOWN, 2048, METHOD_NEITHER, FILE_WRITE_ACCESS)
167
168 #endif // EXT2_UNLOAD
169
170 #include "common.h"
171
172 #ifndef _GNU_NTIFS_
173 typedef IO_STACK_LOCATION EXTENDED_IO_STACK_LOCATION, *PEXTENDED_IO_STACK_LOCATION;
174 #endif
175
176 #define IsFlagOn(a,b) ((BOOLEAN)(FlagOn(a,b) == b))
177 #ifndef FlagOn
178 #define FlagOn(_F,_SF) ((_F) & (_SF))
179 #endif
180
181 #ifndef BooleanFlagOn
182 #define BooleanFlagOn(F,SF) ((BOOLEAN)(((F) & (SF)) != 0))
183 #endif
184
185 #ifndef SetFlag
186 #define SetFlag(_F,_SF) ((_F) |= (_SF))
187 #endif
188
189 #ifndef ClearFlag
190 #define ClearFlag(_F,_SF) ((_F) &= ~(_SF))
191 #endif
192
193 #ifndef min
194 #define min(a,b) (((a) < (b)) ? (a) : (b))
195 #endif
196
197 #ifndef max
198 #define max(a,b) (((a) > (b)) ? (a) : (b))
199 #endif
200
201 #ifdef _WIN2K_TARGET_
202 #define InterlockedOr _InterlockedOr
203 LONG
204 _InterlockedAnd (
205 IN OUT LONG volatile *Target,
206 IN LONG Set
207 );
208
209 #pragma intrinsic (_InterlockedAnd)
210 #define InterlockedAnd _InterlockedAnd
211
212 LONG
213 _InterlockedXor (
214 IN OUT LONG volatile *Target,
215 IN LONG Set
216 );
217
218 #pragma intrinsic (_InterlockedXor)
219 #define InterlockedXor _InterlockedXor
220
221 #endif /* only for win2k */
222
223 #if EXT2_DEBUG
224
225 #define SetLongFlag(_F,_SF) Ext2SetFlag((PULONG)&(_F), (ULONG)(_SF))
226 #define ClearLongFlag(_F,_SF) Ext2ClearFlag((PULONG)&(_F), (ULONG)(_SF))
227
228 #ifdef __REACTOS__
229 static
230 #endif
231 __inline
232 VOID
233 Ext2SetFlag(PULONG Flags, ULONG FlagBit)
234 {
235 ULONG _ret = InterlockedOr(Flags, FlagBit);
236 ASSERT(*Flags == (_ret | FlagBit));
237 }
238
239 #ifdef __REACTOS__
240 static
241 #endif
242 __inline
243 VOID
244 Ext2ClearFlag(PULONG Flags, ULONG FlagBit)
245 {
246 ULONG _ret = InterlockedAnd(Flags, ~FlagBit);
247 ASSERT(*Flags == (_ret & (~FlagBit)));
248 }
249
250 #else
251
252 #define SetLongFlag(_F,_SF) InterlockedOr(&(_F), (ULONG)(_SF))
253 #define ClearLongFlag(_F,_SF) InterlockedAnd(&(_F), ~((ULONG)(_SF)))
254
255 #endif /* release */
256
257 #define Ext2RaiseStatus(IRPCONTEXT,STATUS) { \
258 (IRPCONTEXT)->ExceptionCode = (STATUS); \
259 ExRaiseStatus((STATUS)); \
260 }
261
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)); \
266 }
267
268 //
269 // Define IsWritingToEof for write (append) operations
270 //
271
272 #define FILE_WRITE_TO_END_OF_FILE 0xffffffff
273
274 #define IsWritingToEof(Pos) (((Pos).LowPart == FILE_WRITE_TO_END_OF_FILE) && \
275 ((Pos).HighPart == -1 ))
276
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)
282
283 //
284 // Pool Tags
285 //
286
287 #define TAG_VPB ' bpV'
288 #define VPB_SIZE sizeof(VPB)
289
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'
301
302 //
303 // Bug Check Codes Definitions
304 //
305
306 #define EXT2_FILE_SYSTEM (FILE_SYSTEM)
307
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)
331
332 #define EXT2_BUGCHK_LAST (0x00170000)
333
334 #define Ext2BugCheck(A,B,C,D) { KeBugCheckEx(EXT2_FILE_SYSTEM, A | __LINE__, B, C, D ); }
335
336
337 /* Ext2 file system definions *******************************************/
338
339 //
340 // The second extended file system magic number
341 //
342
343 #define EXT2_SUPER_MAGIC 0xEF53
344
345 #define EXT2_MIN_BLOCK 1024
346 #define EXT2_MIN_FRAG 1024
347 #define EXT2_MAX_USER_BLKSIZE 65536
348 //
349 // Inode flags (Linux uses octad number, but why ? strange!!!)
350 //
351
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 */
360
361 #define S_ISUID 0x00800 /* 000 4000 */
362 #define S_ISGID 0x00400 /* 000 2000 */
363 #define S_ISVTX 0x00200 /* 000 1000 */
364
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)
373
374 #define S_IPERMISSION_MASK 0x1FF /* */
375
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 */
381
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 */
387
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 */
393
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)
400
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))
403
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)
406
407 #define Ext2SetOwnerWritable(m) do {(m) |= S_IWUSR;} while(0)
408 #define Ext2SetOwnerReadOnly(m) do {(m) &= ~S_IWUSR;} while(0)
409
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))
413
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))
417
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))
421
422 #define Ext2SetReadOnly(m) do {(m) &= ~(S_IWUSR | S_IWGRP | S_IWOTH);} while(0)
423
424
425 #define Ext2FileCanRead (0x1)
426 #define Ext2FileCanWrite (0x2)
427 #define Ext2FileCanExecute (0x4)
428
429
430 /*
431 * We need 8-bytes aligned for all the sturctures
432 * It's a must for all ERESOURCE allocations
433 */
434
435 //
436 // Ext2Fsd Driver Definitions
437 //
438
439 //
440 // EXT2_IDENTIFIER_TYPE
441 //
442 // Identifiers used to mark the structures
443 //
444
445 typedef enum _EXT2_IDENTIFIER_TYPE {
446 #ifdef _MSC_VER
447 EXT2FGD = ':DGF',
448 EXT2VCB = ':BCV',
449 EXT2FCB = ':BCF',
450 EXT2CCB = ':BCC',
451 EXT2ICX = ':XCI',
452 EXT2FSD = ':DSF',
453 EXT2MCB = ':BCM'
454 #else
455 EXT2FGD = 0xE2FD0001,
456 EXT2VCB = 0xE2FD0002,
457 EXT2FCB = 0xE2FD0003,
458 EXT2CCB = 0xE2FD0004,
459 EXT2ICX = 0xE2FD0005,
460 EXT2FSD = 0xE2FD0006,
461 EXT2MCB = 0xE2FD0007
462 #endif
463 } EXT2_IDENTIFIER_TYPE;
464
465 //
466 // EXT2_IDENTIFIER
467 //
468 // Header used to mark the structures
469 //
470 typedef struct _EXT2_IDENTIFIER {
471 EXT2_IDENTIFIER_TYPE Type;
472 ULONG Size;
473 } EXT2_IDENTIFIER, *PEXT2_IDENTIFIER;
474
475
476 #define NodeType(Ptr) (*((EXT2_IDENTIFIER_TYPE *)(Ptr)))
477
478 typedef struct _EXT2_MCB EXT2_MCB, *PEXT2_MCB;
479
480
481 typedef PVOID PBCB;
482
483 //
484
485 //
486 // EXT2_GLOBAL_DATA
487 //
488 // Data that is not specific to a mounted volume
489 //
490
491 typedef VOID (NTAPI *EXT2_REAPER_RELEASE)(PVOID);
492
493 typedef struct _EXT2_REAPER {
494 KEVENT Engine;
495 KEVENT Wait;
496 EXT2_REAPER_RELEASE Free;
497 ULONG Flags;
498 } EXT2_REAPER, *PEXT2_REAPER;
499
500 #define EXT2_REAPER_FLAG_STOP (1 << 0)
501
502 typedef struct _EXT2_GLOBAL {
503
504 /* Identifier for this structure */
505 EXT2_IDENTIFIER Identifier;
506
507 /* Syncronization primitive for this structure */
508 ERESOURCE Resource;
509
510 /* Global flags for the driver: I put it since
511 FastIoDispatch isn't 8bytes aligned. */
512 ULONG Flags;
513
514 /* Table of pointers to the fast I/O entry points */
515 FAST_IO_DISPATCH FastIoDispatch;
516
517 /* Filter callbacks */
518 FS_FILTER_CALLBACKS FilterCallbacks;
519
520 /* Table of pointers to the Cache Manager callbacks */
521 CACHE_MANAGER_CALLBACKS CacheManagerCallbacks;
522 CACHE_MANAGER_CALLBACKS CacheManagerNoOpCallbacks;
523
524 /* Pointer to the driver object */
525 PDRIVER_OBJECT DriverObject;
526
527 /* Pointer to the disk device object */
528 PDEVICE_OBJECT DiskdevObject;
529
530 /* Pointer to the cdrom device object */
531 PDEVICE_OBJECT CdromdevObject;
532
533 /* List of mounted volumes */
534 LIST_ENTRY VcbList;
535
536 /* Cleaning thread related: resource cleaner */
537 EXT2_REAPER McbReaper;
538 EXT2_REAPER bhReaper;
539
540 /* Look Aside table of IRP_CONTEXT, FCB, MCB, CCB */
541 NPAGED_LOOKASIDE_LIST Ext2IrpContextLookasideList;
542 NPAGED_LOOKASIDE_LIST Ext2FcbLookasideList;
543 NPAGED_LOOKASIDE_LIST Ext2CcbLookasideList;
544 NPAGED_LOOKASIDE_LIST Ext2McbLookasideList;
545 NPAGED_LOOKASIDE_LIST Ext2ExtLookasideList;
546 NPAGED_LOOKASIDE_LIST Ext2DentryLookasideList;
547 USHORT MaxDepth;
548
549 /* User specified global codepage name */
550 struct {
551 WCHAR PageName[CODEPAGE_MAXLEN];
552 UCHAR AnsiName[CODEPAGE_MAXLEN];
553 struct nls_table * PageTable;
554 } Codepage;
555
556 /* global hiding patterns */
557 WCHAR wHidingPrefix[HIDINGPAT_LEN];
558 WCHAR wHidingSuffix[HIDINGPAT_LEN];
559 BOOLEAN bHidingPrefix;
560 CHAR sHidingPrefix[HIDINGPAT_LEN];
561 BOOLEAN bHidingSuffix;
562 CHAR sHidingSuffix[HIDINGPAT_LEN];
563
564 /* Registery path */
565 UNICODE_STRING RegistryPath;
566
567 /* global memory and i/o statistics and memory allocations
568 of various sturctures */
569
570 EXT2_PERF_STATISTICS_V2 PerfStat;
571
572 } EXT2_GLOBAL, *PEXT2_GLOBAL;
573
574 //
575 // Flags for EXT2_GLOBAL_DATA
576 //
577
578 #define EXT2_UNLOAD_PENDING 0x00000001
579 #define EXT2_SUPPORT_WRITING 0x00000002
580 #define EXT3_FORCE_WRITING 0x00000004
581 #define EXT2_CHECKING_BITMAP 0x00000008
582 #define EXT2_AUTO_MOUNT 0x00000010
583
584 //
585 // Glboal Ext2Fsd Memory Block
586 //
587
588 extern PEXT2_GLOBAL Ext2Global;
589
590 //
591 // memory allocation statistics
592 //
593
594
595 #define INC_MEM_COUNT(_i, _p, _s) do { ASSERT(_p); Ext2TraceMemory(TRUE, (int) (_i), (PVOID)(_p), (LONG)(_s)); } while(0)
596 #define DEC_MEM_COUNT(_i, _p, _s) do { ASSERT(_p); Ext2TraceMemory(FALSE, (int) (_i), (PVOID)(_p), (LONG)(_s)); } while(0)
597 #define INC_IRP_COUNT(IrpContext) Ext2TraceIrpContext(TRUE, (IrpContext))
598 #define DEC_IRP_COUNT(IrpContext) Ext2TraceIrpContext(FALSE, (IrpContext))
599
600 //
601 // Driver Extension define
602 //
603
604 #define IsExt2FsDevice(DO) ((DO == Ext2Global->DiskdevObject) || \
605 (DO == Ext2Global->CdromdevObject) )
606
607 #ifdef _WIN2K_TARGET_
608 #define FSRTL_ADVANCED_FCB_HEADER FSRTL_COMMON_FCB_HEADER
609 #endif
610
611 typedef struct _EXT2_FCBVCB {
612
613 // Command header for Vcb and Fcb
614 FSRTL_ADVANCED_FCB_HEADER Header;
615
616 #ifndef _WIN2K_TARGET_
617 FAST_MUTEX Mutex;
618 #endif
619
620 // Ext2Fsd identifier
621 EXT2_IDENTIFIER Identifier;
622
623
624 // Locking resources
625 ERESOURCE MainResource;
626 ERESOURCE PagingIoResource;
627
628 } EXT2_FCBVCB, *PEXT2_FCBVCB;
629
630 //
631 // EXT2_VCB Volume Control Block
632 //
633 // Data that represents a mounted logical volume
634 // It is allocated as the device extension of the volume device object
635 //
636 typedef struct _EXT2_VCB {
637
638 /* Common header */
639 EXT2_FCBVCB;
640
641 // Resource for metadata (inode)
642 ERESOURCE MetaInode;
643
644 // Resource for metadata (block)
645 ERESOURCE MetaBlock;
646
647 // Resource for Mcb (Meta data control block)
648 ERESOURCE McbLock;
649
650 // Entry of Mcb Tree (Root Node)
651 PEXT2_MCB McbTree;
652
653 // Mcb list
654 LIST_ENTRY McbList;
655 ULONG NumOfMcb;
656
657 // Link list to Global
658 LIST_ENTRY Next;
659
660 // Section objects
661 SECTION_OBJECT_POINTERS SectionObject;
662
663 // Dirty Mcbs of modifications for volume stream
664 LARGE_MCB Extents;
665
666 // List of FCBs for open files on this volume
667 ULONG FcbCount;
668 LIST_ENTRY FcbList;
669 KSPIN_LOCK FcbLock;
670
671 // Share Access for the file object
672 SHARE_ACCESS ShareAccess;
673
674 // Incremented on IRP_MJ_CREATE, decremented on IRP_MJ_CLOSE
675 // for both files on this volume and open instances of the
676 // volume itself.
677 ULONG ReferenceCount; /* total ref count */
678 ULONG OpenHandleCount; /* all handles */
679
680 ULONG OpenVolumeCount; /* volume handle */
681
682 // Disk change count
683 ULONG ChangeCount;
684
685 // Pointer to the VPB in the target device object
686 PVPB Vpb;
687 PVPB Vpb2;
688
689 // The FileObject of Volume used to lock the volume
690 PFILE_OBJECT LockFile;
691
692 // List of IRPs pending on directory change notify requests
693 LIST_ENTRY NotifyList;
694
695 // Pointer to syncronization primitive for this list
696 PNOTIFY_SYNC NotifySync;
697
698 // This volumes device object
699 PDEVICE_OBJECT DeviceObject;
700
701 // The physical device object (the disk)
702 PDEVICE_OBJECT TargetDeviceObject;
703
704 // The physical device object (the disk)
705 PDEVICE_OBJECT RealDevice;
706
707 // Information about the physical device object
708 DISK_GEOMETRY DiskGeometry;
709 PARTITION_INFORMATION PartitionInformation;
710
711 BOOLEAN IsExt3fs;
712 PEXT2_SUPER_BLOCK SuperBlock;
713
714 // Block / Cluster size
715 ULONG BlockSize;
716
717 // Sector size in bits
718 ULONG SectorBits;
719
720 // Aligned size (Page or Block)
721 ULONGLONG IoUnitSize;
722
723 // Bits of aligned size
724 ULONG IoUnitBits;
725
726 // Inode size
727 ULONG InodeSize;
728
729 // Inode lookaside list
730 NPAGED_LOOKASIDE_LIST InodeLookasideList;
731
732 // Flags for the volume
733 ULONG Flags;
734
735 // Streaming File Object
736 PFILE_OBJECT Volume;
737
738 // User specified codepage name per volume
739 struct {
740 UCHAR AnsiName[CODEPAGE_MAXLEN];
741 struct nls_table * PageTable;
742 } Codepage;
743
744 /* patterns to hiding files */
745 BOOLEAN bHidingPrefix;
746 CHAR sHidingPrefix[HIDINGPAT_LEN];
747 BOOLEAN bHidingSuffix;
748 CHAR sHidingSuffix[HIDINGPAT_LEN];
749
750 /* User to impersanate */
751 uid_t uid;
752 gid_t gid;
753
754 /* User to act as */
755 uid_t euid;
756 gid_t egid;
757
758 /* mountpoint: symlink to DesDevices */
759 UCHAR DrvLetter;
760
761 struct block_device bd;
762 struct super_block sb;
763 struct ext3_sb_info sbi;
764
765 /* Maximum file size in blocks ... */
766 ULONG max_blocks_per_layer[EXT2_BLOCK_TYPES];
767 ULONG max_data_blocks;
768 loff_t max_bitmap_bytes;
769 loff_t max_bytes;
770 } EXT2_VCB, *PEXT2_VCB;
771
772 //
773 // Flags for EXT2_VCB
774 //
775 #define VCB_INITIALIZED 0x00000001
776 #define VCB_VOLUME_LOCKED 0x00000002
777 #define VCB_MOUNTED 0x00000004
778 #define VCB_DISMOUNT_PENDING 0x00000008
779 #define VCB_NEW_VPB 0x00000010
780 #define VCB_BEING_CLOSED 0x00000020
781 #define VCB_USER_IDS 0x00000040 /* uid/gid specified by user */
782 #define VCB_USER_EIDS 0x00000080 /* euid/egid specified by user */
783
784 #define VCB_BEING_DROPPED 0x00002000
785 #define VCB_FORCE_WRITING 0x00004000
786 #define VCB_DEVICE_REMOVED 0x00008000
787 #define VCB_JOURNAL_RECOVER 0x00080000
788 #define VCB_ARRIVAL_NOTIFIED 0x00800000
789 #define VCB_READ_ONLY 0x08000000
790 #define VCB_WRITE_PROTECTED 0x10000000
791 #define VCB_FLOPPY_DISK 0x20000000
792 #define VCB_REMOVAL_PREVENTED 0x40000000
793 #define VCB_REMOVABLE_MEDIA 0x80000000
794
795
796 #define IsVcbInited(Vcb) (IsFlagOn((Vcb)->Flags, VCB_INITIALIZED))
797 #define IsMounted(Vcb) (IsFlagOn((Vcb)->Flags, VCB_MOUNTED))
798 #define IsDispending(Vcb) (IsFlagOn((Vcb)->Flags, VCB_DISMOUNT_PENDING))
799 #define IsVcbReadOnly(Vcb) (IsFlagOn((Vcb)->Flags, VCB_READ_ONLY) || \
800 IsFlagOn((Vcb)->Flags, VCB_WRITE_PROTECTED))
801
802
803 #define IsExt3ForceWrite() (IsFlagOn(Ext2Global->Flags, EXT3_FORCE_WRITING))
804 #define IsVcbForceWrite(Vcb) (IsFlagOn((Vcb)->Flags, VCB_FORCE_WRITING))
805 #define CanIWrite(Vcb) (IsExt3ForceWrite() || (!IsVcbReadOnly(Vcb) && IsVcbForceWrite(Vcb)))
806 #define IsLazyWriter(Fcb) ((Fcb)->LazyWriterThread == PsGetCurrentThread())
807 //
808 // EXT2_FCB File Control Block
809 //
810 // Data that represents an open file
811 // There is a single instance of the FCB for every open file
812 //
813 typedef struct _EXT2_FCB {
814
815 /* Common header */
816 EXT2_FCBVCB;
817
818 // List of FCBs for this volume
819 LIST_ENTRY Next;
820
821 SECTION_OBJECT_POINTERS SectionObject;
822
823 // Share Access for the file object
824 SHARE_ACCESS ShareAccess;
825
826 // List of byte-range locks for this file
827 FILE_LOCK FileLockAnchor;
828
829 // oplock information management structure
830 OPLOCK Oplock;
831
832 // Lazy writer thread context
833 PETHREAD LazyWriterThread;
834
835 // Incremented on IRP_MJ_CREATE, decremented on IRP_MJ_CLEANUP
836 ULONG OpenHandleCount;
837
838 // Incremented on IRP_MJ_CREATE, decremented on IRP_MJ_CLOSE
839 ULONG ReferenceCount;
840
841 // Incremented on IRP_MJ_CREATE, decremented on IRP_MJ_CLEANUP
842 // But only for Files with FO_NO_INTERMEDIATE_BUFFERING flag
843 ULONG NonCachedOpenCount;
844
845 // Flags for the FCB
846 ULONG Flags;
847
848 // Pointer to the inode
849 struct inode *Inode;
850
851 // Vcb
852 PEXT2_VCB Vcb;
853
854 // Mcb Node ...
855 PEXT2_MCB Mcb;
856
857 } EXT2_FCB, *PEXT2_FCB;
858
859 //
860 // Flags for EXT2_FCB
861 //
862
863 #define FCB_FROM_POOL 0x00000001
864 #define FCB_PAGE_FILE 0x00000002
865 #define FCB_FILE_MODIFIED 0x00000020
866 #define FCB_STATE_BUSY 0x00000040
867 #define FCB_ALLOC_IN_CREATE 0x00000080
868 #define FCB_ALLOC_IN_WRITE 0x00000100
869 #define FCB_ALLOC_IN_SETINFO 0x00000200
870
871 #define FCB_DELETE_PENDING 0x80000000
872
873 //
874 // Mcb Node
875 //
876
877 struct _EXT2_MCB {
878
879 // Identifier for this structure
880 EXT2_IDENTIFIER Identifier;
881
882 // Flags
883 ULONG Flags;
884
885 // Link List Info
886 PEXT2_MCB Parent; // Parent
887 PEXT2_MCB Next; // Siblings
888
889 union {
890 PEXT2_MCB Child; // Children Mcb nodes
891 PEXT2_MCB Target; // Target Mcb of symlink
892 };
893
894 // Mcb Node Info
895
896 // -> Fcb
897 PEXT2_FCB Fcb;
898
899 // Short name
900 UNICODE_STRING ShortName;
901
902 // Full name with path
903 UNICODE_STRING FullName;
904
905 // File attribute
906 ULONG FileAttr;
907
908 // reference count
909 ULONG Refercount;
910
911 // Extents zone
912 LARGE_MCB Extents;
913
914 // Metablocks
915 LARGE_MCB MetaExts;
916
917 // Time stamps
918 LARGE_INTEGER CreationTime;
919 LARGE_INTEGER LastWriteTime;
920 LARGE_INTEGER ChangeTime;
921 LARGE_INTEGER LastAccessTime;
922
923 // List Link to Vcb->McbList
924 LIST_ENTRY Link;
925
926 struct inode Inode;
927 struct dentry *de;
928 };
929
930 //
931 // Flags for MCB
932 //
933 #define MCB_FROM_POOL 0x00000001
934 #define MCB_VCB_LINK 0x00000002
935 #define MCB_ENTRY_TREE 0x00000004
936 #define MCB_FILE_DELETED 0x00000008
937
938 #define MCB_ZONE_INITED 0x20000000
939 #define MCB_TYPE_SPECIAL 0x40000000 /* unresolved symlink + device node */
940 #define MCB_TYPE_SYMLINK 0x80000000
941
942 #define IsMcbUsed(Mcb) ((Mcb)->Refercount > 0)
943 #define IsMcbSymLink(Mcb) IsFlagOn((Mcb)->Flags, MCB_TYPE_SYMLINK)
944 #define IsZoneInited(Mcb) IsFlagOn((Mcb)->Flags, MCB_ZONE_INITED)
945 #define IsMcbSpecialFile(Mcb) IsFlagOn((Mcb)->Flags, MCB_TYPE_SPECIAL)
946 #define IsMcbRoot(Mcb) ((Mcb)->Inode.i_ino == EXT2_ROOT_INO)
947 #define IsMcbReadonly(Mcb) IsFlagOn((Mcb)->FileAttr, FILE_ATTRIBUTE_READONLY)
948 #define IsMcbDirectory(Mcb) IsFlagOn((Mcb)->FileAttr, FILE_ATTRIBUTE_DIRECTORY)
949 #define IsFileDeleted(Mcb) IsFlagOn((Mcb)->Flags, MCB_FILE_DELETED)
950
951 #define IsLinkInvalid(Mcb) (IsMcbSymLink(Mcb) && IsFileDeleted(Mcb->Target))
952
953 /*
954 * routines for reference count management
955 */
956
957 #define Ext2ReferXcb(_C) InterlockedIncrement(_C)
958 #define Ext2DerefXcb(_C) DEC_OBJ_CNT(_C)
959
960 #ifdef __REACTOS__
961 static
962 #endif
963 __inline ULONG DEC_OBJ_CNT(PULONG _C) {
964 if (*_C > 0) {
965 return InterlockedDecrement(_C);
966 } else {
967 DbgBreak();
968 }
969 return 0;
970 }
971
972 #if EXT2_DEBUG
973 VOID
974 Ext2TraceMcb(PCHAR fn, USHORT lc, USHORT add, PEXT2_MCB Mcb);
975 #define Ext2ReferMcb(Mcb) Ext2TraceMcb(__FUNCTION__, __LINE__, TRUE, Mcb)
976 #define Ext2DerefMcb(Mcb) Ext2TraceMcb(__FUNCTION__, __LINE__, FALSE, Mcb)
977 #else
978 #define Ext2ReferMcb(Mcb) Ext2ReferXcb(&Mcb->Refercount)
979 #define Ext2DerefMcb(Mcb) Ext2DerefXcb(&Mcb->Refercount)
980 #endif
981
982 //
983 // EXT2_CCB Context Control Block
984 //
985 // Data that represents one instance of an open file
986 // There is one instance of the CCB for every instance of an open file
987 //
988 typedef struct _EXT2_CCB {
989
990 // Identifier for this structure
991 EXT2_IDENTIFIER Identifier;
992
993 // Flags
994 ULONG Flags;
995
996 // Mcb of it's symbol link
997 PEXT2_MCB SymLink;
998
999 // State that may need to be maintained
1000 UNICODE_STRING DirectorySearchPattern;
1001
1002 /* Open handle control block */
1003 struct file filp;
1004
1005 } EXT2_CCB, *PEXT2_CCB;
1006
1007 //
1008 // Flags for CCB
1009 //
1010
1011 #define CCB_FROM_POOL 0x00000001
1012 #define CCB_VOLUME_DASD_PURGE 0x00000002
1013 #define CCB_LAST_WRITE_UPDATED 0x00000004
1014 #define CCB_OPEN_REPARSE_POINT 0x00000008
1015 #define CCB_DELETE_ON_CLOSE 0x00000010
1016
1017 #define CCB_ALLOW_EXTENDED_DASD_IO 0x80000000
1018
1019 //
1020 // EXT2_IRP_CONTEXT
1021 //
1022 // Used to pass information about a request between the drivers functions
1023 //
1024 typedef struct ext2_icb {
1025
1026 // Identifier for this structure
1027 EXT2_IDENTIFIER Identifier;
1028
1029 // Pointer to the IRP this request describes
1030 PIRP Irp;
1031
1032 // Flags
1033 ULONG Flags;
1034
1035 // The major and minor function code for the request
1036 UCHAR MajorFunction;
1037 UCHAR MinorFunction;
1038
1039 // The device object
1040 PDEVICE_OBJECT DeviceObject;
1041
1042 // The real device object
1043 PDEVICE_OBJECT RealDevice;
1044
1045 // The file object
1046 PFILE_OBJECT FileObject;
1047
1048 PEXT2_FCB Fcb;
1049 PEXT2_CCB Ccb;
1050
1051 // If the request is top level
1052 BOOLEAN IsTopLevel;
1053
1054 // Used if the request needs to be queued for later processing
1055 WORK_QUEUE_ITEM WorkQueueItem;
1056
1057 // If an exception is currently in progress
1058 BOOLEAN ExceptionInProgress;
1059
1060 // The exception code when an exception is in progress
1061 NTSTATUS ExceptionCode;
1062
1063 } EXT2_IRP_CONTEXT, *PEXT2_IRP_CONTEXT;
1064
1065
1066 #define IRP_CONTEXT_FLAG_FROM_POOL (0x00000001)
1067 #define IRP_CONTEXT_FLAG_WAIT (0x00000002)
1068 #define IRP_CONTEXT_FLAG_WRITE_THROUGH (0x00000004)
1069 #define IRP_CONTEXT_FLAG_FLOPPY (0x00000008)
1070 #define IRP_CONTEXT_FLAG_DISABLE_POPUPS (0x00000020)
1071 #define IRP_CONTEXT_FLAG_DEFERRED (0x00000040)
1072 #define IRP_CONTEXT_FLAG_VERIFY_READ (0x00000080)
1073 #define IRP_CONTEXT_STACK_IO_CONTEXT (0x00000100)
1074 #define IRP_CONTEXT_FLAG_REQUEUED (0x00000200)
1075 #define IRP_CONTEXT_FLAG_USER_IO (0x00000400)
1076 #define IRP_CONTEXT_FLAG_DELAY_CLOSE (0x00000800)
1077 #define IRP_CONTEXT_FLAG_FILE_BUSY (0x00001000)
1078
1079
1080 #define Ext2CanIWait() (!IrpContext || IsFlagOn(IrpContext->Flags, IRP_CONTEXT_FLAG_WAIT))
1081
1082 //
1083 // EXT2_ALLOC_HEADER
1084 //
1085 // In the checked version of the driver this header is put in the beginning of
1086 // every memory allocation
1087 //
1088 typedef struct _EXT2_ALLOC_HEADER {
1089 EXT2_IDENTIFIER Identifier;
1090 } EXT2_ALLOC_HEADER, *PEXT2_ALLOC_HEADER;
1091
1092 typedef struct _FCB_LIST_ENTRY {
1093 PEXT2_FCB Fcb;
1094 LIST_ENTRY Next;
1095 } FCB_LIST_ENTRY, *PFCB_LIST_ENTRY;
1096
1097
1098 // Block Description List
1099 typedef struct _EXT2_EXTENT {
1100 LONGLONG Lba;
1101 ULONG Offset;
1102 ULONG Length;
1103 PIRP Irp;
1104 struct _EXT2_EXTENT * Next;
1105 } EXT2_EXTENT, *PEXT2_EXTENT;
1106
1107
1108 /* FUNCTIONS DECLARATION *****************************************************/
1109
1110 // Include this so we don't need the latest WDK to build the driver.
1111 #ifndef FSCTL_GET_RETRIEVAL_POINTER_BASE
1112 #define FSCTL_GET_RETRIEVAL_POINTER_BASE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 141, METHOD_BUFFERED, FILE_ANY_ACCESS) // RETRIEVAL_POINTER_BASE
1113 #endif
1114
1115 //
1116 // The following macro is used to determine if an FSD thread can block
1117 // for I/O or wait for a resource. It returns TRUE if the thread can
1118 // block and FALSE otherwise. This attribute can then be used to call
1119 // the FSD & FSP common work routine with the proper wait value.
1120 //
1121
1122 #define CanExt2Wait(IRP) IoIsOperationSynchronous(Irp)
1123
1124 //
1125 // memory allocation statistics
1126 //
1127
1128 #ifdef __REACTOS__
1129 static
1130 #endif
1131 __inline
1132 VOID
1133 Ext2TraceMemory(BOOLEAN _n, int _i, PVOID _p, LONG _s)
1134 {
1135 if (_n) {
1136 InterlockedIncrement(&Ext2Global->PerfStat.Current.Slot[_i]);
1137 InterlockedIncrement(&Ext2Global->PerfStat.Total.Slot[_i]);
1138 InterlockedExchangeAdd(&Ext2Global->PerfStat.Size.Slot[_i], _s);
1139 } else {
1140 InterlockedDecrement(&Ext2Global->PerfStat.Current.Slot[_i]);
1141 InterlockedExchangeAdd(&Ext2Global->PerfStat.Size.Slot[_i], -1 * _s);
1142 }
1143 }
1144
1145 #ifdef __REACTOS__
1146 static
1147 #endif
1148 __inline
1149 VOID
1150 Ext2TraceIrpContext(BOOLEAN _n, PEXT2_IRP_CONTEXT IrpContext)
1151 {
1152 if (_n) {
1153 INC_MEM_COUNT(PS_IRP_CONTEXT, IrpContext, sizeof(EXT2_IRP_CONTEXT));
1154 InterlockedIncrement(&(Ext2Global->PerfStat.Irps[IrpContext->MajorFunction].Current));
1155 } else {
1156 DEC_MEM_COUNT(PS_IRP_CONTEXT, IrpContext, sizeof(EXT2_IRP_CONTEXT));
1157 InterlockedIncrement(&Ext2Global->PerfStat.Irps[IrpContext->MajorFunction].Processed);
1158 InterlockedDecrement(&Ext2Global->PerfStat.Irps[IrpContext->MajorFunction].Current);
1159 }
1160 }
1161
1162 typedef struct _EXT2_FILLDIR_CONTEXT {
1163 PEXT2_IRP_CONTEXT efc_irp;
1164 PUCHAR efc_buf;
1165 ULONG efc_size;
1166 ULONG efc_start;
1167 ULONG efc_prev;
1168 NTSTATUS efc_status;
1169 FILE_INFORMATION_CLASS efc_fi;
1170 BOOLEAN efc_single;
1171 } EXT2_FILLDIR_CONTEXT, *PEXT2_FILLDIR_CONTEXT;
1172
1173 //
1174 // Access.c
1175 //
1176
1177
1178 int Ext2CheckInodeAccess(PEXT2_VCB Vcb, struct inode *in, int attempt);
1179 int Ext2CheckFileAccess (PEXT2_VCB Vcb, PEXT2_MCB Mcb, int attempt);
1180
1181 //
1182 // Block.c
1183 //
1184
1185 PMDL
1186 Ext2CreateMdl (
1187 IN PVOID Buffer,
1188 IN ULONG Length,
1189 IN LOCK_OPERATION Operation
1190 );
1191
1192 VOID
1193 Ext2DestroyMdl (IN PMDL Mdl);
1194
1195 NTSTATUS
1196 Ext2LockUserBuffer (
1197 IN PIRP Irp,
1198 IN ULONG Length,
1199 IN LOCK_OPERATION Operation);
1200 PVOID
1201 Ext2GetUserBuffer (IN PIRP Irp);
1202
1203
1204 NTSTATUS
1205 Ext2ReadWriteBlocks(
1206 IN PEXT2_IRP_CONTEXT IrpContext,
1207 IN PEXT2_VCB Vcb,
1208 IN PEXT2_EXTENT Extent,
1209 IN ULONG Length
1210 );
1211
1212 NTSTATUS
1213 Ext2ReadSync(
1214 IN PEXT2_VCB Vcb,
1215 IN ULONGLONG Offset,
1216 IN ULONG Length,
1217 OUT PVOID Buffer,
1218 IN BOOLEAN bVerify );
1219
1220 NTSTATUS
1221 Ext2ReadDisk(
1222 IN PEXT2_VCB Vcb,
1223 IN ULONGLONG Offset,
1224 IN ULONG Size,
1225 IN PVOID Buffer,
1226 IN BOOLEAN bVerify );
1227
1228 NTSTATUS
1229 Ext2DiskIoControl (
1230 IN PDEVICE_OBJECT DeviceOjbect,
1231 IN ULONG IoctlCode,
1232 IN PVOID InputBuffer,
1233 IN ULONG InputBufferSize,
1234 IN OUT PVOID OutputBuffer,
1235 IN OUT PULONG OutputBufferSize );
1236
1237 VOID
1238 Ext2MediaEjectControl (
1239 IN PEXT2_IRP_CONTEXT IrpContext,
1240 IN PEXT2_VCB Vcb,
1241 IN BOOLEAN bPrevent );
1242
1243 NTSTATUS
1244 Ext2DiskShutDown(PEXT2_VCB Vcb);
1245
1246
1247 //
1248 // Cleanup.c
1249 //
1250
1251 NTSTATUS
1252 Ext2Cleanup (IN PEXT2_IRP_CONTEXT IrpContext);
1253
1254 //
1255 // Close.c
1256 //
1257
1258 NTSTATUS
1259 Ext2Close (IN PEXT2_IRP_CONTEXT IrpContext);
1260
1261 VOID
1262 Ext2QueueCloseRequest (IN PEXT2_IRP_CONTEXT IrpContext);
1263
1264 VOID NTAPI
1265 Ext2DeQueueCloseRequest (IN PVOID Context);
1266
1267 //
1268 // Cmcb.c
1269 //
1270
1271 BOOLEAN NTAPI
1272 Ext2AcquireForLazyWrite (
1273 IN PVOID Context,
1274 IN BOOLEAN Wait );
1275 VOID NTAPI
1276 Ext2ReleaseFromLazyWrite (IN PVOID Context);
1277
1278 BOOLEAN NTAPI
1279 Ext2AcquireForReadAhead (
1280 IN PVOID Context,
1281 IN BOOLEAN Wait );
1282
1283 VOID NTAPI
1284 Ext2ReleaseFromReadAhead (IN PVOID Context);
1285
1286 BOOLEAN NTAPI
1287 Ext2NoOpAcquire (
1288 IN PVOID Fcb,
1289 IN BOOLEAN Wait );
1290
1291 VOID NTAPI
1292 Ext2NoOpRelease (IN PVOID Fcb);
1293
1294 //
1295 // Create.c
1296 //
1297
1298
1299 BOOLEAN
1300 Ext2IsNameValid(PUNICODE_STRING FileName);
1301
1302 NTSTATUS
1303 Ext2FollowLink (
1304 IN PEXT2_IRP_CONTEXT IrpContext,
1305 IN PEXT2_VCB Vcb,
1306 IN PEXT2_MCB Parent,
1307 IN PEXT2_MCB Mcb,
1308 IN ULONG Linkdep
1309 );
1310
1311 NTSTATUS
1312 Ext2ScanDir (
1313 IN PEXT2_IRP_CONTEXT IrpContext,
1314 IN PEXT2_VCB Vcb,
1315 IN PEXT2_MCB Parent,
1316 IN PUNICODE_STRING FileName,
1317 OUT PULONG Inode,
1318 struct dentry **dentry
1319 );
1320
1321 BOOLEAN
1322 Ext2IsSpecialSystemFile(
1323 IN PUNICODE_STRING FileName,
1324 IN BOOLEAN bDirectory
1325 );
1326
1327 #define EXT2_LOOKUP_FLAG_MASK (0xFF00000)
1328 #define EXT2_LOOKUP_NOT_FOLLOW (0x8000000)
1329
1330 NTSTATUS
1331 Ext2LookupFile (
1332 IN PEXT2_IRP_CONTEXT IrpContext,
1333 IN PEXT2_VCB Vcb,
1334 IN PUNICODE_STRING FullName,
1335 IN PEXT2_MCB Parent,
1336 OUT PEXT2_MCB * Ext2Mcb,
1337 IN ULONG Linkdep
1338 );
1339
1340 NTSTATUS
1341 Ext2CreateFile(
1342 IN PEXT2_IRP_CONTEXT IrpContext,
1343 IN PEXT2_VCB Vcb,
1344 OUT PBOOLEAN OpPostIrp
1345 );
1346
1347 NTSTATUS
1348 Ext2CreateVolume(
1349 IN PEXT2_IRP_CONTEXT IrpContext,
1350 IN PEXT2_VCB Vcb );
1351
1352 NTSTATUS
1353 Ext2Create (IN PEXT2_IRP_CONTEXT IrpContext);
1354
1355 NTSTATUS
1356 Ext2CreateInode(
1357 IN PEXT2_IRP_CONTEXT IrpContext,
1358 IN PEXT2_VCB Vcb,
1359 IN PEXT2_FCB pParentFcb,
1360 IN ULONG Type,
1361 IN ULONG FileAttr,
1362 IN PUNICODE_STRING FileName);
1363
1364
1365 NTSTATUS
1366 Ext2SupersedeOrOverWriteFile(
1367 IN PEXT2_IRP_CONTEXT IrpContext,
1368 IN PFILE_OBJECT FileObject,
1369 IN PEXT2_VCB Vcb,
1370 IN PEXT2_FCB Fcb,
1371 IN PLARGE_INTEGER AllocationSize,
1372 IN ULONG Disposition
1373 );
1374
1375 //
1376 // Debug.c
1377 //
1378
1379 /* debug levels */
1380 #define DL_NVR 0
1381 #define DL_VIT 0x00000001
1382 #define DL_ERR 0x00000002
1383 #define DL_DBG 0x00000004
1384 #define DL_INF 0x00000008
1385 #define DL_FUN 0x00000010
1386 #define DL_LOW 0x00000020
1387 #define DL_REN 0x00000040 /* renaming operation */
1388 #define DL_RES 0x00000080 /* entry reference managment */
1389 #define DL_BLK 0x00000100 /* data block allocation / free */
1390 #define DL_CP 0x00000200 /* code pages (create, querydir) */
1391 #define DL_EXT 0x00000400 /* mcb extents */
1392 #define DL_MAP 0x00000800 /* retrieval points */
1393 #define DL_JNL 0x00001000 /* dump journal operations */
1394 #define DL_HTI 0x00002000 /* htree index */
1395 #define DL_WRN 0x00004000 /* warning */
1396 #define DL_BH 0x00008000 /* buffer head */
1397 #define DL_PNP 0x00010000 /* pnp */
1398 #define DL_IO 0x00020000 /* file i/o */
1399
1400 #define DL_ALL (DL_ERR|DL_VIT|DL_DBG|DL_INF|DL_FUN|DL_LOW|DL_REN|DL_RES|DL_BLK|DL_CP|DL_EXT|DL_MAP|DL_JNL|DL_HTI|DL_WRN|DL_BH|DL_PNP|DL_IO)
1401
1402 #if EXT2_DEBUG && defined(__REACTOS__)
1403 #define DL_DEFAULT (DL_ERR|DL_VIT|DL_DBG|DL_INF|DL_FUN|DL_LOW|DL_WRN)
1404 #else
1405 #define DL_DEFAULT (DL_ERR|DL_VIT)
1406 #endif
1407
1408 #if EXT2_DEBUG
1409 extern ULONG DebugFilter;
1410
1411 VOID
1412 __cdecl
1413 Ext2NiPrintf(
1414 PCHAR DebugMessage,
1415 ...
1416 );
1417
1418 #define DEBUG(_DL, arg) do {if ((_DL) & DebugFilter) Ext2Printf arg;} while(0)
1419 #define DEBUGNI(_DL, arg) do {if ((_DL) & DebugFilter) Ext2NiPrintf arg;} while(0)
1420
1421 #define Ext2CompleteRequest(Irp, bPrint, PriorityBoost) \
1422 Ext2DbgPrintComplete(Irp, bPrint); \
1423 IoCompleteRequest(Irp, PriorityBoost)
1424
1425 #else
1426
1427 #define DEBUG(_DL, arg) do {if ((_DL) & DL_ERR) DbgPrint arg;} while(0)
1428
1429 #define Ext2CompleteRequest(Irp, bPrint, PriorityBoost) \
1430 IoCompleteRequest(Irp, PriorityBoost)
1431
1432 #endif // EXT2_DEBUG
1433
1434 VOID
1435 __cdecl
1436 Ext2Printf(
1437 PCHAR DebugMessage,
1438 ...
1439 );
1440
1441 extern ULONG ProcessNameOffset;
1442
1443 #define Ext2GetCurrentProcessName() ( \
1444 (PUCHAR) PsGetCurrentProcess() + ProcessNameOffset \
1445 )
1446
1447 ULONG
1448 Ext2GetProcessNameOffset (VOID);
1449
1450 VOID
1451 Ext2DbgPrintCall (
1452 IN PDEVICE_OBJECT DeviceObject,
1453 IN PIRP Irp );
1454
1455 VOID
1456 Ext2DbgPrintComplete (
1457 IN PIRP Irp,
1458 IN BOOLEAN bPrint
1459 );
1460
1461 PUCHAR
1462 Ext2NtStatusToString (IN NTSTATUS Status );
1463
1464 PVOID Ext2AllocatePool(
1465 IN POOL_TYPE PoolType,
1466 IN SIZE_T NumberOfBytes,
1467 IN ULONG Tag
1468 );
1469
1470 VOID
1471 Ext2FreePool(
1472 IN PVOID P,
1473 IN ULONG Tag
1474 );
1475
1476 //
1477 // Devctl.c
1478 //
1479
1480 NTSTATUS
1481 Ext2ProcessGlobalProperty(
1482 IN PDEVICE_OBJECT DeviceObject,
1483 IN PEXT2_VOLUME_PROPERTY3 Property,
1484 IN ULONG Length
1485 );
1486
1487 NTSTATUS
1488 Ext2ProcessVolumeProperty(
1489 IN PEXT2_VCB Vcb,
1490 IN PEXT2_VOLUME_PROPERTY3 Property,
1491 IN ULONG Length
1492 );
1493
1494 NTSTATUS
1495 Ext2ProcessUserProperty(
1496 IN PEXT2_IRP_CONTEXT IrpContext,
1497 IN PEXT2_VOLUME_PROPERTY3 Property,
1498 IN ULONG Length
1499 );
1500
1501 NTSTATUS
1502 Ex2ProcessUserPerfStat(
1503 IN PEXT2_IRP_CONTEXT IrpContext,
1504 IN PEXT2_QUERY_PERFSTAT QueryPerf,
1505 IN ULONG Length
1506 );
1507
1508 NTSTATUS
1509 Ex2ProcessMountPoint(
1510 IN PEXT2_IRP_CONTEXT IrpContext,
1511 IN PEXT2_MOUNT_POINT MountPoint,
1512 IN ULONG Length
1513 );
1514
1515 NTSTATUS
1516 Ext2DeviceControlNormal (IN PEXT2_IRP_CONTEXT IrpContext);
1517
1518 NTSTATUS
1519 Ext2PrepareToUnload (IN PEXT2_IRP_CONTEXT IrpContext);
1520
1521 NTSTATUS
1522 Ext2DeviceControl (IN PEXT2_IRP_CONTEXT IrpContext);
1523
1524 //
1525 // Dirctl.c
1526 //
1527
1528 ULONG
1529 Ext2GetInfoLength(IN FILE_INFORMATION_CLASS FileInformationClass);
1530
1531 NTSTATUS
1532 Ext2ProcessEntry(
1533 IN PEXT2_IRP_CONTEXT IrpContext,
1534 IN PEXT2_VCB Vcb,
1535 IN PEXT2_FCB Dcb,
1536 IN FILE_INFORMATION_CLASS FileInformationClass,
1537 IN ULONG in,
1538 IN PVOID Buffer,
1539 IN ULONG UsedLength,
1540 IN ULONG Length,
1541 IN ULONG FileIndex,
1542 IN PUNICODE_STRING pName,
1543 OUT PULONG EntrySize,
1544 IN BOOLEAN Single
1545 );
1546
1547 BOOLEAN
1548 Ext2IsWearingCloak(
1549 IN PEXT2_VCB Vcb,
1550 IN POEM_STRING OeName
1551 );
1552
1553 NTSTATUS Ext2QueryDirectory (IN PEXT2_IRP_CONTEXT IrpContext);
1554
1555 NTSTATUS
1556 Ext2NotifyChangeDirectory (
1557 IN PEXT2_IRP_CONTEXT IrpContext
1558 );
1559
1560 VOID
1561 Ext2NotifyReportChange (
1562 IN PEXT2_IRP_CONTEXT IrpContext,
1563 IN PEXT2_VCB Vcb,
1564 IN PEXT2_MCB Mcb,
1565 IN ULONG Filter,
1566 IN ULONG Action
1567 );
1568
1569 NTSTATUS
1570 Ext2DirectoryControl (IN PEXT2_IRP_CONTEXT IrpContext);
1571
1572 BOOLEAN
1573 Ext2IsDirectoryEmpty (
1574 IN PEXT2_IRP_CONTEXT IrpContext,
1575 IN PEXT2_VCB Vcb,
1576 IN PEXT2_MCB Mcb
1577 );
1578
1579 //
1580 // Dispatch.c
1581 //
1582
1583 VOID NTAPI
1584 Ext2OplockComplete (
1585 IN PVOID Context,
1586 IN PIRP Irp
1587 );
1588
1589 VOID NTAPI
1590 Ext2LockIrp (
1591 IN PVOID Context,
1592 IN PIRP Irp
1593 );
1594
1595 NTSTATUS
1596 Ext2QueueRequest (IN PEXT2_IRP_CONTEXT IrpContext);
1597
1598 VOID NTAPI
1599 Ext2DeQueueRequest (IN PVOID Context);
1600
1601 NTSTATUS
1602 Ext2DispatchRequest (IN PEXT2_IRP_CONTEXT IrpContext);
1603
1604 NTSTATUS NTAPI
1605 Ext2BuildRequest (
1606 IN PDEVICE_OBJECT DeviceObject,
1607 IN PIRP Irp
1608 );
1609
1610 //
1611 // Except.c
1612 //
1613
1614 NTSTATUS
1615 Ext2ExceptionFilter (
1616 IN PEXT2_IRP_CONTEXT IrpContext,
1617 IN PEXCEPTION_POINTERS ExceptionPointer
1618 );
1619
1620 NTSTATUS
1621 Ext2ExceptionHandler (IN PEXT2_IRP_CONTEXT IrpContext);
1622
1623
1624 //
1625 // Extents.c
1626 //
1627
1628
1629 NTSTATUS
1630 Ext2MapExtent(
1631 IN PEXT2_IRP_CONTEXT IrpContext,
1632 IN PEXT2_VCB Vcb,
1633 IN PEXT2_MCB Mcb,
1634 IN ULONG Index,
1635 IN BOOLEAN Alloc,
1636 OUT PULONG Block,
1637 OUT PULONG Number
1638 );
1639
1640 NTSTATUS
1641 Ext2ExpandExtent(
1642 PEXT2_IRP_CONTEXT IrpContext,
1643 PEXT2_VCB Vcb,
1644 PEXT2_MCB Mcb,
1645 ULONG Start,
1646 ULONG End,
1647 PLARGE_INTEGER Size
1648 );
1649
1650 NTSTATUS
1651 Ext2TruncateExtent(
1652 PEXT2_IRP_CONTEXT IrpContext,
1653 PEXT2_VCB Vcb,
1654 PEXT2_MCB Mcb,
1655 PLARGE_INTEGER Size
1656 );
1657
1658
1659 //
1660 // generic.c
1661 //
1662
1663 static inline ext3_fsblk_t ext3_blocks_count(struct ext3_super_block *es)
1664 {
1665 return ((ext3_fsblk_t)le32_to_cpu(es->s_blocks_count_hi) << 32) |
1666 le32_to_cpu(es->s_blocks_count);
1667 }
1668
1669 static inline ext3_fsblk_t ext3_r_blocks_count(struct ext3_super_block *es)
1670 {
1671 return ((ext3_fsblk_t)le32_to_cpu(es->s_r_blocks_count_hi) << 32) |
1672 le32_to_cpu(es->s_r_blocks_count);
1673 }
1674
1675 static inline ext3_fsblk_t ext3_free_blocks_count(struct ext3_super_block *es)
1676 {
1677 return ((ext3_fsblk_t)le32_to_cpu(es->s_free_blocks_count_hi) << 32) |
1678 le32_to_cpu(es->s_free_blocks_count);
1679 }
1680
1681 static inline void ext3_blocks_count_set(struct ext3_super_block *es,
1682 ext3_fsblk_t blk)
1683 {
1684 es->s_blocks_count = cpu_to_le32((u32)blk);
1685 es->s_blocks_count_hi = cpu_to_le32(blk >> 32);
1686 }
1687
1688 static inline void ext3_free_blocks_count_set(struct ext3_super_block *es,
1689 ext3_fsblk_t blk)
1690 {
1691 es->s_free_blocks_count = cpu_to_le32((u32)blk);
1692 es->s_free_blocks_count_hi = cpu_to_le32(blk >> 32);
1693 }
1694
1695 static inline void ext3_r_blocks_count_set(struct ext3_super_block *es,
1696 ext3_fsblk_t blk)
1697 {
1698 es->s_r_blocks_count = cpu_to_le32((u32)blk);
1699 es->s_r_blocks_count_hi = cpu_to_le32(blk >> 32);
1700 }
1701
1702 blkcnt_t ext3_inode_blocks(struct ext3_inode *raw_inode,
1703 struct inode *inode);
1704
1705 int ext3_inode_blocks_set(struct ext3_inode *raw_inode,
1706 struct inode * inode);
1707 ext4_fsblk_t ext4_block_bitmap(struct super_block *sb,
1708 struct ext4_group_desc *bg);
1709
1710 ext4_fsblk_t ext4_inode_bitmap(struct super_block *sb,
1711 struct ext4_group_desc *bg);
1712 ext4_fsblk_t ext4_inode_table(struct super_block *sb,
1713 struct ext4_group_desc *bg);
1714 __u32 ext4_free_blks_count(struct super_block *sb,
1715 struct ext4_group_desc *bg);
1716 __u32 ext4_free_inodes_count(struct super_block *sb,
1717 struct ext4_group_desc *bg);
1718 __u32 ext4_used_dirs_count(struct super_block *sb,
1719 struct ext4_group_desc *bg);
1720 __u32 ext4_itable_unused_count(struct super_block *sb,
1721 struct ext4_group_desc *bg);
1722 void ext4_block_bitmap_set(struct super_block *sb,
1723 struct ext4_group_desc *bg, ext4_fsblk_t blk);
1724 void ext4_inode_bitmap_set(struct super_block *sb,
1725 struct ext4_group_desc *bg, ext4_fsblk_t blk);
1726 void ext4_inode_table_set(struct super_block *sb,
1727 struct ext4_group_desc *bg, ext4_fsblk_t blk);
1728 void ext4_free_blks_set(struct super_block *sb,
1729 struct ext4_group_desc *bg, __u32 count);
1730 void ext4_free_inodes_set(struct super_block *sb,
1731 struct ext4_group_desc *bg, __u32 count);
1732 void ext4_used_dirs_set(struct super_block *sb,
1733 struct ext4_group_desc *bg, __u32 count);
1734 void ext4_itable_unused_set(struct super_block *sb,
1735 struct ext4_group_desc *bg, __u32 count);
1736
1737 int ext3_bg_has_super(struct super_block *sb, ext3_group_t group);
1738 unsigned long ext4_bg_num_gdb(struct super_block *sb, ext4_group_t group);
1739 unsigned ext4_init_inode_bitmap(struct super_block *sb, struct buffer_head *bh,
1740 ext4_group_t block_group,
1741 struct ext4_group_desc *gdp);
1742 unsigned ext4_init_block_bitmap(struct super_block *sb, struct buffer_head *bh,
1743 ext4_group_t block_group, struct ext4_group_desc *gdp);
1744 struct ext4_group_desc * ext4_get_group_desc(struct super_block *sb,
1745 ext4_group_t block_group, struct buffer_head **bh);
1746 ext4_fsblk_t ext4_count_free_blocks(struct super_block *sb);
1747 unsigned long ext4_count_free_inodes(struct super_block *sb);
1748 int ext4_check_descriptors(struct super_block *sb);
1749
1750 NTSTATUS
1751 Ext2LoadSuper(
1752 IN PEXT2_VCB Vcb,
1753 IN BOOLEAN bVerify,
1754 OUT PEXT2_SUPER_BLOCK * Sb
1755 );
1756
1757
1758 BOOLEAN
1759 Ext2SaveSuper(
1760 IN PEXT2_IRP_CONTEXT IrpContext,
1761 IN PEXT2_VCB Vcb
1762 );
1763
1764 BOOLEAN
1765 Ext2RefreshSuper(
1766 IN PEXT2_IRP_CONTEXT IrpContext,
1767 IN PEXT2_VCB Vcb
1768 );
1769
1770 BOOLEAN
1771 Ext2LoadGroup(IN PEXT2_VCB Vcb);
1772
1773 VOID
1774 Ext2PutGroup(IN PEXT2_VCB Vcb);
1775
1776 VOID
1777 Ext2DropGroup(IN PEXT2_VCB Vcb);
1778
1779 BOOLEAN
1780 Ext2SaveGroup(
1781 IN PEXT2_IRP_CONTEXT IrpContext,
1782 IN PEXT2_VCB Vcb,
1783 IN ULONG Group
1784 );
1785
1786 BOOLEAN
1787 Ext2RefreshGroup(
1788 IN PEXT2_IRP_CONTEXT IrpContext,
1789 IN PEXT2_VCB Vcb
1790 );
1791
1792 BOOLEAN
1793 Ext2GetInodeLba (
1794 IN PEXT2_VCB Vcb,
1795 IN ULONG inode,
1796 OUT PLONGLONG offset
1797 );
1798
1799 BOOLEAN
1800 Ext2LoadInode (
1801 IN PEXT2_VCB Vcb,
1802 IN struct inode *Inode
1803 );
1804
1805 BOOLEAN
1806 Ext2ClearInode (
1807 IN PEXT2_IRP_CONTEXT IrpContext,
1808 IN PEXT2_VCB Vcb,
1809 IN ULONG inode
1810 );
1811
1812 BOOLEAN
1813 Ext2SaveInode (
1814 IN PEXT2_IRP_CONTEXT IrpContext,
1815 IN PEXT2_VCB Vcb,
1816 IN struct inode *Inode
1817 );
1818
1819 BOOLEAN
1820 Ext2LoadBlock (
1821 IN PEXT2_VCB Vcb,
1822 IN ULONG dwBlk,
1823 IN PVOID Buffer
1824 );
1825
1826 BOOLEAN
1827 Ext2SaveBlock (
1828 IN PEXT2_IRP_CONTEXT IrpContext,
1829 IN PEXT2_VCB Vcb,
1830 IN ULONG dwBlk,
1831 IN PVOID Buf
1832 );
1833
1834 BOOLEAN
1835 Ext2ZeroBuffer(
1836 IN PEXT2_IRP_CONTEXT IrpContext,
1837 IN PEXT2_VCB Vcb,
1838 IN LONGLONG Offset,
1839 IN ULONG Size
1840 );
1841
1842 BOOLEAN
1843 Ext2SaveBuffer(
1844 IN PEXT2_IRP_CONTEXT IrpContext,
1845 IN PEXT2_VCB Vcb,
1846 IN LONGLONG Offset,
1847 IN ULONG Size,
1848 IN PVOID Buf
1849 );
1850
1851 NTSTATUS
1852 Ext2GetBlock(
1853 IN PEXT2_IRP_CONTEXT IrpContext,
1854 IN PEXT2_VCB Vcb,
1855 IN PEXT2_MCB Mcb,
1856 IN ULONG Base,
1857 IN ULONG Layer,
1858 IN ULONG Start,
1859 IN ULONG SizeArray,
1860 IN PULONG BlockArray,
1861 IN BOOLEAN bAlloc,
1862 IN OUT PULONG Hint,
1863 OUT PULONG Block,
1864 OUT PULONG Number
1865 );
1866
1867 NTSTATUS
1868 Ext2BlockMap(
1869 IN PEXT2_IRP_CONTEXT IrpContext,
1870 IN PEXT2_VCB Vcb,
1871 IN PEXT2_MCB Mcb,
1872 IN ULONG Index,
1873 IN BOOLEAN bAlloc,
1874 OUT PULONG pBlock,
1875 OUT PULONG Number
1876 );
1877
1878 VOID
1879 Ext2UpdateVcbStat(
1880 IN PEXT2_IRP_CONTEXT IrpContext,
1881 IN PEXT2_VCB Vcb
1882 );
1883
1884 NTSTATUS
1885 Ext2NewBlock(
1886 IN PEXT2_IRP_CONTEXT IrpContext,
1887 IN PEXT2_VCB Vcb,
1888 IN ULONG GroupHint,
1889 IN ULONG BlockHint,
1890 OUT PULONG Block,
1891 IN OUT PULONG Number
1892 );
1893
1894 NTSTATUS
1895 Ext2FreeBlock(
1896 IN PEXT2_IRP_CONTEXT IrpContext,
1897 IN PEXT2_VCB Vcb,
1898 IN ULONG Block,
1899 IN ULONG Number
1900 );
1901
1902
1903 NTSTATUS
1904 Ext2NewInode(
1905 IN PEXT2_IRP_CONTEXT IrpContext,
1906 IN PEXT2_VCB Vcb,
1907 IN ULONG GroupHint,
1908 IN ULONG Type,
1909 OUT PULONG Inode
1910 );
1911
1912 NTSTATUS
1913 Ext2UpdateGroupDirStat(
1914 IN PEXT2_IRP_CONTEXT IrpContext,
1915 IN PEXT2_VCB Vcb,
1916 IN ULONG Group
1917 );
1918
1919 NTSTATUS
1920 Ext2FreeInode(
1921 IN PEXT2_IRP_CONTEXT IrpContext,
1922 IN PEXT2_VCB Vcb,
1923 IN ULONG Inode,
1924 IN ULONG Type
1925 );
1926
1927 NTSTATUS
1928 Ext2AddEntry (
1929 IN PEXT2_IRP_CONTEXT IrpContext,
1930 IN PEXT2_VCB Vcb,
1931 IN PEXT2_FCB Dcb,
1932 IN struct inode *Inode,
1933 IN PUNICODE_STRING FileName,
1934 OUT struct dentry **dentry
1935 );
1936
1937 NTSTATUS
1938 Ext2SetFileType (
1939 IN PEXT2_IRP_CONTEXT IrpContext,
1940 IN PEXT2_VCB Vcb,
1941 IN PEXT2_FCB Dcb,
1942 IN PEXT2_MCB Mcb,
1943 IN umode_t mode
1944 );
1945
1946 NTSTATUS
1947 Ext2RemoveEntry (
1948 IN PEXT2_IRP_CONTEXT IrpContext,
1949 IN PEXT2_VCB Vcb,
1950 IN PEXT2_FCB Dcb,
1951 IN PEXT2_MCB Mcb
1952 );
1953
1954 NTSTATUS
1955 Ext2SetParentEntry (
1956 IN PEXT2_IRP_CONTEXT IrpContext,
1957 IN PEXT2_VCB Vcb,
1958 IN PEXT2_FCB Dcb,
1959 IN ULONG OldParent,
1960 IN ULONG NewParent );
1961
1962
1963 NTSTATUS
1964 Ext2TruncateBlock(
1965 IN PEXT2_IRP_CONTEXT IrpContext,
1966 IN PEXT2_VCB Vcb,
1967 IN PEXT2_MCB Mcb,
1968 IN ULONG Base,
1969 IN ULONG Start,
1970 IN ULONG Layer,
1971 IN ULONG SizeArray,
1972 IN PULONG BlockArray,
1973 IN PULONG Extra
1974 );
1975
1976 struct ext3_dir_entry_2 *ext3_next_entry(struct ext3_dir_entry_2 *p);
1977
1978 int ext3_check_dir_entry (const char * function, struct inode * dir,
1979 struct ext3_dir_entry_2 * de,
1980 struct buffer_head * bh,
1981 unsigned long offset);
1982
1983 loff_t ext3_max_size(int blkbits, int has_huge_files);
1984 loff_t ext3_max_bitmap_size(int bits, int has_huge_files);
1985
1986
1987 __le16 ext4_group_desc_csum(struct ext3_sb_info *sbi, __u32 block_group,
1988 struct ext4_group_desc *gdp);
1989 int ext4_group_desc_csum_verify(struct ext3_sb_info *sbi, __u32 block_group,
1990 struct ext4_group_desc *gdp);
1991
1992 ext3_fsblk_t descriptor_loc(struct super_block *sb,
1993 ext3_fsblk_t logical_sb_block, unsigned int nr);
1994 struct ext4_group_desc * ext4_get_group_desc(struct super_block *sb,
1995 ext4_group_t block_group, struct buffer_head **bh);
1996 int ext4_check_descriptors(struct super_block *sb);
1997
1998 //
1999 // Fastio.c
2000 //
2001
2002 FAST_IO_POSSIBLE
2003 Ext2IsFastIoPossible(
2004 IN PEXT2_FCB Fcb
2005 );
2006
2007 BOOLEAN NTAPI
2008 Ext2FastIoCheckIfPossible (
2009 IN PFILE_OBJECT FileObject,
2010 IN PLARGE_INTEGER FileOffset,
2011 IN ULONG Length,
2012 IN BOOLEAN Wait,
2013 IN ULONG LockKey,
2014 IN BOOLEAN CheckForReadOperation,
2015 OUT PIO_STATUS_BLOCK IoStatus,
2016 IN PDEVICE_OBJECT DeviceObject
2017 );
2018
2019
2020 BOOLEAN NTAPI
2021 Ext2FastIoRead (IN PFILE_OBJECT FileObject,
2022 IN PLARGE_INTEGER FileOffset,
2023 IN ULONG Length,
2024 IN BOOLEAN Wait,
2025 IN ULONG LockKey,
2026 OUT PVOID Buffer,
2027 OUT PIO_STATUS_BLOCK IoStatus,
2028 IN PDEVICE_OBJECT DeviceObject);
2029
2030 BOOLEAN NTAPI
2031 Ext2FastIoWrite (
2032 IN PFILE_OBJECT FileObject,
2033 IN PLARGE_INTEGER FileOffset,
2034 IN ULONG Length,
2035 IN BOOLEAN Wait,
2036 IN ULONG LockKey,
2037 OUT PVOID Buffer,
2038 OUT PIO_STATUS_BLOCK IoStatus,
2039 IN PDEVICE_OBJECT DeviceObject);
2040
2041 BOOLEAN NTAPI
2042 Ext2FastIoQueryBasicInfo (
2043 IN PFILE_OBJECT FileObject,
2044 IN BOOLEAN Wait,
2045 OUT PFILE_BASIC_INFORMATION Buffer,
2046 OUT PIO_STATUS_BLOCK IoStatus,
2047 IN PDEVICE_OBJECT DeviceObject);
2048
2049 BOOLEAN NTAPI
2050 Ext2FastIoQueryStandardInfo (
2051 IN PFILE_OBJECT FileObject,
2052 IN BOOLEAN Wait,
2053 OUT PFILE_STANDARD_INFORMATION Buffer,
2054 OUT PIO_STATUS_BLOCK IoStatus,
2055 IN PDEVICE_OBJECT DeviceObject);
2056
2057 BOOLEAN NTAPI
2058 Ext2FastIoLock (
2059 IN PFILE_OBJECT FileObject,
2060 IN PLARGE_INTEGER FileOffset,
2061 IN PLARGE_INTEGER Length,
2062 IN PEPROCESS Process,
2063 IN ULONG Key,
2064 IN BOOLEAN FailImmediately,
2065 IN BOOLEAN ExclusiveLock,
2066 OUT PIO_STATUS_BLOCK IoStatus,
2067 IN PDEVICE_OBJECT DeviceObject
2068 );
2069
2070 BOOLEAN NTAPI
2071 Ext2FastIoUnlockSingle (
2072 IN PFILE_OBJECT FileObject,
2073 IN PLARGE_INTEGER FileOffset,
2074 IN PLARGE_INTEGER Length,
2075 IN PEPROCESS Process,
2076 IN ULONG Key,
2077 OUT PIO_STATUS_BLOCK IoStatus,
2078 IN PDEVICE_OBJECT DeviceObject
2079 );
2080
2081 BOOLEAN NTAPI
2082 Ext2FastIoUnlockAll (
2083 IN PFILE_OBJECT FileObject,
2084 IN PEPROCESS Process,
2085 OUT PIO_STATUS_BLOCK IoStatus,
2086 IN PDEVICE_OBJECT DeviceObject
2087 );
2088
2089 BOOLEAN NTAPI
2090 Ext2FastIoUnlockAllByKey (
2091 IN PFILE_OBJECT FileObject,
2092 #ifdef __REACTOS__
2093 IN PVOID Process,
2094 #else
2095 IN PEPROCESS Process,
2096 #endif
2097 IN ULONG Key,
2098 OUT PIO_STATUS_BLOCK IoStatus,
2099 IN PDEVICE_OBJECT DeviceObject
2100 );
2101
2102
2103 BOOLEAN NTAPI
2104 Ext2FastIoQueryNetworkOpenInfo (
2105 IN PFILE_OBJECT FileObject,
2106 IN BOOLEAN Wait,
2107 OUT PFILE_NETWORK_OPEN_INFORMATION Buffer,
2108 OUT PIO_STATUS_BLOCK IoStatus,
2109 IN PDEVICE_OBJECT DeviceObject );
2110
2111 BOOLEAN NTAPI
2112 Ext2FastIoQueryNetworkOpenInfo (
2113 IN PFILE_OBJECT FileObject,
2114 IN BOOLEAN Wait,
2115 OUT PFILE_NETWORK_OPEN_INFORMATION Buffer,
2116 OUT PIO_STATUS_BLOCK IoStatus,
2117 IN PDEVICE_OBJECT DeviceObject);
2118
2119 VOID
2120 NTAPI
2121 Ext2AcquireForCreateSection (
2122 IN PFILE_OBJECT FileObject
2123 );
2124
2125 VOID
2126 NTAPI
2127 Ext2ReleaseForCreateSection (
2128 IN PFILE_OBJECT FileObject
2129 );
2130
2131 NTSTATUS
2132 NTAPI
2133 Ext2AcquireFileForModWrite (
2134 IN PFILE_OBJECT FileObject,
2135 IN PLARGE_INTEGER EndingOffset,
2136 OUT PERESOURCE *ResourceToRelease,
2137 IN PDEVICE_OBJECT DeviceObject
2138 );
2139
2140 NTSTATUS
2141 NTAPI
2142 Ext2ReleaseFileForModWrite (
2143 IN PFILE_OBJECT FileObject,
2144 IN PERESOURCE ResourceToRelease,
2145 IN PDEVICE_OBJECT DeviceObject
2146 );
2147
2148 NTSTATUS
2149 NTAPI
2150 Ext2AcquireFileForCcFlush (
2151 IN PFILE_OBJECT FileObject,
2152 IN PDEVICE_OBJECT DeviceObject
2153 );
2154
2155 NTSTATUS
2156 NTAPI
2157 Ext2ReleaseFileForCcFlush (
2158 IN PFILE_OBJECT FileObject,
2159 IN PDEVICE_OBJECT DeviceObject
2160 );
2161
2162
2163 NTSTATUS
2164 NTAPI
2165 Ext2PreAcquireForCreateSection(
2166 IN PFS_FILTER_CALLBACK_DATA cd,
2167 OUT PVOID *cc
2168 );
2169
2170 //
2171 // FileInfo.c
2172 //
2173
2174
2175 NTSTATUS
2176 Ext2QueryFileInformation (IN PEXT2_IRP_CONTEXT IrpContext);
2177
2178 NTSTATUS
2179 Ext2SetFileInformation (IN PEXT2_IRP_CONTEXT IrpContext);
2180
2181 ULONG
2182 Ext2TotalBlocks(
2183 PEXT2_VCB Vcb,
2184 PLARGE_INTEGER Size,
2185 PULONG pMeta
2186 );
2187
2188 NTSTATUS
2189 Ext2ExpandFile(
2190 PEXT2_IRP_CONTEXT IrpContext,
2191 PEXT2_VCB Vcb,
2192 PEXT2_MCB Mcb,
2193 PLARGE_INTEGER Size
2194 );
2195
2196 NTSTATUS
2197 Ext2TruncateFile (
2198 PEXT2_IRP_CONTEXT IrpContext,
2199 PEXT2_VCB Vcb,
2200 PEXT2_MCB Mcb,
2201 PLARGE_INTEGER AllocationSize );
2202
2203 NTSTATUS
2204 Ext2IsFileRemovable(
2205 IN PEXT2_IRP_CONTEXT IrpContext,
2206 IN PEXT2_VCB Vcb,
2207 IN PEXT2_FCB Fcb,
2208 IN PEXT2_CCB Ccb
2209 );
2210
2211 NTSTATUS
2212 Ext2SetDispositionInfo(
2213 PEXT2_IRP_CONTEXT IrpContext,
2214 PEXT2_VCB Vcb,
2215 PEXT2_FCB Fcb,
2216 PEXT2_CCB Ccb,
2217 BOOLEAN bDelete
2218 );
2219
2220 NTSTATUS
2221 Ext2SetRenameInfo(
2222 PEXT2_IRP_CONTEXT IrpContext,
2223 PEXT2_VCB Vcb,
2224 PEXT2_FCB Fcb,
2225 PEXT2_CCB Ccb
2226 );
2227
2228 NTSTATUS
2229 Ext2SetLinkInfo(
2230 PEXT2_IRP_CONTEXT IrpContext,
2231 PEXT2_VCB Vcb,
2232 PEXT2_FCB Fcb,
2233 PEXT2_CCB Ccb
2234 );
2235
2236 ULONG
2237 Ext2InodeType(PEXT2_MCB Mcb);
2238
2239 NTSTATUS
2240 Ext2DeleteFile(
2241 PEXT2_IRP_CONTEXT IrpContext,
2242 PEXT2_VCB Vcb,
2243 PEXT2_FCB Fcb,
2244 PEXT2_MCB Mcb
2245 );
2246
2247
2248 //
2249 // Flush.c
2250 //
2251
2252 NTSTATUS
2253 Ext2FlushFiles(
2254 IN PEXT2_IRP_CONTEXT IrpContext,
2255 IN PEXT2_VCB Vcb,
2256 IN BOOLEAN bShutDown
2257 );
2258
2259 NTSTATUS
2260 Ext2FlushVolume (
2261 IN PEXT2_IRP_CONTEXT IrpContext,
2262 IN PEXT2_VCB Vcb,
2263 IN BOOLEAN bShutDown
2264 );
2265
2266 NTSTATUS
2267 Ext2FlushFile (
2268 IN PEXT2_IRP_CONTEXT IrpContext,
2269 IN PEXT2_FCB Fcb,
2270 IN PEXT2_CCB Ccb
2271 );
2272
2273 NTSTATUS
2274 Ext2Flush (IN PEXT2_IRP_CONTEXT IrpContext);
2275
2276
2277 //
2278 // Fsctl.c
2279 //
2280
2281 NTSTATUS
2282 Ext2ReadSymlink (
2283 IN PEXT2_IRP_CONTEXT IrpContext,
2284 IN PEXT2_VCB Vcb,
2285 IN PEXT2_MCB Mcb,
2286 IN PVOID Buffer,
2287 IN ULONG Size,
2288 OUT PULONG BytesRead
2289 );
2290
2291 NTSTATUS
2292 Ext2WriteSymlink (
2293 IN PEXT2_IRP_CONTEXT IrpContext,
2294 IN PEXT2_VCB Vcb,
2295 IN PEXT2_MCB Mcb,
2296 IN PVOID Buffer,
2297 IN ULONG Size,
2298 OUT PULONG BytesWritten
2299 );
2300
2301 NTSTATUS
2302 Ext2TruncateSymlink(
2303 PEXT2_IRP_CONTEXT IrpContext,
2304 PEXT2_VCB Vcb,
2305 PEXT2_MCB Mcb,
2306 ULONG Size
2307 );
2308
2309 //
2310 // MountPoint process workitem
2311 //
2312
2313 VOID
2314 Ext2SetVpbFlag (IN PVPB Vpb,
2315 IN USHORT Flag );
2316
2317 VOID
2318 Ext2ClearVpbFlag (IN PVPB Vpb,
2319 IN USHORT Flag );
2320
2321 BOOLEAN
2322 Ext2CheckDismount (
2323 IN PEXT2_IRP_CONTEXT IrpContext,
2324 IN PEXT2_VCB Vcb,
2325 IN BOOLEAN bForce );
2326
2327 NTSTATUS
2328 Ext2PurgeVolume (IN PEXT2_VCB Vcb,
2329 IN BOOLEAN FlushBeforePurge);
2330
2331 NTSTATUS
2332 Ext2PurgeFile (IN PEXT2_FCB Fcb,
2333 IN BOOLEAN FlushBeforePurge);
2334
2335 BOOLEAN
2336 Ext2IsHandleCountZero(IN PEXT2_VCB Vcb);
2337
2338 NTSTATUS
2339 Ext2LockVcb (IN PEXT2_VCB Vcb,
2340 IN PFILE_OBJECT FileObject);
2341
2342 NTSTATUS
2343 Ext2LockVolume (IN PEXT2_IRP_CONTEXT IrpContext);
2344
2345 NTSTATUS
2346 Ext2UnlockVcb (IN PEXT2_VCB Vcb,
2347 IN PFILE_OBJECT FileObject);
2348
2349 NTSTATUS
2350 Ext2UnlockVolume (IN PEXT2_IRP_CONTEXT IrpContext);
2351
2352 NTSTATUS
2353 Ext2AllowExtendedDasdIo(IN PEXT2_IRP_CONTEXT IrpContext);
2354
2355 NTSTATUS
2356 Ext2OplockRequest (IN PEXT2_IRP_CONTEXT IrpContext);
2357
2358 NTSTATUS
2359 Ext2QueryExtentMappings(
2360 IN PEXT2_IRP_CONTEXT IrpContext,
2361 IN PEXT2_VCB Vcb,
2362 IN PEXT2_FCB Fcb,
2363 IN PLARGE_INTEGER RequestVbn,
2364 OUT PLARGE_INTEGER * pMappedRuns
2365 );
2366
2367 NTSTATUS
2368 Ext2QueryRetrievalPointers(IN PEXT2_IRP_CONTEXT IrpContext);
2369
2370 NTSTATUS
2371 Ext2GetRetrievalPointers(IN PEXT2_IRP_CONTEXT IrpContext);
2372
2373 NTSTATUS
2374 Ext2GetRetrievalPointerBase(IN PEXT2_IRP_CONTEXT IrpContext);
2375
2376 NTSTATUS
2377 Ext2UserFsRequest (IN PEXT2_IRP_CONTEXT IrpContext);
2378
2379 BOOLEAN
2380 Ext2IsMediaWriteProtected (
2381 IN PEXT2_IRP_CONTEXT IrpContext,
2382 IN PDEVICE_OBJECT TargetDevice
2383 );
2384
2385 NTSTATUS
2386 Ext2MountVolume (IN PEXT2_IRP_CONTEXT IrpContext);
2387
2388 VOID
2389 Ext2VerifyVcb (IN PEXT2_IRP_CONTEXT IrpContext,
2390 IN PEXT2_VCB Vcb );
2391 NTSTATUS
2392 Ext2VerifyVolume (IN PEXT2_IRP_CONTEXT IrpContext);
2393
2394 NTSTATUS
2395 Ext2IsVolumeMounted (IN PEXT2_IRP_CONTEXT IrpContext);
2396
2397 NTSTATUS
2398 Ext2DismountVolume (IN PEXT2_IRP_CONTEXT IrpContext);
2399
2400 NTSTATUS
2401 Ext2FileSystemControl (IN PEXT2_IRP_CONTEXT IrpContext);
2402
2403 //
2404 // HTree.c
2405 //
2406
2407 struct buffer_head *ext3_append(struct ext2_icb *icb, struct inode *inode,
2408 ext3_lblk_t *block, int *err);
2409
2410 void ext3_set_de_type(struct super_block *sb,
2411 struct ext3_dir_entry_2 *de,
2412 umode_t mode);
2413
2414 __u32 ext3_current_time(struct inode *in);
2415 void ext3_warning (struct super_block * sb, const char * function,
2416 char * fmt, ...);
2417 #define ext3_error ext3_warning
2418 #define ext4_error ext3_error
2419
2420 void ext3_update_dx_flag(struct inode *inode);
2421 int ext3_mark_inode_dirty(struct ext2_icb *icb, struct inode *in);
2422
2423 void ext3_inc_count(struct inode *inode);
2424 void ext3_dec_count(struct inode *inode);
2425
2426 struct buffer_head *
2427 ext3_find_entry (struct ext2_icb *icb, struct dentry *dentry,
2428 struct ext3_dir_entry_2 ** res_dir);
2429 struct buffer_head *
2430 ext3_dx_find_entry(struct ext2_icb *, struct dentry *dentry,
2431 struct ext3_dir_entry_2 **res_dir, int *err);
2432
2433 typedef int (*filldir_t)(void *, const char *, int, unsigned long, __u32, unsigned);
2434 int ext3_dx_readdir(struct file *filp, filldir_t filldir, void * context);
2435
2436 struct buffer_head *ext3_bread(struct ext2_icb *icb, struct inode *inode,
2437 unsigned long block, int *err);
2438 int add_dirent_to_buf(struct ext2_icb *icb, struct dentry *dentry,
2439 struct inode *inode, struct ext3_dir_entry_2 *de,
2440 struct buffer_head *bh);
2441
2442 #if !defined(__REACTOS__) || defined(_MSC_VER)
2443 struct ext3_dir_entry_2 *
2444 do_split(struct ext2_icb *icb, struct inode *dir,
2445 struct buffer_head **bh,struct dx_frame *frame,
2446 struct dx_hash_info *hinfo, int *error);
2447 #endif
2448
2449 int ext3_add_entry(struct ext2_icb *icb, struct dentry *dentry, struct inode *inode);
2450
2451 int ext3_delete_entry(struct ext2_icb *icb, struct inode *dir,
2452 struct ext3_dir_entry_2 *de_del,
2453 struct buffer_head *bh);
2454
2455 int ext3_is_dir_empty(struct ext2_icb *icb, struct inode *inode);
2456
2457 //
2458 // Init.c
2459 //
2460
2461 NTSTATUS
2462 Ext2QueryGlobalParameters(IN PUNICODE_STRING RegistryPath);
2463 BOOLEAN
2464 Ext2QueryRegistrySettings(IN PUNICODE_STRING RegistryPath);
2465
2466 VOID NTAPI
2467 DriverUnload (IN PDRIVER_OBJECT DriverObject);
2468
2469 //
2470 // Indirect.c
2471 //
2472
2473 NTSTATUS
2474 Ext2MapIndirect(
2475 IN PEXT2_IRP_CONTEXT IrpContext,
2476 IN PEXT2_VCB Vcb,
2477 IN PEXT2_MCB Mcb,
2478 IN ULONG Index,
2479 IN BOOLEAN bAlloc,
2480 OUT PULONG pBlock,
2481 OUT PULONG Number
2482 );
2483
2484 NTSTATUS
2485 Ext2ExpandIndirect(
2486 PEXT2_IRP_CONTEXT IrpContext,
2487 PEXT2_VCB Vcb,
2488 PEXT2_MCB Mcb,
2489 ULONG Start,
2490 ULONG End,
2491 PLARGE_INTEGER Size
2492 );
2493
2494 NTSTATUS
2495 Ext2TruncateIndirect(
2496 PEXT2_IRP_CONTEXT IrpContext,
2497 PEXT2_VCB Vcb,
2498 PEXT2_MCB Mcb,
2499 PLARGE_INTEGER Size
2500 );
2501
2502
2503 //
2504 // linux.c: linux lib implemenation
2505 //
2506
2507 int
2508 ext2_init_linux();
2509
2510 void
2511 ext2_destroy_linux();
2512
2513
2514 //
2515 // Lock.c
2516 //
2517
2518 NTSTATUS
2519 Ext2LockControl (IN PEXT2_IRP_CONTEXT IrpContext);
2520
2521
2522 //
2523 // Memory.c
2524 //
2525
2526 VOID
2527 NTAPI
2528 Ext2McbReaperThread(
2529 PVOID Context
2530 );
2531
2532 VOID
2533 NTAPI
2534 Ext2bhReaperThread(
2535 PVOID Context
2536 );
2537
2538
2539 PEXT2_IRP_CONTEXT
2540 Ext2AllocateIrpContext (IN PDEVICE_OBJECT DeviceObject,
2541 IN PIRP Irp );
2542
2543 VOID
2544 Ext2FreeIrpContext (IN PEXT2_IRP_CONTEXT IrpContext);
2545
2546
2547 PEXT2_FCB
2548 Ext2AllocateFcb (
2549 IN PEXT2_VCB Vcb,
2550 IN PEXT2_MCB Mcb
2551 );
2552
2553 VOID
2554 Ext2FreeFcb (IN PEXT2_FCB Fcb);
2555
2556 VOID
2557 Ext2InsertFcb(PEXT2_VCB Vcb, PEXT2_FCB Fcb);
2558
2559 VOID
2560 Ext2RemoveFcb(PEXT2_VCB Vcb, PEXT2_FCB Fcb);
2561
2562 PEXT2_CCB
2563 Ext2AllocateCcb (ULONG Flags, PEXT2_MCB SymLink);
2564
2565 VOID
2566 Ext2FreeMcb (
2567 IN PEXT2_VCB Vcb,
2568 IN PEXT2_MCB Mcb
2569 );
2570
2571 VOID
2572 Ext2FreeCcb (IN PEXT2_VCB Vcb, IN PEXT2_CCB Ccb);
2573
2574 PEXT2_INODE
2575 Ext2AllocateInode (PEXT2_VCB Vcb);
2576
2577 VOID
2578 Ext2DestroyInode (IN PEXT2_VCB Vcb, IN PEXT2_INODE inode);
2579
2580 struct dentry * Ext2AllocateEntry();
2581 VOID Ext2FreeEntry (IN struct dentry *de);
2582 struct dentry *Ext2BuildEntry(PEXT2_VCB Vcb, PEXT2_MCB Dcb, PUNICODE_STRING FileName);
2583
2584 PEXT2_EXTENT
2585 Ext2AllocateExtent();
2586
2587 VOID
2588 Ext2FreeExtent (IN PEXT2_EXTENT Extent);
2589
2590 ULONG
2591 Ext2CountExtents(IN PEXT2_EXTENT Chain);
2592
2593 VOID
2594 Ext2JointExtents(
2595 IN PEXT2_EXTENT Chain,
2596 IN PEXT2_EXTENT Extent
2597 );
2598
2599 VOID
2600 Ext2DestroyExtentChain(IN PEXT2_EXTENT Chain);
2601
2602 NTSTATUS
2603 Ext2BuildExtents(
2604 IN PEXT2_IRP_CONTEXT IrpContext,
2605 IN PEXT2_VCB Vcb,
2606 IN PEXT2_MCB Mcb,
2607 IN ULONGLONG Offset,
2608 IN ULONG Size,
2609 IN BOOLEAN bAlloc,
2610 OUT PEXT2_EXTENT * Chain
2611 );
2612
2613 BOOLEAN
2614 Ext2ListExtents(PLARGE_MCB Extents);
2615
2616 VOID
2617 Ext2CheckExtent(
2618 PLARGE_MCB Zone,
2619 LONGLONG Vbn,
2620 LONGLONG Lbn,
2621 LONGLONG Length,
2622 BOOLEAN bAdded
2623 );
2624
2625 VOID
2626 Ext2ClearAllExtents(PLARGE_MCB Zone);
2627
2628 BOOLEAN
2629 Ext2AddVcbExtent (
2630 IN PEXT2_VCB Vcb,
2631 IN LONGLONG Vbn,
2632 IN LONGLONG Length
2633 );
2634
2635 BOOLEAN
2636 Ext2RemoveVcbExtent (
2637 IN PEXT2_VCB Vcb,
2638 IN LONGLONG Vbn,
2639 IN LONGLONG Length
2640 );
2641
2642 BOOLEAN
2643 Ext2LookupVcbExtent (
2644 IN PEXT2_VCB Vcb,
2645 IN LONGLONG Vbn,
2646 OUT PLONGLONG Lbn,
2647 OUT PLONGLONG Length
2648 );
2649
2650 BOOLEAN
2651 Ext2AddMcbExtent (
2652 IN PEXT2_VCB Vcb,
2653 IN PEXT2_MCB Mcb,
2654 IN LONGLONG Vbn,
2655 IN LONGLONG Lbn,
2656 IN LONGLONG Length
2657 );
2658
2659 BOOLEAN
2660 Ext2RemoveMcbExtent (
2661 IN PEXT2_VCB Vcb,
2662 IN PEXT2_MCB Mcb,
2663 IN LONGLONG Vbn,
2664 IN LONGLONG Length
2665 );
2666
2667 BOOLEAN
2668 Ext2LookupMcbExtent (
2669 IN PEXT2_VCB Vcb,
2670 IN PEXT2_MCB Mcb,
2671 IN LONGLONG Vbn,
2672 OUT PLONGLONG Lbn,
2673 OUT PLONGLONG Length
2674 );
2675
2676 BOOLEAN
2677 Ext2AddMcbMetaExts (
2678 IN PEXT2_VCB Vcb,
2679 IN PEXT2_MCB Mcb,
2680 IN ULONG Block,
2681 IN ULONG Length
2682 );
2683
2684 BOOLEAN
2685 Ext2RemoveMcbMetaExts (
2686 IN PEXT2_VCB Vcb,
2687 IN PEXT2_MCB Mcb,
2688 IN ULONG Block,
2689 IN ULONG Length
2690 );
2691
2692 BOOLEAN
2693 Ext2AddBlockExtent(
2694 IN PEXT2_VCB Vcb,
2695 IN PEXT2_MCB Mcb,
2696 IN ULONG Start,
2697 IN ULONG Block,
2698 IN ULONG Number
2699 );
2700
2701 BOOLEAN
2702 Ext2LookupBlockExtent(
2703 IN PEXT2_VCB Vcb,
2704 IN PEXT2_MCB Mcb,
2705 IN ULONG Start,
2706 IN PULONG Block,
2707 IN PULONG Mapped
2708 );
2709
2710 BOOLEAN
2711 Ext2RemoveBlockExtent(
2712 IN PEXT2_VCB Vcb,
2713 IN PEXT2_MCB Mcb,
2714 IN ULONG Start,
2715 IN ULONG Number
2716 );
2717
2718 NTSTATUS
2719 Ext2InitializeZone(
2720 IN PEXT2_IRP_CONTEXT IrpContext,
2721 IN PEXT2_VCB Vcb,
2722 IN PEXT2_MCB Mcb
2723 );
2724
2725 BOOLEAN
2726 Ext2BuildName(
2727 IN OUT PUNICODE_STRING Target,
2728 IN PUNICODE_STRING File,
2729 IN PUNICODE_STRING Parent
2730 );
2731
2732
2733 PEXT2_MCB
2734 Ext2AllocateMcb (
2735 IN PEXT2_VCB Vcb,
2736 IN PUNICODE_STRING FileName,
2737 IN PUNICODE_STRING Parent,
2738 IN ULONG FileAttr
2739 );
2740
2741 PEXT2_MCB
2742 Ext2SearchMcb(
2743 PEXT2_VCB Vcb,
2744 PEXT2_MCB Parent,
2745 PUNICODE_STRING FileName
2746 );
2747
2748 PEXT2_MCB
2749 Ext2SearchMcbWithoutLock(
2750 PEXT2_MCB Parent,
2751 PUNICODE_STRING FileName
2752 );
2753
2754 VOID
2755 Ext2InsertMcb(
2756 PEXT2_VCB Vcb,
2757 PEXT2_MCB Parent,
2758 PEXT2_MCB Child
2759 );
2760
2761 BOOLEAN
2762 Ext2RemoveMcb(
2763 PEXT2_VCB Vcb,
2764 PEXT2_MCB Mcb
2765 );
2766
2767 VOID
2768 Ext2CleanupAllMcbs(
2769 PEXT2_VCB Vcb
2770 );
2771
2772 BOOLEAN
2773 Ext2CheckSetBlock(
2774 PEXT2_IRP_CONTEXT IrpContext,
2775 PEXT2_VCB Vcb, LONGLONG Block
2776 );
2777
2778 BOOLEAN
2779 Ext2CheckBitmapConsistency(
2780 PEXT2_IRP_CONTEXT IrpContext,
2781 PEXT2_VCB Vcb
2782 );
2783
2784 VOID
2785 Ext2InsertVcb(PEXT2_VCB Vcb);
2786
2787 VOID
2788 Ext2RemoveVcb(PEXT2_VCB Vcb);
2789
2790 NTSTATUS
2791 Ext2InitializeLabel(
2792 IN PEXT2_VCB Vcb,
2793 IN PEXT2_SUPER_BLOCK Sb
2794 );
2795
2796 NTSTATUS
2797 Ext2InitializeVcb(
2798 PEXT2_IRP_CONTEXT IrpContext,
2799 PEXT2_VCB Vcb,
2800 PEXT2_SUPER_BLOCK Ext2Sb,
2801 PDEVICE_OBJECT TargetDevice,
2802 PDEVICE_OBJECT VolumeDevice,
2803 PVPB Vpb );
2804
2805 VOID
2806 Ext2TearDownStream (IN PEXT2_VCB Vcb);
2807
2808 VOID
2809 Ext2DestroyVcb (IN PEXT2_VCB Vcb);
2810
2811 NTSTATUS
2812 Ext2CompleteIrpContext (
2813 IN PEXT2_IRP_CONTEXT IrpContext,
2814 IN NTSTATUS Status );
2815
2816 VOID
2817 Ext2SyncUninitializeCacheMap (
2818 IN PFILE_OBJECT FileObject );
2819
2820 VOID
2821 Ext2LinkTailMcb(PEXT2_VCB Vcb, PEXT2_MCB Mcb);
2822
2823
2824 VOID
2825 Ext2LinkHeadMcb(PEXT2_VCB Vcb, PEXT2_MCB Mcb);
2826
2827 VOID
2828 Ext2UnlinkMcb(PEXT2_VCB Vcb, PEXT2_MCB Mcb);
2829
2830 PEXT2_MCB
2831 Ext2FirstUnusedMcb(
2832 PEXT2_VCB Vcb,
2833 BOOLEAN Wait,
2834 ULONG Number
2835 );
2836
2837 VOID NTAPI
2838 Ext2ReaperThread(
2839 PVOID Context
2840 );
2841
2842 NTSTATUS
2843 Ext2StartReaper(PEXT2_REAPER, EXT2_REAPER_RELEASE);
2844 VOID
2845 NTAPI
2846 Ext2StopReaper(PEXT2_REAPER Reaper);
2847
2848 //
2849 // Misc.c
2850 //
2851
2852 ULONG
2853 Ext2Log2(ULONG Value);
2854
2855 LARGE_INTEGER
2856 Ext2NtTime (IN ULONG i_time);
2857
2858 ULONG
2859 Ext2LinuxTime (IN LARGE_INTEGER SysTime);
2860
2861 ULONG
2862 Ext2OEMToUnicodeSize(
2863 IN PEXT2_VCB Vcb,
2864 IN PANSI_STRING Oem
2865 );
2866
2867 NTSTATUS
2868 Ext2OEMToUnicode(
2869 IN PEXT2_VCB Vcb,
2870 IN OUT PUNICODE_STRING Oem,
2871 IN POEM_STRING Unicode
2872 );
2873
2874 ULONG
2875 Ext2UnicodeToOEMSize(
2876 IN PEXT2_VCB Vcb,
2877 IN PUNICODE_STRING Unicode
2878 );
2879
2880 NTSTATUS
2881 Ext2UnicodeToOEM (
2882 IN PEXT2_VCB Vcb,
2883 IN OUT POEM_STRING Oem,
2884 IN PUNICODE_STRING Unicode
2885 );
2886
2887 VOID
2888 Ext2Sleep(ULONG ms);
2889
2890 int Ext2LinuxError (NTSTATUS Status);
2891 NTSTATUS Ext2WinntError(int rc);
2892
2893 BOOLEAN Ext2IsDot(PUNICODE_STRING name);
2894 BOOLEAN Ext2IsDotDot(PUNICODE_STRING name);
2895 //
2896 // nls/nls_rtl.c
2897 //
2898
2899 int
2900 Ext2LoadAllNls();
2901
2902 VOID
2903 Ext2UnloadAllNls();
2904
2905 //
2906 // Pnp.c
2907 //
2908
2909 NTSTATUS
2910 Ext2Pnp(IN PEXT2_IRP_CONTEXT IrpContext);
2911
2912 NTSTATUS
2913 Ext2PnpQueryRemove(
2914 PEXT2_IRP_CONTEXT IrpContext,
2915 PEXT2_VCB Vcb );
2916
2917 NTSTATUS
2918 Ext2PnpRemove(
2919 PEXT2_IRP_CONTEXT IrpContext,
2920 PEXT2_VCB Vcb );
2921
2922 NTSTATUS
2923 Ext2PnpCancelRemove(
2924 PEXT2_IRP_CONTEXT IrpContext,
2925 PEXT2_VCB Vcb );
2926
2927 NTSTATUS
2928 Ext2PnpSurpriseRemove(
2929 PEXT2_IRP_CONTEXT IrpContext,
2930 PEXT2_VCB Vcb );
2931
2932
2933 //
2934 // Read.c
2935 //
2936
2937 NTSTATUS
2938 Ext2ReadInode (
2939 IN PEXT2_IRP_CONTEXT IrpContext,
2940 IN PEXT2_VCB Vcb,
2941 IN PEXT2_MCB Mcb,
2942 IN ULONGLONG Offset,
2943 IN PVOID Buffer,
2944 IN ULONG Size,
2945 IN BOOLEAN bDirectIo,
2946 OUT PULONG dwReturn
2947 );
2948
2949 NTSTATUS
2950 Ext2Read (IN PEXT2_IRP_CONTEXT IrpContext);
2951
2952
2953 //
2954 // ext3\recover.c
2955 //
2956
2957 PEXT2_MCB
2958 Ext2LoadInternalJournal(
2959 PEXT2_VCB Vcb,
2960 ULONG jNo
2961 );
2962
2963 INT
2964 Ext2CheckJournal(
2965 PEXT2_VCB Vcb,
2966 PULONG jNo
2967 );
2968
2969 INT
2970 Ext2RecoverJournal(
2971 PEXT2_IRP_CONTEXT IrpContext,
2972 PEXT2_VCB Vcb
2973 );
2974
2975 //
2976 // Shutdown.c
2977 //
2978
2979
2980 NTSTATUS
2981 Ext2ShutDown (IN PEXT2_IRP_CONTEXT IrpContext);
2982
2983
2984 //
2985 // Volinfo.c
2986 //
2987
2988 NTSTATUS
2989 Ext2QueryVolumeInformation (IN PEXT2_IRP_CONTEXT IrpContext);
2990
2991 NTSTATUS
2992 Ext2SetVolumeInformation (IN PEXT2_IRP_CONTEXT IrpContext);
2993
2994 //
2995 // Write.c
2996 //
2997
2998 typedef struct _EXT2_RW_CONTEXT {
2999 PIRP MasterIrp;
3000 KEVENT Event;
3001 ULONG Blocks;
3002 ULONG Length;
3003 PERESOURCE Resource;
3004 ERESOURCE_THREAD ThreadId;
3005 PFILE_OBJECT FileObject;
3006 ULONG Flags;
3007 BOOLEAN Wait;
3008
3009 } EXT2_RW_CONTEXT, *PEXT2_RW_CONTEXT;
3010
3011 #define EXT2_RW_CONTEXT_WRITE 1
3012
3013 NTSTATUS
3014 Ext2WriteInode (
3015 IN PEXT2_IRP_CONTEXT IrpContext,
3016 IN PEXT2_VCB Vcb,
3017 IN PEXT2_MCB Mcb,
3018 IN ULONGLONG Offset,
3019 IN PVOID Buffer,
3020 IN ULONG Size,
3021 IN BOOLEAN bDirectIo,
3022 OUT PULONG dwReturn
3023 );
3024
3025
3026 VOID
3027 Ext2StartFloppyFlushDpc (
3028 PEXT2_VCB Vcb,
3029 PEXT2_FCB Fcb,
3030 PFILE_OBJECT FileObject );
3031
3032 BOOLEAN
3033 Ext2ZeroData (
3034 IN PEXT2_IRP_CONTEXT IrpContext,
3035 IN PEXT2_VCB Vcb,
3036 IN PFILE_OBJECT FileObject,
3037 IN PLARGE_INTEGER Start,
3038 IN PLARGE_INTEGER End );
3039
3040 NTSTATUS
3041 Ext2Write (IN PEXT2_IRP_CONTEXT IrpContext);
3042
3043 #endif /* _EXT2_HEADER_ */