Implement IO_NO_PARAMETER_CHECKING flag
Modified: trunk/reactos/include/ddk/iodef.h
Modified: trunk/reactos/ntoskrnl/io/create.c
Modified: trunk/reactos/ntoskrnl/mm/pagefile.c
_____
Modified: trunk/reactos/include/ddk/iodef.h
--- trunk/reactos/include/ddk/iodef.h 2005-01-24 21:25:27 UTC (rev
13255)
+++ trunk/reactos/include/ddk/iodef.h 2005-01-24 22:02:09 UTC (rev
13256)
@@ -161,6 +161,11 @@
#define SL_INVOKE_ON_ERROR 0x80
/*
+ * IoCreateFile options
+ */
+#define IO_NO_PARAMETER_CHECKING 0x100
+
+/*
* Possible flags for the device object flags
*/
#define DO_UNLOAD_PENDING 0x00000001
_____
Modified: trunk/reactos/ntoskrnl/io/create.c
--- trunk/reactos/ntoskrnl/io/create.c 2005-01-24 21:25:27 UTC (rev
13255)
+++ trunk/reactos/ntoskrnl/io/create.c 2005-01-24 22:02:09 UTC (rev
13256)
@@ -321,7 +321,7 @@
* @implemented
*/
NTSTATUS STDCALL
-IoCreateFile(OUT PHANDLE FileHandle,
+IoCreateFile(OUT PHANDLE FileHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes,
OUT PIO_STATUS_BLOCK IoStatusBlock,
@@ -341,7 +341,9 @@
PIRP Irp;
PIO_STACK_LOCATION StackLoc;
IO_SECURITY_CONTEXT SecurityContext;
- KPROCESSOR_MODE PreviousMode;
+ KPROCESSOR_MODE PreviousMode;
+ HANDLE LocalFileHandle;
+ IO_STATUS_BLOCK LocalIoStatusBlock;
DPRINT("IoCreateFile(FileHandle %x, DesiredAccess %x, "
"ObjectAttributes %x ObjectAttributes->ObjectName->Buffer
%S)\n",
@@ -350,14 +352,14 @@
ASSERT_IRQL(PASSIVE_LEVEL);
- if (IoStatusBlock == NULL)
- return STATUS_ACCESS_VIOLATION;
+ if (IoStatusBlock == NULL || FileHandle == NULL)
+ return STATUS_ACCESS_VIOLATION;
- *FileHandle = 0;
+ LocalFileHandle = 0;
PreviousMode = ExGetPreviousMode();
- Status = ObCreateObject(PreviousMode,
+ Status = ObCreateObject(0 == (Options & IO_NO_PARAMETER_CHECKING) ?
PreviousMode : KernelMode,
IoFileObjectType,
ObjectAttributes,
PreviousMode,
@@ -380,7 +382,7 @@
DesiredAccess,
0,
NULL,
- FileHandle);
+ &LocalFileHandle);
if (!NT_SUCCESS(Status))
{
DPRINT("ObInsertObject() failed! (Status %lx)\n", Status);
@@ -418,14 +420,14 @@
Irp = IoAllocateIrp(FileObject->DeviceObject->StackSize, FALSE);
if (Irp == NULL)
{
- ZwClose(*FileHandle);
+ ZwClose(LocalFileHandle);
return STATUS_UNSUCCESSFUL;
}
//trigger FileObject/Event dereferencing
Irp->Tail.Overlay.OriginalFileObject = FileObject;
Irp->RequestorMode = PreviousMode;
- Irp->UserIosb = IoStatusBlock;
+ Irp->UserIosb = &LocalIoStatusBlock;
Irp->AssociatedIrp.SystemBuffer = EaBuffer;
Irp->Tail.Overlay.AuxiliaryBuffer = NULL;
Irp->Tail.Overlay.Thread = PsGetCurrentThread();
@@ -493,7 +495,7 @@
PreviousMode,
FALSE,
NULL);
- Status = IoStatusBlock->Status;
+ Status = LocalIoStatusBlock.Status;
}
if (!NT_SUCCESS(Status))
{
@@ -501,8 +503,35 @@
FileObject->DeviceObject = NULL;
FileObject->Vpb = NULL;
- ZwClose(*FileHandle);
+ ZwClose(LocalFileHandle);
}
+ else
+ {
+ if (KernelMode == PreviousMode || 0 != (Options &
IO_NO_PARAMETER_CHECKING))
+ {
+ *FileHandle = LocalFileHandle;
+ *IoStatusBlock = LocalIoStatusBlock;
+ }
+ else
+ {
+ _SEH_TRY
+ {
+ ProbeForWrite(FileHandle,
+ sizeof(HANDLE),
+ sizeof(ULONG));
+ *FileHandle = LocalFileHandle;
+ ProbeForWrite(IoStatusBlock,
+ sizeof(IO_STATUS_BLOCK),
+ sizeof(ULONG));
+ *IoStatusBlock = LocalIoStatusBlock;
+ }
+ _SEH_HANDLE
+ {
+ Status = _SEH_GetExceptionCode();
+ }
+ _SEH_END;
+ }
+ }
ASSERT_IRQL(PASSIVE_LEVEL);
_____
Modified: trunk/reactos/ntoskrnl/mm/pagefile.c
--- trunk/reactos/ntoskrnl/mm/pagefile.c 2005-01-24 21:25:27 UTC
(rev 13255)
+++ trunk/reactos/ntoskrnl/mm/pagefile.c 2005-01-24 22:02:09 UTC
(rev 13256)
@@ -833,7 +833,7 @@
0,
CreateFileTypeNone,
NULL,
- SL_OPEN_PAGING_FILE);
+ SL_OPEN_PAGING_FILE |
IO_NO_PARAMETER_CHECKING);
RtlReleaseCapturedUnicodeString(&CapturedFileName,
PreviousMode,
FALSE);