24 #pragma alloc_text(PAGE, FFSv1LookupFileName) 25 #pragma alloc_text(PAGE, FFSv2LookupFileName) 26 #pragma alloc_text(PAGE, FFSSearchFcbList) 27 #pragma alloc_text(PAGE, FFSv1ScanDir) 28 #pragma alloc_text(PAGE, FFSv2ScanDir) 29 #pragma alloc_text(PAGE, FFSCreateFile) 30 #pragma alloc_text(PAGE, FFSCreateVolume) 31 #pragma alloc_text(PAGE, FFSCreate) 32 #pragma alloc_text(PAGE, FFSCreateInode) 33 #pragma alloc_text(PAGE, FFSSupersedeOrOverWriteFile) 66 else if (FullFileName->Buffer[0] ==
L'\\')
68 ParentMcb =
Vcb->McbTree;
77 if (FullFileName->Length == 0)
82 if (FullFileName->Length == 2 && FullFileName->Buffer[0] ==
L'\\')
89 *FFSMcb =
Vcb->McbTree;
94 while (bRun && i < FullFileName->
Length / 2)
105 while(i < FullFileName->
Length / 2 && FullFileName->Buffer[
i] ==
L'\\')
i++;
110 while(i < FullFileName->
Length / 2 && (FullFileName->Buffer[
i] !=
L'\\'))
i++;
128 if (i < FullFileName->
Length / 2)
146 if (i < FullFileName->
Length / 2)
175 FFS_FEATURE_INCOMPAT_FILETYPE))
177 if (ffs_dir.
d_type == FFS_FT_DIR)
265 else if (FullFileName->Buffer[0] ==
L'\\')
267 ParentMcb =
Vcb->McbTree;
276 if (FullFileName->Length == 0)
281 if (FullFileName->Length == 2 && FullFileName->Buffer[0] ==
L'\\')
288 *FFSMcb =
Vcb->McbTree;
293 while (bRun && i < FullFileName->
Length / 2)
304 while(i < FullFileName->
Length / 2 && FullFileName->Buffer[
i] ==
L'\\')
i++;
309 while(i < FullFileName->
Length / 2 && (FullFileName->Buffer[
i] !=
L'\\'))
i++;
327 if (i < FullFileName->
Length / 2)
345 if (i < FullFileName->
Length / 2)
374 FFS_FEATURE_INCOMPAT_FILETYPE))
376 if (ffs_dir.
d_type == FFS_FT_DIR)
445 USHORT InodeFileNameLength;
474 if (!InodeFileName.
Buffer)
482 while (!bFound && dwBytes < dinode1->di_size)
507 OemName.Length = (pDir->d_namlen & 0xff);
510 InodeFileNameLength = (
USHORT)
517 InodeFileNameLength + 2);
542 dwBytes +=pDir->d_reclen;
547 if (pDir->d_ino == 0)
549 if (pDir->d_reclen == 0)
556 dwBytes +=pDir->d_reclen;
598 USHORT InodeFileNameLength;
627 if (!InodeFileName.
Buffer)
635 while (!bFound && dwBytes < dinode2->di_size)
660 OemName.Length = (pDir->d_namlen & 0xff);
663 InodeFileNameLength = (
USHORT)
670 InodeFileNameLength + 2);
695 dwBytes +=pDir->d_reclen;
700 if (pDir->d_ino == 0)
702 if (pDir->d_reclen == 0)
709 dwBytes +=pDir->d_reclen;
815 BOOLEAN NoIntermediateBuffering;
870 VcbResourceAcquired =
TRUE;
872 if (
Irp->Overlay.AllocationSize.HighPart)
949 FFSPrint((
DBG_INFO,
"FFSCreateFile: %S (NameLen=%xh) Paging=%xh Option: %xh.\n",
1007 if (PathName.
Buffer[0] !=
L'\\')
1014 ParentMcb =
Vcb->McbTree;
1022 if (((RemainName.
Length != 0) && (RemainName.
Buffer[0] ==
L'\\')) ||
1029 if (RemainName.
Length != 0)
1059 PathName = RemainName;
1125 bParentFcbCreated =
TRUE;
1137 #else // !FFS_READ_ONLY 1172 if ((RealName.
Length == 0x10) &&
1254 #endif // !FFS_READ_ONLY 1256 else if (OpenTargetDirectory)
1291 if (OpenTargetDirectory)
1334 if (NonDirectoryFile)
1348 if (OpenTargetDirectory)
1370 bFcbAllocated =
TRUE;
1375 bFcbAllocated =
TRUE;
1409 EntryName.
Buffer = &NameBuf[0];
1410 NameBuf[0] = (
USHORT)
'.';
1431 EntryName.
Buffer = &NameBuf[0];
1432 NameBuf[0] = NameBuf[1] = (
USHORT)
'.';
1436 Fcb->FFSMcb->Parent->Inode,
1456 &(
Irp->Overlay.AllocationSize)))
1462 #endif // !FFS_READ_ONLY 1504 (
Fcb->SectionObject.DataSectionObject !=
NULL))
1567 Fcb->ReferenceCount++;
1571 Fcb->NonCachedOpenCount++;
1574 Vcb->OpenFileHandleCount++;
1575 Vcb->ReferenceCount++;
1617 #else // !FFS_READ_ONLY 1648 &(
Irp->Overlay.AllocationSize));
1674 #endif // !FFS_READ_ONLY 1685 if (bParentFcbCreated)
1690 if (VcbResourceAcquired)
1714 if (!
Fcb && dinode1)
1719 if (!
Fcb && dinode2)
1769 if (OpenTargetDirectory)
1782 if (
Vcb->OpenHandleCount > 0)
1821 Vcb->ReferenceCount++;
1822 Vcb->OpenHandleCount++;
1857 Irp = IrpContext->Irp;
1908 if (!IrpContext->ExceptionInProgress)
1944 "FFSCreateInode: %S in %S(Inode=%xh)\n",
2032 Fcb->dinode1->di_size = 0;
2037 Fcb->dinode1->di_atime =
2042 if (
Fcb->dinode1->di_size >
Fcb->
Header.AllocationSize.LowPart)
2043 Fcb->dinode1->di_size =
Fcb->
Header.AllocationSize.LowPart;
2055 #endif // !FFS_READ_ONLY #define KeQuerySystemTime(t)
#define STATUS_OBJECT_NAME_COLLISION
__drv_mustHoldCriticalRegion PFFS_FCB FFSv2AllocateFcb(IN PFFS_VCB Vcb, IN PFFS_MCB FFSMcb, IN PFFSv2_INODE dinode2)
#define ExGetCurrentResourceThread()
BOOLEAN NTAPI MmCanFileBeTruncated(IN PSECTION_OBJECT_POINTERS SectionObjectPointer, IN PLARGE_INTEGER NewFileSize)
BOOLEAN NTAPI CcPurgeCacheSection(IN PSECTION_OBJECT_POINTERS SectionObjectPointer, IN OPTIONAL PLARGE_INTEGER FileOffset, IN ULONG Length, IN BOOLEAN UninitializeCacheMaps)
#define STATUS_DELETE_PENDING
_Must_inspect_result_ _In_ WDFDEVICE _In_ ULONG _In_ ACCESS_MASK DesiredAccess
#define FILE_SEQUENTIAL_ONLY
#define STATUS_FILE_IS_A_DIRECTORY
__drv_mustHoldCriticalRegion PFFS_CCB FFSAllocateCcb(VOID)
#define SL_CASE_SENSITIVE
#define STATUS_INSUFFICIENT_RESOURCES
#define FILE_ATTRIBUTE_TEMPORARY
_In_ ULONG _In_ ULONG _In_ ULONG Length
__drv_mustHoldCriticalRegion BOOLEAN FFSv2SaveInode(IN PFFS_IRP_CONTEXT IrpContext, IN PFFS_VCB Vcb, IN ULONG Inode, IN PFFSv2_INODE dinode2)
int memcmp(void *Buffer1, void *Buffer2, ACPI_SIZE Count)
#define __drv_mustHoldCriticalRegion
VOID NTAPI CcFlushCache(IN PSECTION_OBJECT_POINTERS SectionObjectPointer, IN OPTIONAL PLARGE_INTEGER FileOffset, IN ULONG Length, OUT OPTIONAL PIO_STATUS_BLOCK IoStatus)
FSRTL_ADVANCED_FCB_HEADER Header
NTSTATUS FFSv1ReadInode(IN PFFS_IRP_CONTEXT IrpContext, IN PFFS_VCB Vcb, IN PFFSv1_INODE dinode1, IN ULONGLONG offset, IN PVOID Buffer, IN ULONG size, OUT PULONG dwRet)
#define SL_OPEN_PAGING_FILE
#define STATUS_INVALID_PARAMETER
_In_ PIO_STACK_LOCATION _Inout_ PFILE_OBJECT _Inout_ PVCB _Outptr_result_maybenull_ PDCB _In_ PDCB _In_ PDIRENT _In_ ULONG _In_ ULONG _In_ PUNICODE_STRING _In_ PACCESS_MASK DesiredAccess
#define FILE_DIRECTORY_FILE
BOOLEAN FFSv2LoadInode(IN PFFS_VCB Vcb, IN ULONG inode, IN PFFSv2_INODE dinode2)
__drv_mustHoldCriticalRegion NTSTATUS FFSCreateFile(PFFS_IRP_CONTEXT IrpContext, PFFS_VCB Vcb)
__drv_mustHoldCriticalRegion NTSTATUS FFSSupersedeOrOverWriteFile(IN PFFS_IRP_CONTEXT IrpContext, IN PFFS_VCB Vcb, IN PFFS_FCB Fcb, IN ULONG Disposition)
_In_ PIO_STACK_LOCATION _Inout_ PFILE_OBJECT _Inout_ PVCB _Outptr_result_maybenull_ PDCB _In_ PDCB _In_ PDIRENT _In_ ULONG _In_ ULONG _In_ PUNICODE_STRING _In_ PACCESS_MASK _In_ USHORT _In_ ULONG CreateDisposition
#define FILE_NOTIFY_CHANGE_SIZE
#define FILE_NOTIFY_CHANGE_LAST_WRITE
#define FILE_NOTIFY_CHANGE_FILE_NAME
VOID NTAPI IoSetShareAccess(IN ACCESS_MASK DesiredAccess, IN ULONG DesiredShareAccess, IN PFILE_OBJECT FileObject, OUT PSHARE_ACCESS ShareAccess)
#define FO_NO_INTERMEDIATE_BUFFERING
BOOLEAN FFSExpandFile(PFFS_IRP_CONTEXT IrpContext, PFFS_VCB Vcb, PFFS_FCB Fcb, PLARGE_INTEGER AllocationSize)
struct _FFS_FCB * PFFS_FCB
__drv_mustHoldCriticalRegion NTSTATUS FFSCreateVolume(PFFS_IRP_CONTEXT IrpContext, PFFS_VCB Vcb)
#define FILE_NOTIFY_CHANGE_DIR_NAME
NTSTATUS FFSv1LookupFileName(IN PFFS_VCB Vcb, IN PUNICODE_STRING FullFileName, IN PFFS_MCB ParentMcb, OUT PFFS_MCB *FFSMcb, IN OUT PFFSv1_INODE dinode1)
BOOLEAN NTAPI FsRtlDoesNameContainWildCards(IN PUNICODE_STRING Name)
_In_ PIO_STACK_LOCATION _Inout_ PFILE_OBJECT _Inout_ PVCB _Outptr_result_maybenull_ PDCB _In_ PDCB _In_ PDIRENT _In_ ULONG _In_ ULONG _In_ PUNICODE_STRING _In_ PACCESS_MASK _In_ USHORT ShareAccess
_In_ ACCESS_MASK _In_ POBJECT_ATTRIBUTES _Reserved_ ULONG _In_opt_ PUNICODE_STRING _In_ ULONG _Out_opt_ PULONG Disposition
#define FCB_DELETE_PENDING
PDEVICE_OBJECT DeviceObject
#define FILE_WRITE_ATTRIBUTES
__drv_mustHoldCriticalRegion NTSTATUS FFSFlushVolume(IN PFFS_VCB Vcb, BOOLEAN bShutDown)
#define FILE_OPEN_BY_FILE_ID
#define RtlMoveMemory(Destination, Source, Length)
__drv_mustHoldCriticalRegion NTSTATUS FFSCreateInode(PFFS_IRP_CONTEXT IrpContext, PFFS_VCB Vcb, PFFS_FCB ParentFcb, ULONG Type, ULONG FileAttr, PUNICODE_STRING FileName)
#define FCB_DELETE_ON_CLOSE
ULONG FFSInodeTime(IN LARGE_INTEGER SysTime)
BOOLEAN NTAPI ExAcquireResourceExclusiveLite(IN PERESOURCE Resource, IN BOOLEAN Wait)
_In_ PDEVICE_OBJECT DeviceObject
return STATUS_NOT_IMPLEMENTED
_In_ PIO_STACK_LOCATION _Inout_ PFILE_OBJECT _Inout_ PVCB Vcb
#define FILE_NO_INTERMEDIATE_BUFFERING
#define STATUS_NOT_A_DIRECTORY
#define STATUS_SHARING_VIOLATION
__drv_mustHoldCriticalRegion BOOLEAN FFSv1SaveInode(IN PFFS_IRP_CONTEXT IrpContext, IN PFFS_VCB Vcb, IN ULONG Inode, IN PFFSv1_INODE dinode1)
#define FILE_NO_EA_KNOWLEDGE
#define FILE_ACTION_MODIFIED
#define FILE_OVERWRITE_IF
#define STATUS_MEDIA_WRITE_PROTECTED
struct _FFS_VCB * PFFS_VCB
#define FFSSetReadOnly(m)
#define STATUS_USER_MAPPED_FILE
BOOLEAN FFSv1LoadInode(IN PFFS_VCB Vcb, IN ULONG inode, IN PFFSv1_INODE dinode1)
__drv_mustHoldCriticalRegion NTSTATUS FFSFlushFiles(IN PFFS_VCB Vcb, BOOLEAN bShutDown)
#define STATUS_FILE_DELETED
struct _FFS_FCBVCB * PFFS_FCBVCB
#define FILE_ATTRIBUTE_DIRECTORY
BOOLEAN FFSTruncateFile(PFFS_IRP_CONTEXT IrpContext, PFFS_VCB Vcb, PFFS_FCB Fcb, PLARGE_INTEGER AllocationSize)
NTSTATUS FFSNewInode(PFFS_IRP_CONTEXT IrpContext, PFFS_VCB Vcb, ULONG GroupHint, ULONG Type, PULONG Inode)
#define FILE_DELETE_ON_CLOSE
_In_ PWDFDEVICE_INIT _In_ PWDF_REMOVE_LOCK_OPTIONS Options
_Must_inspect_result_ _In_opt_ WDFKEY _In_ PCUNICODE_STRING _In_ ACCESS_MASK _In_ ULONG _Out_opt_ PULONG CreateDisposition
PFFS_MCB FFSSearchMcb(PFFS_VCB Vcb, PFFS_MCB Parent, PUNICODE_STRING FileName)
#define NT_SUCCESS(StatCode)
VOID NTAPI FsRtlDissectName(IN UNICODE_STRING Name, OUT PUNICODE_STRING FirstPart, OUT PUNICODE_STRING RemainingPart)
BOOLEAN NTAPI MmFlushImageSection(IN PSECTION_OBJECT_POINTERS SectionObjectPointer, IN MMFLUSH_TYPE FlushType)
_In_ WDFCOLLECTION _In_ ULONG Index
struct _DEVICE_OBJECT * RealDevice
#define FILE_ATTRIBUTE_READONLY
#define STATUS_OBJECT_PATH_NOT_FOUND
#define STATUS_ACCESS_DENIED
VOID FASTCALL ExReleaseResourceLite(IN PERESOURCE Resource)
#define FO_CACHE_SUPPORTED
#define STATUS_UNSUCCESSFUL
#define VCB_WRITE_PROTECTED
#define ExAllocatePoolWithTag(hernya, size, tag)
#define FILE_DOES_NOT_EXIST
__drv_mustHoldCriticalRegion NTSTATUS FFSCompleteIrpContext(IN PFFS_IRP_CONTEXT IrpContext, IN NTSTATUS Status)
FFS_IDENTIFIER Identifier
#define STATUS_CANNOT_DELETE
#define FILE_ATTRIBUTE_NORMAL
BOOLEAN FFSFreeInode(PFFS_IRP_CONTEXT IrpContext, PFFS_VCB Vcb, ULONG Inode, ULONG Type)
#define VCB_DISMOUNT_PENDING
ULONG RtlCompareUnicodeString(PUNICODE_STRING s1, PUNICODE_STRING s2, BOOLEAN UpCase)
_Must_inspect_result_ _In_ PFLT_INSTANCE _Out_ PBOOLEAN IsDirectory
#define FCB_FILE_MODIFIED
NTSTATUS FFSv1ScanDir(IN PFFS_VCB Vcb, IN PFFS_MCB ParentMcb, IN PUNICODE_STRING FileName, IN OUT PULONG Index, IN PFFSv1_INODE dinode1, IN OUT PFFS_DIR_ENTRY ffs_dir)
#define FILE_NON_DIRECTORY_FILE
_Inout_ PFILE_OBJECT _In_ TYPE_OF_OPEN PFCB _In_opt_ PCCB Ccb
ClearFlag(Dirent->Flags, DIRENT_FLAG_NOT_PERSISTENT)
VOID FFSUnpinRepinnedBcbs(IN PFFS_IRP_CONTEXT IrpContext)
_In_ ULONG _In_ ULONG Offset
IN PFCB IN PFILE_OBJECT FileObject IN ULONG AllocationSize
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)
struct _FileName FileName
#define SL_OPEN_TARGET_DIRECTORY
#define STATUS_OBJECT_NAME_NOT_FOUND
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
__drv_mustHoldCriticalRegion NTSTATUS FFSAddEntry(IN PFFS_IRP_CONTEXT IrpContext, IN PFFS_VCB Vcb, IN PFFS_FCB Dcb, IN ULONG FileType, IN ULONG Inode, IN PUNICODE_STRING FileName)
_In_ PIO_STACK_LOCATION _Inout_ PFILE_OBJECT _Inout_ PVCB _Outptr_result_maybenull_ PDCB _In_ PDCB _In_ PDIRENT _In_ ULONG _In_ ULONG _In_ PUNICODE_STRING _In_ PACCESS_MASK _In_ USHORT _In_ ULONG _In_ BOOLEAN _In_ BOOLEAN DeleteOnClose
__drv_mustHoldCriticalRegion NTSTATUS FFSCreate(IN PFFS_IRP_CONTEXT IrpContext)
#define FILE_NOTIFY_CHANGE_ATTRIBUTES
_In_ PIO_STACK_LOCATION IrpSp
IN PVCB IN ULONG IN OUT PULONG IN BOOLEAN OUT PLARGE_MCB Mcb
#define STATUS_NO_SUCH_FILE
#define STATUS_OBJECT_NAME_INVALID
NTSTATUS FFSv2ScanDir(IN PFFS_VCB Vcb, IN PFFS_MCB ParentMcb, IN PUNICODE_STRING FileName, IN OUT PULONG Index, IN PFFSv2_INODE dinode2, IN OUT PFFS_DIR_ENTRY ffs_dir)
#define VCB_VOLUME_LOCKED
#define FILE_ACTION_ADDED
VOID FFSNotifyReportChange(IN PFFS_IRP_CONTEXT IrpContext, IN PFFS_VCB Vcb, IN PFFS_FCB Fcb, IN ULONG Filter, IN ULONG Action)
NTSTATUS FFSOEMToUnicode(IN OUT PUNICODE_STRING Unicode, IN POEM_STRING Oem)
__drv_mustHoldCriticalRegion PFFS_FCB FFSv1AllocateFcb(IN PFFS_VCB Vcb, IN PFFS_MCB FFSMcb, IN PFFSv1_INODE dinode1)
#define STATUS_VOLUME_DISMOUNTED
VOID FFSAddMcbNode(PFFS_VCB Vcb, PFFS_MCB Parent, PFFS_MCB Child)
#define RtlZeroMemory(Destination, Length)
#define RtlCopyMemory(Destination, Source, Length)
VOID NTAPI ExReleaseResourceForThreadLite(IN PERESOURCE Resource, IN ERESOURCE_THREAD Thread)
VOID NTAPI IoSetHardErrorOrVerifyDevice(IN PIRP Irp, IN PDEVICE_OBJECT DeviceObject)
NTSTATUS FFSv2ReadInode(IN PFFS_IRP_CONTEXT IrpContext, IN PFFS_VCB Vcb, IN PFFSv2_INODE dinode2, IN ULONGLONG offset, IN PVOID Buffer, IN ULONG size, OUT PULONG dwRet)
#define FFSRaiseStatus(IRPCONTEXT, STATUS)
PFFS_MCB FFSAllocateMcb(PFFS_VCB Vcb, PUNICODE_STRING FileName, ULONG FileAttr)
IN PDCB IN POEM_STRING OemName
struct _NAMED_PIPE_CREATE_PARAMETERS * Parameters
NTSTATUS FFSv2LookupFileName(IN PFFS_VCB Vcb, IN PUNICODE_STRING FullFileName, IN PFFS_MCB ParentMcb, OUT PFFS_MCB *FFSMcb, IN OUT PFFSv2_INODE dinode2)
struct direct * PFFS_DIR_ENTRY
HRESULT Create([out]ITransactionReceiver **ppReceiver)
_In_ PIO_STACK_LOCATION _Inout_ PFILE_OBJECT _Inout_ PVCB _Outptr_result_maybenull_ PDCB _In_ PDCB _In_ PDIRENT _In_ ULONG _In_ ULONG _In_ PUNICODE_STRING _In_ PACCESS_MASK _In_ USHORT _In_ ULONG _In_ BOOLEAN NoEaKnowledge
#define RtlOemStringToCountedUnicodeSize(STRING)