From 8f10a631ba36ee8c6a860b059ad328b993f7847c Mon Sep 17 00:00:00 2001 From: short <> Date: Mon, 3 Feb 2003 14:27:54 +0000 Subject: [PATCH] NtSetInformationFile(): FileRenameInformation: Fixed missing fields - fill in: SetFile.FileObject,SetFile.u.d.ReplaceIfExists,SetFile.u.d.AdvanceOnly --- ntoskrnl/io/file.c | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/ntoskrnl/io/file.c b/ntoskrnl/io/file.c index 8cdf925..e40bb09 100644 --- a/ntoskrnl/io/file.c +++ b/ntoskrnl/io/file.c @@ -217,6 +217,7 @@ NtSetInformationFile(HANDLE FileHandle, NTSTATUS Status; PVOID SystemBuffer; IO_STATUS_BLOCK IoSB; + FILE_OBJECT *RootDir_FileObject = NULL; assert(IoStatusBlock != NULL) assert(FileInformation != NULL) @@ -276,9 +277,34 @@ NtSetInformationFile(HANDLE FileHandle, StackPtr->DeviceObject = DeviceObject; StackPtr->FileObject = FileObject; + StackPtr->Parameters.SetFile.Length = Length; StackPtr->Parameters.SetFile.FileInformationClass = FileInformationClass; - StackPtr->Parameters.SetFile.Length = Length; + switch (FileInformationClass) + { + case FileRenameInformation: + if (!((FILE_RENAME_INFORMATION *)FileInformation)->RootDir) + StackPtr->Parameters.SetFile.FileObject=NULL; + else + { + /* 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; + } + StackPtr->Parameters.SetFile.u.d.ReplaceIfExists=((FILE_RENAME_INFORMATION *)FileInformation)->Replace; + StackPtr->Parameters.SetFile.u.d.AdvanceOnly=FALSE; + break; + default:; + } /* * Pass the IRP to the FSD (and wait for @@ -300,6 +326,8 @@ NtSetInformationFile(HANDLE FileHandle, { *IoStatusBlock = IoSB; } + if (RootDir_FileObject != NULL) + ObDereferenceObject(RootDir_FileObject); ExFreePool(SystemBuffer); return Status; -- 1.8.3.1