48 if (fileObject ==
NULL)
57 DPRINT1(
"Attaching %p to %p (%d)\n",
fcb, fileObject,
fcb->RefCount);
70 fileObject->SectionObjectPointer = &
fcb->SectionObjectPointers;
71 fileObject->FsContext =
fcb;
72 fileObject->FsContext2 = newCCB;
73 fileObject->Vpb = vcb->IoVPB;
74 fcb->FileObject = fileObject;
131 dirIndex = pFcb->startIndex;
136 dirIndex = pFcb->dirIndex;
139 DPRINT(
"updEntry dirIndex %u, PathName \'%wZ\'\n", dirIndex, &pFcb->PathNameU);
155 Offset.u.LowPart = dirIndex * SizeDirEntry;
162 DPRINT1(
"Failed write to \'%wZ\'.\n", &pFcb->parentFcb->PathNameU);
167 pFcb->Flags &= ~FCB_IS_DIRTY;
191 DPRINT(
"vfatRenameEntry(%p, %p, %wZ, %d)\n", DeviceExt, pFcb,
FileName, CaseChangeOnly);
204 StartIndex = pFcb->startIndex;
223 NameA.MaximumLength = 42;
284 count = pDirFcb->RFCB.FileSize.u.LowPart / SizeDirEntry;
285 size = DeviceExt->FatInfo.BytesPerCluster / SizeDirEntry;
304 FileOffset.u.LowPart += DeviceExt->FatInfo.BytesPerCluster;
318 if (nbFree == nbSlots)
328 if (nbFree == nbSlots)
354 DeviceExt->FatInfo.BytesPerCluster);
366 memset(pFatEntry, 0xff, DeviceExt->FatInfo.BytesPerCluster);
368 RtlZeroMemory(pFatEntry, DeviceExt->FatInfo.BytesPerCluster);
385 memset(pFatEntry, 0xff, SizeDirEntry);
395 DPRINT(
"nbSlots %u nbFree %u, entry number %u\n", nbSlots, nbFree, *
start);
418 BOOLEAN BaseAllLower, BaseAllUpper;
419 BOOLEAN ExtensionAllLower, ExtensionAllUpper;
423 ULONG CurrentCluster;
436 WCHAR ShortNameBuffer[13];
438 DPRINT(
"addEntry: Name='%wZ', Dir='%wZ'\n", NameU, &
ParentFcb->PathNameU);
454 NameA.Buffer = aName;
456 NameA.MaximumLength =
sizeof(aName);
459 DirContext.ShortNameU.Buffer = ShortNameBuffer;
461 DirContext.ShortNameU.MaximumLength =
sizeof(ShortNameBuffer);
467 if (!IsNameLegal || SpacesFound)
471 WCHAR ShortSearchName[13];
481 for (
i = 0;
i < 100;
i++)
491 else if (MoveContext)
496 if (MoveContext->InPlace)
513 BaseAllLower = BaseAllUpper =
TRUE;
514 ExtensionAllLower = ExtensionAllUpper =
TRUE;
519 if (
c >=
L'A' &&
c <=
L'Z')
522 ExtensionAllLower =
FALSE;
524 BaseAllLower =
FALSE;
526 else if (
c >=
L'a' &&
c <=
L'z')
529 ExtensionAllUpper =
FALSE;
531 BaseAllUpper =
FALSE;
545 if ((!BaseAllLower && !BaseAllUpper) ||
546 (!ExtensionAllLower && !ExtensionAllUpper))
554 aName[NameA.Length] = 0;
555 DPRINT(
"'%s', '%wZ', needTilde=%u, needLong=%u\n",
556 aName, &
DirContext.LongNameU, needTilde, needLong);
558 for (
i = 0;
i < 8 && aName[
i] && aName[
i] !=
'.';
i++)
565 for (
j = 0;
j < 3 && aName[
i];
j++,
i++)
570 if (
DirContext.DirEntry.Fat.Filename[0] == 0xe5)
579 DirContext.LongNameU.MaximumLength =
sizeof(LongNameBuffer);
587 if (BaseAllLower && !BaseAllUpper)
591 if (ExtensionAllLower && !ExtensionAllUpper)
613 if (MoveContext !=
NULL)
615 DirContext.DirEntry.Fat.CreationDate = MoveContext->CreationDate;
617 DirContext.DirEntry.Fat.FileSize = MoveContext->FileSize;
623 for (pSlots[0].alias_checksum = 0,
i = 0;
i < 11;
i++)
626 | ((pSlots[0].alias_checksum & 0xfe) >> 1))
630 for (
i = nbSlots - 2;
i >= 0;
i--)
632 DPRINT(
"construct slot %d\n",
i);
633 pSlots[
i].
attr = 0xf;
636 pSlots[
i].
id = (
unsigned char)(nbSlots -
i - 1);
640 pSlots[
i].
id = (
unsigned char)(nbSlots -
i - 1 + 0x40);
658 if (MoveContext ==
NULL)
672 if (DeviceExt->FatInfo.FatType ==
FAT32)
679 CurrentCluster = MoveContext->FirstCluster;
682 if (DeviceExt->FatInfo.FatType ==
FAT32)
684 DirContext.DirEntry.Fat.FirstClusterHigh = (
unsigned short)(CurrentCluster >> 16);
688 else if (MoveContext !=
NULL)
690 CurrentCluster = MoveContext->FirstCluster;
692 if (DeviceExt->FatInfo.FatType ==
FAT32)
694 DirContext.DirEntry.Fat.FirstClusterHigh = (
unsigned short)(CurrentCluster >> 16);
728 size = DeviceExt->FatInfo.BytesPerCluster -
764 if (MoveContext !=
NULL)
779 DPRINT(
"new : entry=%11.11s\n", (*Fcb)->entry.Fat.Filename);
803 if (MoveContext ==
NULL)
805 RtlZeroMemory(pFatEntry, DeviceExt->FatInfo.BytesPerCluster);
848 DPRINT(
"addEntry: Name='%wZ', Dir='%wZ'\n", NameU, &
ParentFcb->PathNameU);
877 if (MoveContext !=
NULL)
879 DirContext.DirEntry.FatX.FirstCluster = MoveContext->FirstCluster;
890 NameA.MaximumLength = 42;
892 DirContext.DirEntry.FatX.FilenameLength = (
unsigned char)NameA.Length;
910 if (MoveContext !=
NULL)
912 DirContext.DirEntry.FatX.CreationDate = MoveContext->CreationDate;
914 DirContext.DirEntry.FatX.FileSize = MoveContext->FileSize;
936 if (MoveContext !=
NULL)
976 DPRINT(
"delEntry PathName \'%wZ\'\n", &pFcb->PathNameU);
977 DPRINT(
"delete entry: %u to %u\n", pFcb->startIndex, pFcb->dirIndex);
979 for (
i = pFcb->startIndex; i <= pFcb->dirIndex;
i++)
1000 if (
i == pFcb->dirIndex)
1009 if (MoveContext !=
NULL)
1013 MoveContext->FileSize = pDirEntry->
FileSize;
1025 if (MoveContext ==
NULL)
1027 while (CurrentCluster && CurrentCluster != 0xffffffff)
1035 if (DeviceExt->FatInfo.FatType ==
FAT32)
1064 StartIndex = pFcb->startIndex;
1072 DPRINT(
"delEntry PathName \'%wZ\'\n", &pFcb->PathNameU);
1073 DPRINT(
"delete entry: %u\n", StartIndex);
1092 if (MoveContext !=
NULL)
1094 MoveContext->FirstCluster = CurrentCluster;
1095 MoveContext->FileSize = pDirEntry->
FileSize;
1104 if (MoveContext ==
NULL)
1106 while (CurrentCluster && CurrentCluster != 0xffffffff)
NTSYSAPI VOID NTAPI RtlGenerate8dot3Name(_In_ PCUNICODE_STRING Name, _In_ BOOLEAN AllowExtendedCharacters, _Inout_ PGENERATE_NAME_CONTEXT Context, _Inout_ PUNICODE_STRING Name8dot3)
int strncmp(const char *String1, const char *String2, ACPI_SIZE Count)
#define FILE_DIRECTORY_FILE
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 DirContext
ULONG vfatDirEntryGetFirstCluster(PDEVICE_EXTENSION pDeviceExt, PDIR_ENTRY pFatDirEntry)
BOOLEAN FATIsDirectoryEmpty(PDEVICE_EXTENSION DeviceExt, PVFATFCB Fcb)
VFAT_DISPATCH FatXDispatch
BOOLEAN FATXIsDirectoryEmpty(PDEVICE_EXTENSION DeviceExt, PVFATFCB Fcb)
NTSTATUS vfatRenameEntry(IN PDEVICE_EXTENSION DeviceExt, IN PVFATFCB pFcb, IN PUNICODE_STRING FileName, IN BOOLEAN CaseChangeOnly)
VFAT_DISPATCH FatDispatch
NTSTATUS FATXGetNextDirEntry(PVOID *pContext, PVOID *pPage, PVFATFCB pDirFcb, PVFAT_DIRENTRY_CONTEXT DirContext, BOOLEAN First)
static NTSTATUS FATAddEntry(IN PDEVICE_EXTENSION DeviceExt, IN PUNICODE_STRING NameU, IN PVFATFCB *Fcb, IN PVFATFCB ParentFcb, IN ULONG RequestedOptions, IN UCHAR ReqAttr, IN PVFAT_MOVE_CONTEXT MoveContext)
NTSTATUS VfatMoveEntry(IN PDEVICE_EXTENSION DeviceExt, IN PVFATFCB pFcb, IN PUNICODE_STRING FileName, IN PVFATFCB ParentFcb)
static NTSTATUS FATXDelEntry(IN PDEVICE_EXTENSION DeviceExt, IN PVFATFCB pFcb, OUT PVFAT_MOVE_CONTEXT MoveContext)
BOOLEAN vfatFindDirSpace(IN PDEVICE_EXTENSION DeviceExt, IN PVFATFCB pDirFcb, IN ULONG nbSlots, OUT PULONG start)
NTSTATUS vfatFCBInitializeCacheFromVolume(PVCB vcb, PVFATFCB fcb)
NTSTATUS FATGetNextDirEntry(PVOID *pContext, PVOID *pPage, PVFATFCB pDirFcb, PVFAT_DIRENTRY_CONTEXT DirContext, BOOLEAN First)
static NTSTATUS FATDelEntry(IN PDEVICE_EXTENSION DeviceExt, IN PVFATFCB pFcb, OUT PVFAT_MOVE_CONTEXT MoveContext)
static NTSTATUS FATXAddEntry(IN PDEVICE_EXTENSION DeviceExt, IN PUNICODE_STRING NameU, IN PVFATFCB *Fcb, IN PVFATFCB ParentFcb, IN ULONG RequestedOptions, IN UCHAR ReqAttr, IN PVFAT_MOVE_CONTEXT MoveContext)
NTSTATUS VfatUpdateEntry(IN PDEVICE_EXTENSION DeviceExt, IN PVFATFCB pFcb)
#define NT_SUCCESS(StatCode)
unsigned short(__cdecl typeof(TIFFCurrentDirectory))(struct tiff *)
#define FCB_CACHE_INITIALIZED
BOOLEAN FsdSystemTimeToDosDateTime(PDEVICE_EXTENSION DeviceExt, PLARGE_INTEGER SystemTime, PUSHORT pDosDate, PUSHORT pDosTime)
NTSTATUS GetNextCluster(PDEVICE_EXTENSION DeviceExt, ULONG CurrentCluster, PULONG NextCluster)
NTSTATUS FAT32UpdateFreeClustersCount(PDEVICE_EXTENSION DeviceExt)
NTSTATUS WriteCluster(PDEVICE_EXTENSION DeviceExt, ULONG ClusterToWrite, ULONG NewValue)
NTSTATUS NextCluster(PDEVICE_EXTENSION DeviceExt, ULONG FirstCluster, PULONG CurrentCluster, BOOLEAN Extend)
#define ExAllocatePoolWithTag(hernya, size, tag)
NTSTATUS RtlUpcaseUnicodeString(PUNICODE_STRING dst, PUNICODE_STRING src, BOOLEAN Alloc)
#define KeQuerySystemTime(t)
#define ExAcquireResourceExclusiveLite(res, wait)
#define BooleanFlagOn(F, SF)
IN PDCB IN POEM_STRING IN PUNICODE_STRING IN OUT POEM_STRING ShortName
IN PFCB IN PFILE_OBJECT FileObject IN ULONG AllocationSize
PVFAT_GLOBAL_DATA VfatGlobalData
VOID NTAPI CcInitializeCacheMap(IN PFILE_OBJECT FileObject, IN PCC_FILE_SIZES FileSizes, IN BOOLEAN PinAccess, IN PCACHE_MANAGER_CALLBACKS Callbacks, IN PVOID LazyWriteContext)
GLuint GLuint GLsizei count
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
BOOLEAN NTAPI RtlIsNameLegalDOS8Dot3(_In_ PUNICODE_STRING Name, _Inout_opt_ POEM_STRING OemName, _Inout_opt_ PBOOLEAN NameContainsSpaces)
#define EXCEPTION_EXECUTE_HANDLER
#define ExFreePoolWithTag(_P, _T)
NTSYSAPI NTSTATUS NTAPI RtlUnicodeStringToOemString(POEM_STRING DestinationString, PCUNICODE_STRING SourceString, BOOLEAN AllocateDestinationString)
#define FILE_ATTRIBUTE_DIRECTORY
_In_ ULONG _In_ ULONG Offset
VOID FASTCALL ExReleaseResourceLite(IN PERESOURCE Resource)
BOOLEAN NTAPI FsRtlIsNameInExpression(IN PUNICODE_STRING Expression, IN PUNICODE_STRING Name, IN BOOLEAN IgnoreCase, IN PWCHAR UpcaseTable OPTIONAL)
PFILE_OBJECT NTAPI IoCreateStreamFileObject(IN PFILE_OBJECT FileObject, IN PDEVICE_OBJECT DeviceObject)
#define STATUS_NAME_TOO_LONG
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_GetExceptionCode()
#define _SEH2_EXCEPT(...)
#define _SEH2_YIELD(__stmt)
NPAGED_LOOKASIDE_LIST CcbLookasideList
CACHE_MANAGER_CALLBACKS CacheMgrCallbacks
unsigned char Filename[8]
unsigned char ShortName[11]
unsigned short CreationDate
unsigned short FirstCluster
unsigned short CreationTime
unsigned short FirstClusterHigh
unsigned short CreationDate
unsigned char Filename[42]
unsigned char FilenameLength
unsigned short CreationTime
FSRTL_COMMON_FCB_HEADER RFCB
struct _VFATFCB * parentFcb
SECTION_OBJECT_POINTERS SectionObjectPointers
UNICODE_STRING ShortNameU
PDEVICE_EXTENSION DeviceExt
unsigned char alias_checksum
#define RtlCopyMemory(Destination, Source, Length)
#define RtlZeroMemory(Destination, Length)
#define STATUS_UNSUCCESSFUL
#define STATUS_INSUFFICIENT_RESOURCES
struct _LARGE_INTEGER::@2379 u
#define ENTRY_DELETED(IsFatX, DirEntry)
struct _FATDirEntry FAT_DIR_ENTRY
struct _FATXDirEntry FATX_DIR_ENTRY
FORCEINLINE NTSTATUS VfatAddEntry(PDEVICE_EXTENSION DeviceExt, PUNICODE_STRING NameU, struct _VFATFCB **Fcb, struct _VFATFCB *ParentFcb, ULONG RequestedOptions, UCHAR ReqAttr, struct _VFAT_MOVE_CONTEXT *MoveContext)
union _DIR_ENTRY * PDIR_ENTRY
#define VFAT_CASE_LOWER_EXT
FORCEINLINE BOOLEAN vfatFCBIsDirectory(PVFATFCB FCB)
#define LONGNAME_MAX_LENGTH
#define VFAT_CASE_LOWER_BASE
FORCEINLINE NTSTATUS VfatDelEntry(PDEVICE_EXTENSION DeviceExt, struct _VFATFCB *Fcb, struct _VFAT_MOVE_CONTEXT *MoveContext)
#define ENTRY_END(IsFatX, DirEntry)
FORCEINLINE BOOLEAN vfatVolumeIsFatX(PDEVICE_EXTENSION DeviceExt)
NTSTATUS vfatUpdateFCB(PDEVICE_EXTENSION pVCB, PVFATFCB Fcb, PVFAT_DIRENTRY_CONTEXT DirContext, PVFATFCB ParentFcb)
BOOLEAN vfatFCBIsRoot(PVFATFCB FCB)
NTSTATUS vfatMakeFCBFromDirEntry(PVCB vcb, PVFATFCB directoryFCB, PVFAT_DIRENTRY_CONTEXT DirContext, PVFATFCB *fileFCB)
VOID vfatGrabFCB(PDEVICE_EXTENSION pVCB, PVFATFCB pFCB)
NTSTATUS VfatSetAllocationSizeInformation(PFILE_OBJECT FileObject, PVFATFCB Fcb, PDEVICE_EXTENSION DeviceExt, PLARGE_INTEGER AllocationSize)
_In_ WDFCOLLECTION _In_ ULONG Index
#define ExIsResourceAcquiredExclusive
#define ObDereferenceObject