#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,
PVOID SystemBuffer;
IO_STATUS_BLOCK IoSB;
FILE_OBJECT *RootDir_FileObject = NULL;
+ HANDLE RootDir_FileHandle;
assert(IoStatusBlock != NULL)
assert(FileInformation != NULL)
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:;
}
*IoStatusBlock = IoSB;
}
if (RootDir_FileObject != NULL)
- ObDereferenceObject(RootDir_FileObject);
+ {
+ NtClose(RootDir_FileHandle); /* errors ignored */
+ ObDereferenceObject(RootDir_FileObject);
+ }
ExFreePool(SystemBuffer);
return Status;