47 if (cString[0] == 0x05)
52 StringA.Buffer = cString;
53 for (StringA.Length = 0;
54 StringA.Length < 8 && StringA.Buffer[StringA.Length] !=
' ';
56 StringA.MaximumLength = StringA.Length;
65 if (cString[8] !=
' ')
78 StringA.Buffer = &cString[8];
79 for (StringA.Length = 0;
80 StringA.Length < 3 && StringA.Buffer[StringA.Length] !=
' ';
82 StringA.MaximumLength = StringA.Length;
109 USHORT PathNameBufferLength;
120 DPRINT(
"FindFile(Parent %p, FileToFind '%wZ', DirIndex: %u)\n",
131 PathNameU.
Buffer = PathNameBuffer;
140 if (WildCard ==
FALSE)
166 DPRINT(
"FindFile: new Name %wZ, DirIndex %u (%u)\n",
172 DPRINT(
"FCB not found for %wZ\n", &PathNameU);
206 DPRINT1(
"WARNING: File system corruption detected. You may need to run a disk repair utility.\n");
246 DPRINT(
"FindFile: new Name %wZ, DirIndex %u\n",
279 ULONG RequestedDisposition,
280 ULONG RequestedOptions,
299 if (!DeviceExt->FatInfo.FixedMedia)
322 DPRINT(
"Checking for existing FCB in memory\n");
327 DPRINT (
"Could not make a new FCB, status: %x\n",
Status);
378 CloseContext =
Fcb->CloseContext;
380 if (CloseContext !=
NULL)
382 ConcurrentDeletion =
FALSE;
390 ConcurrentDeletion =
TRUE;
400 if (!ConcurrentDeletion)
406 DPRINT(
"Reusing delayed close FCB for %wZ\n", &
Fcb->PathNameU);
409 DPRINT(
"Attaching FCB to fileObject\n");
430 ULONG RequestedDisposition, RequestedOptions;
445 RequestedDisposition = ((
Stack->Parameters.Create.Options >> 24) & 0xff);
481 FileObject->RelatedFileObject->FsContext == DeviceExt->VolumeFcb))
483 DPRINT(
"Volume opening\n");
509 pFcb = DeviceExt->VolumeFcb;
514 Stack->Parameters.Create.ShareAccess,
521 Stack->Parameters.Create.ShareAccess,
533 DeviceExt->OpenHandleCount++;
542 FileObject->RelatedFileObject->FsContext == DeviceExt->VolumeFcb)
556 if (*
c ==
L'\\' ||
c == PathNameU.
Buffer)
558 if (Dots &&
last >
c)
562 if (*
c ==
L'\\' && (
c - 1) > PathNameU.
Buffer &&
594 TrailingBackslash =
FALSE;
598 TrailingBackslash =
TRUE;
697 Stack->Parameters.Create.ShareAccess,
704 Stack->Parameters.Create.ShareAccess,
723 DeviceExt->OpenHandleCount++;
762 DPRINT1(
"VfatOpenFile failed for '%wZ', status %x\n", &PathNameU,
Status);
783 if (TrailingBackslash)
816 &
Irp->Overlay.AllocationSize);
818 Irp->AssociatedIrp.SystemBuffer,
819 Stack->Parameters.Create.EaLength);
821 if (PagingFileCreate)
866 Stack->Parameters.Create.ShareAccess,
901 #ifndef USE_ROS_CC_AND_FS 922 if (PagingFileCreate)
1004 &
Irp->Overlay.AllocationSize);
1032 Stack->Parameters.Create.ShareAccess,
1066 DeviceExt->OpenHandleCount++;
1098 DPRINT (
"FsdCreate called with file system\n");
#define KeQuerySystemTime(t)
unsigned short UpdateTime
#define STATUS_OBJECT_NAME_COLLISION
LIST_ENTRY CloseListEntry
NTSTATUS VfatCreate(PVFAT_IRP_CONTEXT IrpContext)
NTSTATUS VfatSetAllocationSizeInformation(PFILE_OBJECT FileObject, PVFATFCB Fcb, PDEVICE_EXTENSION DeviceExt, PLARGE_INTEGER AllocationSize)
#define STATUS_DELETE_PENDING
SECTION_OBJECT_POINTERS SectionObjectPointers
#define STATUS_FILE_IS_A_DIRECTORY
NTSTATUS VfatCloseFile(PDEVICE_EXTENSION DeviceExt, PFILE_OBJECT FileObject)
#define STATUS_INSUFFICIENT_RESOURCES
NTSTATUS RtlUpcaseUnicodeString(PUNICODE_STRING dst, PUNICODE_STRING src, BOOLEAN Alloc)
_In_ ULONG _In_ ULONG _In_ ULONG Length
unsigned short UpdateDate
#define STATUS_NO_MORE_ENTRIES
UNICODE_STRING ShortNameU
#define CCB_DELETE_ON_CLOSE
PDEVICE_EXTENSION DeviceExt
#define SL_OPEN_PAGING_FILE
#define STATUS_INVALID_PARAMETER
#define FILE_ATTRIBUTE_SYSTEM
#define BooleanFlagOn(F, SF)
if(OpenRequiringOplock &&(Iosb.Status==STATUS_SUCCESS))
#define FILE_DIRECTORY_FILE
NTSTATUS vfatAttachFCBToFileObject(PDEVICE_EXTENSION vcb, PVFATFCB fcb, PFILE_OBJECT fileObject)
#define IOCTL_DISK_CHECK_VERIFY
VOID NTAPI CcUnpinData(IN PVOID Bcb)
VOID vfat8Dot3ToString(PFAT_DIR_ENTRY pEntry, PUNICODE_STRING NameU)
FORCEINLINE BOOLEAN vfatFCBIsDirectory(PVFATFCB FCB)
BOOLEAN vfatFCBIsRoot(PVFATFCB FCB)
#define FILE_NOTIFY_CHANGE_SIZE
#define FILE_NOTIFY_CHANGE_LAST_WRITE
#define vfatAddToStat(Vcb, Stat, Inc)
#define FILE_NOTIFY_CHANGE_FILE_NAME
VOID NTAPI IoSetShareAccess(IN ACCESS_MASK DesiredAccess, IN ULONG DesiredShareAccess, IN PFILE_OBJECT FileObject, OUT PSHARE_ACCESS ShareAccess)
ACPI_PHYSICAL_ADDRESS ACPI_SIZE BOOLEAN Warn BOOLEAN Physical UINT32 ACPI_TABLE_HEADER *OutTableHeader ACPI_TABLE_HEADER **OutTable ACPI_HANDLE UINT32 ACPI_WALK_CALLBACK ACPI_WALK_CALLBACK void void **ReturnValue UINT32 ACPI_BUFFER *RetPathPtr ACPI_OBJECT_HANDLER void *Data ACPI_OBJECT_HANDLER void **Data ACPI_STRING ACPI_OBJECT_LIST ACPI_BUFFER *ReturnObjectBuffer ACPI_DEVICE_INFO **ReturnBuffer ACPI_HANDLE Parent
NTSTATUS VfatSetExtendedAttributes(PFILE_OBJECT FileObject, PVOID Ea, ULONG EaLength)
#define FILE_NOTIFY_CHANGE_DIR_NAME
_Must_inspect_result_ FORCEINLINE BOOLEAN IsListEmpty(_In_ const LIST_ENTRY *ListHead)
BOOLEAN NTAPI FsRtlDoesNameContainWildCards(IN PUNICODE_STRING Name)
VOID FASTCALL ExReleaseFastMutex(IN PFAST_MUTEX FastMutex)
BOOLEAN NTAPI FsRtlIsNameInExpression(IN PUNICODE_STRING Expression, IN PUNICODE_STRING Name, IN BOOLEAN IgnoreCase, IN PWCHAR UpcaseTable OPTIONAL)
#define FCB_DELETE_PENDING
#define FILE_VALID_OPTION_FLAGS
#define ENTRY_VOLUME(IsFatX, DirEntry)
#define FILE_OPEN_BY_FILE_ID
#define RtlMoveMemory(Destination, Source, Length)
NTSYSAPI VOID NTAPI RtlCopyUnicodeString(PUNICODE_STRING DestinationString, PUNICODE_STRING SourceString)
FORCEINLINE BOOLEAN RemoveEntryList(_In_ PLIST_ENTRY Entry)
BOOLEAN NTAPI ExAcquireResourceExclusiveLite(IN PERESOURCE Resource, IN BOOLEAN Wait)
_In_ WDFREQUEST _In_ PIO_STACK_LOCATION Stack
_In_ PDEVICE_OBJECT DeviceObject
return STATUS_NOT_IMPLEMENTED
NTSYSAPI NTSTATUS WINAPI RtlDowncaseUnicodeString(UNICODE_STRING *, const UNICODE_STRING *, BOOLEAN)
#define STATUS_NOT_A_DIRECTORY
FORCEINLINE BOOLEAN vfatFCBIsReadOnly(PVFATFCB FCB)
#define IO_DISK_INCREMENT
BOOLEAN FsdSystemTimeToDosDateTime(PDEVICE_EXTENSION DeviceExt, PLARGE_INTEGER SystemTime, PUSHORT pDosDate, PUSHORT pDosTime)
#define STATUS_SHARING_VIOLATION
_In_ PIO_STACK_LOCATION _Inout_ PFILE_OBJECT FileObject
#define FILE_ACTION_MODIFIED
SHARE_ACCESS FCBShareAccess
#define FILE_OVERWRITE_IF
_In_ WDFREQUEST _In_ WDFFILEOBJECT FileObject
#define FILE_ATTRIBUTE_DIRECTORY
FORCEINLINE BOOLEAN vfatVolumeIsFatX(PDEVICE_EXTENSION DeviceExt)
#define FILE_DELETE_ON_CLOSE
BOOLEAN NTAPI FsRtlAreNamesEqual(IN PCUNICODE_STRING Name1, IN PCUNICODE_STRING Name2, IN BOOLEAN IgnoreCase, IN PCWCH UpcaseTable OPTIONAL)
PDEVICE_OBJECT DeviceObject
#define NT_SUCCESS(StatCode)
BOOLEAN NTAPI MmFlushImageSection(IN PSECTION_OBJECT_POINTERS SectionObjectPointer, IN MMFLUSH_TYPE FlushType)
#define FAT_ENTRY_VOLUME(DirEntry)
FORCEINLINE NTSTATUS VfatAddEntry(PDEVICE_EXTENSION DeviceExt, PUNICODE_STRING NameU, struct _VFATFCB **Fcb, struct _VFATFCB *ParentFcb, ULONG RequestedOptions, UCHAR ReqAttr, struct _VFAT_MOVE_CONTEXT *MoveContext)
_In_ PFCB _In_ PDIRENT_ENUM_CONTEXT DirContext
#define FILE_ATTRIBUTE_READONLY
#define STATUS_OBJECT_PATH_NOT_FOUND
NTSYSAPI VOID NTAPI RtlFreeUnicodeString(PUNICODE_STRING UnicodeString)
#define STATUS_ACCESS_DENIED
VOID FASTCALL ExReleaseResourceLite(IN PERESOURCE Resource)
PVFATFCB vfatGrabFCBFromTable(PDEVICE_EXTENSION pVCB, PUNICODE_STRING PathNameU)
#define VFAT_CASE_LOWER_BASE
#define STATUS_UNSUCCESSFUL
#define ExAllocatePoolWithTag(hernya, size, tag)
#define FILE_ATTRIBUTE_ARCHIVE
#define FILE_DOES_NOT_EXIST
#define STATUS_CANNOT_DELETE
FORCEINLINE NTSTATUS VfatGetNextDirEntry(PDEVICE_EXTENSION DeviceExt, PVOID *pContext, PVOID *pPage, struct _VFATFCB *pDirFcb, struct _VFAT_DIRENTRY_CONTEXT *DirContext, BOOLEAN First)
#define FILE_NON_DIRECTORY_FILE
#define VFAT_CASE_LOWER_EXT
BOOLEAN IsDotOrDotDot(PCUNICODE_STRING Name)
NTSYSAPI NTSTATUS NTAPI RtlOemStringToUnicodeString(PUNICODE_STRING DestinationString, PCOEM_STRING SourceString, BOOLEAN AllocateDestinationString)
ClearFlag(Dirent->Flags, DIRENT_FLAG_NOT_PERSISTENT)
#define FCB_DELAYED_CLOSE
#define VFAT_BREAK_ON_CORRUPTION
PVFAT_GLOBAL_DATA VfatGlobalData
NTSTATUS NTAPI IoCheckShareAccess(IN ACCESS_MASK DesiredAccess, IN ULONG DesiredShareAccess, IN PFILE_OBJECT FileObject, IN PSHARE_ACCESS ShareAccess, IN BOOLEAN Update)
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(_In_ PIRP Irp)
#define SL_OPEN_TARGET_DIRECTORY
FORCEINLINE VOID vfatReportChange(IN PDEVICE_EXTENSION DeviceExt, IN PVFATFCB Fcb, IN ULONG FilterMatch, IN ULONG Action)
VOID FASTCALL ExAcquireFastMutex(IN PFAST_MUTEX FastMutex)
NTSTATUS VfatBlockDeviceIoControl(IN PDEVICE_OBJECT DeviceObject, IN ULONG CtlCode, IN PVOID InputBuffer OPTIONAL, IN ULONG InputBufferSize, IN OUT PVOID OutputBuffer OPTIONAL, IN OUT PULONG OutputBufferSize, IN BOOLEAN Override)
#define FILE_NOTIFY_CHANGE_ATTRIBUTES
NTSYSAPI NTSTATUS NTAPI RtlAppendUnicodeStringToString(PUNICODE_STRING Destination, PUNICODE_STRING Source)
#define STATUS_OBJECT_NAME_INVALID
#define VCB_IS_SYS_OR_HAS_PAGE
#define FILE_ATTRIBUTE_HIDDEN
PDEVICE_OBJECT DeviceObject
#define VCB_VOLUME_LOCKED
#define FILE_ACTION_ADDED
BOOLEAN vfatIsLongIllegal(WCHAR c)
NTSTATUS FindFile(PDEVICE_EXTENSION DeviceExt, PVFATFCB Parent, PUNICODE_STRING FileToFindU, PVFAT_DIRENTRY_CONTEXT DirContext, BOOLEAN First)
#define LONGNAME_MAX_LENGTH
NTSTATUS VfatUpdateEntry(IN PDEVICE_EXTENSION DeviceExt, IN PVFATFCB pFcb)
VOID vfatGrabFCB(PDEVICE_EXTENSION pVCB, PVFATFCB pFCB)
static NTSTATUS VfatOpenFile(PDEVICE_EXTENSION DeviceExt, PUNICODE_STRING PathNameU, PFILE_OBJECT FileObject, ULONG RequestedDisposition, ULONG RequestedOptions, PVFATFCB *ParentFcb)
unsigned short UpdateDate
#define RtlCopyMemory(Destination, Source, Length)
VOID vfatReleaseFCB(PDEVICE_EXTENSION pVCB, PVFATFCB pFCB)
NTSTATUS vfatGetFCBForFile(PDEVICE_EXTENSION pVCB, PVFATFCB *pParentFCB, PVFATFCB *pFCB, PUNICODE_STRING pFileNameU)
#define ExFreePoolWithTag(_P, _T)
unsigned short UpdateTime
VOID vfatSplitPathName(PUNICODE_STRING PathNameU, PUNICODE_STRING DirNameU, PUNICODE_STRING FileNameU)
VOID NTAPI IoUpdateShareAccess(IN PFILE_OBJECT FileObject, OUT PSHARE_ACCESS ShareAccess)
PAGED_LOOKASIDE_LIST CloseContextLookasideList
static NTSTATUS VfatCreateFile(PDEVICE_OBJECT DeviceObject, PIRP Irp)
_Must_inspect_result_ _In_ WDFDMAENABLER _In_ _In_opt_ PWDF_OBJECT_ATTRIBUTES Attributes