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