Properly setup the I/O stack location in IopSecurityFile.
[reactos.git] / reactos / ntoskrnl / io / file.c
index ea4dca5..0c21f63 100644 (file)
@@ -14,9 +14,6 @@
 #define NDEBUG
 #include <internal/debug.h>
 
 #define NDEBUG
 #include <internal/debug.h>
 
-/* FIXME: Header mess */
-#undef CreateMailslot
-
 /* GLOBALS *******************************************************************/
 
 extern GENERIC_MAPPING IopFileMapping;
 /* GLOBALS *******************************************************************/
 
 extern GENERIC_MAPPING IopFileMapping;
@@ -53,7 +50,7 @@ IopCreateFile(PVOID ObjectBody,
   POBJECT_TYPE ParentObjectType;
   NTSTATUS Status;
 
   POBJECT_TYPE ParentObjectType;
   NTSTATUS Status;
 
-  DPRINT("IopCreateFile(ObjectBody %x, Parent %x, RemainingPath %S)\n",
+  DPRINT("IopCreateFile(ObjectBody 0x%p, Parent 0x%p, RemainingPath %S)\n",
          ObjectBody,
          Parent,
          RemainingPath);
          ObjectBody,
          Parent,
          RemainingPath);
@@ -72,7 +69,7 @@ IopCreateFile(PVOID ObjectBody,
       ParentObjectType != IoFileObjectType)
     {
       DPRINT("Parent [%wZ] is a %S which is neither a file type nor a device type ; remaining path = %S\n",
       ParentObjectType != IoFileObjectType)
     {
       DPRINT("Parent [%wZ] is a %S which is neither a file type nor a device type ; remaining path = %S\n",
-             &BODY_TO_HEADER(Parent)->NameInfo->Name,
+             &HEADER_TO_OBJECT_NAME(BODY_TO_HEADER(Parent))->Name,
              BODY_TO_HEADER(Parent)->Type->Name.Buffer,
              RemainingPath);
       return(STATUS_UNSUCCESSFUL);
              BODY_TO_HEADER(Parent)->Type->Name.Buffer,
              RemainingPath);
       return(STATUS_UNSUCCESSFUL);
@@ -84,7 +81,7 @@ IopCreateFile(PVOID ObjectBody,
                                       UserMode);
   if (!NT_SUCCESS(Status))
     {
                                       UserMode);
   if (!NT_SUCCESS(Status))
     {
-      CPRINT("Failed to reference parent object %x\n", Parent);
+      CPRINT("Failed to reference parent object 0x%p\n", Parent);
       return(Status);
     }
 
       return(Status);
     }
 
@@ -92,7 +89,7 @@ IopCreateFile(PVOID ObjectBody,
     {
       /* Parent is a devce object */
       DeviceObject = IoGetAttachedDevice((PDEVICE_OBJECT)Parent);
     {
       /* Parent is a devce object */
       DeviceObject = IoGetAttachedDevice((PDEVICE_OBJECT)Parent);
-      DPRINT("DeviceObject %x\n", DeviceObject);
+      DPRINT("DeviceObject 0x%p\n", DeviceObject);
 
       if (RemainingPath == NULL)
         {
 
       if (RemainingPath == NULL)
         {
@@ -146,7 +143,7 @@ IopCreateFile(PVOID ObjectBody,
         }
 
       DeviceObject = ((PFILE_OBJECT)Parent)->DeviceObject;
         }
 
       DeviceObject = ((PFILE_OBJECT)Parent)->DeviceObject;
-      DPRINT("DeviceObject %x\n", DeviceObject);
+      DPRINT("DeviceObject 0x%p\n", DeviceObject);
 
       FileObject->RelatedFileObject = (PFILE_OBJECT)Parent;
 
 
       FileObject->RelatedFileObject = (PFILE_OBJECT)Parent;
 
@@ -157,7 +154,7 @@ IopCreateFile(PVOID ObjectBody,
   DPRINT("FileObject->FileName %wZ\n",
          &FileObject->FileName);
   FileObject->DeviceObject = DeviceObject;
   DPRINT("FileObject->FileName %wZ\n",
          &FileObject->FileName);
   FileObject->DeviceObject = DeviceObject;
-  DPRINT("FileObject %x DeviceObject %x\n",
+  DPRINT("FileObject 0x%p DeviceObject 0x%p\n",
          FileObject,
          DeviceObject);
   FileObject->Vpb = DeviceObject->Vpb;
          FileObject,
          DeviceObject);
   FileObject->Vpb = DeviceObject->Vpb;
@@ -327,6 +324,7 @@ IopSecurityFile(PVOID ObjectBody,
 
     /* Set Stack Parameters */
     StackPtr = IoGetNextIrpStackLocation(Irp);
 
     /* Set Stack Parameters */
     StackPtr = IoGetNextIrpStackLocation(Irp);
+    StackPtr->MajorFunction = MajorFunction;
     StackPtr->FileObject = FileObject;
 
     /* Set Parameters */
     StackPtr->FileObject = FileObject;
 
     /* Set Parameters */
@@ -402,7 +400,7 @@ IopQueryNameFile(PVOID ObjectBody,
                  ULONG Length,
                  PULONG ReturnLength)
 {
                  ULONG Length,
                  PULONG ReturnLength)
 {
-    PVOID LocalInfo;
+    POBJECT_NAME_INFORMATION LocalInfo;
     PFILE_OBJECT FileObject;
     ULONG LocalReturnLength;
     NTSTATUS Status;
     PFILE_OBJECT FileObject;
     ULONG LocalReturnLength;
     NTSTATUS Status;
@@ -431,7 +429,7 @@ IopQueryNameFile(PVOID ObjectBody,
     
     /* Write Device Path */
     Status = RtlAppendUnicodeStringToString(&ObjectNameInfo->Name,
     
     /* Write Device Path */
     Status = RtlAppendUnicodeStringToString(&ObjectNameInfo->Name,
-                                            &((POBJECT_NAME_INFORMATION)LocalInfo)->Name);
+                                            &(LocalInfo)->Name);
 
     /* Query the File name */
     Status = IoQueryFileInformation(FileObject,
 
     /* Query the File name */
     Status = IoQueryFileInformation(FileObject,
@@ -534,10 +532,10 @@ IopDeviceFsIoControl(IN HANDLE DeviceHandle,
     BOOLEAN LocalEvent = FALSE;
     KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
 
     BOOLEAN LocalEvent = FALSE;
     KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
 
-    DPRINT("IopDeviceFsIoControl(DeviceHandle %x Event %x UserApcRoutine %x "
-           "UserApcContext %x IoStatusBlock %x IoControlCode %x "
-           "InputBuffer %x InputBufferLength %x OutputBuffer %x "
-           "OutputBufferLength %x)\n",
+    DPRINT("IopDeviceFsIoControl(DeviceHandle 0x%p Event 0x%p UserApcRoutine 0x%p "
+           "UserApcContext 0x%p IoStatusBlock 0x%p IoControlCode %x "
+           "InputBuffer 0x%p InputBufferLength %x OutputBuffer 0x%p "
+           "OutputBufferLength 0x%p)\n",
            DeviceHandle,Event,UserApcRoutine,UserApcContext,IoStatusBlock,
            IoControlCode,InputBuffer,InputBufferLength,OutputBuffer,
            OutputBufferLength);
            DeviceHandle,Event,UserApcRoutine,UserApcContext,IoStatusBlock,
            IoControlCode,InputBuffer,InputBufferLength,OutputBuffer,
            OutputBufferLength);
@@ -761,8 +759,8 @@ IoCreateFile(OUT PHANDLE  FileHandle,
    PVOID                SystemEaBuffer = NULL;
    NTSTATUS  Status = STATUS_SUCCESS;
 
    PVOID                SystemEaBuffer = NULL;
    NTSTATUS  Status = STATUS_SUCCESS;
 
-   DPRINT("IoCreateFile(FileHandle %x, DesiredAccess %x, "
-          "ObjectAttributes %x ObjectAttributes->ObjectName->Buffer %S)\n",
+   DPRINT("IoCreateFile(FileHandle 0x%p, DesiredAccess %x, "
+          "ObjectAttributes 0x%p ObjectAttributes->ObjectName->Buffer %S)\n",
           FileHandle,DesiredAccess,ObjectAttributes,
           ObjectAttributes->ObjectName->Buffer);
 
           FileHandle,DesiredAccess,ObjectAttributes,
           ObjectAttributes->ObjectName->Buffer);
 
@@ -936,8 +934,8 @@ IoCreateFile(OUT PHANDLE  FileHandle,
    KeInitializeEvent(&FileObject->Lock, SynchronizationEvent, TRUE);
    KeInitializeEvent(&FileObject->Event, NotificationEvent, FALSE);
 
    KeInitializeEvent(&FileObject->Lock, SynchronizationEvent, TRUE);
    KeInitializeEvent(&FileObject->Event, NotificationEvent, FALSE);
 
-   DPRINT("FileObject %x\n", FileObject);
-   DPRINT("FileObject->DeviceObject %x\n", FileObject->DeviceObject);
+   DPRINT("FileObject 0x%p\n", FileObject);
+   DPRINT("FileObject->DeviceObject 0x%p\n", FileObject->DeviceObject);
    /*
     * Create a new IRP to hand to
     * the FS driver: this may fail
    /*
     * Create a new IRP to hand to
     * the FS driver: this may fail
@@ -1051,7 +1049,7 @@ IoCreateFile(OUT PHANDLE  FileHandle,
 
    ASSERT_IRQL(PASSIVE_LEVEL);
 
 
    ASSERT_IRQL(PASSIVE_LEVEL);
 
-   DPRINT("Finished IoCreateFile() (*FileHandle) %x\n", (*FileHandle));
+   DPRINT("Finished IoCreateFile() (*FileHandle) 0x%p\n", (*FileHandle));
 
    return Status;
 }
 
    return Status;
 }
@@ -1115,7 +1113,7 @@ IoCreateStreamFileObject(PFILE_OBJECT FileObject,
        reason. These hacks need to be removed.
     */
 
        reason. These hacks need to be removed.
     */
 
-    DPRINT("IoCreateStreamFileObject(FileObject %x, DeviceObject %x)\n",
+    DPRINT("IoCreateStreamFileObject(FileObject 0x%p, DeviceObject 0x%p)\n",
             FileObject, DeviceObject);
     PAGED_CODE();
 
             FileObject, DeviceObject);
     PAGED_CODE();
 
@@ -1137,7 +1135,7 @@ IoCreateStreamFileObject(PFILE_OBJECT FileObject,
 
     /* Choose Device Object */
     if (FileObject) DeviceObject = FileObject->DeviceObject;
 
     /* Choose Device Object */
     if (FileObject) DeviceObject = FileObject->DeviceObject;
-    DPRINT("DeviceObject %x\n", DeviceObject);
+    DPRINT("DeviceObject 0x%p\n", DeviceObject);
     
     /* HACK */
     DeviceObject = IoGetAttachedDevice(DeviceObject);
     
     /* HACK */
     DeviceObject = IoGetAttachedDevice(DeviceObject);
@@ -1241,7 +1239,7 @@ IoQueryFileInformation(IN PFILE_OBJECT FileObject,
                                         KernelMode);
     if (!NT_SUCCESS(Status)) return(Status);
 
                                         KernelMode);
     if (!NT_SUCCESS(Status)) return(Status);
 
-    DPRINT("FileObject %x\n", FileObject);
+    DPRINT("FileObject 0x%p\n", FileObject);
 
     /* Get the Device Object */
     DeviceObject = IoGetRelatedDeviceObject(FileObject);
 
     /* Get the Device Object */
     DeviceObject = IoGetRelatedDeviceObject(FileObject);
@@ -1501,8 +1499,8 @@ NtCreateMailslotFile(OUT PHANDLE FileHandle,
 {
     MAILSLOT_CREATE_PARAMETERS Buffer;
 
 {
     MAILSLOT_CREATE_PARAMETERS Buffer;
 
-    DPRINT("NtCreateMailslotFile(FileHandle %x, DesiredAccess %x, "
-           "ObjectAttributes %x ObjectAttributes->ObjectName->Buffer %S)\n",
+    DPRINT("NtCreateMailslotFile(FileHandle 0x%p, DesiredAccess %x, "
+           "ObjectAttributes 0x%p ObjectAttributes->ObjectName->Buffer %S)\n",
            FileHandle,DesiredAccess,ObjectAttributes,
            ObjectAttributes->ObjectName->Buffer);
     PAGED_CODE();
            FileHandle,DesiredAccess,ObjectAttributes,
            ObjectAttributes->ObjectName->Buffer);
     PAGED_CODE();
@@ -1562,8 +1560,8 @@ NtCreateNamedPipeFile(PHANDLE FileHandle,
 {
     NAMED_PIPE_CREATE_PARAMETERS Buffer;
 
 {
     NAMED_PIPE_CREATE_PARAMETERS Buffer;
 
-    DPRINT("NtCreateNamedPipeFile(FileHandle %x, DesiredAccess %x, "
-           "ObjectAttributes %x ObjectAttributes->ObjectName->Buffer %S)\n",
+    DPRINT("NtCreateNamedPipeFile(FileHandle 0x%p, DesiredAccess %x, "
+           "ObjectAttributes 0x%p ObjectAttributes->ObjectName->Buffer %S)\n",
             FileHandle,DesiredAccess,ObjectAttributes,
             ObjectAttributes->ObjectName->Buffer);
     PAGED_CODE();
             FileHandle,DesiredAccess,ObjectAttributes,
             ObjectAttributes->ObjectName->Buffer);
     PAGED_CODE();
@@ -2404,7 +2402,7 @@ NtQueryInformationFile(HANDLE FileHandle,
     ASSERT(IoStatusBlock != NULL);
     ASSERT(FileInformation != NULL);
 
     ASSERT(IoStatusBlock != NULL);
     ASSERT(FileInformation != NULL);
 
-    DPRINT("NtQueryInformationFile(Handle %x StatBlk %x FileInfo %x Length %d "
+    DPRINT("NtQueryInformationFile(Handle 0x%p StatBlk 0x%p FileInfo 0x%p Length %d "
            "Class %d)\n", FileHandle, IoStatusBlock, FileInformation,
             Length, FileInformationClass);
 
            "Class %d)\n", FileHandle, IoStatusBlock, FileInformation,
             Length, FileInformationClass);
 
@@ -2447,7 +2445,7 @@ NtQueryInformationFile(HANDLE FileHandle,
         return STATUS_ACCESS_DENIED;
     }
 
         return STATUS_ACCESS_DENIED;
     }
 
-    DPRINT("FileObject %x\n", FileObject);
+    DPRINT("FileObject 0x%p\n", FileObject);
 
     /* Check if this is a direct open or not */
     if (FileObject->Flags & FO_DIRECT_DEVICE_OPEN)
 
     /* Check if this is a direct open or not */
     if (FileObject->Flags & FO_DIRECT_DEVICE_OPEN)
@@ -2590,8 +2588,8 @@ NtReadFile(IN HANDLE FileHandle,
     BOOLEAN LocalEvent = FALSE;
     PKEVENT EventObject = NULL;
 
     BOOLEAN LocalEvent = FALSE;
     PKEVENT EventObject = NULL;
 
-    DPRINT("NtReadFile(FileHandle %x Buffer %x Length %x ByteOffset %x, "
-           "IoStatusBlock %x)\n", FileHandle, Buffer, Length, ByteOffset,
+    DPRINT("NtReadFile(FileHandle 0x%p Buffer 0x%p Length %x ByteOffset 0x%p, "
+           "IoStatusBlock 0x%p)\n", FileHandle, Buffer, Length, ByteOffset,
             IoStatusBlock);
     PAGED_CODE();
 
             IoStatusBlock);
     PAGED_CODE();
 
@@ -2630,7 +2628,7 @@ NtReadFile(IN HANDLE FileHandle,
     /* Check the Byte Offset */
     if (!ByteOffset ||
         (ByteOffset->u.LowPart == FILE_USE_FILE_POINTER_POSITION &&
     /* Check the Byte Offset */
     if (!ByteOffset ||
         (ByteOffset->u.LowPart == FILE_USE_FILE_POINTER_POSITION &&
-         ByteOffset->u.HighPart == 0xffffffff))
+         ByteOffset->u.HighPart == -1))
     {
         /* a valid ByteOffset is required if asynch. op. */
         if (!(FileObject->Flags & FO_SYNCHRONOUS_IO))
     {
         /* a valid ByteOffset is required if asynch. op. */
         if (!(FileObject->Flags & FO_SYNCHRONOUS_IO))
@@ -2812,13 +2810,45 @@ NtSetInformationFile(HANDLE FileHandle,
     KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
     BOOLEAN Failed = FALSE;
 
     KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
     BOOLEAN Failed = FALSE;
 
-    ASSERT(IoStatusBlock != NULL);
-    ASSERT(FileInformation != NULL);
-
-    DPRINT("NtSetInformationFile(Handle %x StatBlk %x FileInfo %x Length %d "
+    DPRINT("NtSetInformationFile(Handle 0x%p StatBlk 0x%p FileInfo 0x%p Length %d "
            "Class %d)\n", FileHandle, IoStatusBlock, FileInformation,
             Length, FileInformationClass);
 
            "Class %d)\n", FileHandle, IoStatusBlock, FileInformation,
             Length, FileInformationClass);
 
+    if (PreviousMode != KernelMode)
+    {
+        _SEH_TRY
+        {
+            if (IoStatusBlock != NULL)
+            {
+                ProbeForWrite(IoStatusBlock,
+                              sizeof(IO_STATUS_BLOCK),
+                              sizeof(ULONG));
+            }
+            
+            if (Length != 0)
+            {
+                ProbeForRead(FileInformation,
+                             Length,
+                             1);
+            }
+        }
+        _SEH_HANDLE
+        {
+            Status = _SEH_GetExceptionCode();
+        }
+        _SEH_END;
+        
+        if (!NT_SUCCESS(Status))
+        {
+            return Status;
+        }
+    }
+    else
+    {
+        ASSERT(IoStatusBlock != NULL);
+        ASSERT(FileInformation != NULL);
+    }
+
     /* Get the file object from the file handle */
     Status = ObReferenceObjectByHandle(FileHandle,
                                        0,
     /* Get the file object from the file handle */
     Status = ObReferenceObjectByHandle(FileHandle,
                                        0,
@@ -2863,7 +2893,7 @@ NtSetInformationFile(HANDLE FileHandle,
         return STATUS_ACCESS_DENIED;
     }
 
         return STATUS_ACCESS_DENIED;
     }
 
-    DPRINT("FileObject %x\n", FileObject);
+    DPRINT("FileObject 0x%p\n", FileObject);
 
     /* FIXME: Later, we can implement a lot of stuff here and avoid a driver call */
     /* Handle IO Completion Port quickly */
 
     /* FIXME: Later, we can implement a lot of stuff here and avoid a driver call */
     /* Handle IO Completion Port quickly */
@@ -2943,13 +2973,43 @@ NtSetInformationFile(HANDLE FileHandle,
                                                                   Length,
                                                                   TAG_SYSB)))
     {
                                                                   Length,
                                                                   TAG_SYSB)))
     {
-        IoFreeIrp(Irp);
-        ObDereferenceObject(FileObject);
-        return STATUS_INSUFFICIENT_RESOURCES;
+        Status = STATUS_INSUFFICIENT_RESOURCES;
+        goto failfreeirp;
     }
 
     /* Copy the data inside */
     }
 
     /* Copy the data inside */
-    MmSafeCopyFromUser(Irp->AssociatedIrp.SystemBuffer, FileInformation, Length);
+    if (PreviousMode != KernelMode)
+    {
+        _SEH_TRY
+        {
+            /* no need to probe again */
+            RtlCopyMemory(Irp->AssociatedIrp.SystemBuffer,
+                          FileInformation,
+                          Length);
+        }
+        _SEH_HANDLE
+        {
+            Status = _SEH_GetExceptionCode();
+        }
+        _SEH_END;
+        
+        if (!NT_SUCCESS(Status))
+        {
+            ExFreePoolWithTag(Irp->AssociatedIrp.SystemBuffer,
+                              TAG_SYSB);
+            Irp->AssociatedIrp.SystemBuffer = NULL;
+failfreeirp:
+            IoFreeIrp(Irp);
+            ObDereferenceObject(FileObject);
+            return Status;
+        }
+    }
+    else
+    {
+        RtlCopyMemory(Irp->AssociatedIrp.SystemBuffer,
+                      FileInformation,
+                      Length);
+    }
 
     /* Set up the IRP */
     Irp->Tail.Overlay.OriginalFileObject = FileObject;
 
     /* Set up the IRP */
     Irp->Tail.Overlay.OriginalFileObject = FileObject;
@@ -2980,7 +3040,15 @@ NtSetInformationFile(HANDLE FileHandle,
                                   PreviousMode,
                                   FileObject->Flags & FO_ALERTABLE_IO,
                                   NULL);
                                   PreviousMode,
                                   FileObject->Flags & FO_ALERTABLE_IO,
                                   NULL);
-            Status = IoStatusBlock->Status;
+            _SEH_TRY
+            {
+                Status = IoStatusBlock->Status;
+            }
+            _SEH_HANDLE
+            {
+                Status = _SEH_GetExceptionCode();
+            }
+            _SEH_END;
         }
         else
         {
         }
         else
         {
@@ -2989,7 +3057,15 @@ NtSetInformationFile(HANDLE FileHandle,
                                   PreviousMode,
                                   FileObject->Flags & FO_ALERTABLE_IO,
                                   NULL);
                                   PreviousMode,
                                   FileObject->Flags & FO_ALERTABLE_IO,
                                   NULL);
-            Status = FileObject->FinalStatus;
+            _SEH_TRY
+            {
+                Status = FileObject->FinalStatus;
+            }
+            _SEH_HANDLE
+            {
+                Status = _SEH_GetExceptionCode();
+            }
+            _SEH_END;
         }
     }
 
         }
     }
 
@@ -3004,7 +3080,7 @@ NTSTATUS
 STDCALL
 NtSetQuotaInformationFile(HANDLE FileHandle,
                           PIO_STATUS_BLOCK IoStatusBlock,
 STDCALL
 NtSetQuotaInformationFile(HANDLE FileHandle,
                           PIO_STATUS_BLOCK IoStatusBlock,
-                          PFILE_USER_QUOTA_INFORMATION Buffer,
+                          PFILE_QUOTA_INFORMATION Buffer,
                           ULONG BufferLength)
 {
     UNIMPLEMENTED;
                           ULONG BufferLength)
 {
     UNIMPLEMENTED;
@@ -3178,8 +3254,8 @@ NtWriteFile (IN HANDLE FileHandle,
     BOOLEAN LocalEvent = FALSE;
     PKEVENT EventObject = NULL;
 
     BOOLEAN LocalEvent = FALSE;
     PKEVENT EventObject = NULL;
 
-    DPRINT("NtWriteFile(FileHandle %x Buffer %x Length %x ByteOffset %x, "
-            "IoStatusBlock %x)\n", FileHandle, Buffer, Length, ByteOffset,
+    DPRINT("NtWriteFile(FileHandle 0x%p Buffer 0x%p Length %x ByteOffset 0x%p, "
+            "IoStatusBlock 0x%p)\n", FileHandle, Buffer, Length, ByteOffset,
             IoStatusBlock);
 
     /* Validate User-Mode Buffers */
             IoStatusBlock);
 
     /* Validate User-Mode Buffers */
@@ -3229,7 +3305,7 @@ NtWriteFile (IN HANDLE FileHandle,
         /* Check the Byte Offset */
         if (!ByteOffset ||
             (ByteOffset->u.LowPart == FILE_USE_FILE_POINTER_POSITION &&
         /* Check the Byte Offset */
         if (!ByteOffset ||
             (ByteOffset->u.LowPart == FILE_USE_FILE_POINTER_POSITION &&
-             ByteOffset->u.HighPart == 0xffffffff))
+             ByteOffset->u.HighPart == -1))
         {
             /* a valid ByteOffset is required if asynch. op. */
             if (!(FileObject->Flags & FO_SYNCHRONOUS_IO))
         {
             /* a valid ByteOffset is required if asynch. op. */
             if (!(FileObject->Flags & FO_SYNCHRONOUS_IO))