- Remove the permanent flag from an object if ObInserObject failed (in
IoCreateFile).
- Bypass the driver for FilePositionInformation and
FileAlignmentInformation in NtQueryInformationFile and
NtSetInformationFile.
Modified: trunk/reactos/ntoskrnl/io/file.c
_____
Modified: trunk/reactos/ntoskrnl/io/file.c
--- trunk/reactos/ntoskrnl/io/file.c 2005-07-26 19:21:27 UTC (rev
16754)
+++ trunk/reactos/ntoskrnl/io/file.c 2005-07-26 19:31:41 UTC (rev
16755)
@@ -845,6 +845,7 @@
DPRINT1("FIXME: IO_CHECK_CREATE_PARAMETERS not yet supported!\n");
}
+ /* First try to open an existing named object */
Status = ObOpenObjectByName(ObjectAttributes,
NULL,
NULL,
@@ -910,6 +911,7 @@
if (!NT_SUCCESS(Status))
{
DPRINT("ObInsertObject() failed! (Status %lx)\n", Status);
+ ObMakeTemporaryObject(FileObject);
ObDereferenceObject (FileObject);
return Status;
}
@@ -2429,11 +2431,6 @@
Failed = TRUE;
break;
- case FileAlignmentInformation:
- if (!(FileObject->Flags & FO_NO_INTERMEDIATE_BUFFERING))
- Failed = TRUE;
- break;
-
default:
break;
}
@@ -2445,6 +2442,30 @@
return STATUS_ACCESS_DENIED;
}
+ if (FileInformationClass == FilePositionInformation)
+ {
+ if (Length < sizeof(FILE_POSITION_INFORMATION))
+ {
+ Status = STATUS_BUFFER_OVERFLOW;
+ }
+ else
+ {
+ _SEH_TRY
+ {
+
((PFILE_POSITION_INFORMATION)FileInformation)->CurrentByteOffset =
FileObject->CurrentByteOffset;
+ IoStatusBlock->Information =
sizeof(FILE_POSITION_INFORMATION);
+ Status = IoStatusBlock->Status = STATUS_SUCCESS;
+ }
+ _SEH_HANDLE
+ {
+ Status = _SEH_GetExceptionCode();
+ }
+ _SEH_END;
+ }
+ ObDereferenceObject(FileObject);
+ return Status;
+ }
+
DPRINT("FileObject 0x%p\n", FileObject);
/* Check if this is a direct open or not */
@@ -2457,6 +2478,30 @@
DeviceObject = IoGetRelatedDeviceObject(FileObject);
}
+ if (FileInformationClass == FileAlignmentInformation)
+ {
+ if (Length < sizeof(FILE_ALIGNMENT_INFORMATION))
+ {
+ Status = STATUS_BUFFER_OVERFLOW;
+ }
+ else
+ {
+ _SEH_TRY
+ {
+
((PFILE_ALIGNMENT_INFORMATION)FileInformation)->AlignmentRequirement =
DeviceObject->AlignmentRequirement;
+ IoStatusBlock->Information =
sizeof(FILE_ALIGNMENT_INFORMATION);
+ Status = IoStatusBlock->Status = STATUS_SUCCESS;
+ }
+ _SEH_HANDLE
+ {
+ Status = _SEH_GetExceptionCode();
+ }
+ _SEH_END;
+ }
+ ObDereferenceObject(FileObject);
+ return Status;
+ }
+
/* Check if we should use Sync IO or not */
if (FileObject->Flags & FO_SYNCHRONOUS_IO)
{
@@ -2895,6 +2940,30 @@
DPRINT("FileObject 0x%p\n", FileObject);
+ if (FileInformationClass == FilePositionInformation)
+ {
+ if (Length < sizeof(FILE_POSITION_INFORMATION))
+ {
+ Status = STATUS_BUFFER_OVERFLOW;
+ }
+ else
+ {
+ _SEH_TRY
+ {
+ FileObject->CurrentByteOffset =
((PFILE_POSITION_INFORMATION)FileInformation)->CurrentByteOffset;
+ IoStatusBlock->Information = 0;
+ Status = IoStatusBlock->Status = STATUS_SUCCESS;
+ }
+ _SEH_HANDLE
+ {
+ Status = _SEH_GetExceptionCode();
+ }
+ _SEH_END;
+ }
+ ObDereferenceObject(FileObject);
+ return Status;
+ }
+
/* FIXME: Later, we can implement a lot of stuff here and avoid a
driver call */
/* Handle IO Completion Port quickly */
if (FileInformationClass == FileCompletionInformation)
Show replies by date