54 PWSTR pRelativeFileName,
55 PWSTR *pAbsoluteFilename)
60 DPRINT(
"try related for %S\n", pRelativeFileName);
61 Fcb = pFileObject->FsContext;
67 if (pRelativeFileName[0] ==
L'\\')
69 *pAbsoluteFilename =
NULL;
79 pRelativeFileName[0] ==
L'\\')
95 wcscat (rcName, pRelativeFileName);
96 *pAbsoluteFilename = rcName;
114 DPRINT(
"NtfsMoonWalkID(%p, %I64x, %p)\n", DeviceExt,
Id, OutPath);
117 MftRecord = ExAllocateFromNPagedLookasideList(&DeviceExt->FileRecLookasideList);
118 if (MftRecord ==
NULL)
139 DPRINT1(
"$FILE_NAME attribute not found for %I64x\n",
Id);
144 WritePosition -=
FileName->NameLength;
149 FullPath[WritePosition] =
L'\\';
156 ExFreeToNPagedLookasideList(&DeviceExt->FileRecLookasideList, MftRecord);
184 DPRINT(
"NtfsOpenFileById(%p, %p, %I64x, %p)\n", DeviceExt,
FileObject, MftId, FoundFCB);
192 MftRecord = ExAllocateFromNPagedLookasideList(&DeviceExt->FileRecLookasideList);
193 if (MftRecord ==
NULL)
201 ExFreeToNPagedLookasideList(&DeviceExt->FileRecLookasideList, MftRecord);
207 ExFreeToNPagedLookasideList(&DeviceExt->FileRecLookasideList, MftRecord);
220 ExFreeToNPagedLookasideList(&DeviceExt->FileRecLookasideList, MftRecord);
227 ExFreeToNPagedLookasideList(&DeviceExt->FileRecLookasideList, MftRecord);
253 DPRINT(
"NtfsOpenFile(%p, %p, %S, %s, %p)\n",
257 CaseSensitive ?
"TRUE" :
"FALSE",
264 DPRINT(
"Converting relative filename to absolute filename\n");
269 if (AbsFileName)
FileName = AbsFileName;
281 DPRINT(
"Checking for existing FCB in memory\n");
286 DPRINT(
"No existing FCB found, making a new one if file exists.\n");
309 DPRINT(
"Attaching FCB to fileObject\n");
341 if (
Stack->Parameters.Create.SecurityContext !=
NULL)
363 DeviceExt->OpenHandleCount++;
406 ULONG FirstEntry = 0;
448 wcscpy(FinalBuffer, LastSeparator + 1);
452 if (LastSeparator ==
Path)
503 ULONG RequestedDisposition;
504 ULONG RequestedOptions;
518 RequestedDisposition = ((
Stack->Parameters.Create.Options >> 24) & 0xff);
602 DeviceExt->VolumeFcb->RefCount++;
658 (
PVOID *)&
Irp->Tail.Overlay.AuxiliaryBuffer);
685 ULONG DataAttributeOffset;
691 DPRINT1(
"NTFS write-support is EXPERIMENTAL and is disabled by default!\n");
700 fileRecord = ExAllocateFromNPagedLookasideList(&
Fcb->
Vcb->FileRecLookasideList);
708 goto DoneOverwriting;
713 goto DoneOverwriting;
724 ExFreeToNPagedLookasideList(&
Fcb->
Vcb->FileRecLookasideList, fileRecord);
756 DPRINT1(
"NTFS write-support is EXPERIMENTAL and is disabled by default!\n");
781 DPRINT1(
"ERROR: Couldn't create '%wZ' (Status %lx)\n",
808 Irp->IoStatus.Information = 0;
834 DPRINT(
"Opening file system\n");
897 ULONG MaxIndexRootSize;
900 DPRINT(
"NtfsCreateFileRecord(%p, %p, %s, %s)\n",
903 CaseSensitive ?
"TRUE" :
"FALSE",
904 CanWait ?
"TRUE" :
"FALSE");
910 DPRINT1(
"ERROR: Unable to allocate memory for file record!\n");
930 DPRINT1(
"ERROR: Failed to add the $FILE_NAME attribute for '%wZ'!\n", &
FileObject->FileName);
931 ExFreeToNPagedLookasideList(&DeviceExt->FileRecLookasideList, FileRecord);
945 DPRINT1(
"ERROR: Failed to create empty B-Tree!\n");
946 ExFreeToNPagedLookasideList(&DeviceExt->FileRecLookasideList, FileRecord);
951 MaxIndexRootSize = DeviceExt->NtfsInfo.BytesPerFileRecord
963 DPRINT1(
"ERROR: Unable to create empty index root!\n");
965 ExFreeToNPagedLookasideList(&DeviceExt->FileRecLookasideList, FileRecord);
973 Status =
AddIndexRoot(DeviceExt, FileRecord, NextAttribute, NewIndexRoot, RootLength,
L"$I30", 4);
976 DPRINT1(
"ERROR: Failed to add index root to new file record!\n");
978 ExFreeToNPagedLookasideList(&DeviceExt->FileRecLookasideList, FileRecord);
997 DPRINT(
"New File Reference: 0x%016I64x\n", FileMftIndex);
1008 ExFreeToNPagedLookasideList(&DeviceExt->FileRecLookasideList, FileRecord);
1031 DPRINT(
"NtfsCreateEmptyFileRecord(%p)\n", DeviceExt);
1034 FileRecord = ExAllocateFromNPagedLookasideList(&DeviceExt->FileRecLookasideList);
1037 DPRINT1(
"ERROR: Unable to allocate memory for file record!\n");
1041 RtlZeroMemory(FileRecord, DeviceExt->NtfsInfo.BytesPerFileRecord);
1049 FileRecord->
BytesAllocated = DeviceExt->NtfsInfo.BytesPerFileRecord;
1106 DPRINT(
"NtfsCreateFileRecord(%p, %p, %s, %s)\n",
1109 CaseSensitive ?
"TRUE" :
"FALSE",
1110 CanWait ?
"TRUE" :
"FALSE");
1116 DPRINT1(
"ERROR: Unable to allocate memory for file record!\n");
1133 DPRINT1(
"ERROR: Failed to add the $FILE_NAME attribute for '%wZ'!\n", &
FileObject->FileName);
1134 ExFreeToNPagedLookasideList(&DeviceExt->FileRecLookasideList, FileRecord);
1145 AddData(FileRecord, NextAttribute);
1162 DPRINT(
"New File Reference: 0x%016I64x\n", FileMftIndex);
1172 ExFreeToNPagedLookasideList(&DeviceExt->FileRecLookasideList, FileRecord);
static PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(PIRP Irp)
#define ALIGN_UP_BY(size, align)
PRTL_UNICODE_STRING_BUFFER Path
#define FILE_DIRECTORY_FILE
#define FILE_NON_DIRECTORY_FILE
struct NTFS_ATTR_RECORD * PNTFS_ATTR_RECORD
static BOOLEAN NtfsFindMftRecord(_In_ PNTFS_VOLUME_INFO Volume, _In_ ULONGLONG MFTIndex, _In_ PCSTR FileName, _Out_ PULONGLONG OutMFTIndex, _Out_ PULONG FileAttributes)
VOID DestroyBTree(PB_TREE Tree)
NTSTATUS CreateEmptyBTree(PB_TREE *NewTree)
NTSTATUS CreateIndexRootFromBTree(PDEVICE_EXTENSION DeviceExt, PB_TREE Tree, ULONG MaxIndexSize, PINDEX_ROOT_ATTRIBUTE *IndexRoot, ULONG *Length)
#define STATUS_NOT_IMPLEMENTED
#define NT_SUCCESS(StatCode)
_ACRTIMP size_t __cdecl wcslen(const wchar_t *)
_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
NTSTATUS AddIndexRoot(PNTFS_VCB Vcb, PFILE_RECORD_HEADER FileRecord, PNTFS_ATTR_RECORD AttributeAddress, PINDEX_ROOT_ATTRIBUTE NewIndexRoot, ULONG RootLength, PCWSTR Name, USHORT NameLength)
NTSTATUS AddFileName(PFILE_RECORD_HEADER FileRecord, PNTFS_ATTR_RECORD AttributeAddress, PDEVICE_EXTENSION DeviceExt, PFILE_OBJECT FileObject, BOOLEAN CaseSensitive, PULONGLONG ParentMftIndex)
NTSTATUS AddData(PFILE_RECORD_HEADER FileRecord, PNTFS_ATTR_RECORD AttributeAddress)
PFILENAME_ATTRIBUTE GetBestFileNameFromRecord(PDEVICE_EXTENSION Vcb, PFILE_RECORD_HEADER FileRecord)
NTSTATUS AddStandardInformation(PFILE_RECORD_HEADER FileRecord, PNTFS_ATTR_RECORD AttributeAddress)
NTSTATUS NtfsCloseFile(PDEVICE_EXTENSION DeviceExt, PFILE_OBJECT FileObject)
static NTSTATUS NtfsCreateFile(PDEVICE_OBJECT DeviceObject, PNTFS_IRP_CONTEXT IrpContext)
static NTSTATUS NtfsOpenFileById(PDEVICE_EXTENSION DeviceExt, PFILE_OBJECT FileObject, ULONGLONG MftId, PNTFS_FCB *FoundFCB)
static NTSTATUS NtfsOpenFile(PDEVICE_EXTENSION DeviceExt, PFILE_OBJECT FileObject, PWSTR FileName, BOOLEAN CaseSensitive, PNTFS_FCB *FoundFCB)
static NTSTATUS NtfsMoonWalkID(PDEVICE_EXTENSION DeviceExt, ULONGLONG Id, PUNICODE_STRING OutPath)
static NTSTATUS NtfsMakeAbsoluteFilename(PFILE_OBJECT pFileObject, PWSTR pRelativeFileName, PWSTR *pAbsoluteFilename)
NTSTATUS NtfsCreateFileRecord(PDEVICE_EXTENSION DeviceExt, PFILE_OBJECT FileObject, BOOLEAN CaseSensitive, BOOLEAN CanWait)
NTSTATUS NtfsCreateDirectory(PDEVICE_EXTENSION DeviceExt, PFILE_OBJECT FileObject, BOOLEAN CaseSensitive, BOOLEAN CanWait)
static NTSTATUS NtfsOpenTargetDirectory(_In_ PDEVICE_EXTENSION DeviceExt, _In_ PFILE_OBJECT FileObject, _In_ BOOLEAN CaseSensitive, _Out_ PULONG_PTR Information)
NTSTATUS NtfsCreate(PNTFS_IRP_CONTEXT IrpContext)
static PCWSTR MftIdToName[]
static NTSTATUS NtfsGrantShareAccess(_In_ PDEVICE_EXTENSION DeviceExt, _In_ PNTFS_FCB Fcb, _In_ PFILE_OBJECT FileObject, _In_ PIO_STACK_LOCATION Stack)
PFILE_RECORD_HEADER NtfsCreateEmptyFileRecord(PDEVICE_EXTENSION DeviceExt)
PNTFS_GLOBAL_DATA NtfsGlobalData
FORCEINLINE NTSTATUS NtfsMarkIrpContextForQueue(PNTFS_IRP_CONTEXT IrpContext)
struct FILENAME_ATTRIBUTE * PFILENAME_ATTRIBUTE
#define NTFS_FILE_FIRST_USER_FILE
#define IRPCONTEXT_CANWAIT
#define ATTR_RECORD_ALIGNMENT
#define ExAllocatePoolWithTag(hernya, size, tag)
#define ExAcquireResourceExclusiveLite(res, wait)
#define VCB_VOLUME_LOCKED
#define BooleanFlagOn(F, SF)
IN PVCB IN VBO IN ULONG OUT PBCB OUT PVOID IN BOOLEAN IN BOOLEAN Zero
struct _FileName FileName
#define FILE_OPEN_BY_FILE_ID
#define FILE_OVERWRITE_IF
#define FILE_OPEN_REPARSE_POINT
NTSTATUS ReadFileRecord(PDEVICE_EXTENSION Vcb, ULONGLONG index, PFILE_RECORD_HEADER file)
VOID ReleaseAttributeContext(PNTFS_ATTR_CONTEXT Context)
NTSTATUS FindAttribute(PDEVICE_EXTENSION Vcb, PFILE_RECORD_HEADER MftRecord, ULONG Type, PCWSTR Name, ULONG NameLength, PNTFS_ATTR_CONTEXT *AttrCtx, PULONG Offset)
NTSTATUS NtfsAddFilenameToDirectory(PDEVICE_EXTENSION DeviceExt, ULONGLONG DirectoryMftIndex, ULONGLONG FileReferenceNumber, PFILENAME_ATTRIBUTE FilenameAttribute, BOOLEAN CaseSensitive)
NTSTATUS AddNewMftEntry(PFILE_RECORD_HEADER FileRecord, PDEVICE_EXTENSION DeviceExt, PULONGLONG DestinationIndex, BOOLEAN CanWait)
VOID NtfsDumpFileRecord(PDEVICE_EXTENSION Vcb, PFILE_RECORD_HEADER FileRecord)
NTSTATUS SetAttributeDataLength(PFILE_OBJECT FileObject, PNTFS_FCB Fcb, PNTFS_ATTR_CONTEXT AttrContext, ULONG AttrOffset, PFILE_RECORD_HEADER FileRecord, PLARGE_INTEGER DataSize)
#define ExFreePoolWithTag(_P, _T)
#define FILE_DOES_NOT_EXIST
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
#define FILE_VALID_OPTION_FLAGS
__GNU_EXTENSION typedef unsigned __int64 * PULONGLONG
_In_ ULONG _In_ ULONG _In_ ULONG Length
BOOLEAN NtfsFCBIsDirectory(PNTFS_FCB Fcb)
NTSTATUS NtfsReadFCBAttribute(PNTFS_VCB Vcb, PNTFS_FCB pFCB, ULONG Type, PCWSTR Name, ULONG NameLength, PVOID *Data)
PNTFS_FCB NtfsGrabFCBFromTable(PNTFS_VCB Vcb, PCWSTR FileName)
BOOLEAN NtfsFCBIsRoot(PNTFS_FCB Fcb)
BOOLEAN NtfsFCBIsReparsePoint(PNTFS_FCB Fcb)
NTSTATUS NtfsMakeFCBFromDirEntry(PNTFS_VCB Vcb, PNTFS_FCB DirectoryFCB, PUNICODE_STRING Name, PCWSTR Stream, PFILE_RECORD_HEADER Record, ULONGLONG MFTIndex, PNTFS_FCB *fileFCB)
NTSTATUS NtfsAttachFCBToFileObject(PNTFS_VCB Vcb, PNTFS_FCB Fcb, PFILE_OBJECT FileObject)
NTSTATUS NtfsGetFCBForFile(PNTFS_VCB Vcb, PNTFS_FCB *pParentFCB, PNTFS_FCB *pFCB, PCWSTR pFileName, BOOLEAN CaseSensitive)
VOID NtfsReleaseFCB(PNTFS_VCB Vcb, PNTFS_FCB Fcb)
VOID FASTCALL ExReleaseResourceLite(IN PERESOURCE Resource)
VOID NTAPI IoSetShareAccess(IN ACCESS_MASK DesiredAccess, IN ULONG DesiredShareAccess, IN PFILE_OBJECT FileObject, OUT PSHARE_ACCESS ShareAccess)
NTSTATUS NTAPI IoCheckShareAccess(IN ACCESS_MASK DesiredAccess, IN ULONG DesiredShareAccess, IN PFILE_OBJECT FileObject, IN PSHARE_ACCESS ShareAccess, IN BOOLEAN Update)
#define STATUS_NAME_TOO_LONG
struct _REPARSE_DATA_BUFFER * PREPARSE_DATA_BUFFER
struct NTFS_ATTR_RECORD::@170::@172 Resident
BOOLEAN EnableWriteSupport
PDEVICE_OBJECT DeviceObject
PDEVICE_OBJECT DeviceObject
union _IO_STACK_LOCATION::@1814 Parameters
struct _IO_STACK_LOCATION::@5020::@5021 Create
#define FIELD_OFFSET(t, f)
#define RtlCopyMemory(Destination, Source, Length)
#define RtlZeroMemory(Destination, Length)
#define RtlMoveMemory(Destination, Source, Length)
#define STATUS_FILE_IS_A_DIRECTORY
#define STATUS_NOT_A_DIRECTORY
#define STATUS_ACCESS_DENIED
#define STATUS_OBJECT_PATH_NOT_FOUND
#define STATUS_INVALID_PARAMETER
#define STATUS_OBJECT_NAME_COLLISION
#define STATUS_OBJECT_NAME_INVALID
#define STATUS_INSUFFICIENT_RESOURCES
#define STATUS_OBJECT_NAME_NOT_FOUND
_In_ PDEVICE_OBJECT DeviceObject
_Must_inspect_result_ _In_ WDFDEVICE _In_ ULONG _In_ ACCESS_MASK DesiredAccess
_In_ WDFREQUEST _In_ WDFFILEOBJECT FileObject
_In_ WDFREQUEST _In_ PIO_STACK_LOCATION Stack
_In_ WDFREQUEST _In_ NTSTATUS _In_ ULONG_PTR Information
#define IO_REPARSE_TAG_MOUNT_POINT
#define SL_OPEN_TARGET_DIRECTORY
#define SL_CASE_SENSITIVE