From f72b55e4f9c5e9dbcd475d9f635a641cd49acd02 Mon Sep 17 00:00:00 2001 From: short <> Date: Wed, 30 Apr 2003 05:57:35 +0000 Subject: [PATCH] NtSetInformationFile()/FileRenameInformation: Compatibility with ntfs.sys of NT-5.1sp1 --- ntoskrnl/io/file.c | 81 +++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 62 insertions(+), 19 deletions(-) diff --git a/ntoskrnl/io/file.c b/ntoskrnl/io/file.c index e40bb09..5888a62 100644 --- a/ntoskrnl/io/file.c +++ b/ntoskrnl/io/file.c @@ -203,6 +203,10 @@ IoQueryFileInformation(IN PFILE_OBJECT FileObject, #endif /* LIBCAPTIVE */ +#define OBJ_KERNEL_HANDLE 0x00000200 +#define IO_FORCE_ACCESS_CHECK 0x1 +#define IO_NO_PARAMETER_CHECKING 0x100 + NTSTATUS STDCALL NtSetInformationFile(HANDLE FileHandle, PIO_STATUS_BLOCK IoStatusBlock, @@ -218,6 +222,7 @@ NtSetInformationFile(HANDLE FileHandle, PVOID SystemBuffer; IO_STATUS_BLOCK IoSB; FILE_OBJECT *RootDir_FileObject = NULL; + HANDLE RootDir_FileHandle; assert(IoStatusBlock != NULL) assert(FileInformation != NULL) @@ -282,27 +287,62 @@ NtSetInformationFile(HANDLE FileHandle, FileInformationClass; switch (FileInformationClass) { - case FileRenameInformation: - if (!((FILE_RENAME_INFORMATION *)FileInformation)->RootDir) - StackPtr->Parameters.SetFile.FileObject=NULL; - else + case FileRenameInformation: { +FILE_RENAME_INFORMATION *RenameInformation=(FILE_RENAME_INFORMATION *)FileInformation; +OBJECT_ATTRIBUTES file_ObjectAttributes; +UNICODE_STRING file_ObjectAttributes_ObjectName_UnicodeString; +IO_STATUS_BLOCK file_IoStatusBlock; + + /* Create target 'StackPtr->Parameters.SetFile.FileObject' + * by a special way below to open the target directory + * from the given full pathname by 'SL_OPEN_TARGET_DIRECTORY'. + */ + RtlInitUnicodeString(&file_ObjectAttributes_ObjectName_UnicodeString, RenameInformation->FileName); + InitializeObjectAttributes( + &file_ObjectAttributes, /* InitializedAttributes */ + &file_ObjectAttributes_ObjectName_UnicodeString, /* ObjectName */ + OBJ_KERNEL_HANDLE | (0/* FIXME: when to use it? */ ? 0x2000/* FIXME: meaning? */ : 0), /* Attributes */ + RenameInformation->RootDir, /* RootDirectory */ + NULL); /* SecurityDescriptor; ignored */ + Status=IoCreateFile( + &RootDir_FileHandle, /* FileHandle */ + FILE_ADD_FILE | 0x100000/* FIXME: meaning? */, /* DesiredAccess */ + &file_ObjectAttributes, /* ObjectAttributes */ + &file_IoStatusBlock, /* IoStatusBlock */ + NULL, /* AllocationSize; ignored for open */ + 0, /* FileAttributes; ignored for open */ + FILE_SHARE_READ|FILE_SHARE_WRITE, /* ShareAccess; 0 means exclusive */ + FILE_OPEN, /* CreateDisposition */ + FILE_OPEN_FOR_BACKUP_INTENT/* FIXME: why? meaning? */, /* CreateOptions */ + NULL, /* EaBuffer */ + 0, /* EaLength */ + CreateFileTypeNone, /* CreateFileType */ + NULL, /* ExtraCreateParameters */ + IO_NO_PARAMETER_CHECKING|IO_FORCE_ACCESS_CHECK|SL_OPEN_TARGET_DIRECTORY); /* Options */ + if (!NT_SUCCESS(Status)) { - /* Get the file object from the file handle */ - Status = ObReferenceObjectByHandle(((FILE_RENAME_INFORMATION *)FileInformation)->RootDir, - (FILE_ADD_FILE | FILE_ADD_SUBDIRECTORY), - IoFileObjectType, - KernelMode, /* FIXME: or UserMode ? */ - (PVOID *)&RootDir_FileObject, - NULL); - if (!NT_SUCCESS(Status)) - { - return Status; - } - StackPtr->Parameters.SetFile.FileObject=RootDir_FileObject; + return Status; } - StackPtr->Parameters.SetFile.u.d.ReplaceIfExists=((FILE_RENAME_INFORMATION *)FileInformation)->Replace; + + /* Get the file object from the file handle */ + Status = ObReferenceObjectByHandle(RootDir_FileHandle, + (FILE_ADD_FILE | (0/* FIXME: when? */ ? FILE_ADD_SUBDIRECTORY : 0)), + IoFileObjectType, + KernelMode, + (PVOID *)&RootDir_FileObject, + NULL); + if (!NT_SUCCESS(Status)) + { + NtClose(RootDir_FileHandle); /* errors ignored */ + return Status; + } + /* 'StackPtr->FileObject' should be the source file, + * 'StackPtr->Parameters.SetFile.FileObject' should be the target directory. + */ + StackPtr->Parameters.SetFile.FileObject=RootDir_FileObject; + StackPtr->Parameters.SetFile.u.d.ReplaceIfExists=RenameInformation->Replace; StackPtr->Parameters.SetFile.u.d.AdvanceOnly=FALSE; - break; + } break; default:; } @@ -327,7 +367,10 @@ NtSetInformationFile(HANDLE FileHandle, *IoStatusBlock = IoSB; } if (RootDir_FileObject != NULL) - ObDereferenceObject(RootDir_FileObject); + { + NtClose(RootDir_FileHandle); /* errors ignored */ + ObDereferenceObject(RootDir_FileObject); + } ExFreePool(SystemBuffer); return Status; -- 1.8.3.1