NTSTATUS Status;
PVOID SystemBuffer;
IO_STATUS_BLOCK IoSB;
+ FILE_OBJECT *RootDir_FileObject = NULL;
assert(IoStatusBlock != NULL)
assert(FileInformation != NULL)
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
{
*IoStatusBlock = IoSB;
}
+ if (RootDir_FileObject != NULL)
+ ObDereferenceObject(RootDir_FileObject);
ExFreePool(SystemBuffer);
return Status;