22 #pragma alloc_text(PAGE, RfsdQueryInformation) 23 #pragma alloc_text(PAGE, RfsdSetInformation) 25 #pragma alloc_text(PAGE, RfsdExpandFile) 26 #pragma alloc_text(PAGE, RfsdTruncateFile) 27 #pragma alloc_text(PAGE, RfsdSetDispositionInfo) 28 #pragma alloc_text(PAGE, RfsdSetRenameInfo) 29 #pragma alloc_text(PAGE, RfsdDeleteFile) 30 #endif // !RFSD_READ_ONLY 97 IrpContext->IsSynchronous
104 FcbResourceAcquired =
TRUE;
114 Irp = IrpContext->Irp;
119 IoStackLocation->
Parameters.QueryFile.FileInformationClass;
123 Buffer =
Irp->AssociatedIrp.SystemBuffer;
161 #if (_WIN32_WINNT >= 0x0500) 181 #endif // (_WIN32_WINNT >= 0x0500) 427 Irp->IoStatus.Information =
439 if (FcbResourceAcquired) {
445 if (!IrpContext->ExceptionInProgress) {
539 Irp = IrpContext->Irp;
544 IoStackLocation->
Parameters.SetFile.FileInformationClass;
548 Buffer =
Irp->AssociatedIrp.SystemBuffer;
557 #pragma prefast( suppress: 28137, "by design" ) 561 IrpContext->IsSynchronous )) {
567 VcbResourceAcquired =
TRUE;
573 #pragma prefast( suppress: 28137, "by design" ) 577 IrpContext->IsSynchronous )) {
582 FcbMainResourceAcquired =
TRUE;
600 #pragma prefast( suppress: 28137, "by design" ) 604 IrpContext->IsSynchronous )) {
609 FcbPagingIoResourceAcquired =
TRUE;
763 if (IoStackLocation->
Parameters.SetFile.AdvanceOnly) {
768 if ((
FileObject->SectionObjectPointer->DataSectionObject !=
NULL) &&
781 CacheInitialized =
TRUE;
882 #endif // !RFSD_READ_ONLY 921 if (FcbPagingIoResourceAcquired) {
937 if (FcbMainResourceAcquired) {
943 if (VcbResourceAcquired) {
949 if (!IrpContext->ExceptionInProgress) {
1025 RfsdPrint((
DBG_INFO,
"RfsdSetDispositionInformation: MmFlushImageSection on %s.\n",
1026 Fcb->AnsiFileName.Buffer));
1029 MmFlushForDelete )) {
1097 if (
Fcb->RfsdMcb->Inode == RFSD_ROOT_INO) {
1111 if (TargetObject ==
NULL) {
1133 TargetMcb =
Fcb->RfsdMcb->Parent;
1162 if (TargetMcb->Inode ==
Fcb->RfsdMcb->Parent->Inode) {
1179 if ((TargetMcb->Inode !=
Fcb->RfsdMcb->Parent->Inode) &&
1180 (
Fcb->RfsdMcb->Parent->RfsdFcb ==
NULL) ) {
1200 if ( (!ReplaceIfExists) ||
1207 if (ReplaceIfExists) {
1216 Fcb->RfsdMcb->Parent->RfsdFcb,
1218 Fcb->RfsdMcb->Inode );
1229 Fcb->RfsdMcb->Inode,
1237 Fcb->RfsdMcb->Parent->RfsdFcb,
1239 Fcb->RfsdMcb->Inode,
1258 Fcb->RfsdMcb->Parent->Inode,
1259 Fcb->RfsdMcb->Parent->RfsdFcb->Inode)) {
1269 Fcb->RfsdMcb->Parent->Inode,
1281 Fcb->RfsdMcb->Parent->RfsdFcb,
1283 Fcb->RfsdMcb->Inode );
1292 Fcb->RfsdMcb->Inode,
1300 Fcb->RfsdMcb->Parent->RfsdFcb,
1302 Fcb->RfsdMcb->Inode,
1340 if (
Fcb->AnsiFileName.MaximumLength <
FileName.Length) {
1343 Fcb->AnsiFileName.Buffer =
1346 if (!
Fcb->AnsiFileName.Buffer) {
1352 Fcb->AnsiFileName.Length + 1);
1353 Fcb->AnsiFileName.MaximumLength =
1354 Fcb->AnsiFileName.Length + 1;
1447 Vcb->SuperBlock->s_free_blocks_count));
1450 if (
Fcb->Inode->i_links_count <= 2) {
1455 if (
Fcb->Inode->i_links_count <= 1) {
1466 if (
Fcb->RfsdMcb->Parent->RfsdFcb) {
1470 Fcb->RfsdMcb->Parent->RfsdFcb,
1472 RFSD_FT_DIR : RFSD_FT_REG_FILE),
1473 Fcb->RfsdMcb->Inode);
1481 RFSD_FT_DIR : RFSD_FT_REG_FILE),
1482 Fcb->RfsdMcb->Inode);
1502 Fcb->Inode->i_size =
Fcb->
Header.AllocationSize.QuadPart;
1505 Fcb->Inode->i_links_count = 0;
1523 RfsdPrint((
DBG_INFO,
"RfsdDeleteFile: Succeed... RFSDSB->S_FREE_BLOCKS = %xh .\n",
1524 Vcb->SuperBlock->s_free_blocks_count));
1529 #endif // !RFSD_READ_ONLY #define KeQuerySystemTime(t)
struct _RFSD_CCB * PRFSD_CCB
#define STATUS_OBJECT_NAME_COLLISION
#define ExGetCurrentResourceThread()
BOOLEAN NTAPI MmCanFileBeTruncated(IN PSECTION_OBJECT_POINTERS SectionObjectPointer, IN PLARGE_INTEGER NewFileSize)
struct _FILE_INTERNAL_INFORMATION * PFILE_INTERNAL_INFORMATION
struct _FILE_BASIC_INFORMATION * PFILE_BASIC_INFORMATION
NTSTATUS RfsdUnicodeToOEM(IN OUT POEM_STRING Oem, IN PUNICODE_STRING Unicode)
NTSTATUS RfsdAddEntry(IN PRFSD_IRP_CONTEXT IrpContext, IN PRFSD_VCB Vcb, IN PRFSD_FCB Dcb, IN ULONG FileType, IN ULONG Inode, IN PUNICODE_STRING FileName)
struct _FILE_INTERNAL_INFORMATION FILE_INTERNAL_INFORMATION
NTSTATUS RfsdCompleteIrpContext(IN PRFSD_IRP_CONTEXT IrpContext, IN NTSTATUS Status)
#define STATUS_INSUFFICIENT_RESOURCES
#define FILE_ATTRIBUTE_TEMPORARY
_In_ ULONG _In_ ULONG _In_ ULONG Length
#define STATUS_INFO_LENGTH_MISMATCH
#define FILE_ACTION_RENAMED_OLD_NAME
#define __drv_mustHoldCriticalRegion
FSRTL_ADVANCED_FCB_HEADER Header
VOID NTAPI FsRtlNotifyFullChangeDirectory(IN PNOTIFY_SYNC NotifySync, IN PLIST_ENTRY NotifyList, IN PVOID FsContext, IN PSTRING FullDirectoryName, IN BOOLEAN WatchTree, IN BOOLEAN IgnoreBuffer, IN ULONG CompletionFilter, IN PIRP NotifyIrp, IN PCHECK_FOR_TRAVERSE_ACCESS TraverseCallback OPTIONAL, IN PSECURITY_SUBJECT_CONTEXT SubjectContext OPTIONAL)
#define STATUS_DIRECTORY_NOT_EMPTY
NTSTATUS RfsdSetParentEntry(IN PRFSD_IRP_CONTEXT IrpContext, IN PRFSD_VCB Vcb, IN PRFSD_FCB Dcb, IN ULONG OldParent, IN ULONG NewParent)
IN BOOLEAN OUT PSTR Buffer
#define CEILING_ALIGNED(T, A, B)
struct _FILE_DISPOSITION_INFORMATION * PFILE_DISPOSITION_INFORMATION
#define STATUS_INVALID_PARAMETER
VOID RfsdNotifyReportChange(IN PRFSD_IRP_CONTEXT IrpContext, IN PRFSD_VCB Vcb, IN PRFSD_FCB Fcb, IN ULONG Filter, IN ULONG Action)
NTSTATUS RfsdLookupFileName(IN PRFSD_VCB Vcb, IN PUNICODE_STRING FullFileName, IN PRFSD_MCB ParentMcb, OUT PRFSD_MCB *RfsdMcb, IN OUT PRFSD_INODE Inode)
__drv_mustHoldCriticalRegion NTSTATUS RfsdSetInformation(IN PRFSD_IRP_CONTEXT IrpContext)
#define STATUS_INVALID_DEVICE_REQUEST
#define RFSD_IS_ROOT_KEY(x)
BOOLEAN RfsdDeleteMcbNode(PRFSD_VCB Vcb, PRFSD_MCB McbTree, PRFSD_MCB RfsdMcb)
#define FILE_NOTIFY_CHANGE_SIZE
#define FILE_NOTIFY_CHANGE_LAST_WRITE
#define FILE_NOTIFY_CHANGE_FILE_NAME
static OUT PIO_STATUS_BLOCK OUT PVOID IN ULONG IN FILE_INFORMATION_CLASS FileInformationClass
NTSTATUS RfsdQueueRequest(IN PRFSD_IRP_CONTEXT IrpContext)
BOOLEAN RfsdZeroHoles(IN PRFSD_IRP_CONTEXT IrpContext, IN PRFSD_VCB Vcb, IN PFILE_OBJECT FileObject, IN LONGLONG Offset, IN LONGLONG Count)
#define FO_NO_INTERMEDIATE_BUFFERING
NTSTATUS RfsdDeleteFile(PRFSD_IRP_CONTEXT IrpContext, PRFSD_VCB Vcb, PRFSD_FCB Fcb)
struct _FILE_POSITION_INFORMATION FILE_POSITION_INFORMATION
NTSTATUS RfsdExpandInode(PRFSD_IRP_CONTEXT IrpContext, PRFSD_VCB Vcb, PRFSD_FCB Fcb, ULONG *dwRet)
#define FILE_NOTIFY_CHANGE_DIR_NAME
BOOLEAN NTAPI FsRtlDoesNameContainWildCards(IN PUNICODE_STRING Name)
#define FCB_DELETE_PENDING
struct _FILE_NETWORK_OPEN_INFORMATION FILE_NETWORK_OPEN_INFORMATION
PDEVICE_OBJECT DeviceObject
BOOLEAN NTAPI ExAcquireResourceExclusiveLite(IN PERESOURCE Resource, IN BOOLEAN Wait)
LARGE_INTEGER RfsdSysTime(IN ULONG i_time)
_In_ PDEVICE_OBJECT DeviceObject
struct _RFSD_FCB * PRFSD_FCB
return STATUS_NOT_IMPLEMENTED
NTFSIDENTIFIER Identifier
struct _FILE_ATTRIBUTE_TAG_INFORMATION * PFILE_ATTRIBUTE_TAG_INFORMATION
struct _FILE_NAME_INFORMATION * PFILE_NAME_INFORMATION
struct _FILE_ALL_INFORMATION FILE_ALL_INFORMATION
#define RfsdSetReadOnly(m)
NTSTATUS RfsdSetDispositionInfo(PRFSD_IRP_CONTEXT IrpContext, PRFSD_VCB Vcb, PRFSD_FCB Fcb, BOOLEAN bDelete)
#define FILE_ACTION_MODIFIED
__drv_mustHoldCriticalRegion NTSTATUS RfsdQueryInformation(IN PRFSD_IRP_CONTEXT IrpContext)
struct _FILE_ALLOCATION_INFORMATION * PFILE_ALLOCATION_INFORMATION
NTSTATUS RfsdTruncateInode(IN PRFSD_IRP_CONTEXT IrpContext, IN PRFSD_VCB Vcb, IN PRFSD_FCB Fcb)
#define FILE_ACTION_REMOVED
BOOLEAN RfsdIsDirectoryEmpty(IN PRFSD_VCB Vcb, IN PRFSD_FCB Fcb)
#define STATUS_MEDIA_WRITE_PROTECTED
#define STATUS_USER_MAPPED_FILE
#define STATUS_FILE_DELETED
_In_ WDFREQUEST _In_ WDFFILEOBJECT FileObject
#define FILE_NOTIFY_CHANGE_CREATION
struct _FILE_END_OF_FILE_INFORMATION * PFILE_END_OF_FILE_INFORMATION
#define FILE_ATTRIBUTE_DIRECTORY
struct _RFSD_VCB * PRFSD_VCB
enum _FILE_INFORMATION_CLASS FILE_INFORMATION_CLASS
BOOLEAN NTAPI FsRtlAreNamesEqual(IN PCUNICODE_STRING Name1, IN PCUNICODE_STRING Name2, IN BOOLEAN IgnoreCase, IN PCWCH UpcaseTable OPTIONAL)
struct _FILE_RENAME_INFORMATION * PFILE_RENAME_INFORMATION
#define NT_SUCCESS(StatCode)
VOID NTAPI CcInitializeCacheMap(IN PFILE_OBJECT FileObject, IN PCC_FILE_SIZES FileSizes, IN BOOLEAN PinAccess, IN PCACHE_MANAGER_CALLBACKS Callbacks, IN PVOID LazyWriteContext)
BOOLEAN NTAPI MmFlushImageSection(IN PSECTION_OBJECT_POINTERS SectionObjectPointer, IN MMFLUSH_TYPE FlushType)
#define FILE_ATTRIBUTE_READONLY
BOOLEAN RfsdSaveInode(IN PRFSD_IRP_CONTEXT IrpContext, IN PRFSD_VCB Vcb, IN ULONG inode, IN PRFSD_INODE Inode)
ULONG RfsdUnicodeToOEMSize(IN PUNICODE_STRING Unicode)
struct _FILE_EA_INFORMATION FILE_EA_INFORMATION
struct _FILE_ATTRIBUTE_TAG_INFORMATION FILE_ATTRIBUTE_TAG_INFORMATION
ULONG RfsdInodeTime(IN LARGE_INTEGER SysTime)
#define STATUS_UNSUCCESSFUL
CACHE_MANAGER_CALLBACKS CacheManagerNoOpCallbacks
#define ExAllocatePoolWithTag(hernya, size, tag)
PRFSD_FCB RfsdCreateFcbFromMcb(PRFSD_VCB Vcb, PRFSD_MCB Mcb)
#define STATUS_CANNOT_DELETE
#define STATUS_INVALID_INFO_CLASS
_Must_inspect_result_ _In_ PFLT_INSTANCE _Out_ PBOOLEAN IsDirectory
#define FILE_STANDARD_INFORMATION
#define FILE_ACTION_RENAMED_NEW_NAME
struct _FILE_EA_INFORMATION * PFILE_EA_INFORMATION
_Must_inspect_result_ _Out_ PLARGE_INTEGER FileSize
_Inout_ PFILE_OBJECT _In_ TYPE_OF_OPEN PFCB _In_opt_ PCCB Ccb
struct _FILE_STANDARD_INFORMATION * PFILE_STANDARD_INFORMATION
NTSTATUS RfsdExpandFile(PRFSD_IRP_CONTEXT IrpContext, PRFSD_VCB Vcb, PRFSD_FCB Fcb, PLARGE_INTEGER AllocationSize)
ClearFlag(Dirent->Flags, DIRENT_FLAG_NOT_PERSISTENT)
IN PFCB IN PFILE_OBJECT FileObject IN ULONG AllocationSize
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(_In_ PIRP Irp)
struct _FileName FileName
#define STATUS_BUFFER_OVERFLOW
#define FO_CLEANUP_COMPLETE
#define FO_TEMPORARY_FILE
#define FILE_NOTIFY_CHANGE_ATTRIBUTES
_In_ PIO_STACK_LOCATION IrpSp
VOID NTAPI CcSetFileSizes(IN PFILE_OBJECT FileObject, IN PCC_FILE_SIZES FileSizes)
IN PVCB IN ULONG IN OUT PULONG IN BOOLEAN OUT PLARGE_MCB Mcb
NTSTATUS RfsdRemoveEntry(IN PRFSD_IRP_CONTEXT IrpContext, IN PRFSD_VCB Vcb, IN PRFSD_FCB Dcb, IN ULONG FileType, IN ULONG Inode)
#define STATUS_OBJECT_NAME_INVALID
struct _FILE_NETWORK_OPEN_INFORMATION * PFILE_NETWORK_OPEN_INFORMATION
struct _FILE_NAME_INFORMATION FILE_NAME_INFORMATION
BOOLEAN NTAPI ExAcquireResourceSharedLite(IN PERESOURCE Resource, IN BOOLEAN Wait)
#define FILE_ACTION_ADDED
#define FileStandardInformation
NTSTATUS RfsdTruncateFile(PRFSD_IRP_CONTEXT IrpContext, PRFSD_VCB Vcb, PRFSD_FCB Fcb, PLARGE_INTEGER AllocationSize)
_In_ PUNICODE_STRING NewName
struct _FILE_POSITION_INFORMATION * PFILE_POSITION_INFORMATION
struct _FILE_ALL_INFORMATION * PFILE_ALL_INFORMATION
VOID RfsdAddMcbNode(PRFSD_VCB Vcb, PRFSD_MCB Parent, PRFSD_MCB Child)
ERESOURCE PagingIoResource
#define RtlZeroMemory(Destination, Length)
#define RtlCopyMemory(Destination, Source, Length)
VOID NTAPI ExReleaseResourceForThreadLite(IN PERESOURCE Resource, IN ERESOURCE_THREAD Thread)
struct _NAMED_PIPE_CREATE_PARAMETERS * Parameters
NTSTATUS RfsdSetRenameInfo(PRFSD_IRP_CONTEXT IrpContext, PRFSD_VCB Vcb, PRFSD_FCB Fcb)
#define RfsdSetWritable(m)
#define FILE_NOTIFY_CHANGE_LAST_ACCESS
_In_ PIO_STACK_LOCATION _Inout_ PFILE_OBJECT _Inout_ PVCB _Outptr_result_maybenull_ PDCB * Dcb
_In_opt_ HANDLE _In_opt_ PIO_APC_ROUTINE _In_opt_ PVOID _Out_ PIO_STATUS_BLOCK _In_ ULONG NotifyFilter
BOOLEAN RfsdFreeInode(PRFSD_IRP_CONTEXT IrpContext, PRFSD_VCB Vcb, ULONG Inode, ULONG Type)
#define FILE_BASIC_INFORMATION