22#define Dbg (DEBUG_TRACE_EA)
25#pragma alloc_text(PAGE, FatAddEaSet)
26#pragma alloc_text(PAGE, FatAppendPackedEa)
27#pragma alloc_text(PAGE, FatCreateEa)
28#pragma alloc_text(PAGE, FatDeleteEa)
29#pragma alloc_text(PAGE, FatDeleteEaSet)
30#pragma alloc_text(PAGE, FatDeletePackedEa)
31#pragma alloc_text(PAGE, FatGetEaFile)
32#pragma alloc_text(PAGE, FatGetEaLength)
33#pragma alloc_text(PAGE, FatGetNeedEaCount)
34#pragma alloc_text(PAGE, FatIsEaNameValid)
35#pragma alloc_text(PAGE, FatLocateEaByName)
36#pragma alloc_text(PAGE, FatLocateNextEa)
37#pragma alloc_text(PAGE, FatReadEaSet)
38#pragma alloc_text(PAGE, FatPinEaRange)
39#pragma alloc_text(PAGE, FatMarkEaRangeDirty)
40#pragma alloc_text(PAGE, FatUnpinEaRange)
49#define EA_SECTION_SIZE (0x00040000)
100 Dirent->ExtendedAttributes == 0) {
131 FatGetEaFile( IrpContext,
145 if (
Vcb->VirtualEaFile ==
NULL) {
147 DebugTrace(0,
Dbg,
"FatGetEaLength: Ea file doesn't exist\n", 0);
162 Dirent->ExtendedAttributes,
175 DebugTrace(0,
Dbg,
"FatGetEaLength: Length of Ea is -> %08lx\n",
249 if (
Dirent->ExtendedAttributes == 0) {
280 FatGetEaFile( IrpContext,
294 if (
Vcb->VirtualEaFile ==
NULL) {
296 DebugTrace(0,
Dbg,
"FatGetNeedEaCount: Ea file doesn't exist\n", 0);
311 Dirent->ExtendedAttributes,
417 ULONG PackedEasLength;
418 ULONG AllocationLength;
419 ULONG BytesPerCluster;
431 BytesPerCluster = 1 <<
Vcb->AllocationSupport.LogOfBytesPerCluster;
433 AllocationLength = (PackedEasLength
435 + BytesPerCluster - 1)
436 & ~(BytesPerCluster - 1);
463 (
PUCHAR) FullEa + FullEa->NextEntryOffset)) {
468 EaName.Length = FullEa->EaNameLength;
469 EaName.Buffer = &FullEa->EaName[0];
478 "FatCreateEa: Invalid Ea Name -> %Z\n",
481 IrpContext->OriginatingIrp->IoStatus.Information = (
PUCHAR)FullEa -
Buffer;
495 if (FullEa->Flags != 0
498 IrpContext->OriginatingIrp->IoStatus.Information = (
PUCHAR)FullEa -
Buffer;
514 DebugTrace(0,
Dbg,
"FatCreateEa: Duplicate name found\n", 0);
526 if (FullEa->EaValueLength == 0) {
529 "FatCreateEa: Empty ea\n",
548 if (PackedEasLength != 0) {
559 DebugTrace( 0,
Dbg,
"Ea length is greater than maximum\n", 0 );
568 FatGetEaFile( IrpContext,
577 FatAddEaSet( IrpContext,
592 PackedEasLength += 4;
720 FatGetEaFile( IrpContext,
737 "FatDeleteEa: No Ea file exists\n",
748 FatDeleteEaSet( IrpContext,
869 if (
Vcb->VirtualEaFile ==
NULL) {
875 if ( !FatAcquireExclusiveFcb( IrpContext,
Vcb->EaFcb )) {
877 DebugTrace(0,
Dbg,
"FatGetEaFile: Can't grab exclusive\n", 0);
881 UnwindLockedEaFcb =
TRUE;
889 if ((
ExclusiveFcb && !FatAcquireExclusiveFcb( IrpContext,
Vcb->EaFcb ))
897 UnwindLockedEaFcb =
TRUE;
907 UnwindLockedEaFcb =
FALSE;
909 if (!FatAcquireExclusiveFcb( IrpContext,
Vcb->EaFcb )) {
916 UnwindLockedEaFcb =
TRUE;
925 if (
Vcb->VirtualEaFile !=
NULL) {
927 FatVerifyFcb( IrpContext,
Vcb->EaFcb );
929 FatGetDirentFromFcbOrDcb( IrpContext,
951 EaFileName.Buffer =
"EA DATA. SF";
952 EaFileName.Length = 11;
953 EaFileName.MaximumLength = 12;
969 UnwindLockedRootDcb =
TRUE;
971 FatLocateSimpleOemDirent( IrpContext,
972 Vcb->EaFcb->ParentDcb,
990 Vcb->EaFcb->ParentDcb,
1002 Vcb->EaFcb->FirstClusterOfFile = (*EaDirent)->FirstClusterOfFile;
1013 FatLookupFileAllocationSize( IrpContext,
Vcb->EaFcb );
1020 SectionSize.
QuadPart = (*EaDirent)->FileSize;
1021 Vcb->EaFcb->Header.AllocationSize = SectionSize;
1022 Vcb->EaFcb->Header.FileSize = SectionSize;
1031 Vcb->VirtualEaFile = EaStreamFile;
1042 ULONG BytesPerCluster;
1043 ULONG OffsetTableSize;
1046 USHORT AllocatedClusters;
1051 DebugTrace(0,
Dbg,
"FatGetEaFile: Creating local IrpContext\n", 0);
1053 BytesPerCluster = 1 <<
Vcb->AllocationSupport.LogOfBytesPerCluster;
1056 & ~(BytesPerCluster - 1);
1059 >>
Vcb->AllocationSupport.LogOfBytesPerCluster);
1068 FatAllocateDiskSpace( IrpContext,
1075 UnwindAllocatedDiskSpace =
TRUE;
1082 Vcb->EaFcb->DirentOffsetWithinDirectory =
1083 FatCreateNewDirent( IrpContext,
1084 Vcb->EaFcb->ParentDcb,
1088 FatPrepareWriteDirectoryFile( IrpContext,
1089 Vcb->EaFcb->ParentDcb,
1090 Vcb->EaFcb->DirentOffsetWithinDirectory,
1104 UnwindEaDirentCreated =
TRUE;
1131 SectionSize.
QuadPart = (*EaDirent)->FileSize;
1132 Vcb->EaFcb->Header.AllocationSize = SectionSize;
1133 Vcb->EaFcb->Header.FileSize = SectionSize;
1134 UnwindUpdatedSizes =
TRUE;
1164 (*EaDirent)->FirstClusterOfFile =
1168 Vcb->EaFcb->FirstClusterOfFile = (*EaDirent)->FirstClusterOfFile;
1189 Index--, CurrentIndex++) {
1191 *CurrentIndex = AllocatedClusters;
1199 for (
Index = OffsetTableSize >> 1,
1202 Index--, CurrentIndex++) {
1220 Vcb->VirtualEaFile = EaStreamFile;
1239 if (UnwindAllocatedDiskSpace) {
1241 FatDeallocateDiskSpace( IrpContext,
1251 if (UnwindEaDirentCreated) {
1253 if (UnwindUpdatedSizes) {
1255 Vcb->EaFcb->Header.AllocationSize.QuadPart = 0;
1256 Vcb->EaFcb->Header.FileSize.QuadPart = 0;
1260 FatDeleteDirent( IrpContext,
Vcb->EaFcb,
NULL,
TRUE );
1267 if (UnwindLockedEaFcb) {
1276 if (EaStreamFile !=
NULL) {
1287 if (UnwindLockedRootDcb) {
1351 ULONG BytesPerCluster = 1 <<
Vcb->AllocationSupport.LogOfBytesPerCluster;
1380 DebugTrace(-1,
Dbg,
"FatReadEaSet: Illegal handle value\n", 0);
1439 DebugTrace(0,
Dbg,
"FatReadEaSet: Ea handle is unused\n", 0);
1448 <<
Vcb->AllocationSupport.LogOfBytesPerCluster;
1479 DebugTrace(0,
Dbg,
"FatReadEaSet: Ea set header is corrupt\n", 0);
1495 && CbList > BytesPerCluster ) {
1502 & ~(BytesPerCluster - 1);
1583 ULONG BytesPerCluster = 1 <<
Vcb->AllocationSupport.LogOfBytesPerCluster;
1598 ULONG UnwindPrevFileSize = 0;
1610 USHORT EaHeaderBaseIndex;
1616 USHORT EaSetClusterCount;
1630 DebugTrace(-1,
Dbg,
"FatDeleteEaSet: Illegal handle value\n", 0);
1686 EaOffsetCluster = *((
PUSHORT) EaOffsetRange.
Data + EaOffsetIndex);
1690 DebugTrace(0,
Dbg,
"FatReadEaSet: Ea handle is unused\n", 0);
1699 EaSetVbo = (EaHeader->
EaBaseTable[EaHeaderBaseIndex] + EaOffsetCluster)
1700 <<
Vcb->AllocationSupport.LogOfBytesPerCluster;
1726 DebugTrace(0,
Dbg,
"FatReadEaSet: Ea set header is corrupt\n", 0);
1751 >>
Vcb->AllocationSupport.LogOfBytesPerCluster);
1753 EaSetLength = EaSetClusterCount <<
Vcb->AllocationSupport.LogOfBytesPerCluster;
1759 DebugTrace(0,
Dbg,
"FatDeleteEaSet: Full Ea set not contained in file\n", 0);
1791 ULONG PurgeCount = 5;
1793 while (--PurgeCount) {
1843 UnwindInitializeDataMcb =
TRUE;
1845 FatSplitAllocation( IrpContext,
1851 UnwindSplitData =
TRUE;
1857 UnwindInitializeTailMcb =
TRUE;
1859 FatSplitAllocation( IrpContext,
1865 UnwindSplitTail =
TRUE;
1867 FatMergeAllocation( IrpContext,
1872 UnwindMergeTail =
TRUE;
1880 UnwindPrevFileSize = EaFcb->
Header.FileSize.LowPart;
1894 UnwindCacheValues =
TRUE;
1948 NextEaIndex = &EaHeader->
EaBaseTable[EaHeaderBaseIndex + 1];
1952 *(NextEaIndex++) -= EaSetClusterCount;
1958 NextEaIndex = (
PUSHORT) EaOffsetRange.
Data + EaOffsetIndex;
1966 *NextEaIndex -= EaSetClusterCount;
1975 UnwindModifiedEaHeader =
TRUE;
1981 FatDeallocateDiskSpace( IrpContext,
1998 && !UnwindModifiedEaHeader) {
2005 if (UnwindPrevFileSize) {
2007 EaFcb->
Header.FileSize.LowPart = UnwindPrevFileSize;
2008 EaFcb->
Header.AllocationSize.LowPart = UnwindPrevFileSize;
2009 EaDirent->FileSize = UnwindPrevFileSize;
2011 if (UnwindCacheValues) {
2024 if (UnwindMergeTail) {
2026 FatSplitAllocation( IrpContext,
2038 if (UnwindSplitTail) {
2040 FatMergeAllocation( IrpContext,
2052 if (UnwindSplitData) {
2054 FatMergeAllocation( IrpContext,
2073 if (UnwindInitializeDataMcb) {
2078 if (UnwindInitializeTailMcb) {
2141 ULONG BytesPerCluster = 1 <<
Vcb->AllocationSupport.LogOfBytesPerCluster;
2148 ULONG EaNewOffsetVbo = 0;
2150 ULONG EaOffsetTableSize;
2153 ULONG EaSetClusterOffset;
2155 USHORT EaSetClusterCount;
2184 ULONG NewAllocation;
2188 ULONG UnwindPrevFileSize = 0;
2232 EaNewOffsetVbo = EaHeader->
EaBaseTable[0] <<
Vcb->AllocationSupport.LogOfBytesPerCluster;
2260 EaSetClusterOffset = EaFcb->
Header.FileSize.LowPart
2261 >>
Vcb->AllocationSupport.LogOfBytesPerCluster;
2263 NewEaIndex = (
USHORT) ((EaOffsetTableSize >> 1) - 1);
2265 NextEaOffset = (
PUSHORT) EaOffsetRange.
Data + NewEaIndex;
2273 while (NewEaIndex != 0) {
2284 if (NewEaIndex != 1) {
2286 EaSetClusterOffset = *NextEaOffset
2308 while (NewEaIndex) {
2326 if (NewEaIndex == 0) {
2334 NewEaIndex = (
USHORT) EaOffsetTableSize >> 1;
2335 AddedOffsetTableCluster =
TRUE;
2347 "FatAddEaSet: Illegal handle value for new handle\n", 0);
2356 EaHeaderIndex = NewEaIndex >> 7;
2363 EaSetVbo = EaSetClusterOffset <<
Vcb->AllocationSupport.LogOfBytesPerCluster;
2372 & ~(BytesPerCluster - 1);
2375 + (AddedOffsetTableCluster ? BytesPerCluster : 0);
2384 if ((
ULONG) ((0x0000FFFF <<
Vcb->AllocationSupport.LogOfBytesPerCluster)
2385 - EaFcb->
Header.FileSize.LowPart)
2389 "FatAddEaSet: New Ea file size is too large\n", 0);
2396 UnwindInitializedEaSetMcb =
TRUE;
2398 FatAllocateDiskSpace( IrpContext,
2405 UnwindAllocatedNewAllocation =
TRUE;
2409 if (AddedOffsetTableCluster) {
2413 UnwindInitializedOffsetMcb =
TRUE;
2415 FatSplitAllocation( IrpContext,
2421 UnwindSplitNewAllocation =
TRUE;
2427 if (AddedOffsetTableCluster) {
2446 ULONG PurgeCount = 5;
2448 while (--PurgeCount) {
2486 UnwindPurgeCacheMap =
TRUE;
2499 UnwindInitializedTailMcb =
TRUE;
2501 FatSplitAllocation( IrpContext,
2507 UnwindSplitTail =
TRUE;
2515 if (AddedOffsetTableCluster
2516 && EaSetVbo != EaNewOffsetVbo) {
2520 UnwindInitializedInitialEaMcb =
TRUE;
2522 FatSplitAllocation( IrpContext,
2528 UnwindSplitInitialEa =
TRUE;
2546 if (AddedOffsetTableCluster) {
2548 FatMergeAllocation( IrpContext,
2556 UnwindMergedNewOffset =
TRUE;
2563 if (UnwindInitializedInitialEaMcb) {
2565 FatMergeAllocation( IrpContext,
2573 UnwindMergedInitialEa =
TRUE;
2581 if (AddedOffsetTableCluster) {
2583 EaSetClusterOffset += 1;
2584 EaSetVbo += BytesPerCluster;
2591 FatMergeAllocation( IrpContext,
2599 UnwindMergedNewEaSet =
TRUE;
2605 if (UnwindInitializedTailMcb) {
2607 FatMergeAllocation( IrpContext,
2615 UnwindMergedTail =
TRUE;
2628 UnwindPrevFileSize = EaFcb->
Header.FileSize.LowPart;
2630 EaFcb->
Header.FileSize.LowPart += NewAllocation;
2643 UnwindCacheValues =
TRUE;
2719 NextEaOffset = &EaHeader->
EaBaseTable[EaHeaderIndex + 1];
2723 *(NextEaOffset++) += EaSetClusterCount;
2726 if (AddedOffsetTableCluster) {
2734 *(NextEaOffset++) += 1;
2745 if (AddedOffsetTableCluster) {
2747 Count = (BytesPerCluster >> 1) - 1;
2748 NextEaOffset = EaOffsetTable;
2750 *NextEaOffset++ = 0;
2763 NextEaOffset = EaOffsetTable + EaOffsetIndex;
2765 *NextEaOffset++ = (
USHORT) (EaSetClusterOffset
2774 *NextEaOffset += EaSetClusterCount;
2811 if (UnwindPrevFileSize) {
2813 EaFcb->
Header.FileSize.LowPart = UnwindPrevFileSize;
2814 EaFcb->
Header.AllocationSize.LowPart = UnwindPrevFileSize;
2815 EaDirent->FileSize = UnwindPrevFileSize;
2817 if (UnwindCacheValues) {
2828 if (UnwindMergedTail) {
2830 VBO NewTailPosition;
2834 FatSplitAllocation( IrpContext,
2845 if (UnwindMergedNewEaSet) {
2847 FatSplitAllocation( IrpContext,
2858 if (UnwindMergedInitialEa) {
2860 FatSplitAllocation( IrpContext,
2863 EaNewOffsetVbo + BytesPerCluster,
2871 if (UnwindMergedNewOffset) {
2873 FatSplitAllocation( IrpContext,
2885 if (UnwindSplitInitialEa) {
2887 FatMergeAllocation( IrpContext,
Vcb, &EaFcb->
Mcb, &EaInitialEaMcb );
2895 if (UnwindSplitTail) {
2897 FatMergeAllocation( IrpContext,
Vcb, &EaFcb->
Mcb, &EaTailMcb );
2905 if (UnwindPurgeCacheMap) {
2916 if (UnwindSplitNewAllocation) {
2918 FatDeallocateDiskSpace( IrpContext,
Vcb, &EaOffsetMcb,
FALSE );
2925 FatDeallocateDiskSpace( IrpContext,
Vcb, &EaSetMcb,
FALSE );
2939 if (UnwindInitializedEaSetMcb) {
2944 if (UnwindInitializedOffsetMcb) {
2949 if (UnwindInitializedTailMcb) {
2954 if (UnwindInitializedInitialEaMcb) {
3027 if ( PackedEaSize + *PackedEasLength > *AllocationLength ) {
3035 ULONG NewAllocationSize;
3036 ULONG OldAllocationSize;
3048 + BytesPerCluster - 1)
3049 & ~(BytesPerCluster - 1);
3061 OldAllocationSize = *AllocationLength
3070 *EaSetHeader = Temp;
3076 RtlZeroMemory( &(*EaSetHeader)->PackedEas[*AllocationLength],
3077 NewAllocationSize - OldAllocationSize );
3093 (*EaSetHeader)->NeedEaCount++;
3114 *PackedEasLength ));
3124 EaName.MaximumLength = EaName.Length = FullEa->EaNameLength;
3125 EaName.Buffer = ThisPackedEa->
EaName;
3133 *PackedEasLength += PackedEaSize;
3205 EaSetHeader->NeedEaCount--;
3227 (
PUCHAR) PackedEa + PackedEaSize,
3228 *PackedEasLength - (
Offset + PackedEaSize) );
3235 RtlZeroMemory( &EaSetHeader->PackedEas[*PackedEasLength - PackedEaSize],
3242 *PackedEasLength -= PackedEaSize;
3298 DebugTrace(+1,
Dbg,
"FatLocateNextEa, PreviousOffset = %08lx\n",
3305 if ( PreviousOffset >= PackedEasLength ) {
3322 Offset = PreviousOffset + PackedEaSize;
3330 if (
Offset >= PackedEasLength ) {
3383 DebugTrace(+1,
Dbg,
"FatLocateEaByName, EaName = %Z\n", EaName);
3391 *
Offset < PackedEasLength;
3470 if (
Name.Length == 0 ) {
return FALSE; }
3477 if (
Name.Length > 254 ) {
return FALSE; }
3568 ||
StartingVbo >= EaFcb->Header.AllocationSize.LowPart
3584 EaRange->AuxilaryBuffer =
TRUE;
3586 DestinationBuffer = EaRange->Data;
3613 sizeof(
PBCB ) * EaRange->BcbChainLength,
3620 EaRange->BcbChain = (
PBCB *) &EaRange->BcbArray;
3628 EaRange->Length =
Length;
3641 NextBcb = EaRange->BcbChain;
3676 if (EaRange->AuxilaryBuffer ==
TRUE) {
3697 if (EaRange->AuxilaryBuffer ==
FALSE) {
3747 if (EaRange->AuxilaryBuffer ==
TRUE) {
3751 LargeVbo.
QuadPart = EaRange->StartingVbo;
3764 BcbCount = EaRange->BcbChainLength;
3765 NextBcb = EaRange->BcbChain;
3767 while (BcbCount--) {
3769 if (*NextBcb !=
NULL) {
3816 if (EaRange->AuxilaryBuffer ==
TRUE) {
3819 EaRange->AuxilaryBuffer =
FALSE;
3826 if (EaRange->BcbChain !=
NULL) {
3828 BcbCount = EaRange->BcbChainLength;
3829 NextBcb = EaRange->BcbChain;
3831 while (BcbCount--) {
3833 if (*NextBcb !=
NULL) {
3846 if (EaRange->BcbChain != &EaRange->BcbArray[0]) {
3851 EaRange->BcbChain =
NULL;
VOID NTAPI CcFlushCache(IN PSECTION_OBJECT_POINTERS SectionObjectPointer, IN OPTIONAL PLARGE_INTEGER FileOffset, IN ULONG Length, OUT OPTIONAL PIO_STATUS_BLOCK IoStatus)
VOID NTAPI CcSetDirtyPinnedData(IN PVOID BcbVoid, IN OPTIONAL PLARGE_INTEGER Lsn)
_In_ PFCB _In_ LONGLONG FileOffset
_In_ PFCB _In_ PDIRENT_ENUM_CONTEXT _Inout_ PDIRENT Dirent
#define CopyUchar4(Dst, Src)
#define IRP_CONTEXT_FLAG_WAIT
#define _Requires_lock_held_(lock)
#define NT_SUCCESS(StatCode)
#define FsRtlIsLeadDbcsCharacter(DBCS_CHAR)
#define FatGetIndexFromLbo(VCB, LBO)
EA_SET_HEADER * PEA_SET_HEADER
#define FAT_DIRENT_ATTR_ARCHIVE
#define MAX_EA_BASE_INDEX
#define MAX_EA_OFFSET_INDEX
#define FAT_DIRENT_ATTR_READ_ONLY
struct _EA_FILE_HEADER EA_FILE_HEADER
EA_FILE_HEADER * PEA_FILE_HEADER
#define SizeOfPackedEa(EA, SIZE)
#define FAT_DIRENT_ATTR_SYSTEM
#define SIZE_OF_EA_SET_HEADER
#define FAT_DIRENT_ATTR_HIDDEN
#define EA_FILE_SIGNATURE
#define TAG_EA_SET_HEADER
VOID FatPinEaRange(IN PIRP_CONTEXT IrpContext, IN PFILE_OBJECT VirtualEaFile, IN PFCB EaFcb, IN OUT PEA_RANGE EaRange, IN ULONG StartingVbo, IN ULONG Length, IN NTSTATUS ErrorStatus)
VOID FatMarkEaRangeDirty(IN PIRP_CONTEXT IrpContext, IN PFILE_OBJECT EaFileObject, IN OUT PEA_RANGE EaRange)
VOID FatUnpinEaRange(IN PIRP_CONTEXT IrpContext, IN OUT PEA_RANGE EaRange)
VOID FatAppendPackedEa(IN PIRP_CONTEXT IrpContext, IN OUT PEA_SET_HEADER *EaSetHeader, IN OUT PULONG PackedEasLength, IN OUT PULONG AllocationLength, IN PFILE_FULL_EA_INFORMATION FullEa, IN ULONG BytesPerCluster)
VOID FatDeletePackedEa(IN PIRP_CONTEXT IrpContext, IN OUT PEA_SET_HEADER EaSetHeader, IN OUT PULONG PackedEasLength, IN ULONG Offset)
ULONG FatLocateNextEa(IN PIRP_CONTEXT IrpContext, IN PPACKED_EA FirstPackedEa, IN ULONG PackedEasLength, IN ULONG PreviousOffset)
BOOLEAN FatLocateEaByName(IN PIRP_CONTEXT IrpContext, IN PPACKED_EA FirstPackedEa, IN ULONG PackedEasLength, IN POEM_STRING EaName, OUT PULONG Offset)
BOOLEAN FatIsEaNameValid(IN PIRP_CONTEXT IrpContext, IN OEM_STRING Name)
VOID FatReadEaSet(IN PIRP_CONTEXT IrpContext, IN PVCB Vcb, IN USHORT EaHandle, IN POEM_STRING FileName, IN BOOLEAN ReturnEntireSet, OUT PEA_RANGE EaSetRange)
#define ExAcquireResourceExclusiveLite(res, wait)
#define ExAcquireResourceSharedLite(res, wait)
#define BooleanFlagOn(F, SF)
VOID FatPinMappedData(IN PIRP_CONTEXT IrpContext, IN PDCB Dcb, IN VBO StartingVbo, IN ULONG ByteCount, OUT PBCB *Bcb)
PFILE_OBJECT FatOpenEaFile(IN PIRP_CONTEXT IrpContext, IN PFCB EaFcb)
VOID FatConstructDirent(IN PIRP_CONTEXT IrpContext, IN OUT PDIRENT Dirent, IN POEM_STRING FileName, IN BOOLEAN ComponentReallyLowercase, IN BOOLEAN ExtensionReallyLowercase, IN PUNICODE_STRING Lfn OPTIONAL, IN USHORT Attributes, IN BOOLEAN ZeroAndSetTimeFields, IN PLARGE_INTEGER SetCreationTime OPTIONAL)
#define DebugTrace(INDENT, LEVEL, X, Y)
IN PVCB IN ULONG EaSetLength
IN PVCB IN ULONG IN PBCB OUT PDIRENT OUT PUSHORT OUT PEA_RANGE EaSetRange
#define FatUnpinBcb(IRPCONTEXT, BCB)
IN PVCB IN VBO StartingVbo
BOOLEAN FatLookupMcbEntry(IN PVCB Vcb, IN PLARGE_MCB Mcb, IN VBO Vbo, OUT PLBO Lbo, OUT PULONG ByteCount OPTIONAL, OUT PULONG Index OPTIONAL)
#define FatReleaseFcb(IRPCONTEXT, Fcb)
#define FatUpcaseEaName(IRPCONTEXT, NAME, UPCASEDNAME)
IN PVCB IN PUCHAR IN ULONG IN POEM_STRING OUT PUSHORT EaHandle
#define FatRaiseStatus(IRPCONTEXT, STATUS)
IN PVCB IN PDIRENT OUT PULONG EaLength
IN PDCB IN PCCB IN VBO IN OUT PULONG OUT PDIRENT OUT PBCB OUT PVBO ByteOffset
IN PFCB IN PFILE_OBJECT FileObject IN ULONG AllocationSize
VOID Fat8dot3ToString(_In_ PIRP_CONTEXT IrpContext, _In_ PDIRENT Dirent, _In_ BOOLEAN RestoreCase, _Out_ POEM_STRING OutputString)
IN OUT PVCB OUT PDIRENT OUT PBCB * EaBcb
IN OUT PVCB OUT PDIRENT OUT PBCB IN BOOLEAN IN BOOLEAN ExclusiveFcb
IN OUT PVCB OUT PDIRENT * EaDirent
IN PVCB IN PDIRENT OUT PULONG NeedEaCount
#define CopyU4char(Dst, Src)
#define EA_BCB_ARRAY_SIZE
#define FCB_LOOKUP_ALLOCATIONSIZE_HINT
struct _FILE_FULL_EA_INFORMATION * PFILE_FULL_EA_INFORMATION
#define FsRtlIsAnsiCharacterLegalFat(C, WILD)
VOID NTAPI CcSetFileSizes(IN PFILE_OBJECT FileObject, IN PCC_FILE_SIZES FileSizes)
BOOLEAN NTAPI CcPurgeCacheSection(IN PSECTION_OBJECT_POINTERS SectionObjectPointer, IN OPTIONAL PLARGE_INTEGER FileOffset, IN ULONG Length, IN BOOLEAN UninitializeCacheMaps)
#define Add2Ptr(PTR, INC)
VOID NTAPI FsRtlUninitializeLargeMcb(IN PLARGE_MCB Mcb)
VOID NTAPI FsRtlInitializeLargeMcb(IN PLARGE_MCB Mcb, IN POOL_TYPE PoolType)
#define RtlOffsetToPointer(Base, Offset)
NTSYSAPI LONG NTAPI RtlCompareString(PSTRING String1, PSTRING String2, BOOLEAN CaseInSensitive)
#define UNREFERENCED_PARAMETER(P)
_In_ ULONG _In_ ULONG Offset
_In_ ULONG _In_ ULONG _In_ ULONG Length
BOOLEAN NTAPI CcCopyWrite(IN PFILE_OBJECT FileObject, IN PLARGE_INTEGER FileOffset, IN ULONG Length, IN BOOLEAN Wait, IN PVOID Buffer)
VOID FASTCALL ExReleaseResourceLite(IN PERESOURCE Resource)
PVOID NTAPI FsRtlAllocatePoolWithTag(IN POOL_TYPE PoolType, IN ULONG NumberOfBytes, IN ULONG Tag)
#define STATUS_UNABLE_TO_DELETE_SECTION
#define STATUS_NONEXISTENT_EA_ENTRY
#define STATUS_INVALID_EA_NAME
#define STATUS_NO_EAS_ON_FILE
#define STATUS_EA_TOO_LARGE
#define STATUS_DATA_ERROR
VOID NTAPI CcUnpinData(IN PVOID Bcb)
BOOLEAN NTAPI CcPinRead(IN PFILE_OBJECT FileObject, IN PLARGE_INTEGER FileOffset, IN ULONG Length, IN ULONG Flags, OUT PVOID *Bcb, OUT PVOID *Buffer)
#define _SEH2_AbnormalTermination()
FSRTL_ADVANCED_FCB_HEADER Header
#define RtlCopyMemory(Destination, Source, Length)
#define RtlZeroMemory(Destination, Length)
#define STATUS_INSUFFICIENT_RESOURCES
_In_ WDFCOLLECTION _In_ ULONG Index
_Must_inspect_result_ typedef _In_ PHYSICAL_ADDRESS _In_ LARGE_INTEGER ByteCount
#define ObDereferenceObject