123b7c7b8SHermès Bélusca-Maïto /*++
223b7c7b8SHermès Bélusca-Maïto 
323b7c7b8SHermès Bélusca-Maïto Copyright (c) 1989-2000 Microsoft Corporation
423b7c7b8SHermès Bélusca-Maïto 
523b7c7b8SHermès Bélusca-Maïto Module Name:
623b7c7b8SHermès Bélusca-Maïto 
723b7c7b8SHermès Bélusca-Maïto     FatProcs.h
823b7c7b8SHermès Bélusca-Maïto 
923b7c7b8SHermès Bélusca-Maïto Abstract:
1023b7c7b8SHermès Bélusca-Maïto 
1123b7c7b8SHermès Bélusca-Maïto     This module defines all of the globally used procedures in the FAT
1223b7c7b8SHermès Bélusca-Maïto     file system.
1323b7c7b8SHermès Bélusca-Maïto 
1423b7c7b8SHermès Bélusca-Maïto 
1523b7c7b8SHermès Bélusca-Maïto --*/
1623b7c7b8SHermès Bélusca-Maïto 
1723b7c7b8SHermès Bélusca-Maïto #ifndef _FATPROCS_
1823b7c7b8SHermès Bélusca-Maïto #define _FATPROCS_
1923b7c7b8SHermès Bélusca-Maïto 
2023b7c7b8SHermès Bélusca-Maïto #ifdef _MSC_VER
2123b7c7b8SHermès Bélusca-Maïto #pragma warning( disable: 4127 ) // conditional expression is constant
2223b7c7b8SHermès Bélusca-Maïto 
2323b7c7b8SHermès Bélusca-Maïto #pragma warning( push )
2423b7c7b8SHermès Bélusca-Maïto #pragma warning( disable: 4201 ) // nonstandard extension used : nameless struct/union
2523b7c7b8SHermès Bélusca-Maïto #pragma warning( disable: 4214 ) // nonstandard extension used : bit field types
2623b7c7b8SHermès Bélusca-Maïto #endif
2723b7c7b8SHermès Bélusca-Maïto 
2823b7c7b8SHermès Bélusca-Maïto #include <ntifs.h>
2923b7c7b8SHermès Bélusca-Maïto 
3023b7c7b8SHermès Bélusca-Maïto 
3123b7c7b8SHermès Bélusca-Maïto #include <ntddscsi.h>
3223b7c7b8SHermès Bélusca-Maïto #include <scsi.h>
3323b7c7b8SHermès Bélusca-Maïto #include <ntddcdrm.h>
3423b7c7b8SHermès Bélusca-Maïto #include <ntdddisk.h>
3523b7c7b8SHermès Bélusca-Maïto #include <ntddstor.h>
3623b7c7b8SHermès Bélusca-Maïto #include <ntintsafe.h>
3723b7c7b8SHermès Bélusca-Maïto #ifdef __REACTOS__
3823b7c7b8SHermès Bélusca-Maïto #include <pseh/pseh2.h>
39*d9a287e9STimo Kreuzer #include <dbgbitmap.h>
4023b7c7b8SHermès Bélusca-Maïto #endif
4123b7c7b8SHermès Bélusca-Maïto 
4223b7c7b8SHermès Bélusca-Maïto 
4323b7c7b8SHermès Bélusca-Maïto #ifdef __REACTOS__
4423b7c7b8SHermès Bélusca-Maïto // Downgrade unsupported NT6.2+ features.
4523b7c7b8SHermès Bélusca-Maïto #undef MdlMappingNoExecute
4623b7c7b8SHermès Bélusca-Maïto #define MdlMappingNoExecute 0
4723b7c7b8SHermès Bélusca-Maïto #define NonPagedPoolNx NonPagedPool
4823b7c7b8SHermès Bélusca-Maïto #define NonPagedPoolNxCacheAligned NonPagedPoolCacheAligned
4923b7c7b8SHermès Bélusca-Maïto #undef POOL_NX_ALLOCATION
5023b7c7b8SHermès Bélusca-Maïto #define POOL_NX_ALLOCATION 0
5123b7c7b8SHermès Bélusca-Maïto 
5223b7c7b8SHermès Bélusca-Maïto // Moved up: needed in 'fatstruc.h'.
5323b7c7b8SHermès Bélusca-Maïto typedef enum _TYPE_OF_OPEN {
5423b7c7b8SHermès Bélusca-Maïto 
5523b7c7b8SHermès Bélusca-Maïto     UnopenedFileObject = 1,
5623b7c7b8SHermès Bélusca-Maïto     UserFileOpen,
5723b7c7b8SHermès Bélusca-Maïto     UserDirectoryOpen,
5823b7c7b8SHermès Bélusca-Maïto     UserVolumeOpen,
5923b7c7b8SHermès Bélusca-Maïto     VirtualVolumeFile,
6023b7c7b8SHermès Bélusca-Maïto     DirectoryFile,
6123b7c7b8SHermès Bélusca-Maïto     EaFile,
6223b7c7b8SHermès Bélusca-Maïto } TYPE_OF_OPEN;
6323b7c7b8SHermès Bélusca-Maïto #endif
6423b7c7b8SHermès Bélusca-Maïto 
6523b7c7b8SHermès Bélusca-Maïto #include "nodetype.h"
6623b7c7b8SHermès Bélusca-Maïto #include "fat.h"
6723b7c7b8SHermès Bélusca-Maïto #include "lfn.h"
6823b7c7b8SHermès Bélusca-Maïto #include "fatstruc.h"
6923b7c7b8SHermès Bélusca-Maïto #include "fatdata.h"
7023b7c7b8SHermès Bélusca-Maïto 
7123b7c7b8SHermès Bélusca-Maïto 
7223b7c7b8SHermès Bélusca-Maïto 
7323b7c7b8SHermès Bélusca-Maïto #ifdef _MSC_VER
7423b7c7b8SHermès Bélusca-Maïto #pragma warning( pop )
7523b7c7b8SHermès Bélusca-Maïto #endif
7623b7c7b8SHermès Bélusca-Maïto 
7723b7c7b8SHermès Bélusca-Maïto #ifndef INLINE
7823b7c7b8SHermès Bélusca-Maïto #define INLINE __inline
7923b7c7b8SHermès Bélusca-Maïto #endif
8023b7c7b8SHermès Bélusca-Maïto 
8123b7c7b8SHermès Bélusca-Maïto #define Add2Ptr(P,I) ((PVOID)((PUCHAR)(P) + (I)))
8223b7c7b8SHermès Bélusca-Maïto 
8323b7c7b8SHermès Bélusca-Maïto #ifndef MAX_ULONG
8423b7c7b8SHermès Bélusca-Maïto #define MAX_ULONG ((ULONG)-1)
8523b7c7b8SHermès Bélusca-Maïto #endif
8623b7c7b8SHermès Bélusca-Maïto 
8723b7c7b8SHermès Bélusca-Maïto #ifndef MAX_USHORT
8823b7c7b8SHermès Bélusca-Maïto #define MAX_USHORT ((USHORT)-1)
8923b7c7b8SHermès Bélusca-Maïto #endif
9023b7c7b8SHermès Bélusca-Maïto 
9123b7c7b8SHermès Bélusca-Maïto //
9223b7c7b8SHermès Bélusca-Maïto //  We must explicitly tag our allocations.
9323b7c7b8SHermès Bélusca-Maïto //
9423b7c7b8SHermès Bélusca-Maïto 
9523b7c7b8SHermès Bélusca-Maïto #undef FsRtlAllocatePool
9623b7c7b8SHermès Bélusca-Maïto #undef FsRtlAllocatePoolWithQuota
9723b7c7b8SHermès Bélusca-Maïto 
9823b7c7b8SHermès Bélusca-Maïto //
9923b7c7b8SHermès Bélusca-Maïto //  A function that returns finished denotes if it was able to complete the
10023b7c7b8SHermès Bélusca-Maïto //  operation (TRUE) or could not complete the operation (FALSE) because the
10123b7c7b8SHermès Bélusca-Maïto //  wait value stored in the irp context was false and we would have had
10223b7c7b8SHermès Bélusca-Maïto //  to block for a resource or I/O
10323b7c7b8SHermès Bélusca-Maïto //
10423b7c7b8SHermès Bélusca-Maïto 
10523b7c7b8SHermès Bélusca-Maïto typedef BOOLEAN FINISHED;
10623b7c7b8SHermès Bélusca-Maïto 
10723b7c7b8SHermès Bélusca-Maïto //
10823b7c7b8SHermès Bélusca-Maïto //  Size (characters) of stack allocated name component buffers in
10923b7c7b8SHermès Bélusca-Maïto //  the create/rename paths.
11023b7c7b8SHermès Bélusca-Maïto //
11123b7c7b8SHermès Bélusca-Maïto 
11223b7c7b8SHermès Bélusca-Maïto #define FAT_CREATE_INITIAL_NAME_BUF_SIZE    32
11323b7c7b8SHermès Bélusca-Maïto 
11423b7c7b8SHermès Bélusca-Maïto 
11523b7c7b8SHermès Bélusca-Maïto //
11623b7c7b8SHermès Bélusca-Maïto //  Some string buffer handling functions,  implemented in strucsup.c
11723b7c7b8SHermès Bélusca-Maïto //
11823b7c7b8SHermès Bélusca-Maïto 
11923b7c7b8SHermès Bélusca-Maïto VOID
12023b7c7b8SHermès Bélusca-Maïto FatFreeStringBuffer (
12123b7c7b8SHermès Bélusca-Maïto     _Inout_ PVOID String
12223b7c7b8SHermès Bélusca-Maïto     );
12323b7c7b8SHermès Bélusca-Maïto 
12423b7c7b8SHermès Bélusca-Maïto VOID
12523b7c7b8SHermès Bélusca-Maïto FatExtendString(
12623b7c7b8SHermès Bélusca-Maïto     _Inout_ PVOID String,
12723b7c7b8SHermès Bélusca-Maïto     _In_ USHORT DesiredBufferSize,
12823b7c7b8SHermès Bélusca-Maïto     _In_ BOOLEAN FreeOldBuffer,
12923b7c7b8SHermès Bélusca-Maïto     __out_opt PBOOLEAN NeedsFree
13023b7c7b8SHermès Bélusca-Maïto     );
13123b7c7b8SHermès Bélusca-Maïto 
13223b7c7b8SHermès Bélusca-Maïto VOID
13323b7c7b8SHermès Bélusca-Maïto FatEnsureStringBufferEnough (
13423b7c7b8SHermès Bélusca-Maïto     _Inout_ PVOID String,
13523b7c7b8SHermès Bélusca-Maïto     _In_ USHORT DesiredBufferSize
13623b7c7b8SHermès Bélusca-Maïto     );
13723b7c7b8SHermès Bélusca-Maïto 
13823b7c7b8SHermès Bélusca-Maïto BOOLEAN
13923b7c7b8SHermès Bélusca-Maïto FatAddMcbEntry (
14023b7c7b8SHermès Bélusca-Maïto     IN PVCB Vcb,
14123b7c7b8SHermès Bélusca-Maïto     IN PLARGE_MCB Mcb,
14223b7c7b8SHermès Bélusca-Maïto     IN VBO Vbo,
14323b7c7b8SHermès Bélusca-Maïto     IN LBO Lbo,
14423b7c7b8SHermès Bélusca-Maïto     IN ULONG SectorCount
14523b7c7b8SHermès Bélusca-Maïto     );
14623b7c7b8SHermès Bélusca-Maïto 
14723b7c7b8SHermès Bélusca-Maïto BOOLEAN
14823b7c7b8SHermès Bélusca-Maïto FatLookupMcbEntry (
14923b7c7b8SHermès Bélusca-Maïto     IN PVCB Vcb,
15023b7c7b8SHermès Bélusca-Maïto     IN PLARGE_MCB Mcb,
15123b7c7b8SHermès Bélusca-Maïto     IN VBO Vbo,
15223b7c7b8SHermès Bélusca-Maïto     OUT PLBO Lbo,
15323b7c7b8SHermès Bélusca-Maïto     OUT PULONG ByteCount OPTIONAL,
15423b7c7b8SHermès Bélusca-Maïto     OUT PULONG Index OPTIONAL
15523b7c7b8SHermès Bélusca-Maïto     );
15623b7c7b8SHermès Bélusca-Maïto 
15723b7c7b8SHermès Bélusca-Maïto BOOLEAN
15823b7c7b8SHermès Bélusca-Maïto FatLookupLastMcbEntry (
15923b7c7b8SHermès Bélusca-Maïto     IN PVCB Vcb,
16023b7c7b8SHermès Bélusca-Maïto     IN PLARGE_MCB Mcb,
16123b7c7b8SHermès Bélusca-Maïto     OUT PVBO Vbo,
16223b7c7b8SHermès Bélusca-Maïto     OUT PLBO Lbo,
16323b7c7b8SHermès Bélusca-Maïto     OUT PULONG Index OPTIONAL
16423b7c7b8SHermès Bélusca-Maïto     );
16523b7c7b8SHermès Bélusca-Maïto 
16623b7c7b8SHermès Bélusca-Maïto BOOLEAN
16723b7c7b8SHermès Bélusca-Maïto FatGetNextMcbEntry (
16823b7c7b8SHermès Bélusca-Maïto     IN PVCB Vcb,
16923b7c7b8SHermès Bélusca-Maïto     IN PLARGE_MCB Mcb,
17023b7c7b8SHermès Bélusca-Maïto     IN ULONG RunIndex,
17123b7c7b8SHermès Bélusca-Maïto     OUT PVBO Vbo,
17223b7c7b8SHermès Bélusca-Maïto     OUT PLBO Lbo,
17323b7c7b8SHermès Bélusca-Maïto     OUT PULONG ByteCount
17423b7c7b8SHermès Bélusca-Maïto     );
17523b7c7b8SHermès Bélusca-Maïto 
17623b7c7b8SHermès Bélusca-Maïto VOID
17723b7c7b8SHermès Bélusca-Maïto FatRemoveMcbEntry (
17823b7c7b8SHermès Bélusca-Maïto     IN PVCB Vcb,
17923b7c7b8SHermès Bélusca-Maïto     IN PLARGE_MCB Mcb,
18023b7c7b8SHermès Bélusca-Maïto     IN VBO Vbo,
18123b7c7b8SHermès Bélusca-Maïto     IN ULONG SectorCount
18223b7c7b8SHermès Bélusca-Maïto     );
18323b7c7b8SHermès Bélusca-Maïto 
18423b7c7b8SHermès Bélusca-Maïto 
18523b7c7b8SHermès Bélusca-Maïto //
18623b7c7b8SHermès Bélusca-Maïto //  File access check routine, implemented in AcChkSup.c
18723b7c7b8SHermès Bélusca-Maïto //
18823b7c7b8SHermès Bélusca-Maïto 
18923b7c7b8SHermès Bélusca-Maïto BOOLEAN
19023b7c7b8SHermès Bélusca-Maïto FatCheckFileAccess (
19123b7c7b8SHermès Bélusca-Maïto     PIRP_CONTEXT IrpContext,
19223b7c7b8SHermès Bélusca-Maïto     IN UCHAR DirentAttributes,
19323b7c7b8SHermès Bélusca-Maïto     IN PACCESS_MASK DesiredAccess
19423b7c7b8SHermès Bélusca-Maïto     );
19523b7c7b8SHermès Bélusca-Maïto 
19623b7c7b8SHermès Bélusca-Maïto BOOLEAN
19723b7c7b8SHermès Bélusca-Maïto FatCheckManageVolumeAccess (
19823b7c7b8SHermès Bélusca-Maïto     _In_ PIRP_CONTEXT IrpContext,
19923b7c7b8SHermès Bélusca-Maïto     _In_ PACCESS_STATE AccessState,
20023b7c7b8SHermès Bélusca-Maïto     _In_ KPROCESSOR_MODE ProcessorMode
20123b7c7b8SHermès Bélusca-Maïto     );
20223b7c7b8SHermès Bélusca-Maïto 
20323b7c7b8SHermès Bélusca-Maïto NTSTATUS
20423b7c7b8SHermès Bélusca-Maïto FatExplicitDeviceAccessGranted (
20523b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
20623b7c7b8SHermès Bélusca-Maïto     IN PDEVICE_OBJECT DeviceObject,
20723b7c7b8SHermès Bélusca-Maïto     IN PACCESS_STATE AccessState,
20823b7c7b8SHermès Bélusca-Maïto     IN KPROCESSOR_MODE ProcessorMode
20923b7c7b8SHermès Bélusca-Maïto     );
21023b7c7b8SHermès Bélusca-Maïto 
21123b7c7b8SHermès Bélusca-Maïto 
21223b7c7b8SHermès Bélusca-Maïto //
21323b7c7b8SHermès Bélusca-Maïto //  Allocation support routines, implemented in AllocSup.c
21423b7c7b8SHermès Bélusca-Maïto //
21523b7c7b8SHermès Bélusca-Maïto 
21623b7c7b8SHermès Bélusca-Maïto static
21723b7c7b8SHermès Bélusca-Maïto INLINE
21823b7c7b8SHermès Bélusca-Maïto BOOLEAN
FatIsIoRangeValid(IN PVCB Vcb,IN LARGE_INTEGER Start,IN ULONG Length)21923b7c7b8SHermès Bélusca-Maïto FatIsIoRangeValid (
22023b7c7b8SHermès Bélusca-Maïto     IN PVCB Vcb,
22123b7c7b8SHermès Bélusca-Maïto     IN LARGE_INTEGER Start,
22223b7c7b8SHermès Bélusca-Maïto     IN ULONG Length
22323b7c7b8SHermès Bélusca-Maïto     )
22423b7c7b8SHermès Bélusca-Maïto 
22523b7c7b8SHermès Bélusca-Maïto /*++
22623b7c7b8SHermès Bélusca-Maïto 
22723b7c7b8SHermès Bélusca-Maïto Routine Description:
22823b7c7b8SHermès Bélusca-Maïto 
22923b7c7b8SHermès Bélusca-Maïto     This routine enforces the restriction that object space must be
23023b7c7b8SHermès Bélusca-Maïto     representable in 32 bits.
23123b7c7b8SHermès Bélusca-Maïto 
23223b7c7b8SHermès Bélusca-Maïto Arguments:
23323b7c7b8SHermès Bélusca-Maïto 
23423b7c7b8SHermès Bélusca-Maïto     Vcb - the volume the range is on
23523b7c7b8SHermès Bélusca-Maïto 
23623b7c7b8SHermès Bélusca-Maïto     Start - starting byte (zero based) of the range
23723b7c7b8SHermès Bélusca-Maïto 
23823b7c7b8SHermès Bélusca-Maïto     Length - size of the range
23923b7c7b8SHermès Bélusca-Maïto 
24023b7c7b8SHermès Bélusca-Maïto     HeaderSize - if the file has a header
24123b7c7b8SHermès Bélusca-Maïto 
24223b7c7b8SHermès Bélusca-Maïto Return Value:
24323b7c7b8SHermès Bélusca-Maïto 
24423b7c7b8SHermès Bélusca-Maïto     BOOLEAN - if, considering the cluster size, the neccesary size of
24523b7c7b8SHermès Bélusca-Maïto         the object to contain the range can be represented in 32 bits.
24623b7c7b8SHermès Bélusca-Maïto 
24723b7c7b8SHermès Bélusca-Maïto --*/
24823b7c7b8SHermès Bélusca-Maïto 
24923b7c7b8SHermès Bélusca-Maïto {
25023b7c7b8SHermès Bélusca-Maïto 
25123b7c7b8SHermès Bélusca-Maïto     UNREFERENCED_PARAMETER( Vcb );
25223b7c7b8SHermès Bélusca-Maïto 
25323b7c7b8SHermès Bélusca-Maïto     //
25423b7c7b8SHermès Bélusca-Maïto     //  The only restriction on a FAT object is that the filesize must
25523b7c7b8SHermès Bélusca-Maïto     //  fit in 32bits, i.e. <= 0xffffffff. This then implies that the
25623b7c7b8SHermès Bélusca-Maïto     //  range of valid byte offsets is [0, fffffffe].
25723b7c7b8SHermès Bélusca-Maïto     //
25823b7c7b8SHermès Bélusca-Maïto     //  Two phases which check for illegality
25923b7c7b8SHermès Bélusca-Maïto     //
26023b7c7b8SHermès Bélusca-Maïto     //      - if the high 32bits are nonzero
26123b7c7b8SHermès Bélusca-Maïto     //      - if the length would cause a 32bit overflow
26223b7c7b8SHermès Bélusca-Maïto     //
26323b7c7b8SHermès Bélusca-Maïto 
26423b7c7b8SHermès Bélusca-Maïto     return !(Start.HighPart ||
26523b7c7b8SHermès Bélusca-Maïto              Start.LowPart + Length < Start.LowPart);
26623b7c7b8SHermès Bélusca-Maïto }
26723b7c7b8SHermès Bélusca-Maïto 
26823b7c7b8SHermès Bélusca-Maïto 
26923b7c7b8SHermès Bélusca-Maïto //
27023b7c7b8SHermès Bélusca-Maïto //  This strucure is used by FatLookupFatEntry to remember a pinned page
27123b7c7b8SHermès Bélusca-Maïto //  of fat.
27223b7c7b8SHermès Bélusca-Maïto //
27323b7c7b8SHermès Bélusca-Maïto 
27423b7c7b8SHermès Bélusca-Maïto typedef struct _FAT_ENUMERATION_CONTEXT {
27523b7c7b8SHermès Bélusca-Maïto 
27623b7c7b8SHermès Bélusca-Maïto     VBO VboOfPinnedPage;
27723b7c7b8SHermès Bélusca-Maïto     PBCB Bcb;
27823b7c7b8SHermès Bélusca-Maïto     PVOID PinnedPage;
27923b7c7b8SHermès Bélusca-Maïto 
28023b7c7b8SHermès Bélusca-Maïto } FAT_ENUMERATION_CONTEXT, *PFAT_ENUMERATION_CONTEXT;
28123b7c7b8SHermès Bélusca-Maïto 
28223b7c7b8SHermès Bélusca-Maïto VOID
28323b7c7b8SHermès Bélusca-Maïto FatLookupFatEntry (
28423b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
28523b7c7b8SHermès Bélusca-Maïto     IN PVCB Vcb,
28623b7c7b8SHermès Bélusca-Maïto     IN ULONG FatIndex,
28723b7c7b8SHermès Bélusca-Maïto     IN OUT PULONG FatEntry,
28823b7c7b8SHermès Bélusca-Maïto     IN OUT PFAT_ENUMERATION_CONTEXT Context
28923b7c7b8SHermès Bélusca-Maïto     );
29023b7c7b8SHermès Bélusca-Maïto 
29123b7c7b8SHermès Bélusca-Maïto VOID
29223b7c7b8SHermès Bélusca-Maïto FatSetupAllocationSupport (
29323b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
29423b7c7b8SHermès Bélusca-Maïto     IN PVCB Vcb
29523b7c7b8SHermès Bélusca-Maïto     );
29623b7c7b8SHermès Bélusca-Maïto 
29723b7c7b8SHermès Bélusca-Maïto VOID
29823b7c7b8SHermès Bélusca-Maïto FatTearDownAllocationSupport (
29923b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
30023b7c7b8SHermès Bélusca-Maïto     IN PVCB Vcb
30123b7c7b8SHermès Bélusca-Maïto     );
30223b7c7b8SHermès Bélusca-Maïto 
30323b7c7b8SHermès Bélusca-Maïto _Requires_lock_held_(_Global_critical_region_)
30423b7c7b8SHermès Bélusca-Maïto VOID
30523b7c7b8SHermès Bélusca-Maïto FatLookupFileAllocation (
30623b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
30723b7c7b8SHermès Bélusca-Maïto     IN PFCB FcbOrDcb,
30823b7c7b8SHermès Bélusca-Maïto     IN VBO Vbo,
30923b7c7b8SHermès Bélusca-Maïto     OUT PLBO Lbo,
31023b7c7b8SHermès Bélusca-Maïto     OUT PULONG ByteCount,
31123b7c7b8SHermès Bélusca-Maïto     OUT PBOOLEAN Allocated,
31223b7c7b8SHermès Bélusca-Maïto     OUT PBOOLEAN EndOnMax,
31323b7c7b8SHermès Bélusca-Maïto     OUT PULONG Index OPTIONAL
31423b7c7b8SHermès Bélusca-Maïto     );
31523b7c7b8SHermès Bélusca-Maïto 
31623b7c7b8SHermès Bélusca-Maïto _Requires_lock_held_(_Global_critical_region_)
31723b7c7b8SHermès Bélusca-Maïto VOID
31823b7c7b8SHermès Bélusca-Maïto FatAddFileAllocation (
31923b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
32023b7c7b8SHermès Bélusca-Maïto     IN PFCB FcbOrDcb,
32123b7c7b8SHermès Bélusca-Maïto     IN PFILE_OBJECT FileObject OPTIONAL,
32223b7c7b8SHermès Bélusca-Maïto     IN ULONG AllocationSize
32323b7c7b8SHermès Bélusca-Maïto     );
32423b7c7b8SHermès Bélusca-Maïto 
32523b7c7b8SHermès Bélusca-Maïto _Requires_lock_held_(_Global_critical_region_)
32623b7c7b8SHermès Bélusca-Maïto VOID
32723b7c7b8SHermès Bélusca-Maïto FatTruncateFileAllocation (
32823b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
32923b7c7b8SHermès Bélusca-Maïto     IN PFCB FcbOrDcb,
33023b7c7b8SHermès Bélusca-Maïto     IN ULONG AllocationSize
33123b7c7b8SHermès Bélusca-Maïto     );
33223b7c7b8SHermès Bélusca-Maïto 
33323b7c7b8SHermès Bélusca-Maïto _Requires_lock_held_(_Global_critical_region_)
33423b7c7b8SHermès Bélusca-Maïto VOID
33523b7c7b8SHermès Bélusca-Maïto FatLookupFileAllocationSize (
33623b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
33723b7c7b8SHermès Bélusca-Maïto     IN PFCB FcbOrDcb
33823b7c7b8SHermès Bélusca-Maïto     );
33923b7c7b8SHermès Bélusca-Maïto 
34023b7c7b8SHermès Bélusca-Maïto _Requires_lock_held_(_Global_critical_region_)
34123b7c7b8SHermès Bélusca-Maïto VOID
34223b7c7b8SHermès Bélusca-Maïto FatAllocateDiskSpace (
34323b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
34423b7c7b8SHermès Bélusca-Maïto     IN PVCB Vcb,
34523b7c7b8SHermès Bélusca-Maïto     IN ULONG AbsoluteClusterHint,
34623b7c7b8SHermès Bélusca-Maïto     IN OUT PULONG ByteCount,
34723b7c7b8SHermès Bélusca-Maïto     IN BOOLEAN ExactMatchRequired,
34823b7c7b8SHermès Bélusca-Maïto     OUT PLARGE_MCB Mcb
34923b7c7b8SHermès Bélusca-Maïto     );
35023b7c7b8SHermès Bélusca-Maïto 
35123b7c7b8SHermès Bélusca-Maïto _Requires_lock_held_(_Global_critical_region_)
35223b7c7b8SHermès Bélusca-Maïto VOID
35323b7c7b8SHermès Bélusca-Maïto FatDeallocateDiskSpace (
35423b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
35523b7c7b8SHermès Bélusca-Maïto     IN PVCB Vcb,
35623b7c7b8SHermès Bélusca-Maïto     IN PLARGE_MCB Mcb,
35723b7c7b8SHermès Bélusca-Maïto     IN BOOLEAN ZeroOnDeallocate
35823b7c7b8SHermès Bélusca-Maïto     );
35923b7c7b8SHermès Bélusca-Maïto 
36023b7c7b8SHermès Bélusca-Maïto _Requires_lock_held_(_Global_critical_region_)
36123b7c7b8SHermès Bélusca-Maïto VOID
36223b7c7b8SHermès Bélusca-Maïto FatSplitAllocation (
36323b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
36423b7c7b8SHermès Bélusca-Maïto     IN PVCB Vcb,
36523b7c7b8SHermès Bélusca-Maïto     IN OUT PLARGE_MCB Mcb,
36623b7c7b8SHermès Bélusca-Maïto     IN VBO SplitAtVbo,
36723b7c7b8SHermès Bélusca-Maïto     OUT PLARGE_MCB RemainingMcb
36823b7c7b8SHermès Bélusca-Maïto     );
36923b7c7b8SHermès Bélusca-Maïto 
37023b7c7b8SHermès Bélusca-Maïto _Requires_lock_held_(_Global_critical_region_)
37123b7c7b8SHermès Bélusca-Maïto VOID
37223b7c7b8SHermès Bélusca-Maïto FatMergeAllocation (
37323b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
37423b7c7b8SHermès Bélusca-Maïto     IN PVCB Vcb,
37523b7c7b8SHermès Bélusca-Maïto     IN OUT PLARGE_MCB Mcb,
37623b7c7b8SHermès Bélusca-Maïto     IN PLARGE_MCB SecondMcb
37723b7c7b8SHermès Bélusca-Maïto     );
37823b7c7b8SHermès Bélusca-Maïto 
37923b7c7b8SHermès Bélusca-Maïto _Requires_lock_held_(_Global_critical_region_)
38023b7c7b8SHermès Bélusca-Maïto VOID
38123b7c7b8SHermès Bélusca-Maïto FatSetFatEntry (
38223b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
38323b7c7b8SHermès Bélusca-Maïto     IN PVCB Vcb,
38423b7c7b8SHermès Bélusca-Maïto     IN ULONG FatIndex,
38523b7c7b8SHermès Bélusca-Maïto     IN FAT_ENTRY FatEntry
38623b7c7b8SHermès Bélusca-Maïto     );
38723b7c7b8SHermès Bélusca-Maïto 
38823b7c7b8SHermès Bélusca-Maïto UCHAR
38923b7c7b8SHermès Bélusca-Maïto FatLogOf(
39023b7c7b8SHermès Bélusca-Maïto     IN ULONG Value
39123b7c7b8SHermès Bélusca-Maïto     );
39223b7c7b8SHermès Bélusca-Maïto 
39323b7c7b8SHermès Bélusca-Maïto 
39423b7c7b8SHermès Bélusca-Maïto //
39523b7c7b8SHermès Bélusca-Maïto //   Buffer control routines for data caching, implemented in CacheSup.c
39623b7c7b8SHermès Bélusca-Maïto //
39723b7c7b8SHermès Bélusca-Maïto 
39823b7c7b8SHermès Bélusca-Maïto VOID
39923b7c7b8SHermès Bélusca-Maïto FatReadVolumeFile (
40023b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
40123b7c7b8SHermès Bélusca-Maïto     IN PVCB Vcb,
40223b7c7b8SHermès Bélusca-Maïto     IN VBO StartingVbo,
40323b7c7b8SHermès Bélusca-Maïto     IN ULONG ByteCount,
40423b7c7b8SHermès Bélusca-Maïto     OUT PBCB *Bcb,
40523b7c7b8SHermès Bélusca-Maïto     OUT PVOID *Buffer
40623b7c7b8SHermès Bélusca-Maïto     );
40723b7c7b8SHermès Bélusca-Maïto 
40823b7c7b8SHermès Bélusca-Maïto _Requires_lock_held_(_Global_critical_region_)
40923b7c7b8SHermès Bélusca-Maïto VOID
41023b7c7b8SHermès Bélusca-Maïto FatPrepareWriteVolumeFile (
41123b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
41223b7c7b8SHermès Bélusca-Maïto     IN PVCB Vcb,
41323b7c7b8SHermès Bélusca-Maïto     IN VBO StartingVbo,
41423b7c7b8SHermès Bélusca-Maïto     IN ULONG ByteCount,
41523b7c7b8SHermès Bélusca-Maïto     OUT PBCB *Bcb,
41623b7c7b8SHermès Bélusca-Maïto     OUT PVOID *Buffer,
41723b7c7b8SHermès Bélusca-Maïto     IN BOOLEAN Reversible,
41823b7c7b8SHermès Bélusca-Maïto     IN BOOLEAN Zero
41923b7c7b8SHermès Bélusca-Maïto     );
42023b7c7b8SHermès Bélusca-Maïto 
42123b7c7b8SHermès Bélusca-Maïto _Requires_lock_held_(_Global_critical_region_)
42223b7c7b8SHermès Bélusca-Maïto VOID
42323b7c7b8SHermès Bélusca-Maïto FatReadDirectoryFile (
42423b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
42523b7c7b8SHermès Bélusca-Maïto     IN PDCB Dcb,
42623b7c7b8SHermès Bélusca-Maïto     IN VBO StartingVbo,
42723b7c7b8SHermès Bélusca-Maïto     IN ULONG ByteCount,
42823b7c7b8SHermès Bélusca-Maïto     IN BOOLEAN Pin,
42923b7c7b8SHermès Bélusca-Maïto     OUT PBCB *Bcb,
43023b7c7b8SHermès Bélusca-Maïto     OUT PVOID *Buffer,
43123b7c7b8SHermès Bélusca-Maïto     OUT PNTSTATUS Status
43223b7c7b8SHermès Bélusca-Maïto     );
43323b7c7b8SHermès Bélusca-Maïto 
43423b7c7b8SHermès Bélusca-Maïto _Requires_lock_held_(_Global_critical_region_)
43523b7c7b8SHermès Bélusca-Maïto VOID
43623b7c7b8SHermès Bélusca-Maïto FatPrepareWriteDirectoryFile (
43723b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
43823b7c7b8SHermès Bélusca-Maïto     IN PDCB Dcb,
43923b7c7b8SHermès Bélusca-Maïto     IN VBO StartingVbo,
44023b7c7b8SHermès Bélusca-Maïto     IN ULONG ByteCount,
44123b7c7b8SHermès Bélusca-Maïto     OUT PBCB *Bcb,
44223b7c7b8SHermès Bélusca-Maïto     OUT PVOID *Buffer,
44323b7c7b8SHermès Bélusca-Maïto     IN BOOLEAN Zero,
44423b7c7b8SHermès Bélusca-Maïto     IN BOOLEAN Reversible,
44523b7c7b8SHermès Bélusca-Maïto     OUT PNTSTATUS Status
44623b7c7b8SHermès Bélusca-Maïto     );
44723b7c7b8SHermès Bélusca-Maïto 
44823b7c7b8SHermès Bélusca-Maïto _Requires_lock_held_(_Global_critical_region_)
44923b7c7b8SHermès Bélusca-Maïto VOID
45023b7c7b8SHermès Bélusca-Maïto FatOpenDirectoryFile (
45123b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
45223b7c7b8SHermès Bélusca-Maïto     IN PDCB Dcb
45323b7c7b8SHermès Bélusca-Maïto     );
45423b7c7b8SHermès Bélusca-Maïto 
45523b7c7b8SHermès Bélusca-Maïto PFILE_OBJECT
45623b7c7b8SHermès Bélusca-Maïto FatOpenEaFile (
45723b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
45823b7c7b8SHermès Bélusca-Maïto     IN PFCB EaFcb
45923b7c7b8SHermès Bélusca-Maïto     );
46023b7c7b8SHermès Bélusca-Maïto 
46123b7c7b8SHermès Bélusca-Maïto VOID
46223b7c7b8SHermès Bélusca-Maïto FatCloseEaFile (
46323b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
46423b7c7b8SHermès Bélusca-Maïto     IN PVCB Vcb,
46523b7c7b8SHermès Bélusca-Maïto     IN BOOLEAN FlushFirst
46623b7c7b8SHermès Bélusca-Maïto     );
46723b7c7b8SHermès Bélusca-Maïto 
46823b7c7b8SHermès Bélusca-Maïto 
46923b7c7b8SHermès Bélusca-Maïto _Requires_lock_held_(_Global_critical_region_)
47023b7c7b8SHermès Bélusca-Maïto VOID
47123b7c7b8SHermès Bélusca-Maïto FatSetDirtyBcb (
47223b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
47323b7c7b8SHermès Bélusca-Maïto     IN PBCB Bcb,
47423b7c7b8SHermès Bélusca-Maïto     IN PVCB Vcb OPTIONAL,
47523b7c7b8SHermès Bélusca-Maïto     IN BOOLEAN Reversible
47623b7c7b8SHermès Bélusca-Maïto     );
47723b7c7b8SHermès Bélusca-Maïto 
47823b7c7b8SHermès Bélusca-Maïto VOID
47923b7c7b8SHermès Bélusca-Maïto FatRepinBcb (
48023b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
48123b7c7b8SHermès Bélusca-Maïto     IN PBCB Bcb
48223b7c7b8SHermès Bélusca-Maïto     );
48323b7c7b8SHermès Bélusca-Maïto 
48423b7c7b8SHermès Bélusca-Maïto VOID
48523b7c7b8SHermès Bélusca-Maïto FatUnpinRepinnedBcbs (
48623b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext
48723b7c7b8SHermès Bélusca-Maïto     );
48823b7c7b8SHermès Bélusca-Maïto 
48923b7c7b8SHermès Bélusca-Maïto FINISHED
49023b7c7b8SHermès Bélusca-Maïto FatZeroData (
49123b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
49223b7c7b8SHermès Bélusca-Maïto     IN PVCB Vcb,
49323b7c7b8SHermès Bélusca-Maïto     IN PFILE_OBJECT FileObject,
49423b7c7b8SHermès Bélusca-Maïto     IN ULONG StartingZero,
49523b7c7b8SHermès Bélusca-Maïto     IN ULONG ByteCount
49623b7c7b8SHermès Bélusca-Maïto     );
49723b7c7b8SHermès Bélusca-Maïto 
49823b7c7b8SHermès Bélusca-Maïto NTSTATUS
49923b7c7b8SHermès Bélusca-Maïto FatCompleteMdl (
50023b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
50123b7c7b8SHermès Bélusca-Maïto     IN PIRP Irp
50223b7c7b8SHermès Bélusca-Maïto     );
50323b7c7b8SHermès Bélusca-Maïto 
50423b7c7b8SHermès Bélusca-Maïto VOID
50523b7c7b8SHermès Bélusca-Maïto FatPinMappedData (
50623b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
50723b7c7b8SHermès Bélusca-Maïto     IN PDCB Dcb,
50823b7c7b8SHermès Bélusca-Maïto     IN VBO StartingVbo,
50923b7c7b8SHermès Bélusca-Maïto     IN ULONG ByteCount,
51023b7c7b8SHermès Bélusca-Maïto     OUT PBCB *Bcb
51123b7c7b8SHermès Bélusca-Maïto     );
51223b7c7b8SHermès Bélusca-Maïto 
51323b7c7b8SHermès Bélusca-Maïto NTSTATUS
51423b7c7b8SHermès Bélusca-Maïto FatPrefetchPages (
51523b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
51623b7c7b8SHermès Bélusca-Maïto     IN PFILE_OBJECT FileObject,
51723b7c7b8SHermès Bélusca-Maïto     IN ULONG StartingPage,
51823b7c7b8SHermès Bélusca-Maïto     IN ULONG PageCount
51923b7c7b8SHermès Bélusca-Maïto     );
52023b7c7b8SHermès Bélusca-Maïto 
52123b7c7b8SHermès Bélusca-Maïto //
52223b7c7b8SHermès Bélusca-Maïto // VOID
52323b7c7b8SHermès Bélusca-Maïto // FatUnpinBcb (
52423b7c7b8SHermès Bélusca-Maïto //     IN PIRP_CONTEXT IrpContext,
52523b7c7b8SHermès Bélusca-Maïto //     IN OUT PBCB Bcb,
52623b7c7b8SHermès Bélusca-Maïto //     );
52723b7c7b8SHermès Bélusca-Maïto //
52823b7c7b8SHermès Bélusca-Maïto 
52923b7c7b8SHermès Bélusca-Maïto //
53023b7c7b8SHermès Bélusca-Maïto //  This macro unpins a Bcb, in the checked build make sure all
53123b7c7b8SHermès Bélusca-Maïto //  requests unpin all Bcbs before leaving.
53223b7c7b8SHermès Bélusca-Maïto //
53323b7c7b8SHermès Bélusca-Maïto 
53423b7c7b8SHermès Bélusca-Maïto #if DBG
53523b7c7b8SHermès Bélusca-Maïto 
53623b7c7b8SHermès Bélusca-Maïto #define FatUnpinBcb(IRPCONTEXT,BCB) {       \
53723b7c7b8SHermès Bélusca-Maïto     if ((BCB) != NULL) {                    \
53823b7c7b8SHermès Bélusca-Maïto         CcUnpinData((BCB));                 \
53923b7c7b8SHermès Bélusca-Maïto         NT_ASSERT( (IRPCONTEXT)->PinCount );\
54023b7c7b8SHermès Bélusca-Maïto         (IRPCONTEXT)->PinCount -= 1;        \
54123b7c7b8SHermès Bélusca-Maïto         (BCB) = NULL;                       \
54223b7c7b8SHermès Bélusca-Maïto     }                                       \
54323b7c7b8SHermès Bélusca-Maïto }
54423b7c7b8SHermès Bélusca-Maïto 
54523b7c7b8SHermès Bélusca-Maïto #else
54623b7c7b8SHermès Bélusca-Maïto 
54723b7c7b8SHermès Bélusca-Maïto #define FatUnpinBcb(IRPCONTEXT,BCB) { \
54823b7c7b8SHermès Bélusca-Maïto     if ((BCB) != NULL) {              \
54923b7c7b8SHermès Bélusca-Maïto         CcUnpinData((BCB));           \
55023b7c7b8SHermès Bélusca-Maïto         (BCB) = NULL;                 \
55123b7c7b8SHermès Bélusca-Maïto     }                                 \
55223b7c7b8SHermès Bélusca-Maïto }
55323b7c7b8SHermès Bélusca-Maïto 
55423b7c7b8SHermès Bélusca-Maïto #endif // DBG
55523b7c7b8SHermès Bélusca-Maïto 
55623b7c7b8SHermès Bélusca-Maïto VOID
55723b7c7b8SHermès Bélusca-Maïto FatInitializeCacheMap (
55823b7c7b8SHermès Bélusca-Maïto     _In_ PFILE_OBJECT FileObject,
55923b7c7b8SHermès Bélusca-Maïto     _In_ PCC_FILE_SIZES FileSizes,
56023b7c7b8SHermès Bélusca-Maïto     _In_ BOOLEAN PinAccess,
56123b7c7b8SHermès Bélusca-Maïto     _In_ PCACHE_MANAGER_CALLBACKS Callbacks,
56223b7c7b8SHermès Bélusca-Maïto     _In_ PVOID LazyWriteContext
56323b7c7b8SHermès Bélusca-Maïto     );
56423b7c7b8SHermès Bélusca-Maïto 
56523b7c7b8SHermès Bélusca-Maïto VOID
56623b7c7b8SHermès Bélusca-Maïto FatSyncUninitializeCacheMap (
56723b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
56823b7c7b8SHermès Bélusca-Maïto     IN PFILE_OBJECT FileObject
56923b7c7b8SHermès Bélusca-Maïto     );
57023b7c7b8SHermès Bélusca-Maïto 
57123b7c7b8SHermès Bélusca-Maïto 
57223b7c7b8SHermès Bélusca-Maïto //
57323b7c7b8SHermès Bélusca-Maïto //  Device I/O routines, implemented in DevIoSup.c
57423b7c7b8SHermès Bélusca-Maïto //
57523b7c7b8SHermès Bélusca-Maïto //  These routines perform the actual device read and writes.  They only affect
57623b7c7b8SHermès Bélusca-Maïto //  the on disk structure and do not alter any other data structures.
57723b7c7b8SHermès Bélusca-Maïto //
57823b7c7b8SHermès Bélusca-Maïto 
57923b7c7b8SHermès Bélusca-Maïto VOID
58023b7c7b8SHermès Bélusca-Maïto FatPagingFileIo (
58123b7c7b8SHermès Bélusca-Maïto     IN PIRP Irp,
58223b7c7b8SHermès Bélusca-Maïto     IN PFCB Fcb
58323b7c7b8SHermès Bélusca-Maïto     );
58423b7c7b8SHermès Bélusca-Maïto 
58523b7c7b8SHermès Bélusca-Maïto 
58623b7c7b8SHermès Bélusca-Maïto _Requires_lock_held_(_Global_critical_region_)
58723b7c7b8SHermès Bélusca-Maïto NTSTATUS
58823b7c7b8SHermès Bélusca-Maïto FatNonCachedIo (
58923b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
59023b7c7b8SHermès Bélusca-Maïto     IN PIRP Irp,
59123b7c7b8SHermès Bélusca-Maïto     IN PFCB FcbOrDcb,
59223b7c7b8SHermès Bélusca-Maïto     IN ULONG StartingVbo,
59323b7c7b8SHermès Bélusca-Maïto     IN ULONG ByteCount,
59423b7c7b8SHermès Bélusca-Maïto     IN ULONG UserByteCount,
59523b7c7b8SHermès Bélusca-Maïto     IN ULONG StreamFlags
59623b7c7b8SHermès Bélusca-Maïto     );
59723b7c7b8SHermès Bélusca-Maïto 
59823b7c7b8SHermès Bélusca-Maïto _Requires_lock_held_(_Global_critical_region_)
59923b7c7b8SHermès Bélusca-Maïto VOID
60023b7c7b8SHermès Bélusca-Maïto FatNonCachedNonAlignedRead (
60123b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
60223b7c7b8SHermès Bélusca-Maïto     IN PIRP Irp,
60323b7c7b8SHermès Bélusca-Maïto     IN PFCB FcbOrDcb,
60423b7c7b8SHermès Bélusca-Maïto     IN ULONG StartingVbo,
60523b7c7b8SHermès Bélusca-Maïto     IN ULONG ByteCount
60623b7c7b8SHermès Bélusca-Maïto     );
60723b7c7b8SHermès Bélusca-Maïto 
60823b7c7b8SHermès Bélusca-Maïto VOID
60923b7c7b8SHermès Bélusca-Maïto FatMultipleAsync (
61023b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
61123b7c7b8SHermès Bélusca-Maïto     IN PVCB Vcb,
61223b7c7b8SHermès Bélusca-Maïto     IN PIRP Irp,
61323b7c7b8SHermès Bélusca-Maïto     IN ULONG MultipleIrpCount,
61423b7c7b8SHermès Bélusca-Maïto     IN PIO_RUN IoRuns
61523b7c7b8SHermès Bélusca-Maïto     );
61623b7c7b8SHermès Bélusca-Maïto 
61723b7c7b8SHermès Bélusca-Maïto VOID
61823b7c7b8SHermès Bélusca-Maïto FatSingleAsync (
61923b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
62023b7c7b8SHermès Bélusca-Maïto     IN PVCB Vcb,
62123b7c7b8SHermès Bélusca-Maïto     IN LBO Lbo,
62223b7c7b8SHermès Bélusca-Maïto     IN ULONG ByteCount,
62323b7c7b8SHermès Bélusca-Maïto     IN PIRP Irp
62423b7c7b8SHermès Bélusca-Maïto     );
62523b7c7b8SHermès Bélusca-Maïto 
62623b7c7b8SHermès Bélusca-Maïto VOID
62723b7c7b8SHermès Bélusca-Maïto FatWaitSync (
62823b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext
62923b7c7b8SHermès Bélusca-Maïto     );
63023b7c7b8SHermès Bélusca-Maïto 
63123b7c7b8SHermès Bélusca-Maïto VOID
63223b7c7b8SHermès Bélusca-Maïto FatLockUserBuffer (
63323b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
63423b7c7b8SHermès Bélusca-Maïto     IN OUT PIRP Irp,
63523b7c7b8SHermès Bélusca-Maïto     IN LOCK_OPERATION Operation,
63623b7c7b8SHermès Bélusca-Maïto     IN ULONG BufferLength
63723b7c7b8SHermès Bélusca-Maïto     );
63823b7c7b8SHermès Bélusca-Maïto 
63923b7c7b8SHermès Bélusca-Maïto PVOID
64023b7c7b8SHermès Bélusca-Maïto FatBufferUserBuffer (
64123b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
64223b7c7b8SHermès Bélusca-Maïto     IN OUT PIRP Irp,
64323b7c7b8SHermès Bélusca-Maïto     IN ULONG BufferLength
64423b7c7b8SHermès Bélusca-Maïto     );
64523b7c7b8SHermès Bélusca-Maïto 
64623b7c7b8SHermès Bélusca-Maïto PVOID
64723b7c7b8SHermès Bélusca-Maïto FatMapUserBuffer (
64823b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
64923b7c7b8SHermès Bélusca-Maïto     IN OUT PIRP Irp
65023b7c7b8SHermès Bélusca-Maïto     );
65123b7c7b8SHermès Bélusca-Maïto 
65223b7c7b8SHermès Bélusca-Maïto NTSTATUS
65323b7c7b8SHermès Bélusca-Maïto FatToggleMediaEjectDisable (
65423b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
65523b7c7b8SHermès Bélusca-Maïto     IN PVCB Vcb,
65623b7c7b8SHermès Bélusca-Maïto     IN BOOLEAN PreventRemoval
65723b7c7b8SHermès Bélusca-Maïto     );
65823b7c7b8SHermès Bélusca-Maïto 
65923b7c7b8SHermès Bélusca-Maïto NTSTATUS
66023b7c7b8SHermès Bélusca-Maïto FatPerformDevIoCtrl (
66123b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
66223b7c7b8SHermès Bélusca-Maïto     IN ULONG IoControlCode,
66323b7c7b8SHermès Bélusca-Maïto     IN PDEVICE_OBJECT Device,
66423b7c7b8SHermès Bélusca-Maïto     IN PVOID InputBuffer OPTIONAL,
66523b7c7b8SHermès Bélusca-Maïto     IN ULONG InputBufferLength,
66623b7c7b8SHermès Bélusca-Maïto     OUT PVOID OutputBuffer OPTIONAL,
66723b7c7b8SHermès Bélusca-Maïto     IN ULONG OutputBufferLength,
66823b7c7b8SHermès Bélusca-Maïto     IN BOOLEAN InternalDeviceIoControl,
66923b7c7b8SHermès Bélusca-Maïto     IN BOOLEAN OverrideVerify,
67023b7c7b8SHermès Bélusca-Maïto     OUT PIO_STATUS_BLOCK Iosb OPTIONAL
67123b7c7b8SHermès Bélusca-Maïto     );
67223b7c7b8SHermès Bélusca-Maïto 
67323b7c7b8SHermès Bélusca-Maïto PMDL
67423b7c7b8SHermès Bélusca-Maïto FatBuildZeroMdl (
67523b7c7b8SHermès Bélusca-Maïto     __in PIRP_CONTEXT IrpContext,
67623b7c7b8SHermès Bélusca-Maïto     __in ULONG Length
67723b7c7b8SHermès Bélusca-Maïto     );
67823b7c7b8SHermès Bélusca-Maïto 
67923b7c7b8SHermès Bélusca-Maïto 
68023b7c7b8SHermès Bélusca-Maïto //
68123b7c7b8SHermès Bélusca-Maïto //  Dirent support routines, implemented in DirSup.c
68223b7c7b8SHermès Bélusca-Maïto //
68323b7c7b8SHermès Bélusca-Maïto 
68423b7c7b8SHermès Bélusca-Maïto //
68523b7c7b8SHermès Bélusca-Maïto //  Tunneling is a deletion precursor (all tunneling cases do
68623b7c7b8SHermès Bélusca-Maïto //  not involve deleting dirents, however)
68723b7c7b8SHermès Bélusca-Maïto //
68823b7c7b8SHermès Bélusca-Maïto 
68923b7c7b8SHermès Bélusca-Maïto VOID
69023b7c7b8SHermès Bélusca-Maïto FatTunnelFcbOrDcb (
69123b7c7b8SHermès Bélusca-Maïto     IN PFCB FcbOrDcb,
69223b7c7b8SHermès Bélusca-Maïto     IN PCCB Ccb OPTIONAL
69323b7c7b8SHermès Bélusca-Maïto     );
69423b7c7b8SHermès Bélusca-Maïto 
69523b7c7b8SHermès Bélusca-Maïto _Requires_lock_held_(_Global_critical_region_)
69623b7c7b8SHermès Bélusca-Maïto ULONG
69723b7c7b8SHermès Bélusca-Maïto FatCreateNewDirent (
69823b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
69923b7c7b8SHermès Bélusca-Maïto     IN PDCB ParentDirectory,
70023b7c7b8SHermès Bélusca-Maïto     IN ULONG DirentsNeeded,
70123b7c7b8SHermès Bélusca-Maïto     IN BOOLEAN RescanDir
70223b7c7b8SHermès Bélusca-Maïto     );
70323b7c7b8SHermès Bélusca-Maïto 
70423b7c7b8SHermès Bélusca-Maïto _Requires_lock_held_(_Global_critical_region_)
70523b7c7b8SHermès Bélusca-Maïto VOID
70623b7c7b8SHermès Bélusca-Maïto FatInitializeDirectoryDirent (
70723b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
70823b7c7b8SHermès Bélusca-Maïto     IN PDCB Dcb,
70923b7c7b8SHermès Bélusca-Maïto     IN PDIRENT ParentDirent
71023b7c7b8SHermès Bélusca-Maïto     );
71123b7c7b8SHermès Bélusca-Maïto 
71223b7c7b8SHermès Bélusca-Maïto _Requires_lock_held_(_Global_critical_region_)
71323b7c7b8SHermès Bélusca-Maïto VOID
71423b7c7b8SHermès Bélusca-Maïto FatDeleteDirent (
71523b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
71623b7c7b8SHermès Bélusca-Maïto     IN PFCB FcbOrDcb,
71723b7c7b8SHermès Bélusca-Maïto     IN PDELETE_CONTEXT DeleteContext OPTIONAL,
71823b7c7b8SHermès Bélusca-Maïto     IN BOOLEAN DeleteEa
71923b7c7b8SHermès Bélusca-Maïto     );
72023b7c7b8SHermès Bélusca-Maïto 
72123b7c7b8SHermès Bélusca-Maïto 
72223b7c7b8SHermès Bélusca-Maïto _Requires_lock_held_(_Global_critical_region_)
72323b7c7b8SHermès Bélusca-Maïto VOID
72423b7c7b8SHermès Bélusca-Maïto FatLocateDirent (
72523b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
72623b7c7b8SHermès Bélusca-Maïto     IN PDCB ParentDirectory,
72723b7c7b8SHermès Bélusca-Maïto     IN PCCB Ccb,
72823b7c7b8SHermès Bélusca-Maïto     IN VBO OffsetToStartSearchFrom,
72923b7c7b8SHermès Bélusca-Maïto     IN OUT PULONG Flags,
73023b7c7b8SHermès Bélusca-Maïto     OUT PDIRENT *Dirent,
73123b7c7b8SHermès Bélusca-Maïto     OUT PBCB *Bcb,
73223b7c7b8SHermès Bélusca-Maïto     OUT PVBO ByteOffset,
73323b7c7b8SHermès Bélusca-Maïto     OUT PBOOLEAN FileNameDos OPTIONAL,
73423b7c7b8SHermès Bélusca-Maïto     IN OUT PUNICODE_STRING Lfn OPTIONAL,
73523b7c7b8SHermès Bélusca-Maïto     IN OUT PUNICODE_STRING OrigLfn OPTIONAL
73623b7c7b8SHermès Bélusca-Maïto     );
73723b7c7b8SHermès Bélusca-Maïto 
73823b7c7b8SHermès Bélusca-Maïto _Requires_lock_held_(_Global_critical_region_)
73923b7c7b8SHermès Bélusca-Maïto VOID
74023b7c7b8SHermès Bélusca-Maïto FatLocateSimpleOemDirent (
74123b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
74223b7c7b8SHermès Bélusca-Maïto     IN PDCB ParentDirectory,
74323b7c7b8SHermès Bélusca-Maïto     IN POEM_STRING FileName,
74423b7c7b8SHermès Bélusca-Maïto     OUT PDIRENT *Dirent,
74523b7c7b8SHermès Bélusca-Maïto     OUT PBCB *Bcb,
74623b7c7b8SHermès Bélusca-Maïto     OUT PVBO ByteOffset
74723b7c7b8SHermès Bélusca-Maïto     );
74823b7c7b8SHermès Bélusca-Maïto 
74923b7c7b8SHermès Bélusca-Maïto _Requires_lock_held_(_Global_critical_region_)
75023b7c7b8SHermès Bélusca-Maïto BOOLEAN
75123b7c7b8SHermès Bélusca-Maïto FatLfnDirentExists (
75223b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
75323b7c7b8SHermès Bélusca-Maïto     IN PDCB Dcb,
75423b7c7b8SHermès Bélusca-Maïto     IN PUNICODE_STRING Lfn,
75523b7c7b8SHermès Bélusca-Maïto     IN PUNICODE_STRING LfnTmp
75623b7c7b8SHermès Bélusca-Maïto     );
75723b7c7b8SHermès Bélusca-Maïto 
75823b7c7b8SHermès Bélusca-Maïto _Requires_lock_held_(_Global_critical_region_)
75923b7c7b8SHermès Bélusca-Maïto VOID
76023b7c7b8SHermès Bélusca-Maïto FatLocateVolumeLabel (
76123b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
76223b7c7b8SHermès Bélusca-Maïto     IN PVCB Vcb,
76323b7c7b8SHermès Bélusca-Maïto     OUT PDIRENT *Dirent,
76423b7c7b8SHermès Bélusca-Maïto     OUT PBCB *Bcb,
76523b7c7b8SHermès Bélusca-Maïto     OUT PVBO ByteOffset
76623b7c7b8SHermès Bélusca-Maïto     );
76723b7c7b8SHermès Bélusca-Maïto 
76823b7c7b8SHermès Bélusca-Maïto _Requires_lock_held_(_Global_critical_region_)
76923b7c7b8SHermès Bélusca-Maïto VOID
77023b7c7b8SHermès Bélusca-Maïto FatGetDirentFromFcbOrDcb (
77123b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
77223b7c7b8SHermès Bélusca-Maïto     IN PFCB FcbOrDcb,
77323b7c7b8SHermès Bélusca-Maïto     IN BOOLEAN ReturnOnFailure,
77423b7c7b8SHermès Bélusca-Maïto     OUT PDIRENT *Dirent,
77523b7c7b8SHermès Bélusca-Maïto     OUT PBCB *Bcb
77623b7c7b8SHermès Bélusca-Maïto     );
77723b7c7b8SHermès Bélusca-Maïto 
77823b7c7b8SHermès Bélusca-Maïto _Requires_lock_held_(_Global_critical_region_)
77923b7c7b8SHermès Bélusca-Maïto BOOLEAN
78023b7c7b8SHermès Bélusca-Maïto FatIsDirectoryEmpty (
78123b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
78223b7c7b8SHermès Bélusca-Maïto     IN PDCB Dcb
78323b7c7b8SHermès Bélusca-Maïto     );
78423b7c7b8SHermès Bélusca-Maïto 
78523b7c7b8SHermès Bélusca-Maïto _Requires_lock_held_(_Global_critical_region_)
78623b7c7b8SHermès Bélusca-Maïto VOID
78723b7c7b8SHermès Bélusca-Maïto FatDeleteFile (
78823b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
78923b7c7b8SHermès Bélusca-Maïto     IN PDCB TargetDcb,
79023b7c7b8SHermès Bélusca-Maïto     IN ULONG LfnOffset,
79123b7c7b8SHermès Bélusca-Maïto     IN ULONG DirentOffset,
79223b7c7b8SHermès Bélusca-Maïto     IN PDIRENT Dirent,
79323b7c7b8SHermès Bélusca-Maïto     IN PUNICODE_STRING Lfn
79423b7c7b8SHermès Bélusca-Maïto     );
79523b7c7b8SHermès Bélusca-Maïto 
79623b7c7b8SHermès Bélusca-Maïto 
79723b7c7b8SHermès Bélusca-Maïto VOID
79823b7c7b8SHermès Bélusca-Maïto FatConstructDirent (
79923b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
80023b7c7b8SHermès Bélusca-Maïto     IN OUT PDIRENT Dirent,
80123b7c7b8SHermès Bélusca-Maïto     IN POEM_STRING FileName,
80223b7c7b8SHermès Bélusca-Maïto     IN BOOLEAN ComponentReallyLowercase,
80323b7c7b8SHermès Bélusca-Maïto     IN BOOLEAN ExtensionReallyLowercase,
80423b7c7b8SHermès Bélusca-Maïto     IN PUNICODE_STRING Lfn OPTIONAL,
80523b7c7b8SHermès Bélusca-Maïto     IN USHORT Attributes,
80623b7c7b8SHermès Bélusca-Maïto     IN BOOLEAN ZeroAndSetTimeFields,
80723b7c7b8SHermès Bélusca-Maïto     IN PLARGE_INTEGER SetCreationTime OPTIONAL
80823b7c7b8SHermès Bélusca-Maïto     );
80923b7c7b8SHermès Bélusca-Maïto 
81023b7c7b8SHermès Bélusca-Maïto VOID
81123b7c7b8SHermès Bélusca-Maïto FatConstructLabelDirent (
81223b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
81323b7c7b8SHermès Bélusca-Maïto     IN OUT PDIRENT Dirent,
81423b7c7b8SHermès Bélusca-Maïto     IN POEM_STRING Label
81523b7c7b8SHermès Bélusca-Maïto     );
81623b7c7b8SHermès Bélusca-Maïto 
81723b7c7b8SHermès Bélusca-Maïto _Requires_lock_held_(_Global_critical_region_)
81823b7c7b8SHermès Bélusca-Maïto VOID
81923b7c7b8SHermès Bélusca-Maïto FatSetFileSizeInDirent (
82023b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
82123b7c7b8SHermès Bélusca-Maïto     IN PFCB Fcb,
82223b7c7b8SHermès Bélusca-Maïto     IN PULONG AlternativeFileSize OPTIONAL
82323b7c7b8SHermès Bélusca-Maïto     );
82423b7c7b8SHermès Bélusca-Maïto 
82523b7c7b8SHermès Bélusca-Maïto _Requires_lock_held_(_Global_critical_region_)
82623b7c7b8SHermès Bélusca-Maïto VOID
82723b7c7b8SHermès Bélusca-Maïto FatSetFileSizeInDirentNoRaise (
82823b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
82923b7c7b8SHermès Bélusca-Maïto     IN PFCB Fcb,
83023b7c7b8SHermès Bélusca-Maïto     IN PULONG AlternativeFileSize OPTIONAL
83123b7c7b8SHermès Bélusca-Maïto     );
83223b7c7b8SHermès Bélusca-Maïto 
83323b7c7b8SHermès Bélusca-Maïto 
83423b7c7b8SHermès Bélusca-Maïto _Requires_lock_held_(_Global_critical_region_)
83523b7c7b8SHermès Bélusca-Maïto VOID
83623b7c7b8SHermès Bélusca-Maïto FatUpdateDirentFromFcb (
83723b7c7b8SHermès Bélusca-Maïto    IN PIRP_CONTEXT IrpContext,
83823b7c7b8SHermès Bélusca-Maïto    IN PFILE_OBJECT FileObject,
83923b7c7b8SHermès Bélusca-Maïto    IN PFCB FcbOrDcb,
84023b7c7b8SHermès Bélusca-Maïto    IN PCCB Ccb
84123b7c7b8SHermès Bélusca-Maïto    );
84223b7c7b8SHermès Bélusca-Maïto 
84323b7c7b8SHermès Bélusca-Maïto 
84423b7c7b8SHermès Bélusca-Maïto //
84523b7c7b8SHermès Bélusca-Maïto //  Generate a relatively unique static 64bit ID from a FAT Fcb/Dcb
84623b7c7b8SHermès Bélusca-Maïto //
84723b7c7b8SHermès Bélusca-Maïto //  ULONGLONG
84823b7c7b8SHermès Bélusca-Maïto //  FatDirectoryKey (FcbOrDcb);
84923b7c7b8SHermès Bélusca-Maïto //
85023b7c7b8SHermès Bélusca-Maïto 
85123b7c7b8SHermès Bélusca-Maïto #define FatDirectoryKey(FcbOrDcb)  ((ULONGLONG)((FcbOrDcb)->CreationTime.QuadPart ^ (FcbOrDcb)->FirstClusterOfFile))
85223b7c7b8SHermès Bélusca-Maïto 
85323b7c7b8SHermès Bélusca-Maïto 
85423b7c7b8SHermès Bélusca-Maïto //
85523b7c7b8SHermès Bélusca-Maïto //  The following routines are used to access and manipulate the
85623b7c7b8SHermès Bélusca-Maïto //  clusters containing EA data in the ea data file.  They are
85723b7c7b8SHermès Bélusca-Maïto //  implemented in EaSup.c
85823b7c7b8SHermès Bélusca-Maïto //
85923b7c7b8SHermès Bélusca-Maïto 
86023b7c7b8SHermès Bélusca-Maïto //
86123b7c7b8SHermès Bélusca-Maïto //  VOID
86223b7c7b8SHermès Bélusca-Maïto //  FatUpcaseEaName (
86323b7c7b8SHermès Bélusca-Maïto //      IN PIRP_CONTEXT IrpContext,
86423b7c7b8SHermès Bélusca-Maïto //      IN POEM_STRING EaName,
86523b7c7b8SHermès Bélusca-Maïto //      OUT POEM_STRING UpcasedEaName
86623b7c7b8SHermès Bélusca-Maïto //      );
86723b7c7b8SHermès Bélusca-Maïto //
86823b7c7b8SHermès Bélusca-Maïto 
86923b7c7b8SHermès Bélusca-Maïto #define FatUpcaseEaName( IRPCONTEXT, NAME, UPCASEDNAME ) \
87023b7c7b8SHermès Bélusca-Maïto     RtlUpperString( UPCASEDNAME, NAME )
87123b7c7b8SHermès Bélusca-Maïto 
87223b7c7b8SHermès Bélusca-Maïto _Requires_lock_held_(_Global_critical_region_)
87323b7c7b8SHermès Bélusca-Maïto VOID
87423b7c7b8SHermès Bélusca-Maïto FatGetEaLength (
87523b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
87623b7c7b8SHermès Bélusca-Maïto     IN PVCB Vcb,
87723b7c7b8SHermès Bélusca-Maïto     IN PDIRENT Dirent,
87823b7c7b8SHermès Bélusca-Maïto     OUT PULONG EaLength
87923b7c7b8SHermès Bélusca-Maïto     );
88023b7c7b8SHermès Bélusca-Maïto 
88123b7c7b8SHermès Bélusca-Maïto _Requires_lock_held_(_Global_critical_region_)
88223b7c7b8SHermès Bélusca-Maïto VOID
88323b7c7b8SHermès Bélusca-Maïto FatGetNeedEaCount (
88423b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
88523b7c7b8SHermès Bélusca-Maïto     IN PVCB Vcb,
88623b7c7b8SHermès Bélusca-Maïto     IN PDIRENT Dirent,
88723b7c7b8SHermès Bélusca-Maïto     OUT PULONG NeedEaCount
88823b7c7b8SHermès Bélusca-Maïto     );
88923b7c7b8SHermès Bélusca-Maïto 
89023b7c7b8SHermès Bélusca-Maïto _Requires_lock_held_(_Global_critical_region_)
89123b7c7b8SHermès Bélusca-Maïto VOID
89223b7c7b8SHermès Bélusca-Maïto FatCreateEa (
89323b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
89423b7c7b8SHermès Bélusca-Maïto     IN PVCB Vcb,
89523b7c7b8SHermès Bélusca-Maïto     IN PUCHAR Buffer,
89623b7c7b8SHermès Bélusca-Maïto     IN ULONG Length,
89723b7c7b8SHermès Bélusca-Maïto     IN POEM_STRING FileName,
89823b7c7b8SHermès Bélusca-Maïto     OUT PUSHORT EaHandle
89923b7c7b8SHermès Bélusca-Maïto     );
90023b7c7b8SHermès Bélusca-Maïto 
90123b7c7b8SHermès Bélusca-Maïto _Requires_lock_held_(_Global_critical_region_)
90223b7c7b8SHermès Bélusca-Maïto VOID
90323b7c7b8SHermès Bélusca-Maïto FatDeleteEa (
90423b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
90523b7c7b8SHermès Bélusca-Maïto     IN PVCB Vcb,
90623b7c7b8SHermès Bélusca-Maïto     IN USHORT EaHandle,
90723b7c7b8SHermès Bélusca-Maïto     IN POEM_STRING FileName
90823b7c7b8SHermès Bélusca-Maïto     );
90923b7c7b8SHermès Bélusca-Maïto 
91023b7c7b8SHermès Bélusca-Maïto _Requires_lock_held_(_Global_critical_region_)
91123b7c7b8SHermès Bélusca-Maïto VOID
91223b7c7b8SHermès Bélusca-Maïto FatGetEaFile (
91323b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
91423b7c7b8SHermès Bélusca-Maïto     IN OUT PVCB Vcb,
91523b7c7b8SHermès Bélusca-Maïto     OUT PDIRENT *EaDirent,
91623b7c7b8SHermès Bélusca-Maïto     OUT PBCB *EaBcb,
91723b7c7b8SHermès Bélusca-Maïto     IN BOOLEAN CreateFile,
91823b7c7b8SHermès Bélusca-Maïto     IN BOOLEAN ExclusiveFcb
91923b7c7b8SHermès Bélusca-Maïto     );
92023b7c7b8SHermès Bélusca-Maïto 
92123b7c7b8SHermès Bélusca-Maïto VOID
92223b7c7b8SHermès Bélusca-Maïto FatReadEaSet (
92323b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
92423b7c7b8SHermès Bélusca-Maïto     IN PVCB Vcb,
92523b7c7b8SHermès Bélusca-Maïto     IN USHORT EaHandle,
92623b7c7b8SHermès Bélusca-Maïto     IN POEM_STRING FileName,
92723b7c7b8SHermès Bélusca-Maïto     IN BOOLEAN ReturnEntireSet,
92823b7c7b8SHermès Bélusca-Maïto     OUT PEA_RANGE EaSetRange
92923b7c7b8SHermès Bélusca-Maïto     );
93023b7c7b8SHermès Bélusca-Maïto 
93123b7c7b8SHermès Bélusca-Maïto _Requires_lock_held_(_Global_critical_region_)
93223b7c7b8SHermès Bélusca-Maïto VOID
93323b7c7b8SHermès Bélusca-Maïto FatDeleteEaSet (
93423b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
93523b7c7b8SHermès Bélusca-Maïto     IN PVCB Vcb,
93623b7c7b8SHermès Bélusca-Maïto     IN PBCB EaBcb,
93723b7c7b8SHermès Bélusca-Maïto     OUT PDIRENT EaDirent,
93823b7c7b8SHermès Bélusca-Maïto     IN USHORT EaHandle,
93923b7c7b8SHermès Bélusca-Maïto     IN POEM_STRING Filename
94023b7c7b8SHermès Bélusca-Maïto     );
94123b7c7b8SHermès Bélusca-Maïto 
94223b7c7b8SHermès Bélusca-Maïto _Requires_lock_held_(_Global_critical_region_)
94323b7c7b8SHermès Bélusca-Maïto VOID
94423b7c7b8SHermès Bélusca-Maïto FatAddEaSet (
94523b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
94623b7c7b8SHermès Bélusca-Maïto     IN PVCB Vcb,
94723b7c7b8SHermès Bélusca-Maïto     IN ULONG EaSetLength,
94823b7c7b8SHermès Bélusca-Maïto     IN PBCB EaBcb,
94923b7c7b8SHermès Bélusca-Maïto     OUT PDIRENT EaDirent,
95023b7c7b8SHermès Bélusca-Maïto     OUT PUSHORT EaHandle,
95123b7c7b8SHermès Bélusca-Maïto     OUT PEA_RANGE EaSetRange
95223b7c7b8SHermès Bélusca-Maïto     );
95323b7c7b8SHermès Bélusca-Maïto 
95423b7c7b8SHermès Bélusca-Maïto VOID
95523b7c7b8SHermès Bélusca-Maïto FatDeletePackedEa (
95623b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
95723b7c7b8SHermès Bélusca-Maïto     IN OUT PEA_SET_HEADER EaSetHeader,
95823b7c7b8SHermès Bélusca-Maïto     IN OUT PULONG PackedEasLength,
95923b7c7b8SHermès Bélusca-Maïto     IN ULONG Offset
96023b7c7b8SHermès Bélusca-Maïto     );
96123b7c7b8SHermès Bélusca-Maïto 
96223b7c7b8SHermès Bélusca-Maïto VOID
96323b7c7b8SHermès Bélusca-Maïto FatAppendPackedEa (
96423b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
96523b7c7b8SHermès Bélusca-Maïto     IN OUT PEA_SET_HEADER *EaSetHeader,
96623b7c7b8SHermès Bélusca-Maïto     IN OUT PULONG PackedEasLength,
96723b7c7b8SHermès Bélusca-Maïto     IN OUT PULONG AllocationLength,
96823b7c7b8SHermès Bélusca-Maïto     IN PFILE_FULL_EA_INFORMATION FullEa,
96923b7c7b8SHermès Bélusca-Maïto     IN ULONG BytesPerCluster
97023b7c7b8SHermès Bélusca-Maïto     );
97123b7c7b8SHermès Bélusca-Maïto 
97223b7c7b8SHermès Bélusca-Maïto ULONG
97323b7c7b8SHermès Bélusca-Maïto FatLocateNextEa (
97423b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
97523b7c7b8SHermès Bélusca-Maïto     IN PPACKED_EA FirstPackedEa,
97623b7c7b8SHermès Bélusca-Maïto     IN ULONG PackedEasLength,
97723b7c7b8SHermès Bélusca-Maïto     IN ULONG PreviousOffset
97823b7c7b8SHermès Bélusca-Maïto     );
97923b7c7b8SHermès Bélusca-Maïto 
98023b7c7b8SHermès Bélusca-Maïto BOOLEAN
98123b7c7b8SHermès Bélusca-Maïto FatLocateEaByName (
98223b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
98323b7c7b8SHermès Bélusca-Maïto     IN PPACKED_EA FirstPackedEa,
98423b7c7b8SHermès Bélusca-Maïto     IN ULONG PackedEasLength,
98523b7c7b8SHermès Bélusca-Maïto     IN POEM_STRING EaName,
98623b7c7b8SHermès Bélusca-Maïto     OUT PULONG Offset
98723b7c7b8SHermès Bélusca-Maïto     );
98823b7c7b8SHermès Bélusca-Maïto 
98923b7c7b8SHermès Bélusca-Maïto BOOLEAN
99023b7c7b8SHermès Bélusca-Maïto FatIsEaNameValid (
99123b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
99223b7c7b8SHermès Bélusca-Maïto     IN OEM_STRING Name
99323b7c7b8SHermès Bélusca-Maïto     );
99423b7c7b8SHermès Bélusca-Maïto 
99523b7c7b8SHermès Bélusca-Maïto VOID
99623b7c7b8SHermès Bélusca-Maïto FatPinEaRange (
99723b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
99823b7c7b8SHermès Bélusca-Maïto     IN PFILE_OBJECT VirtualEaFile,
99923b7c7b8SHermès Bélusca-Maïto     IN PFCB EaFcb,
100023b7c7b8SHermès Bélusca-Maïto     IN OUT PEA_RANGE EaRange,
100123b7c7b8SHermès Bélusca-Maïto     IN ULONG StartingVbo,
100223b7c7b8SHermès Bélusca-Maïto     IN ULONG Length,
100323b7c7b8SHermès Bélusca-Maïto     IN NTSTATUS ErrorStatus
100423b7c7b8SHermès Bélusca-Maïto     );
100523b7c7b8SHermès Bélusca-Maïto 
100623b7c7b8SHermès Bélusca-Maïto VOID
100723b7c7b8SHermès Bélusca-Maïto FatMarkEaRangeDirty (
100823b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
100923b7c7b8SHermès Bélusca-Maïto     IN PFILE_OBJECT EaFileObject,
101023b7c7b8SHermès Bélusca-Maïto     IN OUT PEA_RANGE EaRange
101123b7c7b8SHermès Bélusca-Maïto     );
101223b7c7b8SHermès Bélusca-Maïto 
101323b7c7b8SHermès Bélusca-Maïto VOID
101423b7c7b8SHermès Bélusca-Maïto FatUnpinEaRange (
101523b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
101623b7c7b8SHermès Bélusca-Maïto     IN OUT PEA_RANGE EaRange
101723b7c7b8SHermès Bélusca-Maïto     );
101823b7c7b8SHermès Bélusca-Maïto 
101923b7c7b8SHermès Bélusca-Maïto //
102023b7c7b8SHermès Bélusca-Maïto //  The following macro computes the size of a full ea (not including
102123b7c7b8SHermès Bélusca-Maïto //  padding to bring it to a longword.  A full ea has a 4 byte offset,
102223b7c7b8SHermès Bélusca-Maïto //  folowed by 1 byte flag, 1 byte name length, 2 bytes value length,
102323b7c7b8SHermès Bélusca-Maïto //  the name, 1 null byte, and the value.
102423b7c7b8SHermès Bélusca-Maïto //
102523b7c7b8SHermès Bélusca-Maïto //      ULONG
102623b7c7b8SHermès Bélusca-Maïto //      SizeOfFullEa (
102723b7c7b8SHermès Bélusca-Maïto //          IN PFILE_FULL_EA_INFORMATION FullEa
102823b7c7b8SHermès Bélusca-Maïto //          );
102923b7c7b8SHermès Bélusca-Maïto //
103023b7c7b8SHermès Bélusca-Maïto 
103123b7c7b8SHermès Bélusca-Maïto #define SizeOfFullEa(EA) (4+1+1+2+(EA)->EaNameLength+1+(EA)->EaValueLength)
103223b7c7b8SHermès Bélusca-Maïto 
103323b7c7b8SHermès Bélusca-Maïto 
103423b7c7b8SHermès Bélusca-Maïto //
103523b7c7b8SHermès Bélusca-Maïto //  The following routines are used to manipulate the fscontext fields
103623b7c7b8SHermès Bélusca-Maïto //  of the file object, implemented in FilObSup.c
103723b7c7b8SHermès Bélusca-Maïto //
103823b7c7b8SHermès Bélusca-Maïto 
103923b7c7b8SHermès Bélusca-Maïto #ifndef __REACTOS__
104023b7c7b8SHermès Bélusca-Maïto typedef enum _TYPE_OF_OPEN {
104123b7c7b8SHermès Bélusca-Maïto 
104223b7c7b8SHermès Bélusca-Maïto     UnopenedFileObject = 1,
104323b7c7b8SHermès Bélusca-Maïto     UserFileOpen,
104423b7c7b8SHermès Bélusca-Maïto     UserDirectoryOpen,
104523b7c7b8SHermès Bélusca-Maïto     UserVolumeOpen,
104623b7c7b8SHermès Bélusca-Maïto     VirtualVolumeFile,
104723b7c7b8SHermès Bélusca-Maïto     DirectoryFile,
104823b7c7b8SHermès Bélusca-Maïto     EaFile,
104923b7c7b8SHermès Bélusca-Maïto } TYPE_OF_OPEN;
105023b7c7b8SHermès Bélusca-Maïto #endif
105123b7c7b8SHermès Bélusca-Maïto 
105223b7c7b8SHermès Bélusca-Maïto typedef enum _FAT_FLUSH_TYPE {
105323b7c7b8SHermès Bélusca-Maïto 
105423b7c7b8SHermès Bélusca-Maïto     NoFlush = 0,
105523b7c7b8SHermès Bélusca-Maïto     Flush,
105623b7c7b8SHermès Bélusca-Maïto     FlushAndInvalidate,
105723b7c7b8SHermès Bélusca-Maïto     FlushWithoutPurge
105823b7c7b8SHermès Bélusca-Maïto 
105923b7c7b8SHermès Bélusca-Maïto } FAT_FLUSH_TYPE;
106023b7c7b8SHermès Bélusca-Maïto 
106123b7c7b8SHermès Bélusca-Maïto VOID
106223b7c7b8SHermès Bélusca-Maïto FatSetFileObject (
106323b7c7b8SHermès Bélusca-Maïto     IN PFILE_OBJECT FileObject OPTIONAL,
106423b7c7b8SHermès Bélusca-Maïto     IN TYPE_OF_OPEN TypeOfOpen,
106523b7c7b8SHermès Bélusca-Maïto     IN PVOID VcbOrFcbOrDcb,
106623b7c7b8SHermès Bélusca-Maïto     IN PCCB Ccb OPTIONAL
106723b7c7b8SHermès Bélusca-Maïto     );
106823b7c7b8SHermès Bélusca-Maïto 
106923b7c7b8SHermès Bélusca-Maïto TYPE_OF_OPEN
107023b7c7b8SHermès Bélusca-Maïto FatDecodeFileObject (
107123b7c7b8SHermès Bélusca-Maïto     _In_ PFILE_OBJECT FileObject,
107223b7c7b8SHermès Bélusca-Maïto     _Outptr_ PVCB *Vcb,
107323b7c7b8SHermès Bélusca-Maïto     _Outptr_ PFCB *FcbOrDcb,
107423b7c7b8SHermès Bélusca-Maïto     _Outptr_ PCCB *Ccb
107523b7c7b8SHermès Bélusca-Maïto     );
107623b7c7b8SHermès Bélusca-Maïto 
107723b7c7b8SHermès Bélusca-Maïto _Requires_lock_held_(_Global_critical_region_)
107823b7c7b8SHermès Bélusca-Maïto VOID
107923b7c7b8SHermès Bélusca-Maïto FatPurgeReferencedFileObjects (
108023b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
108123b7c7b8SHermès Bélusca-Maïto     IN PFCB FcbOrDcb,
108223b7c7b8SHermès Bélusca-Maïto     IN FAT_FLUSH_TYPE FlushType
108323b7c7b8SHermès Bélusca-Maïto     );
108423b7c7b8SHermès Bélusca-Maïto 
108523b7c7b8SHermès Bélusca-Maïto _Requires_lock_held_(_Global_critical_region_)
108623b7c7b8SHermès Bélusca-Maïto VOID
108723b7c7b8SHermès Bélusca-Maïto FatForceCacheMiss (
108823b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
108923b7c7b8SHermès Bélusca-Maïto     IN PFCB Fcb,
109023b7c7b8SHermès Bélusca-Maïto     IN FAT_FLUSH_TYPE FlushType
109123b7c7b8SHermès Bélusca-Maïto     );
109223b7c7b8SHermès Bélusca-Maïto 
109323b7c7b8SHermès Bélusca-Maïto 
109423b7c7b8SHermès Bélusca-Maïto //
109523b7c7b8SHermès Bélusca-Maïto //  File system control routines, implemented in FsCtrl.c
109623b7c7b8SHermès Bélusca-Maïto //
109723b7c7b8SHermès Bélusca-Maïto 
109823b7c7b8SHermès Bélusca-Maïto _Requires_lock_held_(_Global_critical_region_)
109923b7c7b8SHermès Bélusca-Maïto VOID
110023b7c7b8SHermès Bélusca-Maïto FatFlushAndCleanVolume(
110123b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
110223b7c7b8SHermès Bélusca-Maïto     IN PIRP Irp,
110323b7c7b8SHermès Bélusca-Maïto     IN PVCB Vcb,
110423b7c7b8SHermès Bélusca-Maïto     IN FAT_FLUSH_TYPE FlushType
110523b7c7b8SHermès Bélusca-Maïto     );
110623b7c7b8SHermès Bélusca-Maïto 
110723b7c7b8SHermès Bélusca-Maïto BOOLEAN
110823b7c7b8SHermès Bélusca-Maïto FatIsBootSectorFat (
110923b7c7b8SHermès Bélusca-Maïto     IN PPACKED_BOOT_SECTOR BootSector
111023b7c7b8SHermès Bélusca-Maïto     );
111123b7c7b8SHermès Bélusca-Maïto 
111223b7c7b8SHermès Bélusca-Maïto _Requires_lock_held_(_Global_critical_region_)
111323b7c7b8SHermès Bélusca-Maïto NTSTATUS
111423b7c7b8SHermès Bélusca-Maïto FatLockVolumeInternal (
111523b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
111623b7c7b8SHermès Bélusca-Maïto     IN PVCB Vcb,
111723b7c7b8SHermès Bélusca-Maïto     IN PFILE_OBJECT FileObject OPTIONAL
111823b7c7b8SHermès Bélusca-Maïto     );
111923b7c7b8SHermès Bélusca-Maïto 
112023b7c7b8SHermès Bélusca-Maïto NTSTATUS
112123b7c7b8SHermès Bélusca-Maïto FatUnlockVolumeInternal (
112223b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
112323b7c7b8SHermès Bélusca-Maïto     IN PVCB Vcb,
112423b7c7b8SHermès Bélusca-Maïto     IN PFILE_OBJECT FileObject OPTIONAL
112523b7c7b8SHermès Bélusca-Maïto     );
112623b7c7b8SHermès Bélusca-Maïto 
112723b7c7b8SHermès Bélusca-Maïto 
112823b7c7b8SHermès Bélusca-Maïto //
112923b7c7b8SHermès Bélusca-Maïto //  Name support routines, implemented in NameSup.c
113023b7c7b8SHermès Bélusca-Maïto //
113123b7c7b8SHermès Bélusca-Maïto 
113223b7c7b8SHermès Bélusca-Maïto //
113323b7c7b8SHermès Bélusca-Maïto //  BOOLEAN
113423b7c7b8SHermès Bélusca-Maïto //  FatAreNamesEqual (
113523b7c7b8SHermès Bélusca-Maïto //      IN PIRP_CONTEXT IrpContext,
113623b7c7b8SHermès Bélusca-Maïto //      IN OEM_STRING ConstantNameA,
113723b7c7b8SHermès Bélusca-Maïto //      IN OEM_STRING ConstantNameB
113823b7c7b8SHermès Bélusca-Maïto //      )
113923b7c7b8SHermès Bélusca-Maïto //
114023b7c7b8SHermès Bélusca-Maïto //  /*++
114123b7c7b8SHermès Bélusca-Maïto //
114223b7c7b8SHermès Bélusca-Maïto //  Routine Description:
114323b7c7b8SHermès Bélusca-Maïto //
114423b7c7b8SHermès Bélusca-Maïto //      This routine simple returns whether the two names are exactly equal.
114523b7c7b8SHermès Bélusca-Maïto //      If the two names are known to be constant, this routine is much
114623b7c7b8SHermès Bélusca-Maïto //      faster than FatIsDbcsInExpression.
114723b7c7b8SHermès Bélusca-Maïto //
114823b7c7b8SHermès Bélusca-Maïto //  Arguments:
114923b7c7b8SHermès Bélusca-Maïto //
115023b7c7b8SHermès Bélusca-Maïto //      ConstantNameA - Constant name.
115123b7c7b8SHermès Bélusca-Maïto //
115223b7c7b8SHermès Bélusca-Maïto //      ConstantNameB - Constant name.
115323b7c7b8SHermès Bélusca-Maïto //
115423b7c7b8SHermès Bélusca-Maïto //  Return Value:
115523b7c7b8SHermès Bélusca-Maïto //
115623b7c7b8SHermès Bélusca-Maïto //      BOOLEAN - TRUE if the two names are lexically equal.
115723b7c7b8SHermès Bélusca-Maïto //
115823b7c7b8SHermès Bélusca-Maïto 
115923b7c7b8SHermès Bélusca-Maïto #define FatAreNamesEqual(IRPCONTEXT,NAMEA,NAMEB) (      \
116023b7c7b8SHermès Bélusca-Maïto     ((ULONG)(NAMEA).Length == (ULONG)(NAMEB).Length) && \
116123b7c7b8SHermès Bélusca-Maïto     (RtlEqualMemory( &(NAMEA).Buffer[0],                \
116223b7c7b8SHermès Bélusca-Maïto                      &(NAMEB).Buffer[0],                \
116323b7c7b8SHermès Bélusca-Maïto                      (NAMEA).Length ))                  \
116423b7c7b8SHermès Bélusca-Maïto )
116523b7c7b8SHermès Bélusca-Maïto 
116623b7c7b8SHermès Bélusca-Maïto //
116723b7c7b8SHermès Bélusca-Maïto //  BOOLEAN
116823b7c7b8SHermès Bélusca-Maïto //  FatIsNameShortOemValid (
116923b7c7b8SHermès Bélusca-Maïto //      IN PIRP_CONTEXT IrpContext,
117023b7c7b8SHermès Bélusca-Maïto //      IN OEM_STRING Name,
117123b7c7b8SHermès Bélusca-Maïto //      IN BOOLEAN CanContainWildCards,
117223b7c7b8SHermès Bélusca-Maïto //      IN BOOLEAN PathNamePermissible,
117323b7c7b8SHermès Bélusca-Maïto //      IN BOOLEAN LeadingBackslashPermissible
117423b7c7b8SHermès Bélusca-Maïto //      )
117523b7c7b8SHermès Bélusca-Maïto //
117623b7c7b8SHermès Bélusca-Maïto //  /*++
117723b7c7b8SHermès Bélusca-Maïto //
117823b7c7b8SHermès Bélusca-Maïto //  Routine Description:
117923b7c7b8SHermès Bélusca-Maïto //
118023b7c7b8SHermès Bélusca-Maïto //      This routine scans the input name and verifies that if only
118123b7c7b8SHermès Bélusca-Maïto //      contains valid characters
118223b7c7b8SHermès Bélusca-Maïto //
118323b7c7b8SHermès Bélusca-Maïto //  Arguments:
118423b7c7b8SHermès Bélusca-Maïto //
118523b7c7b8SHermès Bélusca-Maïto //      Name - Supplies the input name to check.
118623b7c7b8SHermès Bélusca-Maïto //
118723b7c7b8SHermès Bélusca-Maïto //      CanContainWildCards - Indicates if the name can contain wild cards
118823b7c7b8SHermès Bélusca-Maïto //          (i.e., * and ?).
118923b7c7b8SHermès Bélusca-Maïto //
119023b7c7b8SHermès Bélusca-Maïto //  Return Value:
119123b7c7b8SHermès Bélusca-Maïto //
119223b7c7b8SHermès Bélusca-Maïto //          BOOLEAN - Returns TRUE if the name is valid and FALSE otherwise.
119323b7c7b8SHermès Bélusca-Maïto //
119423b7c7b8SHermès Bélusca-Maïto //  --*/
119523b7c7b8SHermès Bélusca-Maïto //
119623b7c7b8SHermès Bélusca-Maïto //  The FatIsNameLongOemValid and FatIsNameLongUnicodeValid are similar.
119723b7c7b8SHermès Bélusca-Maïto //
119823b7c7b8SHermès Bélusca-Maïto 
119923b7c7b8SHermès Bélusca-Maïto #define FatIsNameShortOemValid(IRPCONTEXT,NAME,CAN_CONTAIN_WILD_CARDS,PATH_NAME_OK,LEADING_BACKSLASH_OK) ( \
120023b7c7b8SHermès Bélusca-Maïto     FsRtlIsFatDbcsLegal((NAME),                   \
120123b7c7b8SHermès Bélusca-Maïto                         (CAN_CONTAIN_WILD_CARDS), \
120223b7c7b8SHermès Bélusca-Maïto                         (PATH_NAME_OK),           \
120323b7c7b8SHermès Bélusca-Maïto                         (LEADING_BACKSLASH_OK))   \
120423b7c7b8SHermès Bélusca-Maïto )
120523b7c7b8SHermès Bélusca-Maïto 
120623b7c7b8SHermès Bélusca-Maïto #define FatIsNameLongOemValid(IRPCONTEXT,NAME,CAN_CONTAIN_WILD_CARDS,PATH_NAME_OK,LEADING_BACKSLASH_OK) ( \
120723b7c7b8SHermès Bélusca-Maïto     FsRtlIsHpfsDbcsLegal((NAME),                  \
120823b7c7b8SHermès Bélusca-Maïto                         (CAN_CONTAIN_WILD_CARDS), \
120923b7c7b8SHermès Bélusca-Maïto                         (PATH_NAME_OK),           \
121023b7c7b8SHermès Bélusca-Maïto                         (LEADING_BACKSLASH_OK))   \
121123b7c7b8SHermès Bélusca-Maïto )
121223b7c7b8SHermès Bélusca-Maïto 
121323b7c7b8SHermès Bélusca-Maïto static
121423b7c7b8SHermès Bélusca-Maïto INLINE
121523b7c7b8SHermès Bélusca-Maïto BOOLEAN
FatIsNameLongUnicodeValid(PIRP_CONTEXT IrpContext,PUNICODE_STRING Name,BOOLEAN CanContainWildcards,BOOLEAN PathNameOk,BOOLEAN LeadingBackslashOk)121623b7c7b8SHermès Bélusca-Maïto FatIsNameLongUnicodeValid (
121723b7c7b8SHermès Bélusca-Maïto     PIRP_CONTEXT IrpContext,
121823b7c7b8SHermès Bélusca-Maïto     PUNICODE_STRING Name,
121923b7c7b8SHermès Bélusca-Maïto     BOOLEAN CanContainWildcards,
122023b7c7b8SHermès Bélusca-Maïto     BOOLEAN PathNameOk,
122123b7c7b8SHermès Bélusca-Maïto     BOOLEAN LeadingBackslashOk
122223b7c7b8SHermès Bélusca-Maïto     )
122323b7c7b8SHermès Bélusca-Maïto {
122423b7c7b8SHermès Bélusca-Maïto     ULONG i;
122523b7c7b8SHermès Bélusca-Maïto 
122623b7c7b8SHermès Bélusca-Maïto     UNREFERENCED_PARAMETER( IrpContext );
122723b7c7b8SHermès Bélusca-Maïto     UNREFERENCED_PARAMETER( LeadingBackslashOk );
122823b7c7b8SHermès Bélusca-Maïto     UNREFERENCED_PARAMETER( PathNameOk );
122923b7c7b8SHermès Bélusca-Maïto 
123023b7c7b8SHermès Bélusca-Maïto     //
123123b7c7b8SHermès Bélusca-Maïto     //  I'm not bothering to do the whole thing, just enough to make this call look
123223b7c7b8SHermès Bélusca-Maïto     //  the same as the others.
123323b7c7b8SHermès Bélusca-Maïto     //
123423b7c7b8SHermès Bélusca-Maïto 
123523b7c7b8SHermès Bélusca-Maïto     NT_ASSERT( !PathNameOk && !LeadingBackslashOk );
123623b7c7b8SHermès Bélusca-Maïto 
123723b7c7b8SHermès Bélusca-Maïto     for (i=0; i < Name->Length/sizeof(WCHAR); i++) {
123823b7c7b8SHermès Bélusca-Maïto 
123923b7c7b8SHermès Bélusca-Maïto         if ((Name->Buffer[i] < 0x80) &&
124023b7c7b8SHermès Bélusca-Maïto             !(FsRtlIsAnsiCharacterLegalHpfs(Name->Buffer[i], CanContainWildcards))) {
124123b7c7b8SHermès Bélusca-Maïto 
124223b7c7b8SHermès Bélusca-Maïto             return FALSE;
124323b7c7b8SHermès Bélusca-Maïto         }
124423b7c7b8SHermès Bélusca-Maïto     }
124523b7c7b8SHermès Bélusca-Maïto 
124623b7c7b8SHermès Bélusca-Maïto     return TRUE;
124723b7c7b8SHermès Bélusca-Maïto }
124823b7c7b8SHermès Bélusca-Maïto 
124923b7c7b8SHermès Bélusca-Maïto BOOLEAN
125023b7c7b8SHermès Bélusca-Maïto FatIsNameInExpression (
125123b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
125223b7c7b8SHermès Bélusca-Maïto     IN OEM_STRING Expression,
125323b7c7b8SHermès Bélusca-Maïto     IN OEM_STRING Name
125423b7c7b8SHermès Bélusca-Maïto     );
125523b7c7b8SHermès Bélusca-Maïto 
125623b7c7b8SHermès Bélusca-Maïto VOID
125723b7c7b8SHermès Bélusca-Maïto FatStringTo8dot3 (
125823b7c7b8SHermès Bélusca-Maïto     _In_ PIRP_CONTEXT IrpContext,
125923b7c7b8SHermès Bélusca-Maïto     _In_ OEM_STRING InputString,
126023b7c7b8SHermès Bélusca-Maïto     _Out_writes_bytes_(11) PFAT8DOT3 Output8dot3
126123b7c7b8SHermès Bélusca-Maïto     );
126223b7c7b8SHermès Bélusca-Maïto 
126323b7c7b8SHermès Bélusca-Maïto VOID
126423b7c7b8SHermès Bélusca-Maïto Fat8dot3ToString (
126523b7c7b8SHermès Bélusca-Maïto     _In_ PIRP_CONTEXT IrpContext,
126623b7c7b8SHermès Bélusca-Maïto     _In_ PDIRENT Dirent,
126723b7c7b8SHermès Bélusca-Maïto     _In_ BOOLEAN RestoreCase,
126823b7c7b8SHermès Bélusca-Maïto     _Out_ POEM_STRING OutputString
126923b7c7b8SHermès Bélusca-Maïto     );
127023b7c7b8SHermès Bélusca-Maïto 
127123b7c7b8SHermès Bélusca-Maïto _Requires_lock_held_(_Global_critical_region_)
127223b7c7b8SHermès Bélusca-Maïto VOID
127323b7c7b8SHermès Bélusca-Maïto FatGetUnicodeNameFromFcb (
127423b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
127523b7c7b8SHermès Bélusca-Maïto     IN PFCB Fcb,
127623b7c7b8SHermès Bélusca-Maïto     IN OUT PUNICODE_STRING Lfn
127723b7c7b8SHermès Bélusca-Maïto     );
127823b7c7b8SHermès Bélusca-Maïto 
127923b7c7b8SHermès Bélusca-Maïto _Requires_lock_held_(_Global_critical_region_)
128023b7c7b8SHermès Bélusca-Maïto VOID
128123b7c7b8SHermès Bélusca-Maïto FatSetFullFileNameInFcb (
128223b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
128323b7c7b8SHermès Bélusca-Maïto     IN PFCB Fcb
128423b7c7b8SHermès Bélusca-Maïto     );
128523b7c7b8SHermès Bélusca-Maïto 
128623b7c7b8SHermès Bélusca-Maïto VOID
128723b7c7b8SHermès Bélusca-Maïto FatSetFullNameInFcb (
128823b7c7b8SHermès Bélusca-Maïto     _In_ PIRP_CONTEXT IrpContext,
128923b7c7b8SHermès Bélusca-Maïto     _Inout_ PFCB Fcb,
129023b7c7b8SHermès Bélusca-Maïto     _In_ PUNICODE_STRING FinalName
129123b7c7b8SHermès Bélusca-Maïto     );
129223b7c7b8SHermès Bélusca-Maïto 
129323b7c7b8SHermès Bélusca-Maïto VOID
129423b7c7b8SHermès Bélusca-Maïto FatUnicodeToUpcaseOem (
129523b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
129623b7c7b8SHermès Bélusca-Maïto     IN POEM_STRING OemString,
129723b7c7b8SHermès Bélusca-Maïto     IN PUNICODE_STRING UnicodeString
129823b7c7b8SHermès Bélusca-Maïto     );
129923b7c7b8SHermès Bélusca-Maïto 
130023b7c7b8SHermès Bélusca-Maïto _Requires_lock_held_(_Global_critical_region_)
130123b7c7b8SHermès Bélusca-Maïto VOID
130223b7c7b8SHermès Bélusca-Maïto FatSelectNames (
130323b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
130423b7c7b8SHermès Bélusca-Maïto     IN PDCB Parent,
130523b7c7b8SHermès Bélusca-Maïto     IN POEM_STRING OemName,
130623b7c7b8SHermès Bélusca-Maïto     IN PUNICODE_STRING UnicodeName,
130723b7c7b8SHermès Bélusca-Maïto     IN OUT POEM_STRING ShortName,
130823b7c7b8SHermès Bélusca-Maïto     IN PUNICODE_STRING SuggestedShortName OPTIONAL,
130923b7c7b8SHermès Bélusca-Maïto     IN OUT BOOLEAN *AllLowerComponent,
131023b7c7b8SHermès Bélusca-Maïto     IN OUT BOOLEAN *AllLowerExtension,
131123b7c7b8SHermès Bélusca-Maïto     IN OUT BOOLEAN *CreateLfn
131223b7c7b8SHermès Bélusca-Maïto     );
131323b7c7b8SHermès Bélusca-Maïto 
131423b7c7b8SHermès Bélusca-Maïto VOID
131523b7c7b8SHermès Bélusca-Maïto FatEvaluateNameCase (
131623b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
131723b7c7b8SHermès Bélusca-Maïto     IN PUNICODE_STRING Name,
131823b7c7b8SHermès Bélusca-Maïto     IN OUT BOOLEAN *AllLowerComponent,
131923b7c7b8SHermès Bélusca-Maïto     IN OUT BOOLEAN *AllLowerExtension,
132023b7c7b8SHermès Bélusca-Maïto     IN OUT BOOLEAN *CreateLfn
132123b7c7b8SHermès Bélusca-Maïto     );
132223b7c7b8SHermès Bélusca-Maïto 
132323b7c7b8SHermès Bélusca-Maïto BOOLEAN
132423b7c7b8SHermès Bélusca-Maïto FatSpaceInName (
132523b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
132623b7c7b8SHermès Bélusca-Maïto     IN PUNICODE_STRING UnicodeName
132723b7c7b8SHermès Bélusca-Maïto     );
132823b7c7b8SHermès Bélusca-Maïto 
132923b7c7b8SHermès Bélusca-Maïto VOID
133023b7c7b8SHermès Bélusca-Maïto FatUnicodeRestoreShortNameCase(
133123b7c7b8SHermès Bélusca-Maïto     IN PUNICODE_STRING ShortNameWithCase,
133223b7c7b8SHermès Bélusca-Maïto     IN BOOLEAN LowerCase8,
133323b7c7b8SHermès Bélusca-Maïto     IN BOOLEAN LowerCase3
133423b7c7b8SHermès Bélusca-Maïto     );
133523b7c7b8SHermès Bélusca-Maïto 
133623b7c7b8SHermès Bélusca-Maïto 
133723b7c7b8SHermès Bélusca-Maïto //
133823b7c7b8SHermès Bélusca-Maïto //  Resources support routines/macros, implemented in ResrcSup.c
133923b7c7b8SHermès Bélusca-Maïto //
134023b7c7b8SHermès Bélusca-Maïto //  The following routines/macros are used for gaining shared and exclusive
134123b7c7b8SHermès Bélusca-Maïto //  access to the global/vcb data structures.  The routines are implemented
134223b7c7b8SHermès Bélusca-Maïto //  in ResrcSup.c.  There is a global resources that everyone tries to take
134323b7c7b8SHermès Bélusca-Maïto //  out shared to do their work, with the exception of mount/dismount which
134423b7c7b8SHermès Bélusca-Maïto //  take out the global resource exclusive.  All other resources only work
134523b7c7b8SHermès Bélusca-Maïto //  on their individual item.  For example, an Fcb resource does not take out
134623b7c7b8SHermès Bélusca-Maïto //  a Vcb resource.  But the way the file system is structured we know
134723b7c7b8SHermès Bélusca-Maïto //  that when we are processing an Fcb other threads cannot be trying to remove
134823b7c7b8SHermès Bélusca-Maïto //  or alter the Fcb, so we do not need to acquire the Vcb.
134923b7c7b8SHermès Bélusca-Maïto //
135023b7c7b8SHermès Bélusca-Maïto //  The procedures/macros are:
135123b7c7b8SHermès Bélusca-Maïto //
135223b7c7b8SHermès Bélusca-Maïto //          Macro          FatData    Vcb        Fcb         Subsequent macros
135323b7c7b8SHermès Bélusca-Maïto //
135423b7c7b8SHermès Bélusca-Maïto //  AcquireExclusiveGlobal Read/Write None       None        ReleaseGlobal
135523b7c7b8SHermès Bélusca-Maïto //
135623b7c7b8SHermès Bélusca-Maïto //  AcquireSharedGlobal    Read       None       None        ReleaseGlobal
135723b7c7b8SHermès Bélusca-Maïto //
135823b7c7b8SHermès Bélusca-Maïto //  AcquireExclusiveVcb    Read       Read/Write None        ReleaseVcb
135923b7c7b8SHermès Bélusca-Maïto //
136023b7c7b8SHermès Bélusca-Maïto //  AcquireSharedVcb       Read       Read       None        ReleaseVcb
136123b7c7b8SHermès Bélusca-Maïto //
136223b7c7b8SHermès Bélusca-Maïto //  AcquireExclusiveFcb    Read       None       Read/Write  ConvertToSharFcb
136323b7c7b8SHermès Bélusca-Maïto //                                                           ReleaseFcb
136423b7c7b8SHermès Bélusca-Maïto //
136523b7c7b8SHermès Bélusca-Maïto //  AcquireSharedFcb       Read       None       Read        ReleaseFcb
136623b7c7b8SHermès Bélusca-Maïto //
136723b7c7b8SHermès Bélusca-Maïto //  ConvertToSharedFcb     Read       None       Read        ReleaseFcb
136823b7c7b8SHermès Bélusca-Maïto //
136923b7c7b8SHermès Bélusca-Maïto //  ReleaseGlobal
137023b7c7b8SHermès Bélusca-Maïto //
137123b7c7b8SHermès Bélusca-Maïto //  ReleaseVcb
137223b7c7b8SHermès Bélusca-Maïto //
137323b7c7b8SHermès Bélusca-Maïto //  ReleaseFcb
137423b7c7b8SHermès Bélusca-Maïto //
137523b7c7b8SHermès Bélusca-Maïto 
137623b7c7b8SHermès Bélusca-Maïto //
137723b7c7b8SHermès Bélusca-Maïto //  FINISHED
137823b7c7b8SHermès Bélusca-Maïto //  FatAcquireExclusiveGlobal (
137923b7c7b8SHermès Bélusca-Maïto //      IN PIRP_CONTEXT IrpContext
138023b7c7b8SHermès Bélusca-Maïto //      );
138123b7c7b8SHermès Bélusca-Maïto //
138223b7c7b8SHermès Bélusca-Maïto //  FINISHED
138323b7c7b8SHermès Bélusca-Maïto //  FatAcquireSharedGlobal (
138423b7c7b8SHermès Bélusca-Maïto //      IN PIRP_CONTEXT IrpContext
138523b7c7b8SHermès Bélusca-Maïto //      );
138623b7c7b8SHermès Bélusca-Maïto //
138723b7c7b8SHermès Bélusca-Maïto 
138823b7c7b8SHermès Bélusca-Maïto #define FatAcquireExclusiveGlobal(IRPCONTEXT) (                                                                     \
138923b7c7b8SHermès Bélusca-Maïto     ExAcquireResourceExclusiveLite( &FatData.Resource, BooleanFlagOn((IRPCONTEXT)->Flags, IRP_CONTEXT_FLAG_WAIT) )  \
139023b7c7b8SHermès Bélusca-Maïto )
139123b7c7b8SHermès Bélusca-Maïto 
139223b7c7b8SHermès Bélusca-Maïto #define FatAcquireSharedGlobal(IRPCONTEXT) (                                                                        \
139323b7c7b8SHermès Bélusca-Maïto     ExAcquireResourceSharedLite( &FatData.Resource, BooleanFlagOn((IRPCONTEXT)->Flags, IRP_CONTEXT_FLAG_WAIT) )     \
139423b7c7b8SHermès Bélusca-Maïto )
139523b7c7b8SHermès Bélusca-Maïto 
139623b7c7b8SHermès Bélusca-Maïto //
139723b7c7b8SHermès Bélusca-Maïto //  The following macro must only be called when Wait is TRUE!
139823b7c7b8SHermès Bélusca-Maïto //
139923b7c7b8SHermès Bélusca-Maïto //  FatAcquireExclusiveVolume (
140023b7c7b8SHermès Bélusca-Maïto //      IN PIRP_CONTEXT IrpContext,
140123b7c7b8SHermès Bélusca-Maïto //      IN PVCB Vcb
140223b7c7b8SHermès Bélusca-Maïto //      );
140323b7c7b8SHermès Bélusca-Maïto //
140423b7c7b8SHermès Bélusca-Maïto //  FatReleaseVolume (
140523b7c7b8SHermès Bélusca-Maïto //      IN PIRP_CONTEXT IrpContext,
140623b7c7b8SHermès Bélusca-Maïto //      IN PVCB Vcb
140723b7c7b8SHermès Bélusca-Maïto //      );
140823b7c7b8SHermès Bélusca-Maïto //
140923b7c7b8SHermès Bélusca-Maïto 
141023b7c7b8SHermès Bélusca-Maïto #define FatAcquireExclusiveVolume(IRPCONTEXT,VCB) {                                     \
141123b7c7b8SHermès Bélusca-Maïto     PFCB __FFFFFcb = NULL;                                                                    \
141223b7c7b8SHermès Bélusca-Maïto     NT_ASSERT(FlagOn((IRPCONTEXT)->Flags, IRP_CONTEXT_FLAG_WAIT));                      \
141323b7c7b8SHermès Bélusca-Maïto     (VOID)FatAcquireExclusiveVcb( (IRPCONTEXT), (VCB) );                                \
141423b7c7b8SHermès Bélusca-Maïto     while ( (__FFFFFcb = FatGetNextFcbBottomUp((IRPCONTEXT), __FFFFFcb, (VCB)->RootDcb)) != NULL) { \
141523b7c7b8SHermès Bélusca-Maïto         (VOID)FatAcquireExclusiveFcb((IRPCONTEXT), __FFFFFcb );                               \
141623b7c7b8SHermès Bélusca-Maïto     }                                                                                   \
141723b7c7b8SHermès Bélusca-Maïto }
141823b7c7b8SHermès Bélusca-Maïto 
141923b7c7b8SHermès Bélusca-Maïto #define FatReleaseVolume(IRPCONTEXT,VCB) {                                              \
142023b7c7b8SHermès Bélusca-Maïto     PFCB __FFFFFcb = NULL;                                                                    \
142123b7c7b8SHermès Bélusca-Maïto     NT_ASSERT(FlagOn((IRPCONTEXT)->Flags, IRP_CONTEXT_FLAG_WAIT));                      \
142223b7c7b8SHermès Bélusca-Maïto     while ( (__FFFFFcb = FatGetNextFcbBottomUp((IRPCONTEXT), __FFFFFcb, (VCB)->RootDcb)) != NULL) { \
142323b7c7b8SHermès Bélusca-Maïto         (VOID)ExReleaseResourceLite( __FFFFFcb->Header.Resource );                            \
142423b7c7b8SHermès Bélusca-Maïto     }                                                                                   \
142523b7c7b8SHermès Bélusca-Maïto     FatReleaseVcb((IRPCONTEXT), (VCB));                                                 \
142623b7c7b8SHermès Bélusca-Maïto }
142723b7c7b8SHermès Bélusca-Maïto 
142823b7c7b8SHermès Bélusca-Maïto //
142923b7c7b8SHermès Bélusca-Maïto //  Macro to enable easy tracking of Vcb state transitions.
143023b7c7b8SHermès Bélusca-Maïto //
143123b7c7b8SHermès Bélusca-Maïto 
143223b7c7b8SHermès Bélusca-Maïto #ifdef FASTFATDBG
143323b7c7b8SHermès Bélusca-Maïto #define FatSetVcbCondition( V, X) {                                            \
143423b7c7b8SHermès Bélusca-Maïto             DebugTrace(0,DEBUG_TRACE_VERFYSUP,"%d -> ",(V)->VcbCondition);     \
143523b7c7b8SHermès Bélusca-Maïto             DebugTrace(0,DEBUG_TRACE_VERFYSUP,"%x\n",(X));                     \
143623b7c7b8SHermès Bélusca-Maïto             (V)->VcbCondition = (X);                                           \
143723b7c7b8SHermès Bélusca-Maïto         }
143823b7c7b8SHermès Bélusca-Maïto #else
143923b7c7b8SHermès Bélusca-Maïto #define FatSetVcbCondition( V, X)       (V)->VcbCondition = (X)
144023b7c7b8SHermès Bélusca-Maïto #endif
144123b7c7b8SHermès Bélusca-Maïto 
144223b7c7b8SHermès Bélusca-Maïto //
144323b7c7b8SHermès Bélusca-Maïto //  These macros can be used to determine what kind of FAT we have for an
144423b7c7b8SHermès Bélusca-Maïto //  initialized Vcb.  It is somewhat more elegant to use these (visually).
144523b7c7b8SHermès Bélusca-Maïto //
144623b7c7b8SHermès Bélusca-Maïto 
144723b7c7b8SHermès Bélusca-Maïto #define FatIsFat32(VCB) ((BOOLEAN)((VCB)->AllocationSupport.FatIndexBitSize == 32))
144823b7c7b8SHermès Bélusca-Maïto #define FatIsFat16(VCB) ((BOOLEAN)((VCB)->AllocationSupport.FatIndexBitSize == 16))
144923b7c7b8SHermès Bélusca-Maïto #define FatIsFat12(VCB) ((BOOLEAN)((VCB)->AllocationSupport.FatIndexBitSize == 12))
145023b7c7b8SHermès Bélusca-Maïto 
145123b7c7b8SHermès Bélusca-Maïto 
145223b7c7b8SHermès Bélusca-Maïto _Requires_lock_held_(_Global_critical_region_)
145323b7c7b8SHermès Bélusca-Maïto _When_(return != FALSE && NoOpCheck != FALSE, _Acquires_exclusive_lock_(Vcb->Resource))
145423b7c7b8SHermès Bélusca-Maïto FINISHED
145523b7c7b8SHermès Bélusca-Maïto FatAcquireExclusiveVcb_Real (
145623b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
145723b7c7b8SHermès Bélusca-Maïto     IN PVCB Vcb,
145823b7c7b8SHermès Bélusca-Maïto     IN BOOLEAN NoOpCheck
145923b7c7b8SHermès Bélusca-Maïto     );
146023b7c7b8SHermès Bélusca-Maïto 
146123b7c7b8SHermès Bélusca-Maïto #define FatAcquireExclusiveVcb( IC, V)          FatAcquireExclusiveVcb_Real( IC, V, FALSE)
146223b7c7b8SHermès Bélusca-Maïto #define FatAcquireExclusiveVcbNoOpCheck( IC, V) FatAcquireExclusiveVcb_Real( IC, V, TRUE)
146323b7c7b8SHermès Bélusca-Maïto 
146423b7c7b8SHermès Bélusca-Maïto _Requires_lock_held_(_Global_critical_region_)
146523b7c7b8SHermès Bélusca-Maïto _When_(return != 0, _Acquires_shared_lock_(Vcb->Resource))
146623b7c7b8SHermès Bélusca-Maïto FINISHED
146723b7c7b8SHermès Bélusca-Maïto FatAcquireSharedVcb (
146823b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
146923b7c7b8SHermès Bélusca-Maïto     IN PVCB Vcb
147023b7c7b8SHermès Bélusca-Maïto     );
147123b7c7b8SHermès Bélusca-Maïto 
147223b7c7b8SHermès Bélusca-Maïto _Requires_lock_held_(_Global_critical_region_)
147323b7c7b8SHermès Bélusca-Maïto _Acquires_exclusive_lock_(*Fcb->Header.Resource)
147423b7c7b8SHermès Bélusca-Maïto FINISHED
147523b7c7b8SHermès Bélusca-Maïto FatAcquireExclusiveFcb (
147623b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
147723b7c7b8SHermès Bélusca-Maïto     IN PFCB Fcb
147823b7c7b8SHermès Bélusca-Maïto     );
147923b7c7b8SHermès Bélusca-Maïto 
148023b7c7b8SHermès Bélusca-Maïto _Requires_lock_held_(_Global_critical_region_)
148123b7c7b8SHermès Bélusca-Maïto _Acquires_shared_lock_(*Fcb->Header.Resource)
148223b7c7b8SHermès Bélusca-Maïto FINISHED
148323b7c7b8SHermès Bélusca-Maïto FatAcquireSharedFcb (
148423b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
148523b7c7b8SHermès Bélusca-Maïto     IN PFCB Fcb
148623b7c7b8SHermès Bélusca-Maïto     );
148723b7c7b8SHermès Bélusca-Maïto 
148823b7c7b8SHermès Bélusca-Maïto _Requires_lock_held_(_Global_critical_region_)
148923b7c7b8SHermès Bélusca-Maïto _When_(return != 0, _Acquires_shared_lock_(*Fcb->Header.Resource))
149023b7c7b8SHermès Bélusca-Maïto FINISHED
149123b7c7b8SHermès Bélusca-Maïto FatAcquireSharedFcbWaitForEx (
149223b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
149323b7c7b8SHermès Bélusca-Maïto     IN PFCB Fcb
149423b7c7b8SHermès Bélusca-Maïto     );
149523b7c7b8SHermès Bélusca-Maïto 
149623b7c7b8SHermès Bélusca-Maïto #define FatVcbAcquiredExclusive(IRPCONTEXT,VCB) (                   \
149723b7c7b8SHermès Bélusca-Maïto     ExIsResourceAcquiredExclusiveLite(&(VCB)->Resource)  ||         \
149823b7c7b8SHermès Bélusca-Maïto     ExIsResourceAcquiredExclusiveLite(&FatData.Resource)            \
149923b7c7b8SHermès Bélusca-Maïto )
150023b7c7b8SHermès Bélusca-Maïto 
150123b7c7b8SHermès Bélusca-Maïto #define FatFcbAcquiredShared(IRPCONTEXT,FCB) (                      \
150223b7c7b8SHermès Bélusca-Maïto     ExIsResourceAcquiredSharedLite((FCB)->Header.Resource)          \
150323b7c7b8SHermès Bélusca-Maïto )
150423b7c7b8SHermès Bélusca-Maïto 
150523b7c7b8SHermès Bélusca-Maïto #define FatFcbAcquiredExclusive(IRPCONTEXT,FCB) (                   \
150623b7c7b8SHermès Bélusca-Maïto     ExIsResourceAcquiredExclusiveLite((FCB)->Header.Resource)       \
150723b7c7b8SHermès Bélusca-Maïto )
150823b7c7b8SHermès Bélusca-Maïto 
150923b7c7b8SHermès Bélusca-Maïto #define FatAcquireDirectoryFileMutex(VCB) {                         \
151023b7c7b8SHermès Bélusca-Maïto     NT_ASSERT(KeAreApcsDisabled());                                 \
151123b7c7b8SHermès Bélusca-Maïto     ExAcquireFastMutexUnsafe(&(VCB)->DirectoryFileCreationMutex);   \
151223b7c7b8SHermès Bélusca-Maïto }
151323b7c7b8SHermès Bélusca-Maïto 
151423b7c7b8SHermès Bélusca-Maïto #define FatReleaseDirectoryFileMutex(VCB) {                         \
151523b7c7b8SHermès Bélusca-Maïto     NT_ASSERT(KeAreApcsDisabled());                                 \
151623b7c7b8SHermès Bélusca-Maïto     ExReleaseFastMutexUnsafe(&(VCB)->DirectoryFileCreationMutex);   \
151723b7c7b8SHermès Bélusca-Maïto }
151823b7c7b8SHermès Bélusca-Maïto 
151923b7c7b8SHermès Bélusca-Maïto //
152023b7c7b8SHermès Bélusca-Maïto //  The following are cache manager call backs
152123b7c7b8SHermès Bélusca-Maïto 
152223b7c7b8SHermès Bélusca-Maïto BOOLEAN
152323b7c7b8SHermès Bélusca-Maïto FatAcquireVolumeForClose (
152423b7c7b8SHermès Bélusca-Maïto     IN PVOID Vcb,
152523b7c7b8SHermès Bélusca-Maïto     IN BOOLEAN Wait
152623b7c7b8SHermès Bélusca-Maïto     );
152723b7c7b8SHermès Bélusca-Maïto 
152823b7c7b8SHermès Bélusca-Maïto VOID
152923b7c7b8SHermès Bélusca-Maïto FatReleaseVolumeFromClose (
153023b7c7b8SHermès Bélusca-Maïto     IN PVOID Vcb
153123b7c7b8SHermès Bélusca-Maïto     );
153223b7c7b8SHermès Bélusca-Maïto 
153323b7c7b8SHermès Bélusca-Maïto _Requires_lock_held_(_Global_critical_region_)
153423b7c7b8SHermès Bélusca-Maïto BOOLEAN
153523b7c7b8SHermès Bélusca-Maïto NTAPI
153623b7c7b8SHermès Bélusca-Maïto FatAcquireFcbForLazyWrite (
153723b7c7b8SHermès Bélusca-Maïto     IN PVOID Null,
153823b7c7b8SHermès Bélusca-Maïto     IN BOOLEAN Wait
153923b7c7b8SHermès Bélusca-Maïto     );
154023b7c7b8SHermès Bélusca-Maïto 
154123b7c7b8SHermès Bélusca-Maïto _Requires_lock_held_(_Global_critical_region_)
154223b7c7b8SHermès Bélusca-Maïto VOID
154323b7c7b8SHermès Bélusca-Maïto NTAPI
154423b7c7b8SHermès Bélusca-Maïto FatReleaseFcbFromLazyWrite (
154523b7c7b8SHermès Bélusca-Maïto     IN PVOID Null
154623b7c7b8SHermès Bélusca-Maïto     );
154723b7c7b8SHermès Bélusca-Maïto 
154823b7c7b8SHermès Bélusca-Maïto _Requires_lock_held_(_Global_critical_region_)
154923b7c7b8SHermès Bélusca-Maïto BOOLEAN
155023b7c7b8SHermès Bélusca-Maïto NTAPI
155123b7c7b8SHermès Bélusca-Maïto FatAcquireFcbForReadAhead (
155223b7c7b8SHermès Bélusca-Maïto     IN PVOID Null,
155323b7c7b8SHermès Bélusca-Maïto     IN BOOLEAN Wait
155423b7c7b8SHermès Bélusca-Maïto     );
155523b7c7b8SHermès Bélusca-Maïto 
155623b7c7b8SHermès Bélusca-Maïto _Requires_lock_held_(_Global_critical_region_)
155723b7c7b8SHermès Bélusca-Maïto VOID
155823b7c7b8SHermès Bélusca-Maïto NTAPI
155923b7c7b8SHermès Bélusca-Maïto FatReleaseFcbFromReadAhead (
156023b7c7b8SHermès Bélusca-Maïto     IN PVOID Null
156123b7c7b8SHermès Bélusca-Maïto     );
156223b7c7b8SHermès Bélusca-Maïto 
156323b7c7b8SHermès Bélusca-Maïto _Function_class_(FAST_IO_ACQUIRE_FOR_CCFLUSH)
156423b7c7b8SHermès Bélusca-Maïto _Requires_lock_held_(_Global_critical_region_)
156523b7c7b8SHermès Bélusca-Maïto NTSTATUS
156623b7c7b8SHermès Bélusca-Maïto NTAPI
156723b7c7b8SHermès Bélusca-Maïto FatAcquireForCcFlush (
156823b7c7b8SHermès Bélusca-Maïto     IN PFILE_OBJECT FileObject,
156923b7c7b8SHermès Bélusca-Maïto     IN PDEVICE_OBJECT DeviceObject
157023b7c7b8SHermès Bélusca-Maïto     );
157123b7c7b8SHermès Bélusca-Maïto 
157223b7c7b8SHermès Bélusca-Maïto _Function_class_(FAST_IO_RELEASE_FOR_CCFLUSH)
157323b7c7b8SHermès Bélusca-Maïto _Requires_lock_held_(_Global_critical_region_)
157423b7c7b8SHermès Bélusca-Maïto NTSTATUS
157523b7c7b8SHermès Bélusca-Maïto NTAPI
157623b7c7b8SHermès Bélusca-Maïto FatReleaseForCcFlush (
157723b7c7b8SHermès Bélusca-Maïto     IN PFILE_OBJECT FileObject,
157823b7c7b8SHermès Bélusca-Maïto     IN PDEVICE_OBJECT DeviceObject
157923b7c7b8SHermès Bélusca-Maïto     );
158023b7c7b8SHermès Bélusca-Maïto 
158123b7c7b8SHermès Bélusca-Maïto BOOLEAN
158223b7c7b8SHermès Bélusca-Maïto NTAPI
158323b7c7b8SHermès Bélusca-Maïto FatNoOpAcquire (
158423b7c7b8SHermès Bélusca-Maïto     IN PVOID Fcb,
158523b7c7b8SHermès Bélusca-Maïto     IN BOOLEAN Wait
158623b7c7b8SHermès Bélusca-Maïto     );
158723b7c7b8SHermès Bélusca-Maïto 
158823b7c7b8SHermès Bélusca-Maïto VOID
158923b7c7b8SHermès Bélusca-Maïto NTAPI
159023b7c7b8SHermès Bélusca-Maïto FatNoOpRelease (
159123b7c7b8SHermès Bélusca-Maïto     IN PVOID Fcb
159223b7c7b8SHermès Bélusca-Maïto     );
159323b7c7b8SHermès Bélusca-Maïto 
159423b7c7b8SHermès Bélusca-Maïto _Requires_lock_held_(_Global_critical_region_)
159523b7c7b8SHermès Bélusca-Maïto NTSTATUS
159623b7c7b8SHermès Bélusca-Maïto NTAPI
159723b7c7b8SHermès Bélusca-Maïto FatFilterCallbackAcquireForCreateSection (
159823b7c7b8SHermès Bélusca-Maïto     IN PFS_FILTER_CALLBACK_DATA CallbackData,
159923b7c7b8SHermès Bélusca-Maïto     OUT PVOID *CompletionContext
160023b7c7b8SHermès Bélusca-Maïto     );
160123b7c7b8SHermès Bélusca-Maïto 
160223b7c7b8SHermès Bélusca-Maïto //
160323b7c7b8SHermès Bélusca-Maïto //  VOID
160423b7c7b8SHermès Bélusca-Maïto //  FatConvertToSharedFcb (
160523b7c7b8SHermès Bélusca-Maïto //      IN PIRP_CONTEXT IrpContext,
160623b7c7b8SHermès Bélusca-Maïto //      IN PFCB Fcb
160723b7c7b8SHermès Bélusca-Maïto //      );
160823b7c7b8SHermès Bélusca-Maïto //
160923b7c7b8SHermès Bélusca-Maïto 
161023b7c7b8SHermès Bélusca-Maïto #define FatConvertToSharedFcb(IRPCONTEXT,Fcb) {                 \
161123b7c7b8SHermès Bélusca-Maïto     ExConvertExclusiveToSharedLite( (Fcb)->Header.Resource );   \
161223b7c7b8SHermès Bélusca-Maïto     }
161323b7c7b8SHermès Bélusca-Maïto 
161423b7c7b8SHermès Bélusca-Maïto //
161523b7c7b8SHermès Bélusca-Maïto //  VOID
161623b7c7b8SHermès Bélusca-Maïto //  FatReleaseGlobal (
161723b7c7b8SHermès Bélusca-Maïto //      IN PIRP_CONTEXT IrpContext
161823b7c7b8SHermès Bélusca-Maïto //      );
161923b7c7b8SHermès Bélusca-Maïto //
162023b7c7b8SHermès Bélusca-Maïto //  VOID
162123b7c7b8SHermès Bélusca-Maïto //  FatReleaseVcb (
162223b7c7b8SHermès Bélusca-Maïto //      IN PIRP_CONTEXT IrpContext,
162323b7c7b8SHermès Bélusca-Maïto //      IN PVCB Vcb
162423b7c7b8SHermès Bélusca-Maïto //      );
162523b7c7b8SHermès Bélusca-Maïto //
162623b7c7b8SHermès Bélusca-Maïto //  VOID
162723b7c7b8SHermès Bélusca-Maïto //  FatReleaseFcb (
162823b7c7b8SHermès Bélusca-Maïto //      IN PIRP_CONTEXT IrpContext,
162923b7c7b8SHermès Bélusca-Maïto //      IN PVCB Vcb
163023b7c7b8SHermès Bélusca-Maïto //      );
163123b7c7b8SHermès Bélusca-Maïto //
163223b7c7b8SHermès Bélusca-Maïto 
163323b7c7b8SHermès Bélusca-Maïto #define FatDeleteResource(RESRC) {                      \
163423b7c7b8SHermès Bélusca-Maïto     ExDeleteResourceLite( (RESRC) );                    \
163523b7c7b8SHermès Bélusca-Maïto }
163623b7c7b8SHermès Bélusca-Maïto 
163723b7c7b8SHermès Bélusca-Maïto #define FatReleaseGlobal(IRPCONTEXT) {                  \
163823b7c7b8SHermès Bélusca-Maïto     ExReleaseResourceLite( &(FatData.Resource) );       \
163923b7c7b8SHermès Bélusca-Maïto     }
164023b7c7b8SHermès Bélusca-Maïto 
164123b7c7b8SHermès Bélusca-Maïto #define FatReleaseVcb(IRPCONTEXT,Vcb) {                 \
164223b7c7b8SHermès Bélusca-Maïto     ExReleaseResourceLite( &((Vcb)->Resource) );        \
164323b7c7b8SHermès Bélusca-Maïto     }
164423b7c7b8SHermès Bélusca-Maïto 
164523b7c7b8SHermès Bélusca-Maïto #define FatReleaseFcb(IRPCONTEXT,Fcb) {                 \
164623b7c7b8SHermès Bélusca-Maïto     ExReleaseResourceLite( (Fcb)->Header.Resource );    \
164723b7c7b8SHermès Bélusca-Maïto     }
164823b7c7b8SHermès Bélusca-Maïto 
164923b7c7b8SHermès Bélusca-Maïto //
165023b7c7b8SHermès Bélusca-Maïto //  The following macro is used to retrieve the oplock structure within
165123b7c7b8SHermès Bélusca-Maïto //  the Fcb. This structure was moved to the advanced Fcb header
165223b7c7b8SHermès Bélusca-Maïto //  in Win8.
165323b7c7b8SHermès Bélusca-Maïto //
165423b7c7b8SHermès Bélusca-Maïto 
165523b7c7b8SHermès Bélusca-Maïto #if (NTDDI_VERSION >= NTDDI_WIN8)
165623b7c7b8SHermès Bélusca-Maïto 
165723b7c7b8SHermès Bélusca-Maïto #define FatGetFcbOplock(F)  &(F)->Header.Oplock
165823b7c7b8SHermès Bélusca-Maïto 
165923b7c7b8SHermès Bélusca-Maïto #else
166023b7c7b8SHermès Bélusca-Maïto 
166123b7c7b8SHermès Bélusca-Maïto #define FatGetFcbOplock(F)  &(F)->Specific.Fcb.Oplock
166223b7c7b8SHermès Bélusca-Maïto 
166323b7c7b8SHermès Bélusca-Maïto #endif
166423b7c7b8SHermès Bélusca-Maïto 
166523b7c7b8SHermès Bélusca-Maïto 
166623b7c7b8SHermès Bélusca-Maïto //
166723b7c7b8SHermès Bélusca-Maïto //  In-memory structure support routine, implemented in StrucSup.c
166823b7c7b8SHermès Bélusca-Maïto //
166923b7c7b8SHermès Bélusca-Maïto 
167023b7c7b8SHermès Bélusca-Maïto _Requires_lock_held_(_Global_critical_region_)
167123b7c7b8SHermès Bélusca-Maïto VOID
167223b7c7b8SHermès Bélusca-Maïto FatInitializeVcb (
167323b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
167423b7c7b8SHermès Bélusca-Maïto     IN OUT PVCB Vcb,
167523b7c7b8SHermès Bélusca-Maïto     IN PDEVICE_OBJECT TargetDeviceObject,
167623b7c7b8SHermès Bélusca-Maïto     IN PVPB Vpb,
167723b7c7b8SHermès Bélusca-Maïto     IN PDEVICE_OBJECT FsDeviceObject
167823b7c7b8SHermès Bélusca-Maïto     );
167923b7c7b8SHermès Bélusca-Maïto 
168023b7c7b8SHermès Bélusca-Maïto VOID
168123b7c7b8SHermès Bélusca-Maïto FatTearDownVcb (
168223b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
168323b7c7b8SHermès Bélusca-Maïto     IN PVCB Vcb
168423b7c7b8SHermès Bélusca-Maïto     );
168523b7c7b8SHermès Bélusca-Maïto 
168623b7c7b8SHermès Bélusca-Maïto VOID
168723b7c7b8SHermès Bélusca-Maïto FatDeleteVcb (
168823b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
168923b7c7b8SHermès Bélusca-Maïto     IN PVCB Vcb
169023b7c7b8SHermès Bélusca-Maïto     );
169123b7c7b8SHermès Bélusca-Maïto 
169223b7c7b8SHermès Bélusca-Maïto _Requires_lock_held_(_Global_critical_region_)
169323b7c7b8SHermès Bélusca-Maïto VOID
169423b7c7b8SHermès Bélusca-Maïto FatCreateRootDcb (
169523b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
169623b7c7b8SHermès Bélusca-Maïto     IN PVCB Vcb
169723b7c7b8SHermès Bélusca-Maïto     );
169823b7c7b8SHermès Bélusca-Maïto 
169923b7c7b8SHermès Bélusca-Maïto PFCB
170023b7c7b8SHermès Bélusca-Maïto FatCreateFcb (
170123b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
170223b7c7b8SHermès Bélusca-Maïto     IN PVCB Vcb,
170323b7c7b8SHermès Bélusca-Maïto     IN PDCB ParentDcb,
170423b7c7b8SHermès Bélusca-Maïto     IN ULONG LfnOffsetWithinDirectory,
170523b7c7b8SHermès Bélusca-Maïto     IN ULONG DirentOffsetWithinDirectory,
170623b7c7b8SHermès Bélusca-Maïto     IN PDIRENT Dirent,
170723b7c7b8SHermès Bélusca-Maïto     IN PUNICODE_STRING Lfn OPTIONAL,
170823b7c7b8SHermès Bélusca-Maïto     IN PUNICODE_STRING OrigLfn OPTIONAL,
170923b7c7b8SHermès Bélusca-Maïto     IN BOOLEAN IsPagingFile,
171023b7c7b8SHermès Bélusca-Maïto     IN BOOLEAN SingleResource
171123b7c7b8SHermès Bélusca-Maïto     );
171223b7c7b8SHermès Bélusca-Maïto 
171323b7c7b8SHermès Bélusca-Maïto PDCB
171423b7c7b8SHermès Bélusca-Maïto FatCreateDcb (
171523b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
171623b7c7b8SHermès Bélusca-Maïto     IN PVCB Vcb,
171723b7c7b8SHermès Bélusca-Maïto     IN PDCB ParentDcb,
171823b7c7b8SHermès Bélusca-Maïto     IN ULONG LfnOffsetWithinDirectory,
171923b7c7b8SHermès Bélusca-Maïto     IN ULONG DirentOffsetWithinDirectory,
172023b7c7b8SHermès Bélusca-Maïto     IN PDIRENT Dirent,
172123b7c7b8SHermès Bélusca-Maïto     IN PUNICODE_STRING Lfn OPTIONAL
172223b7c7b8SHermès Bélusca-Maïto     );
172323b7c7b8SHermès Bélusca-Maïto 
172423b7c7b8SHermès Bélusca-Maïto VOID
172523b7c7b8SHermès Bélusca-Maïto FatDeleteFcb (
172623b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
172723b7c7b8SHermès Bélusca-Maïto     IN PFCB *Fcb
172823b7c7b8SHermès Bélusca-Maïto     );
172923b7c7b8SHermès Bélusca-Maïto 
173023b7c7b8SHermès Bélusca-Maïto PCCB
173123b7c7b8SHermès Bélusca-Maïto FatCreateCcb (
173223b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext
173323b7c7b8SHermès Bélusca-Maïto     );
173423b7c7b8SHermès Bélusca-Maïto 
173523b7c7b8SHermès Bélusca-Maïto VOID
173623b7c7b8SHermès Bélusca-Maïto FatDeallocateCcbStrings(
173723b7c7b8SHermès Bélusca-Maïto         IN PCCB Ccb
173823b7c7b8SHermès Bélusca-Maïto         );
173923b7c7b8SHermès Bélusca-Maïto 
174023b7c7b8SHermès Bélusca-Maïto VOID
174123b7c7b8SHermès Bélusca-Maïto FatDeleteCcb (
174223b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
174323b7c7b8SHermès Bélusca-Maïto     IN PCCB *Ccb
174423b7c7b8SHermès Bélusca-Maïto     );
174523b7c7b8SHermès Bélusca-Maïto 
174623b7c7b8SHermès Bélusca-Maïto PIRP_CONTEXT
174723b7c7b8SHermès Bélusca-Maïto FatCreateIrpContext (
174823b7c7b8SHermès Bélusca-Maïto     IN PIRP Irp,
174923b7c7b8SHermès Bélusca-Maïto     IN BOOLEAN Wait
175023b7c7b8SHermès Bélusca-Maïto     );
175123b7c7b8SHermès Bélusca-Maïto 
175223b7c7b8SHermès Bélusca-Maïto VOID
175323b7c7b8SHermès Bélusca-Maïto FatDeleteIrpContext_Real (
175423b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext
175523b7c7b8SHermès Bélusca-Maïto     );
175623b7c7b8SHermès Bélusca-Maïto 
175723b7c7b8SHermès Bélusca-Maïto #ifdef FASTFATDBG
175823b7c7b8SHermès Bélusca-Maïto #define FatDeleteIrpContext(IRPCONTEXT) {   \
175923b7c7b8SHermès Bélusca-Maïto     FatDeleteIrpContext_Real((IRPCONTEXT)); \
176023b7c7b8SHermès Bélusca-Maïto     (IRPCONTEXT) = NULL;                    \
176123b7c7b8SHermès Bélusca-Maïto }
176223b7c7b8SHermès Bélusca-Maïto #else
176323b7c7b8SHermès Bélusca-Maïto #define FatDeleteIrpContext(IRPCONTEXT) {   \
176423b7c7b8SHermès Bélusca-Maïto     FatDeleteIrpContext_Real((IRPCONTEXT)); \
176523b7c7b8SHermès Bélusca-Maïto }
176623b7c7b8SHermès Bélusca-Maïto #endif // FASTFAT_DBG
176723b7c7b8SHermès Bélusca-Maïto 
176823b7c7b8SHermès Bélusca-Maïto PFCB
176923b7c7b8SHermès Bélusca-Maïto FatGetNextFcbTopDown (
177023b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
177123b7c7b8SHermès Bélusca-Maïto     IN PFCB Fcb,
177223b7c7b8SHermès Bélusca-Maïto     IN PFCB TerminationFcb
177323b7c7b8SHermès Bélusca-Maïto     );
177423b7c7b8SHermès Bélusca-Maïto 
177523b7c7b8SHermès Bélusca-Maïto PFCB
177623b7c7b8SHermès Bélusca-Maïto FatGetNextFcbBottomUp (
177723b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
177823b7c7b8SHermès Bélusca-Maïto     IN PFCB Fcb,
177923b7c7b8SHermès Bélusca-Maïto     IN PFCB TerminationFcb
178023b7c7b8SHermès Bélusca-Maïto     );
178123b7c7b8SHermès Bélusca-Maïto 
178223b7c7b8SHermès Bélusca-Maïto //
178323b7c7b8SHermès Bélusca-Maïto //  These two macros just make the code a bit cleaner.
178423b7c7b8SHermès Bélusca-Maïto //
178523b7c7b8SHermès Bélusca-Maïto 
178623b7c7b8SHermès Bélusca-Maïto #define FatGetFirstChild(DIR) ((PFCB)(                          \
178723b7c7b8SHermès Bélusca-Maïto     IsListEmpty(&(DIR)->Specific.Dcb.ParentDcbQueue) ? NULL :   \
178823b7c7b8SHermès Bélusca-Maïto     CONTAINING_RECORD((DIR)->Specific.Dcb.ParentDcbQueue.Flink, \
178923b7c7b8SHermès Bélusca-Maïto                       DCB,                                      \
179023b7c7b8SHermès Bélusca-Maïto                       ParentDcbLinks.Flink)))
179123b7c7b8SHermès Bélusca-Maïto 
179223b7c7b8SHermès Bélusca-Maïto #define FatGetNextSibling(FILE) ((PFCB)(                     \
179323b7c7b8SHermès Bélusca-Maïto     &(FILE)->ParentDcb->Specific.Dcb.ParentDcbQueue.Flink == \
179423b7c7b8SHermès Bélusca-Maïto     (PVOID)(FILE)->ParentDcbLinks.Flink ? NULL :             \
179523b7c7b8SHermès Bélusca-Maïto     CONTAINING_RECORD((FILE)->ParentDcbLinks.Flink,          \
179623b7c7b8SHermès Bélusca-Maïto                       FCB,                                   \
179723b7c7b8SHermès Bélusca-Maïto                       ParentDcbLinks.Flink)))
179823b7c7b8SHermès Bélusca-Maïto 
179923b7c7b8SHermès Bélusca-Maïto _Requires_lock_held_(_Global_critical_region_)
180023b7c7b8SHermès Bélusca-Maïto BOOLEAN
180123b7c7b8SHermès Bélusca-Maïto FatCheckForDismount (
180223b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
180323b7c7b8SHermès Bélusca-Maïto     PVCB Vcb,
180423b7c7b8SHermès Bélusca-Maïto     IN BOOLEAN Force
180523b7c7b8SHermès Bélusca-Maïto     );
180623b7c7b8SHermès Bélusca-Maïto 
180723b7c7b8SHermès Bélusca-Maïto VOID
180823b7c7b8SHermès Bélusca-Maïto FatConstructNamesInFcb (
180923b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
181023b7c7b8SHermès Bélusca-Maïto     PFCB Fcb,
181123b7c7b8SHermès Bélusca-Maïto     PDIRENT Dirent,
181223b7c7b8SHermès Bélusca-Maïto     PUNICODE_STRING Lfn OPTIONAL
181323b7c7b8SHermès Bélusca-Maïto     );
181423b7c7b8SHermès Bélusca-Maïto 
181523b7c7b8SHermès Bélusca-Maïto _Requires_lock_held_(_Global_critical_region_)
181623b7c7b8SHermès Bélusca-Maïto VOID
181723b7c7b8SHermès Bélusca-Maïto FatCheckFreeDirentBitmap (
181823b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
181923b7c7b8SHermès Bélusca-Maïto     IN PDCB Dcb
182023b7c7b8SHermès Bélusca-Maïto     );
182123b7c7b8SHermès Bélusca-Maïto 
182223b7c7b8SHermès Bélusca-Maïto ULONG
182323b7c7b8SHermès Bélusca-Maïto FatVolumeUncleanCount (
182423b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
182523b7c7b8SHermès Bélusca-Maïto     IN PVCB Vcb
182623b7c7b8SHermès Bélusca-Maïto     );
182723b7c7b8SHermès Bélusca-Maïto 
182823b7c7b8SHermès Bélusca-Maïto VOID
182923b7c7b8SHermès Bélusca-Maïto FatPreallocateCloseContext (
183023b7c7b8SHermès Bélusca-Maïto     IN PVCB Vcb
183123b7c7b8SHermès Bélusca-Maïto     );
183223b7c7b8SHermès Bélusca-Maïto 
183323b7c7b8SHermès Bélusca-Maïto PCLOSE_CONTEXT
183423b7c7b8SHermès Bélusca-Maïto FatAllocateCloseContext(
183523b7c7b8SHermès Bélusca-Maïto     IN PVCB Vcb
183623b7c7b8SHermès Bélusca-Maïto     );
183723b7c7b8SHermès Bélusca-Maïto 
183823b7c7b8SHermès Bélusca-Maïto //
183923b7c7b8SHermès Bélusca-Maïto //  BOOLEAN
184023b7c7b8SHermès Bélusca-Maïto //  FatIsRawDevice (
184123b7c7b8SHermès Bélusca-Maïto //      IN PIRP_CONTEXT IrpContext,
184223b7c7b8SHermès Bélusca-Maïto //      IN NTSTATUS Status
184323b7c7b8SHermès Bélusca-Maïto //      );
184423b7c7b8SHermès Bélusca-Maïto //
184523b7c7b8SHermès Bélusca-Maïto 
184623b7c7b8SHermès Bélusca-Maïto #define FatIsRawDevice(IC,S) (          \
184723b7c7b8SHermès Bélusca-Maïto     ((S) == STATUS_DEVICE_NOT_READY) || \
184823b7c7b8SHermès Bélusca-Maïto     ((S) == STATUS_NO_MEDIA_IN_DEVICE)  \
184923b7c7b8SHermès Bélusca-Maïto )
185023b7c7b8SHermès Bélusca-Maïto 
185123b7c7b8SHermès Bélusca-Maïto 
185223b7c7b8SHermès Bélusca-Maïto //
185323b7c7b8SHermès Bélusca-Maïto //  Routines to support managing file names Fcbs and Dcbs.
185423b7c7b8SHermès Bélusca-Maïto //  Implemented in SplaySup.c
185523b7c7b8SHermès Bélusca-Maïto //
185623b7c7b8SHermès Bélusca-Maïto 
185723b7c7b8SHermès Bélusca-Maïto VOID
185823b7c7b8SHermès Bélusca-Maïto FatInsertName (
185923b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
186023b7c7b8SHermès Bélusca-Maïto     IN PRTL_SPLAY_LINKS *RootNode,
186123b7c7b8SHermès Bélusca-Maïto     IN PFILE_NAME_NODE Name
186223b7c7b8SHermès Bélusca-Maïto     );
186323b7c7b8SHermès Bélusca-Maïto 
186423b7c7b8SHermès Bélusca-Maïto VOID
186523b7c7b8SHermès Bélusca-Maïto FatRemoveNames (
186623b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
186723b7c7b8SHermès Bélusca-Maïto     IN PFCB Fcb
186823b7c7b8SHermès Bélusca-Maïto     );
186923b7c7b8SHermès Bélusca-Maïto 
187023b7c7b8SHermès Bélusca-Maïto PFCB
187123b7c7b8SHermès Bélusca-Maïto FatFindFcb (
187223b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
187323b7c7b8SHermès Bélusca-Maïto     IN OUT PRTL_SPLAY_LINKS *RootNode,
187423b7c7b8SHermès Bélusca-Maïto     IN PSTRING Name,
187523b7c7b8SHermès Bélusca-Maïto     OUT PBOOLEAN FileNameDos OPTIONAL
187623b7c7b8SHermès Bélusca-Maïto     );
187723b7c7b8SHermès Bélusca-Maïto 
187823b7c7b8SHermès Bélusca-Maïto BOOLEAN
187923b7c7b8SHermès Bélusca-Maïto FatIsHandleCountZero (
188023b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
188123b7c7b8SHermès Bélusca-Maïto     IN PVCB Vcb
188223b7c7b8SHermès Bélusca-Maïto     );
188323b7c7b8SHermès Bélusca-Maïto 
188423b7c7b8SHermès Bélusca-Maïto typedef enum _COMPARISON {
188523b7c7b8SHermès Bélusca-Maïto     IsLessThan,
188623b7c7b8SHermès Bélusca-Maïto     IsGreaterThan,
188723b7c7b8SHermès Bélusca-Maïto     IsEqual
188823b7c7b8SHermès Bélusca-Maïto } COMPARISON;
188923b7c7b8SHermès Bélusca-Maïto 
189023b7c7b8SHermès Bélusca-Maïto COMPARISON
189123b7c7b8SHermès Bélusca-Maïto FatCompareNames (
189223b7c7b8SHermès Bélusca-Maïto     IN PSTRING NameA,
189323b7c7b8SHermès Bélusca-Maïto     IN PSTRING NameB
189423b7c7b8SHermès Bélusca-Maïto     );
189523b7c7b8SHermès Bélusca-Maïto 
189623b7c7b8SHermès Bélusca-Maïto //
189723b7c7b8SHermès Bélusca-Maïto //  Do a macro here to check for a common case.
189823b7c7b8SHermès Bélusca-Maïto //
189923b7c7b8SHermès Bélusca-Maïto 
190023b7c7b8SHermès Bélusca-Maïto #define CompareNames(NAMEA,NAMEB) (                        \
190123b7c7b8SHermès Bélusca-Maïto     *(PUCHAR)(NAMEA)->Buffer != *(PUCHAR)(NAMEB)->Buffer ? \
190223b7c7b8SHermès Bélusca-Maïto     *(PUCHAR)(NAMEA)->Buffer < *(PUCHAR)(NAMEB)->Buffer ?  \
190323b7c7b8SHermès Bélusca-Maïto     IsLessThan : IsGreaterThan :                           \
190423b7c7b8SHermès Bélusca-Maïto     FatCompareNames((PSTRING)(NAMEA), (PSTRING)(NAMEB))    \
190523b7c7b8SHermès Bélusca-Maïto )
190623b7c7b8SHermès Bélusca-Maïto 
190723b7c7b8SHermès Bélusca-Maïto //
190823b7c7b8SHermès Bélusca-Maïto //  Time conversion support routines, implemented in TimeSup.c
190923b7c7b8SHermès Bélusca-Maïto //
191023b7c7b8SHermès Bélusca-Maïto 
191123b7c7b8SHermès Bélusca-Maïto _Success_(return != FALSE)
191223b7c7b8SHermès Bélusca-Maïto BOOLEAN
191323b7c7b8SHermès Bélusca-Maïto FatNtTimeToFatTime (
191423b7c7b8SHermès Bélusca-Maïto     _In_ PIRP_CONTEXT IrpContext,
191523b7c7b8SHermès Bélusca-Maïto     _In_ PLARGE_INTEGER NtTime,
191623b7c7b8SHermès Bélusca-Maïto     _In_ BOOLEAN Rounding,
191723b7c7b8SHermès Bélusca-Maïto     _Out_ PFAT_TIME_STAMP FatTime,
191823b7c7b8SHermès Bélusca-Maïto     _Out_opt_ PUCHAR TenMsecs
191923b7c7b8SHermès Bélusca-Maïto     );
192023b7c7b8SHermès Bélusca-Maïto 
192123b7c7b8SHermès Bélusca-Maïto LARGE_INTEGER
192223b7c7b8SHermès Bélusca-Maïto FatFatTimeToNtTime (
192323b7c7b8SHermès Bélusca-Maïto     _In_ PIRP_CONTEXT IrpContext,
192423b7c7b8SHermès Bélusca-Maïto     _In_ FAT_TIME_STAMP FatTime,
192523b7c7b8SHermès Bélusca-Maïto     _In_ UCHAR TenMilliSeconds
192623b7c7b8SHermès Bélusca-Maïto     );
192723b7c7b8SHermès Bélusca-Maïto 
192823b7c7b8SHermès Bélusca-Maïto LARGE_INTEGER
192923b7c7b8SHermès Bélusca-Maïto FatFatDateToNtTime (
193023b7c7b8SHermès Bélusca-Maïto     _In_ PIRP_CONTEXT IrpContext,
193123b7c7b8SHermès Bélusca-Maïto     _In_ FAT_DATE FatDate
193223b7c7b8SHermès Bélusca-Maïto     );
193323b7c7b8SHermès Bélusca-Maïto 
193423b7c7b8SHermès Bélusca-Maïto FAT_TIME_STAMP
193523b7c7b8SHermès Bélusca-Maïto FatGetCurrentFatTime (
193623b7c7b8SHermès Bélusca-Maïto     _In_ PIRP_CONTEXT IrpContext
193723b7c7b8SHermès Bélusca-Maïto     );
193823b7c7b8SHermès Bélusca-Maïto 
193923b7c7b8SHermès Bélusca-Maïto 
194023b7c7b8SHermès Bélusca-Maïto //
194123b7c7b8SHermès Bélusca-Maïto //  Low level verification routines, implemented in VerfySup.c
194223b7c7b8SHermès Bélusca-Maïto //
194323b7c7b8SHermès Bélusca-Maïto //  The first routine is called to help process a verify IRP.  Its job is
194423b7c7b8SHermès Bélusca-Maïto //  to walk every Fcb/Dcb and mark them as need to be verified.
194523b7c7b8SHermès Bélusca-Maïto //
194623b7c7b8SHermès Bélusca-Maïto //  The other routines are used by every dispatch routine to verify that
194723b7c7b8SHermès Bélusca-Maïto //  an Vcb/Fcb/Dcb is still good.  The routine walks as much of the opened
194823b7c7b8SHermès Bélusca-Maïto //  file/directory tree as necessary to make sure that the path is still valid.
194923b7c7b8SHermès Bélusca-Maïto //  The function result indicates if the procedure needed to block for I/O.
195023b7c7b8SHermès Bélusca-Maïto //  If the structure is bad the procedure raise the error condition
195123b7c7b8SHermès Bélusca-Maïto //  STATUS_FILE_INVALID, otherwise they simply return to their caller
195223b7c7b8SHermès Bélusca-Maïto //
195323b7c7b8SHermès Bélusca-Maïto 
195423b7c7b8SHermès Bélusca-Maïto typedef enum _FAT_VOLUME_STATE {
195523b7c7b8SHermès Bélusca-Maïto     VolumeClean,
195623b7c7b8SHermès Bélusca-Maïto     VolumeDirty,
195723b7c7b8SHermès Bélusca-Maïto     VolumeDirtyWithSurfaceTest
195823b7c7b8SHermès Bélusca-Maïto } FAT_VOLUME_STATE, *PFAT_VOLUME_STATE;
195923b7c7b8SHermès Bélusca-Maïto 
196023b7c7b8SHermès Bélusca-Maïto VOID
196123b7c7b8SHermès Bélusca-Maïto FatMarkFcbCondition (
196223b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
196323b7c7b8SHermès Bélusca-Maïto     IN PFCB Fcb,
196423b7c7b8SHermès Bélusca-Maïto     IN FCB_CONDITION FcbCondition,
196523b7c7b8SHermès Bélusca-Maïto     IN BOOLEAN Recursive
196623b7c7b8SHermès Bélusca-Maïto     );
196723b7c7b8SHermès Bélusca-Maïto 
196823b7c7b8SHermès Bélusca-Maïto VOID
196923b7c7b8SHermès Bélusca-Maïto FatVerifyVcb (
197023b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
197123b7c7b8SHermès Bélusca-Maïto     IN PVCB Vcb
197223b7c7b8SHermès Bélusca-Maïto     );
197323b7c7b8SHermès Bélusca-Maïto 
197423b7c7b8SHermès Bélusca-Maïto _Requires_lock_held_(_Global_critical_region_)
197523b7c7b8SHermès Bélusca-Maïto VOID
197623b7c7b8SHermès Bélusca-Maïto FatVerifyFcb (
197723b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
197823b7c7b8SHermès Bélusca-Maïto     IN PFCB Fcb
197923b7c7b8SHermès Bélusca-Maïto     );
198023b7c7b8SHermès Bélusca-Maïto 
198123b7c7b8SHermès Bélusca-Maïto 
198223b7c7b8SHermès Bélusca-Maïto KDEFERRED_ROUTINE FatCleanVolumeDpc;
198323b7c7b8SHermès Bélusca-Maïto 
198423b7c7b8SHermès Bélusca-Maïto VOID
198523b7c7b8SHermès Bélusca-Maïto NTAPI
198623b7c7b8SHermès Bélusca-Maïto FatCleanVolumeDpc (
198723b7c7b8SHermès Bélusca-Maïto     _In_ PKDPC Dpc,
198823b7c7b8SHermès Bélusca-Maïto     _In_opt_ PVOID DeferredContext,
198923b7c7b8SHermès Bélusca-Maïto     _In_opt_ PVOID SystemArgument1,
199023b7c7b8SHermès Bélusca-Maïto     _In_opt_ PVOID SystemArgument2
199123b7c7b8SHermès Bélusca-Maïto     );
199223b7c7b8SHermès Bélusca-Maïto 
199323b7c7b8SHermès Bélusca-Maïto _Requires_lock_held_(_Global_critical_region_)
199423b7c7b8SHermès Bélusca-Maïto VOID
199523b7c7b8SHermès Bélusca-Maïto FatMarkVolume (
199623b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
199723b7c7b8SHermès Bélusca-Maïto     IN PVCB Vcb,
199823b7c7b8SHermès Bélusca-Maïto     IN FAT_VOLUME_STATE VolumeState
199923b7c7b8SHermès Bélusca-Maïto     );
200023b7c7b8SHermès Bélusca-Maïto 
200123b7c7b8SHermès Bélusca-Maïto WORKER_THREAD_ROUTINE FatFspMarkVolumeDirtyWithRecover;
200223b7c7b8SHermès Bélusca-Maïto 
200323b7c7b8SHermès Bélusca-Maïto VOID
200423b7c7b8SHermès Bélusca-Maïto NTAPI
200523b7c7b8SHermès Bélusca-Maïto FatFspMarkVolumeDirtyWithRecover (
200623b7c7b8SHermès Bélusca-Maïto     PVOID Parameter
200723b7c7b8SHermès Bélusca-Maïto     );
200823b7c7b8SHermès Bélusca-Maïto 
200923b7c7b8SHermès Bélusca-Maïto VOID
201023b7c7b8SHermès Bélusca-Maïto FatCheckDirtyBit (
201123b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
201223b7c7b8SHermès Bélusca-Maïto     IN PVCB Vcb
201323b7c7b8SHermès Bélusca-Maïto     );
201423b7c7b8SHermès Bélusca-Maïto 
201523b7c7b8SHermès Bélusca-Maïto VOID
201623b7c7b8SHermès Bélusca-Maïto FatQuickVerifyVcb (
201723b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
201823b7c7b8SHermès Bélusca-Maïto     IN PVCB Vcb
201923b7c7b8SHermès Bélusca-Maïto     );
202023b7c7b8SHermès Bélusca-Maïto 
202123b7c7b8SHermès Bélusca-Maïto VOID
202223b7c7b8SHermès Bélusca-Maïto FatVerifyOperationIsLegal (
202323b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext
202423b7c7b8SHermès Bélusca-Maïto     );
202523b7c7b8SHermès Bélusca-Maïto 
202623b7c7b8SHermès Bélusca-Maïto _Requires_lock_held_(_Global_critical_region_)
202723b7c7b8SHermès Bélusca-Maïto NTSTATUS
202823b7c7b8SHermès Bélusca-Maïto FatPerformVerify (
202923b7c7b8SHermès Bélusca-Maïto     _In_ PIRP_CONTEXT IrpContext,
203023b7c7b8SHermès Bélusca-Maïto     _In_ PIRP Irp,
203123b7c7b8SHermès Bélusca-Maïto     _In_ PDEVICE_OBJECT Device
203223b7c7b8SHermès Bélusca-Maïto     );
203323b7c7b8SHermès Bélusca-Maïto 
203423b7c7b8SHermès Bélusca-Maïto 
203523b7c7b8SHermès Bélusca-Maïto //
203623b7c7b8SHermès Bélusca-Maïto //  Work queue routines for posting and retrieving an Irp, implemented in
203723b7c7b8SHermès Bélusca-Maïto //  workque.c
203823b7c7b8SHermès Bélusca-Maïto //
203923b7c7b8SHermès Bélusca-Maïto 
204023b7c7b8SHermès Bélusca-Maïto VOID
204123b7c7b8SHermès Bélusca-Maïto NTAPI
204223b7c7b8SHermès Bélusca-Maïto FatOplockComplete (
204323b7c7b8SHermès Bélusca-Maïto     IN PVOID Context,
204423b7c7b8SHermès Bélusca-Maïto     IN PIRP Irp
204523b7c7b8SHermès Bélusca-Maïto     );
204623b7c7b8SHermès Bélusca-Maïto 
204723b7c7b8SHermès Bélusca-Maïto VOID
204823b7c7b8SHermès Bélusca-Maïto NTAPI
204923b7c7b8SHermès Bélusca-Maïto FatPrePostIrp (
205023b7c7b8SHermès Bélusca-Maïto     IN PVOID Context,
205123b7c7b8SHermès Bélusca-Maïto     IN PIRP Irp
205223b7c7b8SHermès Bélusca-Maïto     );
205323b7c7b8SHermès Bélusca-Maïto 
205423b7c7b8SHermès Bélusca-Maïto VOID
205523b7c7b8SHermès Bélusca-Maïto #ifdef __REACTOS__
205623b7c7b8SHermès Bélusca-Maïto NTAPI
205723b7c7b8SHermès Bélusca-Maïto #endif
205823b7c7b8SHermès Bélusca-Maïto FatAddToWorkque (
205923b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
206023b7c7b8SHermès Bélusca-Maïto     IN PIRP Irp
206123b7c7b8SHermès Bélusca-Maïto     );
206223b7c7b8SHermès Bélusca-Maïto 
206323b7c7b8SHermès Bélusca-Maïto NTSTATUS
206423b7c7b8SHermès Bélusca-Maïto FatFsdPostRequest (
206523b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
206623b7c7b8SHermès Bélusca-Maïto     IN PIRP Irp
206723b7c7b8SHermès Bélusca-Maïto     );
206823b7c7b8SHermès Bélusca-Maïto 
206923b7c7b8SHermès Bélusca-Maïto //
207023b7c7b8SHermès Bélusca-Maïto //  Miscellaneous support routines
207123b7c7b8SHermès Bélusca-Maïto //
207223b7c7b8SHermès Bélusca-Maïto 
207323b7c7b8SHermès Bélusca-Maïto //
207423b7c7b8SHermès Bélusca-Maïto //      ULONG
207523b7c7b8SHermès Bélusca-Maïto //      PtrOffset (
207623b7c7b8SHermès Bélusca-Maïto //          IN PVOID BasePtr,
207723b7c7b8SHermès Bélusca-Maïto //          IN PVOID OffsetPtr
207823b7c7b8SHermès Bélusca-Maïto //          );
207923b7c7b8SHermès Bélusca-Maïto //
208023b7c7b8SHermès Bélusca-Maïto 
208123b7c7b8SHermès Bélusca-Maïto #define PtrOffset(BASE,OFFSET) ((ULONG)((ULONG_PTR)(OFFSET) - (ULONG_PTR)(BASE)))
208223b7c7b8SHermès Bélusca-Maïto 
208323b7c7b8SHermès Bélusca-Maïto //
208423b7c7b8SHermès Bélusca-Maïto //  This macro takes a pointer (or ulong) and returns its rounded up word
208523b7c7b8SHermès Bélusca-Maïto //  value
208623b7c7b8SHermès Bélusca-Maïto //
208723b7c7b8SHermès Bélusca-Maïto 
208823b7c7b8SHermès Bélusca-Maïto #define WordAlign(Ptr) (                \
208923b7c7b8SHermès Bélusca-Maïto     ((((ULONG)(Ptr)) + 1) & 0xfffffffe) \
209023b7c7b8SHermès Bélusca-Maïto     )
209123b7c7b8SHermès Bélusca-Maïto 
209223b7c7b8SHermès Bélusca-Maïto //
209323b7c7b8SHermès Bélusca-Maïto //  This macro takes a pointer (or ulong) and returns its rounded up longword
209423b7c7b8SHermès Bélusca-Maïto //  value
209523b7c7b8SHermès Bélusca-Maïto //
209623b7c7b8SHermès Bélusca-Maïto 
209723b7c7b8SHermès Bélusca-Maïto #define LongAlign(Ptr) (                \
209823b7c7b8SHermès Bélusca-Maïto     ((((ULONG)(Ptr)) + 3) & 0xfffffffc) \
209923b7c7b8SHermès Bélusca-Maïto     )
210023b7c7b8SHermès Bélusca-Maïto 
210123b7c7b8SHermès Bélusca-Maïto //
210223b7c7b8SHermès Bélusca-Maïto //  This macro takes a pointer (or ulong) and returns its rounded up quadword
210323b7c7b8SHermès Bélusca-Maïto //  value
210423b7c7b8SHermès Bélusca-Maïto //
210523b7c7b8SHermès Bélusca-Maïto 
210623b7c7b8SHermès Bélusca-Maïto #define QuadAlign(Ptr) (                \
210723b7c7b8SHermès Bélusca-Maïto     ((((ULONG)(Ptr)) + 7) & 0xfffffff8) \
210823b7c7b8SHermès Bélusca-Maïto     )
210923b7c7b8SHermès Bélusca-Maïto 
211023b7c7b8SHermès Bélusca-Maïto //
211123b7c7b8SHermès Bélusca-Maïto //  The following types and macros are used to help unpack the packed and
211223b7c7b8SHermès Bélusca-Maïto //  misaligned fields found in the Bios parameter block
211323b7c7b8SHermès Bélusca-Maïto //
211423b7c7b8SHermès Bélusca-Maïto 
211523b7c7b8SHermès Bélusca-Maïto typedef union _UCHAR1 {
211623b7c7b8SHermès Bélusca-Maïto     UCHAR  Uchar[1];
211723b7c7b8SHermès Bélusca-Maïto     UCHAR  ForceAlignment;
211823b7c7b8SHermès Bélusca-Maïto } UCHAR1, *PUCHAR1;
211923b7c7b8SHermès Bélusca-Maïto 
212023b7c7b8SHermès Bélusca-Maïto typedef union _UCHAR2 {
212123b7c7b8SHermès Bélusca-Maïto     UCHAR  Uchar[2];
212223b7c7b8SHermès Bélusca-Maïto     USHORT ForceAlignment;
212323b7c7b8SHermès Bélusca-Maïto } UCHAR2, *PUCHAR2;
212423b7c7b8SHermès Bélusca-Maïto 
212523b7c7b8SHermès Bélusca-Maïto typedef union _UCHAR4 {
212623b7c7b8SHermès Bélusca-Maïto     UCHAR  Uchar[4];
212723b7c7b8SHermès Bélusca-Maïto     ULONG  ForceAlignment;
212823b7c7b8SHermès Bélusca-Maïto } UCHAR4, *PUCHAR4;
212923b7c7b8SHermès Bélusca-Maïto 
213023b7c7b8SHermès Bélusca-Maïto //
213123b7c7b8SHermès Bélusca-Maïto //  This macro copies an unaligned src byte to an aligned dst byte
213223b7c7b8SHermès Bélusca-Maïto //
213323b7c7b8SHermès Bélusca-Maïto 
213423b7c7b8SHermès Bélusca-Maïto #define CopyUchar1(Dst,Src) {                               \
213523b7c7b8SHermès Bélusca-Maïto     *((UCHAR1 *)(Dst)) = *((UNALIGNED UCHAR1 *)(Src));      \
213623b7c7b8SHermès Bélusca-Maïto     }
213723b7c7b8SHermès Bélusca-Maïto 
213823b7c7b8SHermès Bélusca-Maïto //
213923b7c7b8SHermès Bélusca-Maïto //  This macro copies an unaligned src word to an aligned dst word
214023b7c7b8SHermès Bélusca-Maïto //
214123b7c7b8SHermès Bélusca-Maïto 
214223b7c7b8SHermès Bélusca-Maïto #define CopyUchar2(Dst,Src) {                               \
214323b7c7b8SHermès Bélusca-Maïto     *((UCHAR2 *)(Dst)) = *((UNALIGNED UCHAR2 *)(Src));      \
214423b7c7b8SHermès Bélusca-Maïto     }
214523b7c7b8SHermès Bélusca-Maïto 
214623b7c7b8SHermès Bélusca-Maïto //
214723b7c7b8SHermès Bélusca-Maïto //  This macro copies an unaligned src longword to an aligned dsr longword
214823b7c7b8SHermès Bélusca-Maïto //
214923b7c7b8SHermès Bélusca-Maïto 
215023b7c7b8SHermès Bélusca-Maïto #define CopyUchar4(Dst,Src) {                               \
215123b7c7b8SHermès Bélusca-Maïto     *((UCHAR4 *)(Dst)) = *((UNALIGNED UCHAR4 *)(Src));      \
215223b7c7b8SHermès Bélusca-Maïto     }
215323b7c7b8SHermès Bélusca-Maïto 
215423b7c7b8SHermès Bélusca-Maïto #define CopyU4char(Dst,Src) {                               \
215523b7c7b8SHermès Bélusca-Maïto     *((UNALIGNED UCHAR4 *)(Dst)) = *((UCHAR4 *)(Src));      \
215623b7c7b8SHermès Bélusca-Maïto     }
215723b7c7b8SHermès Bélusca-Maïto 
215823b7c7b8SHermès Bélusca-Maïto //
215923b7c7b8SHermès Bélusca-Maïto //  VOID
216023b7c7b8SHermès Bélusca-Maïto //  FatNotifyReportChange (
216123b7c7b8SHermès Bélusca-Maïto //      IN PIRP_CONTEXT IrpContext,
216223b7c7b8SHermès Bélusca-Maïto //      IN PVCB Vcb,
216323b7c7b8SHermès Bélusca-Maïto //      IN PFCB Fcb,
216423b7c7b8SHermès Bélusca-Maïto //      IN ULONG Filter,
216523b7c7b8SHermès Bélusca-Maïto //      IN ULONG Action
216623b7c7b8SHermès Bélusca-Maïto //      );
216723b7c7b8SHermès Bélusca-Maïto //
216823b7c7b8SHermès Bélusca-Maïto 
216923b7c7b8SHermès Bélusca-Maïto #define FatNotifyReportChange(I,V,F,FL,A) {                                                         \
217023b7c7b8SHermès Bélusca-Maïto     if ((F)->FullFileName.Buffer == NULL) {                                                         \
217123b7c7b8SHermès Bélusca-Maïto         FatSetFullFileNameInFcb((I),(F));                                                           \
217223b7c7b8SHermès Bélusca-Maïto     }                                                                                               \
217323b7c7b8SHermès Bélusca-Maïto     NT_ASSERT( (F)->FullFileName.Length != 0 );                                                     \
217423b7c7b8SHermès Bélusca-Maïto     NT_ASSERT( (F)->FinalNameLength != 0 );                                                         \
217523b7c7b8SHermès Bélusca-Maïto     NT_ASSERT( (F)->FullFileName.Length > (F)->FinalNameLength );                                   \
217623b7c7b8SHermès Bélusca-Maïto     NT_ASSERT( (F)->FullFileName.Buffer[((F)->FullFileName.Length - (F)->FinalNameLength)/sizeof(WCHAR) - 1] == L'\\' ); \
217723b7c7b8SHermès Bélusca-Maïto     FsRtlNotifyFullReportChange( (V)->NotifySync,                                                   \
217823b7c7b8SHermès Bélusca-Maïto                                  &(V)->DirNotifyList,                                               \
217923b7c7b8SHermès Bélusca-Maïto                                  (PSTRING)&(F)->FullFileName,                                       \
218023b7c7b8SHermès Bélusca-Maïto                                  (USHORT) ((F)->FullFileName.Length -                               \
218123b7c7b8SHermès Bélusca-Maïto                                            (F)->FinalNameLength),                                   \
218223b7c7b8SHermès Bélusca-Maïto                                  (PSTRING)NULL,                                                     \
218323b7c7b8SHermès Bélusca-Maïto                                  (PSTRING)NULL,                                                     \
218423b7c7b8SHermès Bélusca-Maïto                                  (ULONG)FL,                                                         \
218523b7c7b8SHermès Bélusca-Maïto                                  (ULONG)A,                                                          \
218623b7c7b8SHermès Bélusca-Maïto                                  (PVOID)NULL );                                                     \
218723b7c7b8SHermès Bélusca-Maïto }
218823b7c7b8SHermès Bélusca-Maïto 
218923b7c7b8SHermès Bélusca-Maïto 
219023b7c7b8SHermès Bélusca-Maïto //
219123b7c7b8SHermès Bélusca-Maïto //  The FSD Level dispatch routines.   These routines are called by the
219223b7c7b8SHermès Bélusca-Maïto //  I/O system via the dispatch table in the Driver Object.
219323b7c7b8SHermès Bélusca-Maïto //
219423b7c7b8SHermès Bélusca-Maïto //  They each accept as input a pointer to a device object (actually most
219523b7c7b8SHermès Bélusca-Maïto //  expect a volume device object, with the exception of the file system
219623b7c7b8SHermès Bélusca-Maïto //  control function which can also take a file system device object), and
219723b7c7b8SHermès Bélusca-Maïto //  a pointer to the IRP.  They either perform the function at the FSD level
219823b7c7b8SHermès Bélusca-Maïto //  or post the request to the FSP work queue for FSP level processing.
219923b7c7b8SHermès Bélusca-Maïto //
220023b7c7b8SHermès Bélusca-Maïto 
220123b7c7b8SHermès Bélusca-Maïto _Function_class_(IRP_MJ_CLEANUP)
220223b7c7b8SHermès Bélusca-Maïto _Function_class_(DRIVER_DISPATCH)
220323b7c7b8SHermès Bélusca-Maïto NTSTATUS
220423b7c7b8SHermès Bélusca-Maïto NTAPI
220523b7c7b8SHermès Bélusca-Maïto FatFsdCleanup (                         //  implemented in Cleanup.c
220623b7c7b8SHermès Bélusca-Maïto     _In_ PVOLUME_DEVICE_OBJECT VolumeDeviceObject,
220723b7c7b8SHermès Bélusca-Maïto     _Inout_ PIRP Irp
220823b7c7b8SHermès Bélusca-Maïto     );
220923b7c7b8SHermès Bélusca-Maïto 
221023b7c7b8SHermès Bélusca-Maïto _Function_class_(IRP_MJ_CLOSE)
221123b7c7b8SHermès Bélusca-Maïto _Function_class_(DRIVER_DISPATCH)
221223b7c7b8SHermès Bélusca-Maïto NTSTATUS
221323b7c7b8SHermès Bélusca-Maïto NTAPI
221423b7c7b8SHermès Bélusca-Maïto FatFsdClose (                           //  implemented in Close.c
221523b7c7b8SHermès Bélusca-Maïto     _In_ PVOLUME_DEVICE_OBJECT VolumeDeviceObject,
221623b7c7b8SHermès Bélusca-Maïto     _Inout_ PIRP Irp
221723b7c7b8SHermès Bélusca-Maïto     );
221823b7c7b8SHermès Bélusca-Maïto 
221923b7c7b8SHermès Bélusca-Maïto _Function_class_(IRP_MJ_CREATE)
222023b7c7b8SHermès Bélusca-Maïto _Function_class_(DRIVER_DISPATCH)
222123b7c7b8SHermès Bélusca-Maïto NTSTATUS
222223b7c7b8SHermès Bélusca-Maïto NTAPI
222323b7c7b8SHermès Bélusca-Maïto FatFsdCreate (                          //  implemented in Create.c
222423b7c7b8SHermès Bélusca-Maïto     _In_ PVOLUME_DEVICE_OBJECT VolumeDeviceObject,
222523b7c7b8SHermès Bélusca-Maïto     _Inout_ PIRP Irp
222623b7c7b8SHermès Bélusca-Maïto     );
222723b7c7b8SHermès Bélusca-Maïto 
222823b7c7b8SHermès Bélusca-Maïto 
222923b7c7b8SHermès Bélusca-Maïto _Function_class_(IRP_MJ_DEVICE_CONTROL)
223023b7c7b8SHermès Bélusca-Maïto _Function_class_(DRIVER_DISPATCH)
223123b7c7b8SHermès Bélusca-Maïto NTSTATUS
223223b7c7b8SHermès Bélusca-Maïto NTAPI
223323b7c7b8SHermès Bélusca-Maïto FatFsdDeviceControl (                   //  implemented in DevCtrl.c
223423b7c7b8SHermès Bélusca-Maïto     _In_ PVOLUME_DEVICE_OBJECT VolumeDeviceObject,
223523b7c7b8SHermès Bélusca-Maïto     _Inout_ PIRP Irp
223623b7c7b8SHermès Bélusca-Maïto     );
223723b7c7b8SHermès Bélusca-Maïto 
223823b7c7b8SHermès Bélusca-Maïto _Function_class_(IRP_MJ_DIRECTORY_CONTROL)
223923b7c7b8SHermès Bélusca-Maïto _Function_class_(DRIVER_DISPATCH)
224023b7c7b8SHermès Bélusca-Maïto NTSTATUS
224123b7c7b8SHermès Bélusca-Maïto NTAPI
224223b7c7b8SHermès Bélusca-Maïto FatFsdDirectoryControl (                //  implemented in DirCtrl.c
224323b7c7b8SHermès Bélusca-Maïto     _In_ PVOLUME_DEVICE_OBJECT VolumeDeviceObject,
224423b7c7b8SHermès Bélusca-Maïto     _Inout_ PIRP Irp
224523b7c7b8SHermès Bélusca-Maïto     );
224623b7c7b8SHermès Bélusca-Maïto 
224723b7c7b8SHermès Bélusca-Maïto _Function_class_(IRP_MJ_QUERY_EA)
224823b7c7b8SHermès Bélusca-Maïto _Function_class_(DRIVER_DISPATCH)
224923b7c7b8SHermès Bélusca-Maïto NTSTATUS
225023b7c7b8SHermès Bélusca-Maïto NTAPI
225123b7c7b8SHermès Bélusca-Maïto FatFsdQueryEa (                         //  implemented in Ea.c
225223b7c7b8SHermès Bélusca-Maïto     _In_ PVOLUME_DEVICE_OBJECT VolumeDeviceObject,
225323b7c7b8SHermès Bélusca-Maïto     _Inout_ PIRP Irp
225423b7c7b8SHermès Bélusca-Maïto     );
225523b7c7b8SHermès Bélusca-Maïto 
225623b7c7b8SHermès Bélusca-Maïto _Function_class_(IRP_MJ_SET_EA)
225723b7c7b8SHermès Bélusca-Maïto _Function_class_(DRIVER_DISPATCH)
225823b7c7b8SHermès Bélusca-Maïto NTSTATUS
225923b7c7b8SHermès Bélusca-Maïto NTAPI
226023b7c7b8SHermès Bélusca-Maïto FatFsdSetEa (                           //  implemented in Ea.c
226123b7c7b8SHermès Bélusca-Maïto     _In_ PVOLUME_DEVICE_OBJECT VolumeDeviceObject,
226223b7c7b8SHermès Bélusca-Maïto     _Inout_ PIRP Irp
226323b7c7b8SHermès Bélusca-Maïto     );
226423b7c7b8SHermès Bélusca-Maïto 
226523b7c7b8SHermès Bélusca-Maïto _Function_class_(IRP_MJ_QUERY_INFORMATION)
226623b7c7b8SHermès Bélusca-Maïto _Function_class_(DRIVER_DISPATCH)
226723b7c7b8SHermès Bélusca-Maïto NTSTATUS
226823b7c7b8SHermès Bélusca-Maïto NTAPI
226923b7c7b8SHermès Bélusca-Maïto FatFsdQueryInformation (                //  implemented in FileInfo.c
227023b7c7b8SHermès Bélusca-Maïto     _In_ PVOLUME_DEVICE_OBJECT VolumeDeviceObject,
227123b7c7b8SHermès Bélusca-Maïto     _Inout_ PIRP Irp
227223b7c7b8SHermès Bélusca-Maïto     );
227323b7c7b8SHermès Bélusca-Maïto 
227423b7c7b8SHermès Bélusca-Maïto _Function_class_(IRP_MJ_SET_INFORMATION)
227523b7c7b8SHermès Bélusca-Maïto _Function_class_(DRIVER_DISPATCH)
227623b7c7b8SHermès Bélusca-Maïto NTSTATUS
227723b7c7b8SHermès Bélusca-Maïto NTAPI
227823b7c7b8SHermès Bélusca-Maïto FatFsdSetInformation (                  //  implemented in FileInfo.c
227923b7c7b8SHermès Bélusca-Maïto     _In_ PVOLUME_DEVICE_OBJECT VolumeDeviceObject,
228023b7c7b8SHermès Bélusca-Maïto     _Inout_ PIRP Irp
228123b7c7b8SHermès Bélusca-Maïto     );
228223b7c7b8SHermès Bélusca-Maïto 
228323b7c7b8SHermès Bélusca-Maïto _Function_class_(IRP_MJ_FLUSH_BUFFERS)
228423b7c7b8SHermès Bélusca-Maïto _Function_class_(DRIVER_DISPATCH)
228523b7c7b8SHermès Bélusca-Maïto NTSTATUS
228623b7c7b8SHermès Bélusca-Maïto NTAPI
228723b7c7b8SHermès Bélusca-Maïto FatFsdFlushBuffers (                    //  implemented in Flush.c
228823b7c7b8SHermès Bélusca-Maïto     _In_ PVOLUME_DEVICE_OBJECT VolumeDeviceObject,
228923b7c7b8SHermès Bélusca-Maïto     _Inout_ PIRP Irp
229023b7c7b8SHermès Bélusca-Maïto     );
229123b7c7b8SHermès Bélusca-Maïto 
229223b7c7b8SHermès Bélusca-Maïto _Function_class_(IRP_MJ_FILE_SYSTEM_CONTROL)
229323b7c7b8SHermès Bélusca-Maïto _Function_class_(DRIVER_DISPATCH)
229423b7c7b8SHermès Bélusca-Maïto NTSTATUS
229523b7c7b8SHermès Bélusca-Maïto NTAPI
229623b7c7b8SHermès Bélusca-Maïto FatFsdFileSystemControl (               //  implemented in FsCtrl.c
229723b7c7b8SHermès Bélusca-Maïto     _In_ PVOLUME_DEVICE_OBJECT VolumeDeviceObject,
229823b7c7b8SHermès Bélusca-Maïto     _Inout_ PIRP Irp
229923b7c7b8SHermès Bélusca-Maïto     );
230023b7c7b8SHermès Bélusca-Maïto 
230123b7c7b8SHermès Bélusca-Maïto _Function_class_(IRP_MJ_LOCK_CONTROL)
230223b7c7b8SHermès Bélusca-Maïto _Function_class_(DRIVER_DISPATCH)
230323b7c7b8SHermès Bélusca-Maïto NTSTATUS
230423b7c7b8SHermès Bélusca-Maïto NTAPI
230523b7c7b8SHermès Bélusca-Maïto FatFsdLockControl (                     //  implemented in LockCtrl.c
230623b7c7b8SHermès Bélusca-Maïto     _In_ PVOLUME_DEVICE_OBJECT VolumeDeviceObject,
230723b7c7b8SHermès Bélusca-Maïto     _Inout_ PIRP Irp
230823b7c7b8SHermès Bélusca-Maïto     );
230923b7c7b8SHermès Bélusca-Maïto 
231023b7c7b8SHermès Bélusca-Maïto _Function_class_(IRP_MJ_PNP)
231123b7c7b8SHermès Bélusca-Maïto _Function_class_(DRIVER_DISPATCH)
231223b7c7b8SHermès Bélusca-Maïto NTSTATUS
231323b7c7b8SHermès Bélusca-Maïto NTAPI
231423b7c7b8SHermès Bélusca-Maïto FatFsdPnp (                            //  implemented in Pnp.c
231523b7c7b8SHermès Bélusca-Maïto     _In_ PVOLUME_DEVICE_OBJECT VolumeDeviceObject,
231623b7c7b8SHermès Bélusca-Maïto     _Inout_ PIRP Irp
231723b7c7b8SHermès Bélusca-Maïto     );
231823b7c7b8SHermès Bélusca-Maïto 
231923b7c7b8SHermès Bélusca-Maïto _Function_class_(IRP_MJ_READ)
232023b7c7b8SHermès Bélusca-Maïto _Function_class_(DRIVER_DISPATCH)
232123b7c7b8SHermès Bélusca-Maïto NTSTATUS
232223b7c7b8SHermès Bélusca-Maïto NTAPI
232323b7c7b8SHermès Bélusca-Maïto FatFsdRead (                            //  implemented in Read.c
232423b7c7b8SHermès Bélusca-Maïto     _In_ PVOLUME_DEVICE_OBJECT VolumeDeviceObject,
232523b7c7b8SHermès Bélusca-Maïto     _Inout_ PIRP Irp
232623b7c7b8SHermès Bélusca-Maïto     );
232723b7c7b8SHermès Bélusca-Maïto 
232823b7c7b8SHermès Bélusca-Maïto _Function_class_(IRP_MJ_SHUTDOWN)
232923b7c7b8SHermès Bélusca-Maïto _Function_class_(DRIVER_DISPATCH)
233023b7c7b8SHermès Bélusca-Maïto NTSTATUS
233123b7c7b8SHermès Bélusca-Maïto NTAPI
233223b7c7b8SHermès Bélusca-Maïto FatFsdShutdown (                        //  implemented in Shutdown.c
233323b7c7b8SHermès Bélusca-Maïto     _In_ PVOLUME_DEVICE_OBJECT VolumeDeviceObject,
233423b7c7b8SHermès Bélusca-Maïto     _Inout_ PIRP Irp
233523b7c7b8SHermès Bélusca-Maïto     );
233623b7c7b8SHermès Bélusca-Maïto 
233723b7c7b8SHermès Bélusca-Maïto _Function_class_(IRP_MJ_QUERY_VOLUME_INFORMATION)
233823b7c7b8SHermès Bélusca-Maïto _Function_class_(DRIVER_DISPATCH)
233923b7c7b8SHermès Bélusca-Maïto NTSTATUS
234023b7c7b8SHermès Bélusca-Maïto NTAPI
234123b7c7b8SHermès Bélusca-Maïto FatFsdQueryVolumeInformation (          //  implemented in VolInfo.c
234223b7c7b8SHermès Bélusca-Maïto     _In_ PVOLUME_DEVICE_OBJECT VolumeDeviceObject,
234323b7c7b8SHermès Bélusca-Maïto     _Inout_ PIRP Irp
234423b7c7b8SHermès Bélusca-Maïto     );
234523b7c7b8SHermès Bélusca-Maïto 
234623b7c7b8SHermès Bélusca-Maïto _Function_class_(IRP_MJ_SET_VOLUME_INFORMATION)
234723b7c7b8SHermès Bélusca-Maïto _Function_class_(DRIVER_DISPATCH)
234823b7c7b8SHermès Bélusca-Maïto NTSTATUS
234923b7c7b8SHermès Bélusca-Maïto NTAPI
235023b7c7b8SHermès Bélusca-Maïto FatFsdSetVolumeInformation (            //  implemented in VolInfo.c
235123b7c7b8SHermès Bélusca-Maïto     _In_ PVOLUME_DEVICE_OBJECT VolumeDeviceObject,
235223b7c7b8SHermès Bélusca-Maïto     _Inout_ PIRP Irp
235323b7c7b8SHermès Bélusca-Maïto     );
235423b7c7b8SHermès Bélusca-Maïto 
235523b7c7b8SHermès Bélusca-Maïto _Function_class_(IRP_MJ_WRITE)
235623b7c7b8SHermès Bélusca-Maïto _Function_class_(DRIVER_DISPATCH)
235723b7c7b8SHermès Bélusca-Maïto NTSTATUS
235823b7c7b8SHermès Bélusca-Maïto NTAPI
235923b7c7b8SHermès Bélusca-Maïto FatFsdWrite (                           //  implemented in Write.c
236023b7c7b8SHermès Bélusca-Maïto     _In_ PVOLUME_DEVICE_OBJECT VolumeDeviceObject,
236123b7c7b8SHermès Bélusca-Maïto     _Inout_ PIRP Irp
236223b7c7b8SHermès Bélusca-Maïto     );
236323b7c7b8SHermès Bélusca-Maïto 
236423b7c7b8SHermès Bélusca-Maïto //
236523b7c7b8SHermès Bélusca-Maïto //  The following macro is used to determine if an FSD thread can block
236623b7c7b8SHermès Bélusca-Maïto //  for I/O or wait for a resource.  It returns TRUE if the thread can
236723b7c7b8SHermès Bélusca-Maïto //  block and FALSE otherwise.  This attribute can then be used to call
236823b7c7b8SHermès Bélusca-Maïto //  the FSD & FSP common work routine with the proper wait value.
236923b7c7b8SHermès Bélusca-Maïto //
237023b7c7b8SHermès Bélusca-Maïto 
237123b7c7b8SHermès Bélusca-Maïto #define CanFsdWait(IRP) IoIsOperationSynchronous(Irp)
237223b7c7b8SHermès Bélusca-Maïto 
237323b7c7b8SHermès Bélusca-Maïto 
237423b7c7b8SHermès Bélusca-Maïto //
237523b7c7b8SHermès Bélusca-Maïto //  The FSP level dispatch/main routine.  This is the routine that takes
237623b7c7b8SHermès Bélusca-Maïto //  IRP's off of the work queue and calls the appropriate FSP level
237723b7c7b8SHermès Bélusca-Maïto //  work routine.
237823b7c7b8SHermès Bélusca-Maïto //
237923b7c7b8SHermès Bélusca-Maïto 
238023b7c7b8SHermès Bélusca-Maïto 
238123b7c7b8SHermès Bélusca-Maïto WORKER_THREAD_ROUTINE FatFspDispatch;
238223b7c7b8SHermès Bélusca-Maïto 
238323b7c7b8SHermès Bélusca-Maïto VOID
238423b7c7b8SHermès Bélusca-Maïto NTAPI
238523b7c7b8SHermès Bélusca-Maïto FatFspDispatch (                        //  implemented in FspDisp.c
238623b7c7b8SHermès Bélusca-Maïto     _In_ PVOID Context
238723b7c7b8SHermès Bélusca-Maïto     );
238823b7c7b8SHermès Bélusca-Maïto 
238923b7c7b8SHermès Bélusca-Maïto //
239023b7c7b8SHermès Bélusca-Maïto //  The following routines are the FSP work routines that are called
239123b7c7b8SHermès Bélusca-Maïto //  by the preceding FatFspDispath routine.  Each takes as input a pointer
239223b7c7b8SHermès Bélusca-Maïto //  to the IRP, perform the function, and return a pointer to the volume
239323b7c7b8SHermès Bélusca-Maïto //  device object that they just finished servicing (if any).  The return
239423b7c7b8SHermès Bélusca-Maïto //  pointer is then used by the main Fsp dispatch routine to check for
239523b7c7b8SHermès Bélusca-Maïto //  additional IRPs in the volume's overflow queue.
239623b7c7b8SHermès Bélusca-Maïto //
239723b7c7b8SHermès Bélusca-Maïto //  Each of the following routines is also responsible for completing the IRP.
239823b7c7b8SHermès Bélusca-Maïto //  We moved this responsibility from the main loop to the individual routines
239923b7c7b8SHermès Bélusca-Maïto //  to allow them the ability to complete the IRP and continue post processing
240023b7c7b8SHermès Bélusca-Maïto //  actions.
240123b7c7b8SHermès Bélusca-Maïto //
240223b7c7b8SHermès Bélusca-Maïto 
240323b7c7b8SHermès Bélusca-Maïto _Requires_lock_held_(_Global_critical_region_)
240423b7c7b8SHermès Bélusca-Maïto NTSTATUS
240523b7c7b8SHermès Bélusca-Maïto FatCommonCleanup (                      //  implemented in Cleanup.c
240623b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
240723b7c7b8SHermès Bélusca-Maïto     IN PIRP Irp
240823b7c7b8SHermès Bélusca-Maïto     );
240923b7c7b8SHermès Bélusca-Maïto 
241023b7c7b8SHermès Bélusca-Maïto _Requires_lock_held_(_Global_critical_region_)
241123b7c7b8SHermès Bélusca-Maïto NTSTATUS
241223b7c7b8SHermès Bélusca-Maïto FatCommonClose (                        //  implemented in Close.c
241323b7c7b8SHermès Bélusca-Maïto     IN PVCB Vcb,
241423b7c7b8SHermès Bélusca-Maïto     IN PFCB Fcb,
241523b7c7b8SHermès Bélusca-Maïto     IN PCCB Ccb,
241623b7c7b8SHermès Bélusca-Maïto     IN TYPE_OF_OPEN TypeOfOpen,
241723b7c7b8SHermès Bélusca-Maïto     IN BOOLEAN Wait,
241823b7c7b8SHermès Bélusca-Maïto     IN BOOLEAN TopLevel,
241923b7c7b8SHermès Bélusca-Maïto     OUT PBOOLEAN VcbDeleted OPTIONAL
242023b7c7b8SHermès Bélusca-Maïto     );
242123b7c7b8SHermès Bélusca-Maïto 
242223b7c7b8SHermès Bélusca-Maïto _Requires_lock_held_(_Global_critical_region_)
242323b7c7b8SHermès Bélusca-Maïto VOID
242423b7c7b8SHermès Bélusca-Maïto FatFspClose (                           //  implemented in Close.c
242523b7c7b8SHermès Bélusca-Maïto     IN PVCB Vcb OPTIONAL
242623b7c7b8SHermès Bélusca-Maïto     );
242723b7c7b8SHermès Bélusca-Maïto 
242823b7c7b8SHermès Bélusca-Maïto _Requires_lock_held_(_Global_critical_region_)
242923b7c7b8SHermès Bélusca-Maïto NTSTATUS
243023b7c7b8SHermès Bélusca-Maïto FatCommonCreate (                       //  implemented in Create.c
243123b7c7b8SHermès Bélusca-Maïto     _Inout_ PIRP_CONTEXT IrpContext,
243223b7c7b8SHermès Bélusca-Maïto     _Inout_ PIRP Irp
243323b7c7b8SHermès Bélusca-Maïto     );
243423b7c7b8SHermès Bélusca-Maïto 
243523b7c7b8SHermès Bélusca-Maïto #if (NTDDI_VERSION >= NTDDI_WINTHRESHOLD)
243623b7c7b8SHermès Bélusca-Maïto 
243723b7c7b8SHermès Bélusca-Maïto _Requires_lock_held_(_Global_critical_region_)
243823b7c7b8SHermès Bélusca-Maïto NTSTATUS
243923b7c7b8SHermès Bélusca-Maïto FatCommonCreateOnNewStack (        //  implemented in Create.c
244023b7c7b8SHermès Bélusca-Maïto     _Inout_ PIRP_CONTEXT IrpContext,
244123b7c7b8SHermès Bélusca-Maïto     _Inout_ PIRP Irp
244223b7c7b8SHermès Bélusca-Maïto     );
244323b7c7b8SHermès Bélusca-Maïto 
244423b7c7b8SHermès Bélusca-Maïto _Requires_lock_held_(_Global_critical_region_)
244523b7c7b8SHermès Bélusca-Maïto VOID
244623b7c7b8SHermès Bélusca-Maïto FatCommonCreateCallout (              //  implemented in Create.c
244723b7c7b8SHermès Bélusca-Maïto     _In_ PFAT_CALLOUT_PARAMETERS CalloutParameters
244823b7c7b8SHermès Bélusca-Maïto     );
244923b7c7b8SHermès Bélusca-Maïto 
245023b7c7b8SHermès Bélusca-Maïto #endif
245123b7c7b8SHermès Bélusca-Maïto 
245223b7c7b8SHermès Bélusca-Maïto _Requires_lock_held_(_Global_critical_region_)
245323b7c7b8SHermès Bélusca-Maïto NTSTATUS
245423b7c7b8SHermès Bélusca-Maïto FatCommonDirectoryControl (             //  implemented in DirCtrl.c
245523b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
245623b7c7b8SHermès Bélusca-Maïto     IN PIRP Irp
245723b7c7b8SHermès Bélusca-Maïto     );
245823b7c7b8SHermès Bélusca-Maïto 
245923b7c7b8SHermès Bélusca-Maïto _Requires_lock_held_(_Global_critical_region_)
246023b7c7b8SHermès Bélusca-Maïto NTSTATUS
246123b7c7b8SHermès Bélusca-Maïto FatCommonDeviceControl (                //  implemented in DevCtrl.c
246223b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
246323b7c7b8SHermès Bélusca-Maïto     IN PIRP Irp
246423b7c7b8SHermès Bélusca-Maïto     );
246523b7c7b8SHermès Bélusca-Maïto 
246623b7c7b8SHermès Bélusca-Maïto NTSTATUS
246723b7c7b8SHermès Bélusca-Maïto FatCommonQueryEa (                      //  implemented in Ea.c
246823b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
246923b7c7b8SHermès Bélusca-Maïto     IN PIRP Irp
247023b7c7b8SHermès Bélusca-Maïto     );
247123b7c7b8SHermès Bélusca-Maïto 
247223b7c7b8SHermès Bélusca-Maïto NTSTATUS
247323b7c7b8SHermès Bélusca-Maïto FatCommonSetEa (                        //  implemented in Ea.c
247423b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
247523b7c7b8SHermès Bélusca-Maïto     IN PIRP Irp
247623b7c7b8SHermès Bélusca-Maïto     );
247723b7c7b8SHermès Bélusca-Maïto 
247823b7c7b8SHermès Bélusca-Maïto _Requires_lock_held_(_Global_critical_region_)
247923b7c7b8SHermès Bélusca-Maïto NTSTATUS
248023b7c7b8SHermès Bélusca-Maïto FatCommonQueryInformation (             //  implemented in FileInfo.c
248123b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
248223b7c7b8SHermès Bélusca-Maïto     IN PIRP Irp
248323b7c7b8SHermès Bélusca-Maïto     );
248423b7c7b8SHermès Bélusca-Maïto 
248523b7c7b8SHermès Bélusca-Maïto _Requires_lock_held_(_Global_critical_region_)
248623b7c7b8SHermès Bélusca-Maïto NTSTATUS
248723b7c7b8SHermès Bélusca-Maïto FatCommonSetInformation (               //  implemented in FileInfo.c
248823b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
248923b7c7b8SHermès Bélusca-Maïto     IN PIRP Irp
249023b7c7b8SHermès Bélusca-Maïto     );
249123b7c7b8SHermès Bélusca-Maïto 
249223b7c7b8SHermès Bélusca-Maïto _Requires_lock_held_(_Global_critical_region_)
249323b7c7b8SHermès Bélusca-Maïto NTSTATUS
249423b7c7b8SHermès Bélusca-Maïto FatCommonFlushBuffers (                 //  implemented in Flush.c
249523b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
249623b7c7b8SHermès Bélusca-Maïto     IN PIRP Irp
249723b7c7b8SHermès Bélusca-Maïto     );
249823b7c7b8SHermès Bélusca-Maïto 
249923b7c7b8SHermès Bélusca-Maïto _Requires_lock_held_(_Global_critical_region_)
250023b7c7b8SHermès Bélusca-Maïto NTSTATUS
250123b7c7b8SHermès Bélusca-Maïto FatCommonFileSystemControl (            //  implemented in FsCtrl.c
250223b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
250323b7c7b8SHermès Bélusca-Maïto     IN PIRP Irp
250423b7c7b8SHermès Bélusca-Maïto     );
250523b7c7b8SHermès Bélusca-Maïto 
250623b7c7b8SHermès Bélusca-Maïto _Requires_lock_held_(_Global_critical_region_)
250723b7c7b8SHermès Bélusca-Maïto NTSTATUS
250823b7c7b8SHermès Bélusca-Maïto FatCommonLockControl (                  //  implemented in LockCtrl.c
250923b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
251023b7c7b8SHermès Bélusca-Maïto     IN PIRP Irp
251123b7c7b8SHermès Bélusca-Maïto     );
251223b7c7b8SHermès Bélusca-Maïto 
251323b7c7b8SHermès Bélusca-Maïto _Requires_lock_held_(_Global_critical_region_)
251423b7c7b8SHermès Bélusca-Maïto NTSTATUS
251523b7c7b8SHermès Bélusca-Maïto FatCommonPnp (                          //  implemented in Pnp.c
251623b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
251723b7c7b8SHermès Bélusca-Maïto     IN PIRP Irp
251823b7c7b8SHermès Bélusca-Maïto     );
251923b7c7b8SHermès Bélusca-Maïto 
252023b7c7b8SHermès Bélusca-Maïto _Requires_lock_held_(_Global_critical_region_)
252123b7c7b8SHermès Bélusca-Maïto NTSTATUS
252223b7c7b8SHermès Bélusca-Maïto FatCommonRead (                         //  implemented in Read.c
252323b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
252423b7c7b8SHermès Bélusca-Maïto     IN PIRP Irp
252523b7c7b8SHermès Bélusca-Maïto     );
252623b7c7b8SHermès Bélusca-Maïto 
252723b7c7b8SHermès Bélusca-Maïto _Requires_lock_held_(_Global_critical_region_)
252823b7c7b8SHermès Bélusca-Maïto NTSTATUS
252923b7c7b8SHermès Bélusca-Maïto FatCommonShutdown (                     //  implemented in Shutdown.c
253023b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
253123b7c7b8SHermès Bélusca-Maïto     IN PIRP Irp
253223b7c7b8SHermès Bélusca-Maïto     );
253323b7c7b8SHermès Bélusca-Maïto 
253423b7c7b8SHermès Bélusca-Maïto _Requires_lock_held_(_Global_critical_region_)
253523b7c7b8SHermès Bélusca-Maïto NTSTATUS
253623b7c7b8SHermès Bélusca-Maïto FatCommonQueryVolumeInfo (              //  implemented in VolInfo.c
253723b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
253823b7c7b8SHermès Bélusca-Maïto     IN PIRP Irp
253923b7c7b8SHermès Bélusca-Maïto     );
254023b7c7b8SHermès Bélusca-Maïto 
254123b7c7b8SHermès Bélusca-Maïto _Requires_lock_held_(_Global_critical_region_)
254223b7c7b8SHermès Bélusca-Maïto NTSTATUS
254323b7c7b8SHermès Bélusca-Maïto FatCommonSetVolumeInfo (                //  implemented in VolInfo.c
254423b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
254523b7c7b8SHermès Bélusca-Maïto     IN PIRP Irp
254623b7c7b8SHermès Bélusca-Maïto     );
254723b7c7b8SHermès Bélusca-Maïto 
254823b7c7b8SHermès Bélusca-Maïto _Requires_lock_held_(_Global_critical_region_)
254923b7c7b8SHermès Bélusca-Maïto NTSTATUS
255023b7c7b8SHermès Bélusca-Maïto FatCommonWrite (                        //  implemented in Write.c
255123b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
255223b7c7b8SHermès Bélusca-Maïto     IN PIRP Irp
255323b7c7b8SHermès Bélusca-Maïto     );
255423b7c7b8SHermès Bélusca-Maïto 
255523b7c7b8SHermès Bélusca-Maïto //
255623b7c7b8SHermès Bélusca-Maïto //  The following is implemented in Flush.c, and does what is says.
255723b7c7b8SHermès Bélusca-Maïto //
255823b7c7b8SHermès Bélusca-Maïto 
255923b7c7b8SHermès Bélusca-Maïto _Requires_lock_held_(_Global_critical_region_)
256023b7c7b8SHermès Bélusca-Maïto NTSTATUS
256123b7c7b8SHermès Bélusca-Maïto FatFlushFile (
256223b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
256323b7c7b8SHermès Bélusca-Maïto     IN PFCB Fcb,
256423b7c7b8SHermès Bélusca-Maïto     IN FAT_FLUSH_TYPE FlushType
256523b7c7b8SHermès Bélusca-Maïto     );
256623b7c7b8SHermès Bélusca-Maïto 
256723b7c7b8SHermès Bélusca-Maïto _Requires_lock_held_(_Global_critical_region_)
256823b7c7b8SHermès Bélusca-Maïto NTSTATUS
256923b7c7b8SHermès Bélusca-Maïto FatFlushDirectory (
257023b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
257123b7c7b8SHermès Bélusca-Maïto     IN PDCB Dcb,
257223b7c7b8SHermès Bélusca-Maïto     IN FAT_FLUSH_TYPE FlushType
257323b7c7b8SHermès Bélusca-Maïto     );
257423b7c7b8SHermès Bélusca-Maïto 
257523b7c7b8SHermès Bélusca-Maïto NTSTATUS
257623b7c7b8SHermès Bélusca-Maïto FatFlushFat (
257723b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
257823b7c7b8SHermès Bélusca-Maïto     IN PVCB Vcb
257923b7c7b8SHermès Bélusca-Maïto     );
258023b7c7b8SHermès Bélusca-Maïto 
258123b7c7b8SHermès Bélusca-Maïto _Requires_lock_held_(_Global_critical_region_)
258223b7c7b8SHermès Bélusca-Maïto NTSTATUS
258323b7c7b8SHermès Bélusca-Maïto FatFlushVolume (
258423b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
258523b7c7b8SHermès Bélusca-Maïto     IN PVCB Vcb,
258623b7c7b8SHermès Bélusca-Maïto     IN FAT_FLUSH_TYPE FlushType
258723b7c7b8SHermès Bélusca-Maïto     );
258823b7c7b8SHermès Bélusca-Maïto 
258923b7c7b8SHermès Bélusca-Maïto NTSTATUS
259023b7c7b8SHermès Bélusca-Maïto FatHijackIrpAndFlushDevice (
259123b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
259223b7c7b8SHermès Bélusca-Maïto     IN PIRP Irp,
259323b7c7b8SHermès Bélusca-Maïto     IN PDEVICE_OBJECT TargetDeviceObject
259423b7c7b8SHermès Bélusca-Maïto     );
259523b7c7b8SHermès Bélusca-Maïto 
259623b7c7b8SHermès Bélusca-Maïto VOID
259723b7c7b8SHermès Bélusca-Maïto FatFlushFatEntries (
259823b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
259923b7c7b8SHermès Bélusca-Maïto     IN PVCB Vcb,
260023b7c7b8SHermès Bélusca-Maïto     IN ULONG Cluster,
260123b7c7b8SHermès Bélusca-Maïto     IN ULONG Count
260223b7c7b8SHermès Bélusca-Maïto );
260323b7c7b8SHermès Bélusca-Maïto 
260423b7c7b8SHermès Bélusca-Maïto VOID
260523b7c7b8SHermès Bélusca-Maïto FatFlushDirentForFile (
260623b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
260723b7c7b8SHermès Bélusca-Maïto     IN PFCB Fcb
260823b7c7b8SHermès Bélusca-Maïto );
260923b7c7b8SHermès Bélusca-Maïto 
261023b7c7b8SHermès Bélusca-Maïto 
261123b7c7b8SHermès Bélusca-Maïto 
261223b7c7b8SHermès Bélusca-Maïto //
261323b7c7b8SHermès Bélusca-Maïto //  The following procedure is used by the FSP and FSD routines to complete
261423b7c7b8SHermès Bélusca-Maïto //  an IRP.
261523b7c7b8SHermès Bélusca-Maïto //
261623b7c7b8SHermès Bélusca-Maïto //  Note that this macro allows either the Irp or the IrpContext to be
261723b7c7b8SHermès Bélusca-Maïto //  null, however the only legal order to do this in is:
261823b7c7b8SHermès Bélusca-Maïto //
261923b7c7b8SHermès Bélusca-Maïto //      FatCompleteRequest( NULL, Irp, Status );  // completes Irp & preserves context
262023b7c7b8SHermès Bélusca-Maïto //      ...
262123b7c7b8SHermès Bélusca-Maïto //      FatCompleteRequest( IrpContext, NULL, DontCare ); // deallocates context
262223b7c7b8SHermès Bélusca-Maïto //
262323b7c7b8SHermès Bélusca-Maïto //  This would typically be done in order to pass a "naked" IrpContext off to
262423b7c7b8SHermès Bélusca-Maïto //  the Fsp for post processing, such as read ahead.
262523b7c7b8SHermès Bélusca-Maïto //
262623b7c7b8SHermès Bélusca-Maïto 
262723b7c7b8SHermès Bélusca-Maïto VOID
262823b7c7b8SHermès Bélusca-Maïto FatCompleteRequest_Real (
262923b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
263023b7c7b8SHermès Bélusca-Maïto     IN PIRP Irp,
263123b7c7b8SHermès Bélusca-Maïto     IN NTSTATUS Status
263223b7c7b8SHermès Bélusca-Maïto     );
263323b7c7b8SHermès Bélusca-Maïto 
263423b7c7b8SHermès Bélusca-Maïto #define FatCompleteRequest(IRPCONTEXT,IRP,STATUS) { \
263523b7c7b8SHermès Bélusca-Maïto     FatCompleteRequest_Real(IRPCONTEXT,IRP,STATUS); \
263623b7c7b8SHermès Bélusca-Maïto }
263723b7c7b8SHermès Bélusca-Maïto 
263823b7c7b8SHermès Bélusca-Maïto BOOLEAN
263923b7c7b8SHermès Bélusca-Maïto FatIsIrpTopLevel (
264023b7c7b8SHermès Bélusca-Maïto     IN PIRP Irp
264123b7c7b8SHermès Bélusca-Maïto     );
264223b7c7b8SHermès Bélusca-Maïto 
264323b7c7b8SHermès Bélusca-Maïto //
264423b7c7b8SHermès Bélusca-Maïto //  The Following routine makes a popup
264523b7c7b8SHermès Bélusca-Maïto //
264623b7c7b8SHermès Bélusca-Maïto 
264723b7c7b8SHermès Bélusca-Maïto _Requires_lock_held_(_Global_critical_region_)
264823b7c7b8SHermès Bélusca-Maïto VOID
264923b7c7b8SHermès Bélusca-Maïto FatPopUpFileCorrupt (
265023b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
265123b7c7b8SHermès Bélusca-Maïto     IN PFCB Fcb
265223b7c7b8SHermès Bélusca-Maïto     );
265323b7c7b8SHermès Bélusca-Maïto 
265423b7c7b8SHermès Bélusca-Maïto //
265523b7c7b8SHermès Bélusca-Maïto //  Here are the callbacks used by the I/O system for checking for fast I/O or
265623b7c7b8SHermès Bélusca-Maïto //  doing a fast query info call, or doing fast lock calls.
265723b7c7b8SHermès Bélusca-Maïto //
265823b7c7b8SHermès Bélusca-Maïto _Function_class_(FAST_IO_CHECK_IF_POSSIBLE)
265923b7c7b8SHermès Bélusca-Maïto BOOLEAN
266023b7c7b8SHermès Bélusca-Maïto NTAPI
266123b7c7b8SHermès Bélusca-Maïto FatFastIoCheckIfPossible (
266223b7c7b8SHermès Bélusca-Maïto     IN PFILE_OBJECT FileObject,
266323b7c7b8SHermès Bélusca-Maïto     IN PLARGE_INTEGER FileOffset,
266423b7c7b8SHermès Bélusca-Maïto     IN ULONG Length,
266523b7c7b8SHermès Bélusca-Maïto     IN BOOLEAN Wait,
266623b7c7b8SHermès Bélusca-Maïto     IN ULONG LockKey,
266723b7c7b8SHermès Bélusca-Maïto     IN BOOLEAN CheckForReadOperation,
266823b7c7b8SHermès Bélusca-Maïto     OUT PIO_STATUS_BLOCK IoStatus,
266923b7c7b8SHermès Bélusca-Maïto     IN PDEVICE_OBJECT DeviceObject
267023b7c7b8SHermès Bélusca-Maïto     );
267123b7c7b8SHermès Bélusca-Maïto 
267223b7c7b8SHermès Bélusca-Maïto _Function_class_(FAST_IO_QUERY_BASIC_INFO)
267323b7c7b8SHermès Bélusca-Maïto BOOLEAN
267423b7c7b8SHermès Bélusca-Maïto NTAPI
267523b7c7b8SHermès Bélusca-Maïto FatFastQueryBasicInfo (
267623b7c7b8SHermès Bélusca-Maïto     IN PFILE_OBJECT FileObject,
267723b7c7b8SHermès Bélusca-Maïto     IN BOOLEAN Wait,
267823b7c7b8SHermès Bélusca-Maïto     IN OUT PFILE_BASIC_INFORMATION Buffer,
267923b7c7b8SHermès Bélusca-Maïto     OUT PIO_STATUS_BLOCK IoStatus,
268023b7c7b8SHermès Bélusca-Maïto     IN PDEVICE_OBJECT DeviceObject
268123b7c7b8SHermès Bélusca-Maïto     );
268223b7c7b8SHermès Bélusca-Maïto 
268323b7c7b8SHermès Bélusca-Maïto _Function_class_(FAST_IO_QUERY_STANDARD_INFO)
268423b7c7b8SHermès Bélusca-Maïto BOOLEAN
268523b7c7b8SHermès Bélusca-Maïto NTAPI
268623b7c7b8SHermès Bélusca-Maïto FatFastQueryStdInfo (
268723b7c7b8SHermès Bélusca-Maïto     IN PFILE_OBJECT FileObject,
268823b7c7b8SHermès Bélusca-Maïto     IN BOOLEAN Wait,
268923b7c7b8SHermès Bélusca-Maïto     IN OUT PFILE_STANDARD_INFORMATION Buffer,
269023b7c7b8SHermès Bélusca-Maïto     OUT PIO_STATUS_BLOCK IoStatus,
269123b7c7b8SHermès Bélusca-Maïto     IN PDEVICE_OBJECT DeviceObject
269223b7c7b8SHermès Bélusca-Maïto     );
269323b7c7b8SHermès Bélusca-Maïto 
269423b7c7b8SHermès Bélusca-Maïto _Function_class_(FAST_IO_QUERY_NETWORK_OPEN_INFO)
269523b7c7b8SHermès Bélusca-Maïto BOOLEAN
269623b7c7b8SHermès Bélusca-Maïto NTAPI
269723b7c7b8SHermès Bélusca-Maïto FatFastQueryNetworkOpenInfo (
269823b7c7b8SHermès Bélusca-Maïto     IN PFILE_OBJECT FileObject,
269923b7c7b8SHermès Bélusca-Maïto     IN BOOLEAN Wait,
270023b7c7b8SHermès Bélusca-Maïto     IN OUT PFILE_NETWORK_OPEN_INFORMATION Buffer,
270123b7c7b8SHermès Bélusca-Maïto     OUT PIO_STATUS_BLOCK IoStatus,
270223b7c7b8SHermès Bélusca-Maïto     IN PDEVICE_OBJECT DeviceObject
270323b7c7b8SHermès Bélusca-Maïto     );
270423b7c7b8SHermès Bélusca-Maïto 
270523b7c7b8SHermès Bélusca-Maïto _Function_class_(FAST_IO_LOCK)
270623b7c7b8SHermès Bélusca-Maïto BOOLEAN
270723b7c7b8SHermès Bélusca-Maïto NTAPI
270823b7c7b8SHermès Bélusca-Maïto FatFastLock (
270923b7c7b8SHermès Bélusca-Maïto     IN PFILE_OBJECT FileObject,
271023b7c7b8SHermès Bélusca-Maïto     IN PLARGE_INTEGER FileOffset,
271123b7c7b8SHermès Bélusca-Maïto     IN PLARGE_INTEGER Length,
271223b7c7b8SHermès Bélusca-Maïto     PEPROCESS ProcessId,
271323b7c7b8SHermès Bélusca-Maïto     ULONG Key,
271423b7c7b8SHermès Bélusca-Maïto     BOOLEAN FailImmediately,
271523b7c7b8SHermès Bélusca-Maïto     BOOLEAN ExclusiveLock,
271623b7c7b8SHermès Bélusca-Maïto     OUT PIO_STATUS_BLOCK IoStatus,
271723b7c7b8SHermès Bélusca-Maïto     IN PDEVICE_OBJECT DeviceObject
271823b7c7b8SHermès Bélusca-Maïto     );
271923b7c7b8SHermès Bélusca-Maïto 
272023b7c7b8SHermès Bélusca-Maïto _Function_class_(FAST_IO_UNLOCK_SINGLE)
272123b7c7b8SHermès Bélusca-Maïto BOOLEAN
272223b7c7b8SHermès Bélusca-Maïto NTAPI
272323b7c7b8SHermès Bélusca-Maïto FatFastUnlockSingle (
272423b7c7b8SHermès Bélusca-Maïto     IN PFILE_OBJECT FileObject,
272523b7c7b8SHermès Bélusca-Maïto     IN PLARGE_INTEGER FileOffset,
272623b7c7b8SHermès Bélusca-Maïto     IN PLARGE_INTEGER Length,
272723b7c7b8SHermès Bélusca-Maïto     PEPROCESS ProcessId,
272823b7c7b8SHermès Bélusca-Maïto     ULONG Key,
272923b7c7b8SHermès Bélusca-Maïto     OUT PIO_STATUS_BLOCK IoStatus,
273023b7c7b8SHermès Bélusca-Maïto     IN PDEVICE_OBJECT DeviceObject
273123b7c7b8SHermès Bélusca-Maïto     );
273223b7c7b8SHermès Bélusca-Maïto 
273323b7c7b8SHermès Bélusca-Maïto _Function_class_(FAST_IO_UNLOCK_ALL)
273423b7c7b8SHermès Bélusca-Maïto BOOLEAN
273523b7c7b8SHermès Bélusca-Maïto NTAPI
273623b7c7b8SHermès Bélusca-Maïto FatFastUnlockAll (
273723b7c7b8SHermès Bélusca-Maïto     IN PFILE_OBJECT FileObject,
273823b7c7b8SHermès Bélusca-Maïto     PEPROCESS ProcessId,
273923b7c7b8SHermès Bélusca-Maïto     OUT PIO_STATUS_BLOCK IoStatus,
274023b7c7b8SHermès Bélusca-Maïto     IN PDEVICE_OBJECT DeviceObject
274123b7c7b8SHermès Bélusca-Maïto     );
274223b7c7b8SHermès Bélusca-Maïto 
274323b7c7b8SHermès Bélusca-Maïto _Function_class_(FAST_IO_UNLOCK_ALL_BY_KEY)
274423b7c7b8SHermès Bélusca-Maïto BOOLEAN
274523b7c7b8SHermès Bélusca-Maïto NTAPI
274623b7c7b8SHermès Bélusca-Maïto FatFastUnlockAllByKey (
274723b7c7b8SHermès Bélusca-Maïto     IN PFILE_OBJECT FileObject,
274823b7c7b8SHermès Bélusca-Maïto     PVOID ProcessId,
274923b7c7b8SHermès Bélusca-Maïto     ULONG Key,
275023b7c7b8SHermès Bélusca-Maïto     OUT PIO_STATUS_BLOCK IoStatus,
275123b7c7b8SHermès Bélusca-Maïto     IN PDEVICE_OBJECT DeviceObject
275223b7c7b8SHermès Bélusca-Maïto     );
275323b7c7b8SHermès Bélusca-Maïto 
275423b7c7b8SHermès Bélusca-Maïto 
275523b7c7b8SHermès Bélusca-Maïto VOID
275623b7c7b8SHermès Bélusca-Maïto FatExamineFatEntries(
275723b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
275823b7c7b8SHermès Bélusca-Maïto     IN PVCB Vcb,
275923b7c7b8SHermès Bélusca-Maïto     IN ULONG StartIndex OPTIONAL,
276023b7c7b8SHermès Bélusca-Maïto     IN ULONG EndIndex OPTIONAL,
276123b7c7b8SHermès Bélusca-Maïto     IN BOOLEAN SetupWindows,
276223b7c7b8SHermès Bélusca-Maïto     IN PFAT_WINDOW SwitchToWindow OPTIONAL,
276323b7c7b8SHermès Bélusca-Maïto     IN PULONG BitMapBuffer OPTIONAL
276423b7c7b8SHermès Bélusca-Maïto     );
276523b7c7b8SHermès Bélusca-Maïto 
276623b7c7b8SHermès Bélusca-Maïto BOOLEAN
276723b7c7b8SHermès Bélusca-Maïto FatScanForDataTrack(
276823b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
276923b7c7b8SHermès Bélusca-Maïto     IN PDEVICE_OBJECT TargetDeviceObject
277023b7c7b8SHermès Bélusca-Maïto     );
277123b7c7b8SHermès Bélusca-Maïto 
277223b7c7b8SHermès Bélusca-Maïto //
277323b7c7b8SHermès Bélusca-Maïto //  The following macro is used to determine is a file has been deleted.
277423b7c7b8SHermès Bélusca-Maïto //
277523b7c7b8SHermès Bélusca-Maïto //      BOOLEAN
277623b7c7b8SHermès Bélusca-Maïto //      IsFileDeleted (
277723b7c7b8SHermès Bélusca-Maïto //          IN PIRP_CONTEXT IrpContext,
277823b7c7b8SHermès Bélusca-Maïto //          IN PFCB Fcb
277923b7c7b8SHermès Bélusca-Maïto //          );
278023b7c7b8SHermès Bélusca-Maïto //
278123b7c7b8SHermès Bélusca-Maïto 
278223b7c7b8SHermès Bélusca-Maïto #define IsFileDeleted(IRPCONTEXT,FCB)                      \
278323b7c7b8SHermès Bélusca-Maïto     (FlagOn((FCB)->FcbState, FCB_STATE_DELETE_ON_CLOSE) && \
278423b7c7b8SHermès Bélusca-Maïto      ((FCB)->UncleanCount == 0))
278523b7c7b8SHermès Bélusca-Maïto 
278623b7c7b8SHermès Bélusca-Maïto //
278723b7c7b8SHermès Bélusca-Maïto //  The following macro is used by the dispatch routines to determine if
278823b7c7b8SHermès Bélusca-Maïto //  an operation is to be done with or without Write Through.
278923b7c7b8SHermès Bélusca-Maïto //
279023b7c7b8SHermès Bélusca-Maïto //      BOOLEAN
279123b7c7b8SHermès Bélusca-Maïto //      IsFileWriteThrough (
279223b7c7b8SHermès Bélusca-Maïto //          IN PFILE_OBJECT FileObject,
279323b7c7b8SHermès Bélusca-Maïto //          IN PVCB Vcb
279423b7c7b8SHermès Bélusca-Maïto //          );
279523b7c7b8SHermès Bélusca-Maïto //
279623b7c7b8SHermès Bélusca-Maïto 
279723b7c7b8SHermès Bélusca-Maïto #define IsFileWriteThrough(FO,VCB) (             \
279823b7c7b8SHermès Bélusca-Maïto     BooleanFlagOn((FO)->Flags, FO_WRITE_THROUGH) \
279923b7c7b8SHermès Bélusca-Maïto )
280023b7c7b8SHermès Bélusca-Maïto 
280123b7c7b8SHermès Bélusca-Maïto //
280223b7c7b8SHermès Bélusca-Maïto //  The following macro is used to set the is fast i/o possible field in
280323b7c7b8SHermès Bélusca-Maïto //  the common part of the nonpaged fcb.  It checks that this is actually
280423b7c7b8SHermès Bélusca-Maïto //  an FCB (as opposed to a DCB) so that directory oplock code works properly.
280523b7c7b8SHermès Bélusca-Maïto //
280623b7c7b8SHermès Bélusca-Maïto //
280723b7c7b8SHermès Bélusca-Maïto //      BOOLEAN
280823b7c7b8SHermès Bélusca-Maïto //      FatIsFastIoPossible (
280923b7c7b8SHermès Bélusca-Maïto //          IN PFCB Fcb
281023b7c7b8SHermès Bélusca-Maïto //          );
281123b7c7b8SHermès Bélusca-Maïto //
281223b7c7b8SHermès Bélusca-Maïto 
281323b7c7b8SHermès Bélusca-Maïto 
281423b7c7b8SHermès Bélusca-Maïto #define FatIsFastIoPossible(FCB) ((BOOLEAN)                                     \
281523b7c7b8SHermès Bélusca-Maïto     ((((FCB)->FcbCondition != FcbGood) ||                                       \
281623b7c7b8SHermès Bélusca-Maïto       (NodeType( (FCB) ) != FAT_NTC_FCB) ||                                     \
281723b7c7b8SHermès Bélusca-Maïto       !FsRtlOplockIsFastIoPossible( FatGetFcbOplock(FCB) )) ?                   \
281823b7c7b8SHermès Bélusca-Maïto         FastIoIsNotPossible                                                     \
281923b7c7b8SHermès Bélusca-Maïto     :                                                                           \
282023b7c7b8SHermès Bélusca-Maïto         (!FsRtlAreThereCurrentFileLocks( &(FCB)->Specific.Fcb.FileLock ) &&     \
282123b7c7b8SHermès Bélusca-Maïto          ((FCB)->NonPaged->OutstandingAsyncWrites == 0) &&                      \
282223b7c7b8SHermès Bélusca-Maïto          !FlagOn( (FCB)->Vcb->VcbState, VCB_STATE_FLAG_WRITE_PROTECTED ) ?      \
282323b7c7b8SHermès Bélusca-Maïto             FastIoIsPossible                                                    \
282423b7c7b8SHermès Bélusca-Maïto         :                                                                       \
282523b7c7b8SHermès Bélusca-Maïto             FastIoIsQuestionable                                                \
282623b7c7b8SHermès Bélusca-Maïto         )                                                                       \
282723b7c7b8SHermès Bélusca-Maïto     )                                                                           \
282823b7c7b8SHermès Bélusca-Maïto )
282923b7c7b8SHermès Bélusca-Maïto 
283023b7c7b8SHermès Bélusca-Maïto 
283123b7c7b8SHermès Bélusca-Maïto #if (NTDDI_VERSION >= NTDDI_WIN8)
283223b7c7b8SHermès Bélusca-Maïto 
283323b7c7b8SHermès Bélusca-Maïto //
283423b7c7b8SHermès Bélusca-Maïto //  Detect whether this file can have an oplock on it.  As of Windows 8 file and
283523b7c7b8SHermès Bélusca-Maïto //  directories can have oplocks.
283623b7c7b8SHermès Bélusca-Maïto //
283723b7c7b8SHermès Bélusca-Maïto 
283823b7c7b8SHermès Bélusca-Maïto #define FatIsNodeTypeOplockable(N) (    \
283923b7c7b8SHermès Bélusca-Maïto     ((N) == FAT_NTC_FCB) ||             \
284023b7c7b8SHermès Bélusca-Maïto     ((N) == FAT_NTC_ROOT_DCB) ||        \
284123b7c7b8SHermès Bélusca-Maïto     ((N) == FAT_NTC_DCB)                \
284223b7c7b8SHermès Bélusca-Maïto )
284323b7c7b8SHermès Bélusca-Maïto 
284423b7c7b8SHermès Bélusca-Maïto #else
284523b7c7b8SHermès Bélusca-Maïto 
284623b7c7b8SHermès Bélusca-Maïto #define FatIsNodeTypeOplockable(N) (    \
284723b7c7b8SHermès Bélusca-Maïto     ((N) == FAT_NTC_FCB)                \
284823b7c7b8SHermès Bélusca-Maïto )
284923b7c7b8SHermès Bélusca-Maïto 
285023b7c7b8SHermès Bélusca-Maïto #endif
285123b7c7b8SHermès Bélusca-Maïto 
285223b7c7b8SHermès Bélusca-Maïto #define FatIsFileOplockable(F) (                \
285323b7c7b8SHermès Bélusca-Maïto     FatIsNodeTypeOplockable( NodeType( (F) ))   \
285423b7c7b8SHermès Bélusca-Maïto )
285523b7c7b8SHermès Bélusca-Maïto 
285623b7c7b8SHermès Bélusca-Maïto //
285723b7c7b8SHermès Bélusca-Maïto //  The following macro is used to detemine if the file object is opened
285823b7c7b8SHermès Bélusca-Maïto //  for read only access (i.e., it is not also opened for write access or
285923b7c7b8SHermès Bélusca-Maïto //  delete access).
286023b7c7b8SHermès Bélusca-Maïto //
286123b7c7b8SHermès Bélusca-Maïto //      BOOLEAN
286223b7c7b8SHermès Bélusca-Maïto //      IsFileObjectReadOnly (
286323b7c7b8SHermès Bélusca-Maïto //          IN PFILE_OBJECT FileObject
286423b7c7b8SHermès Bélusca-Maïto //          );
286523b7c7b8SHermès Bélusca-Maïto //
286623b7c7b8SHermès Bélusca-Maïto 
286723b7c7b8SHermès Bélusca-Maïto #define IsFileObjectReadOnly(FO) (!((FO)->WriteAccess | (FO)->DeleteAccess))
286823b7c7b8SHermès Bélusca-Maïto 
286923b7c7b8SHermès Bélusca-Maïto 
287023b7c7b8SHermès Bélusca-Maïto //
287123b7c7b8SHermès Bélusca-Maïto //  The following two macro are used by the Fsd/Fsp exception handlers to
287223b7c7b8SHermès Bélusca-Maïto //  process an exception.  The first macro is the exception filter used in the
287323b7c7b8SHermès Bélusca-Maïto //  Fsd/Fsp to decide if an exception should be handled at this level.
287423b7c7b8SHermès Bélusca-Maïto //  The second macro decides if the exception is to be finished off by
287523b7c7b8SHermès Bélusca-Maïto //  completing the IRP, and cleaning up the Irp Context, or if we should
287623b7c7b8SHermès Bélusca-Maïto //  bugcheck.  Exception values such as STATUS_FILE_INVALID (raised by
287723b7c7b8SHermès Bélusca-Maïto //  VerfySup.c) cause us to complete the Irp and cleanup, while exceptions
287823b7c7b8SHermès Bélusca-Maïto //  such as accvio cause us to bugcheck.
287923b7c7b8SHermès Bélusca-Maïto //
288023b7c7b8SHermès Bélusca-Maïto //  The basic structure for fsd/fsp exception handling is as follows:
288123b7c7b8SHermès Bélusca-Maïto //
288223b7c7b8SHermès Bélusca-Maïto //  FatFsdXxx(...)
288323b7c7b8SHermès Bélusca-Maïto //  {
288423b7c7b8SHermès Bélusca-Maïto //      try {
288523b7c7b8SHermès Bélusca-Maïto //
288623b7c7b8SHermès Bélusca-Maïto //          ...
288723b7c7b8SHermès Bélusca-Maïto //
288823b7c7b8SHermès Bélusca-Maïto //      } except(FatExceptionFilter( IrpContext, GetExceptionCode() )) {
288923b7c7b8SHermès Bélusca-Maïto //
289023b7c7b8SHermès Bélusca-Maïto //          Status = FatProcessException( IrpContext, Irp, GetExceptionCode() );
289123b7c7b8SHermès Bélusca-Maïto //      }
289223b7c7b8SHermès Bélusca-Maïto //
289323b7c7b8SHermès Bélusca-Maïto //      Return Status;
289423b7c7b8SHermès Bélusca-Maïto //  }
289523b7c7b8SHermès Bélusca-Maïto //
289623b7c7b8SHermès Bélusca-Maïto //  To explicitly raise an exception that we expect, such as
289723b7c7b8SHermès Bélusca-Maïto //  STATUS_FILE_INVALID, use the below macro FatRaiseStatus().  To raise a
289823b7c7b8SHermès Bélusca-Maïto //  status from an unknown origin (such as CcFlushCache()), use the macro
289923b7c7b8SHermès Bélusca-Maïto //  FatNormalizeAndRaiseStatus.  This will raise the status if it is expected,
290023b7c7b8SHermès Bélusca-Maïto //  or raise STATUS_UNEXPECTED_IO_ERROR if it is not.
290123b7c7b8SHermès Bélusca-Maïto //
290223b7c7b8SHermès Bélusca-Maïto //  If we are vicariously handling exceptions without using FatProcessException(),
290323b7c7b8SHermès Bélusca-Maïto //  if there is the possibility that we raised that exception, one *must*
290423b7c7b8SHermès Bélusca-Maïto //  reset the IrpContext so a subsequent raise in the course of handling this
290523b7c7b8SHermès Bélusca-Maïto //  request that is *not* explicit, i.e. like a pagein error, does not get
290623b7c7b8SHermès Bélusca-Maïto //  spoofed into believing that the first raise status is the reason the second
290723b7c7b8SHermès Bélusca-Maïto //  occured.  This could have really serious consequences.
290823b7c7b8SHermès Bélusca-Maïto //
290923b7c7b8SHermès Bélusca-Maïto //  It is an excellent idea to always FatResetExceptionState in these cases.
291023b7c7b8SHermès Bélusca-Maïto //
291123b7c7b8SHermès Bélusca-Maïto //  Note that when using these two macros, the original status is placed in
291223b7c7b8SHermès Bélusca-Maïto //  IrpContext->ExceptionStatus, signaling FatExceptionFilter and
291323b7c7b8SHermès Bélusca-Maïto //  FatProcessException that the status we actually raise is by definition
291423b7c7b8SHermès Bélusca-Maïto //  expected.
291523b7c7b8SHermès Bélusca-Maïto //
291623b7c7b8SHermès Bélusca-Maïto 
291723b7c7b8SHermès Bélusca-Maïto ULONG
291823b7c7b8SHermès Bélusca-Maïto FatExceptionFilter (
291923b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
292023b7c7b8SHermès Bélusca-Maïto     IN PEXCEPTION_POINTERS ExceptionPointer
292123b7c7b8SHermès Bélusca-Maïto     );
292223b7c7b8SHermès Bélusca-Maïto 
292323b7c7b8SHermès Bélusca-Maïto #if DBG
292423b7c7b8SHermès Bélusca-Maïto ULONG
292523b7c7b8SHermès Bélusca-Maïto FatBugCheckExceptionFilter (
292623b7c7b8SHermès Bélusca-Maïto     IN PEXCEPTION_POINTERS ExceptionPointer
292723b7c7b8SHermès Bélusca-Maïto     );
292823b7c7b8SHermès Bélusca-Maïto #endif
292923b7c7b8SHermès Bélusca-Maïto 
293023b7c7b8SHermès Bélusca-Maïto _Requires_lock_held_(_Global_critical_region_)
293123b7c7b8SHermès Bélusca-Maïto NTSTATUS
293223b7c7b8SHermès Bélusca-Maïto FatProcessException (
293323b7c7b8SHermès Bélusca-Maïto     IN PIRP_CONTEXT IrpContext,
293423b7c7b8SHermès Bélusca-Maïto     IN PIRP Irp,
293523b7c7b8SHermès Bélusca-Maïto     IN NTSTATUS ExceptionCode
293623b7c7b8SHermès Bélusca-Maïto     );
293723b7c7b8SHermès Bélusca-Maïto 
293823b7c7b8SHermès Bélusca-Maïto //
293923b7c7b8SHermès Bélusca-Maïto //  VOID
294023b7c7b8SHermès Bélusca-Maïto //  FatRaiseStatus (
294123b7c7b8SHermès Bélusca-Maïto //      IN PRIP_CONTEXT IrpContext,
294223b7c7b8SHermès Bélusca-Maïto //      IN NT_STATUS Status
294323b7c7b8SHermès Bélusca-Maïto //  );
294423b7c7b8SHermès Bélusca-Maïto //
294523b7c7b8SHermès Bélusca-Maïto //
294623b7c7b8SHermès Bélusca-Maïto 
294723b7c7b8SHermès Bélusca-Maïto #if DBG
294823b7c7b8SHermès Bélusca-Maïto #ifdef _MSC_VER
294923b7c7b8SHermès Bélusca-Maïto #define DebugBreakOnStatus(S) {                                                      \
295023b7c7b8SHermès Bélusca-Maïto __pragma(warning(push))                                                              \
295123b7c7b8SHermès Bélusca-Maïto __pragma(warning(disable:4127))                                                      \
295223b7c7b8SHermès Bélusca-Maïto     if (FatTestRaisedStatus) {                                                       \
295323b7c7b8SHermès Bélusca-Maïto         if ((S) == STATUS_DISK_CORRUPT_ERROR || (S) == STATUS_FILE_CORRUPT_ERROR) {  \
295423b7c7b8SHermès Bélusca-Maïto __pragma(warning(pop))                                                               \
295523b7c7b8SHermès Bélusca-Maïto             DbgPrint( "FAT: Breaking on interesting raised status (0x%08x)\n", (S) );\
295623b7c7b8SHermès Bélusca-Maïto             DbgPrint( "FAT: Set FatTestRaisedStatus @ 0x%p to 0 to disable\n",       \
295723b7c7b8SHermès Bélusca-Maïto                       &FatTestRaisedStatus );                                        \
295823b7c7b8SHermès Bélusca-Maïto             NT_ASSERT(FALSE);                                                        \
295923b7c7b8SHermès Bélusca-Maïto         }                                                                            \
296023b7c7b8SHermès Bélusca-Maïto     }                                                                                \
296123b7c7b8SHermès Bélusca-Maïto }
296223b7c7b8SHermès Bélusca-Maïto #else
296323b7c7b8SHermès Bélusca-Maïto #define DebugBreakOnStatus(S) {                                                      \
296423b7c7b8SHermès Bélusca-Maïto     if (FatTestRaisedStatus) {                                                       \
296523b7c7b8SHermès Bélusca-Maïto         if ((S) == STATUS_DISK_CORRUPT_ERROR || (S) == STATUS_FILE_CORRUPT_ERROR) {  \
296623b7c7b8SHermès Bélusca-Maïto             DbgPrint( "FAT: Breaking on interesting raised status (0x%08x)\n", (S) );\
296723b7c7b8SHermès Bélusca-Maïto             DbgPrint( "FAT: Set FatTestRaisedStatus @ 0x%p to 0 to disable\n",       \
296823b7c7b8SHermès Bélusca-Maïto                       &FatTestRaisedStatus );                                        \
296923b7c7b8SHermès Bélusca-Maïto             NT_ASSERT(FALSE);                                                        \
297023b7c7b8SHermès Bélusca-Maïto         }                                                                            \
297123b7c7b8SHermès Bélusca-Maïto     }                                                                                \
297223b7c7b8SHermès Bélusca-Maïto }
297323b7c7b8SHermès Bélusca-Maïto #endif
297423b7c7b8SHermès Bélusca-Maïto #else
297523b7c7b8SHermès Bélusca-Maïto #define DebugBreakOnStatus(S)
297623b7c7b8SHermès Bélusca-Maïto #endif
297723b7c7b8SHermès Bélusca-Maïto 
297823b7c7b8SHermès Bélusca-Maïto #define FatRaiseStatus(IRPCONTEXT,STATUS) {             \
297923b7c7b8SHermès Bélusca-Maïto     (IRPCONTEXT)->ExceptionStatus = (STATUS);           \
298023b7c7b8SHermès Bélusca-Maïto     DebugBreakOnStatus( (STATUS) )                      \
298123b7c7b8SHermès Bélusca-Maïto     ExRaiseStatus( (STATUS) );                          \
298223b7c7b8SHermès Bélusca-Maïto }
298323b7c7b8SHermès Bélusca-Maïto 
298423b7c7b8SHermès Bélusca-Maïto #define FatResetExceptionState( IRPCONTEXT ) {          \
298523b7c7b8SHermès Bélusca-Maïto     (IRPCONTEXT)->ExceptionStatus = STATUS_SUCCESS;     \
298623b7c7b8SHermès Bélusca-Maïto }
298723b7c7b8SHermès Bélusca-Maïto 
298823b7c7b8SHermès Bélusca-Maïto //
298923b7c7b8SHermès Bélusca-Maïto //  VOID
299023b7c7b8SHermès Bélusca-Maïto //  FatNormalAndRaiseStatus (
299123b7c7b8SHermès Bélusca-Maïto //      IN PRIP_CONTEXT IrpContext,
299223b7c7b8SHermès Bélusca-Maïto //      IN NT_STATUS Status
299323b7c7b8SHermès Bélusca-Maïto //  );
299423b7c7b8SHermès Bélusca-Maïto //
299523b7c7b8SHermès Bélusca-Maïto 
299623b7c7b8SHermès Bélusca-Maïto #define FatNormalizeAndRaiseStatus(IRPCONTEXT,STATUS) {                         \
299723b7c7b8SHermès Bélusca-Maïto     (IRPCONTEXT)->ExceptionStatus = (STATUS);                                   \
299823b7c7b8SHermès Bélusca-Maïto     ExRaiseStatus(FsRtlNormalizeNtstatus((STATUS),STATUS_UNEXPECTED_IO_ERROR)); \
299923b7c7b8SHermès Bélusca-Maïto }
300023b7c7b8SHermès Bélusca-Maïto 
300123b7c7b8SHermès Bélusca-Maïto 
300223b7c7b8SHermès Bélusca-Maïto //
300323b7c7b8SHermès Bélusca-Maïto //  The following macros are used to establish the semantics needed
300423b7c7b8SHermès Bélusca-Maïto //  to do a return from within a try-finally clause.  As a rule every
300523b7c7b8SHermès Bélusca-Maïto //  try clause must end with a label call try_exit.  For example,
300623b7c7b8SHermès Bélusca-Maïto //
300723b7c7b8SHermès Bélusca-Maïto //      try {
300823b7c7b8SHermès Bélusca-Maïto //              :
300923b7c7b8SHermès Bélusca-Maïto //              :
301023b7c7b8SHermès Bélusca-Maïto //
301123b7c7b8SHermès Bélusca-Maïto //      try_exit: NOTHING;
301223b7c7b8SHermès Bélusca-Maïto //      } finally {
301323b7c7b8SHermès Bélusca-Maïto //
301423b7c7b8SHermès Bélusca-Maïto //              :
301523b7c7b8SHermès Bélusca-Maïto //              :
301623b7c7b8SHermès Bélusca-Maïto //      }
301723b7c7b8SHermès Bélusca-Maïto //
301823b7c7b8SHermès Bélusca-Maïto //  Every return statement executed inside of a try clause should use the
301923b7c7b8SHermès Bélusca-Maïto //  try_return macro.  If the compiler fully supports the try-finally construct
302023b7c7b8SHermès Bélusca-Maïto //  then the macro should be
302123b7c7b8SHermès Bélusca-Maïto //
302223b7c7b8SHermès Bélusca-Maïto //      #define try_return(S)  { return(S); }
302323b7c7b8SHermès Bélusca-Maïto //
302423b7c7b8SHermès Bélusca-Maïto //  If the compiler does not support the try-finally construct then the macro
302523b7c7b8SHermès Bélusca-Maïto //  should be
302623b7c7b8SHermès Bélusca-Maïto //
302723b7c7b8SHermès Bélusca-Maïto //      #define try_return(S)  { S; goto try_exit; }
302823b7c7b8SHermès Bélusca-Maïto //
302923b7c7b8SHermès Bélusca-Maïto 
303023b7c7b8SHermès Bélusca-Maïto #define try_return(S) { S; goto try_exit; }
303123b7c7b8SHermès Bélusca-Maïto #define try_leave(S) { S; _SEH2_LEAVE; }
303223b7c7b8SHermès Bélusca-Maïto 
303323b7c7b8SHermès Bélusca-Maïto 
303423b7c7b8SHermès Bélusca-Maïto CLUSTER_TYPE
303523b7c7b8SHermès Bélusca-Maïto FatInterpretClusterType (
303623b7c7b8SHermès Bélusca-Maïto     IN PVCB Vcb,
303723b7c7b8SHermès Bélusca-Maïto     IN FAT_ENTRY Entry
303823b7c7b8SHermès Bélusca-Maïto     );
303923b7c7b8SHermès Bélusca-Maïto 
304023b7c7b8SHermès Bélusca-Maïto 
304123b7c7b8SHermès Bélusca-Maïto //
304223b7c7b8SHermès Bélusca-Maïto //  These routines define the FileId for FAT.  Lacking a fixed/uniquifiable
304323b7c7b8SHermès Bélusca-Maïto //  notion, we simply come up with one which is unique in a given snapshot
304423b7c7b8SHermès Bélusca-Maïto //  of the volume.  As long as the parent directory is not moved or compacted,
304523b7c7b8SHermès Bélusca-Maïto //  it may even be permanent.
304623b7c7b8SHermès Bélusca-Maïto //
304723b7c7b8SHermès Bélusca-Maïto 
304823b7c7b8SHermès Bélusca-Maïto //
304923b7c7b8SHermès Bélusca-Maïto //  The internal information used to identify the fcb/dcb on the
305023b7c7b8SHermès Bélusca-Maïto //  volume is the byte offset of the dirent of the file on disc.
305123b7c7b8SHermès Bélusca-Maïto //  Our root always has fileid 0.  FAT32 roots are chains and can
305223b7c7b8SHermès Bélusca-Maïto //  use the LBO of the cluster, 12/16 roots use the lbo in the Vcb.
305323b7c7b8SHermès Bélusca-Maïto //
305423b7c7b8SHermès Bélusca-Maïto 
305523b7c7b8SHermès Bélusca-Maïto #define FatGenerateFileIdFromDirentOffset(ParentDcb,DirentOffset)                                   \
305623b7c7b8SHermès Bélusca-Maïto     ((ParentDcb) ? ((NodeType(ParentDcb) != FAT_NTC_ROOT_DCB || FatIsFat32((ParentDcb)->Vcb)) ?     \
305723b7c7b8SHermès Bélusca-Maïto                   FatGetLboFromIndex( (ParentDcb)->Vcb,                                             \
305823b7c7b8SHermès Bélusca-Maïto                                       (ParentDcb)->FirstClusterOfFile ) :                           \
305923b7c7b8SHermès Bélusca-Maïto                   (ParentDcb)->Vcb->AllocationSupport.RootDirectoryLbo) +                           \
306023b7c7b8SHermès Bélusca-Maïto                  (DirentOffset)                                                                     \
306123b7c7b8SHermès Bélusca-Maïto                   :                                                                                 \
306223b7c7b8SHermès Bélusca-Maïto                  0)
306323b7c7b8SHermès Bélusca-Maïto 
306423b7c7b8SHermès Bélusca-Maïto //
306523b7c7b8SHermès Bélusca-Maïto //
306623b7c7b8SHermès Bélusca-Maïto 
306723b7c7b8SHermès Bélusca-Maïto #define FatGenerateFileIdFromFcb(Fcb)                                                               \
306823b7c7b8SHermès Bélusca-Maïto         FatGenerateFileIdFromDirentOffset( (Fcb)->ParentDcb, (Fcb)->DirentOffsetWithinDirectory )
306923b7c7b8SHermès Bélusca-Maïto 
307023b7c7b8SHermès Bélusca-Maïto //
307123b7c7b8SHermès Bélusca-Maïto //  Wrap to handle the ./.. cases appropriately.  Note that we commute NULL parent to 0. This would
307223b7c7b8SHermès Bélusca-Maïto //  only occur in an illegal root ".." entry.
307323b7c7b8SHermès Bélusca-Maïto //
307423b7c7b8SHermès Bélusca-Maïto 
307523b7c7b8SHermès Bélusca-Maïto #define FATDOT    ((ULONG)0x2020202E)
307623b7c7b8SHermès Bélusca-Maïto #define FATDOTDOT ((ULONG)0x20202E2E)
307723b7c7b8SHermès Bélusca-Maïto 
307823b7c7b8SHermès Bélusca-Maïto #define FatGenerateFileIdFromDirentAndOffset(Dcb,Dirent,DirentOffset)                               \
307923b7c7b8SHermès Bélusca-Maïto     ((*((PULONG)(Dirent)->FileName)) == FATDOT ? FatGenerateFileIdFromFcb(Dcb) :                    \
308023b7c7b8SHermès Bélusca-Maïto      ((*((PULONG)(Dirent)->FileName)) == FATDOTDOT ? ((Dcb)->ParentDcb ?                            \
308123b7c7b8SHermès Bélusca-Maïto                                                        FatGenerateFileIdFromFcb((Dcb)->ParentDcb) : \
308223b7c7b8SHermès Bélusca-Maïto                                                        0) :                                         \
308323b7c7b8SHermès Bélusca-Maïto       FatGenerateFileIdFromDirentOffset(Dcb,DirentOffset)))
308423b7c7b8SHermès Bélusca-Maïto 
308523b7c7b8SHermès Bélusca-Maïto 
308623b7c7b8SHermès Bélusca-Maïto //
308723b7c7b8SHermès Bélusca-Maïto //  BOOLEAN
308823b7c7b8SHermès Bélusca-Maïto //  FatDeviceIsFatFsdo(
308923b7c7b8SHermès Bélusca-Maïto //      IN PDEVICE_OBJECT D
309023b7c7b8SHermès Bélusca-Maïto //      );
309123b7c7b8SHermès Bélusca-Maïto //
309223b7c7b8SHermès Bélusca-Maïto //  Evaluates to TRUE if the supplied device object is one of the file system devices
309323b7c7b8SHermès Bélusca-Maïto //  we created at initialisation.
309423b7c7b8SHermès Bélusca-Maïto //
309523b7c7b8SHermès Bélusca-Maïto 
309623b7c7b8SHermès Bélusca-Maïto #define FatDeviceIsFatFsdo( D)  (((D) == FatData.DiskFileSystemDeviceObject) || ((D) == FatData.CdromFileSystemDeviceObject))
309723b7c7b8SHermès Bélusca-Maïto 
309823b7c7b8SHermès Bélusca-Maïto 
309923b7c7b8SHermès Bélusca-Maïto //
310023b7c7b8SHermès Bélusca-Maïto //  BlockAlign(): Aligns P on the next V boundary.
310123b7c7b8SHermès Bélusca-Maïto //  BlockAlignTruncate(): Aligns P on the prev V boundary.
310223b7c7b8SHermès Bélusca-Maïto //
310323b7c7b8SHermès Bélusca-Maïto 
310423b7c7b8SHermès Bélusca-Maïto #define BlockAlign(P,V) ((ASSERT( V != 0)), (((P)) + (V-1) & (0-(V))))
310523b7c7b8SHermès Bélusca-Maïto #define BlockAlignTruncate(P,V) ((P) & (0-(V)))
310623b7c7b8SHermès Bélusca-Maïto 
310723b7c7b8SHermès Bélusca-Maïto #define IsDirectory(FcbOrDcb) ((NodeType((FcbOrDcb)) == FAT_NTC_DCB) || (NodeType((FcbOrDcb)) == FAT_NTC_ROOT_DCB))
310823b7c7b8SHermès Bélusca-Maïto 
310923b7c7b8SHermès Bélusca-Maïto #endif // _FATPROCS_
311023b7c7b8SHermès Bélusca-Maïto 
311123b7c7b8SHermès Bélusca-Maïto 
3112