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