update for HEAD-2003091401
[reactos.git] / subsys / win32k / eng / device.c
index 39a5358..b0568e9 100644 (file)
@@ -1,4 +1,23 @@
 /*
+ *  ReactOS W32 Subsystem
+ *  Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 ReactOS Team
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+/* $Id$
+ * 
  * COPYRIGHT:         See COPYING in the top level directory
  * PROJECT:           ReactOS kernel
  * PURPOSE:           GDI Driver Device Functions
  */
 
 #include <ddk/ntddk.h>
+#include <win32k/misc.h>
 
 #define NDEBUG
 #include <debug.h>
 
+/*
+ * @implemented
+ */
 DWORD STDCALL
 EngDeviceIoControl(HANDLE  hDevice,
                   DWORD   dwIoControlCode,
@@ -27,21 +50,34 @@ EngDeviceIoControl(HANDLE  hDevice,
   KEVENT Event;
   IO_STATUS_BLOCK Iosb;
   PFILE_OBJECT FileObject;
+  PEPROCESS CurrentProcess;
 
   DPRINT("EngDeviceIoControl() called\n");
 
   KeInitializeEvent(&Event, SynchronizationEvent, FALSE);
 
+  CurrentProcess = PsGetCurrentProcess();
+  if (CurrentProcess != Win32kDeviceProcess)
+    {  
+      /* Switch to process context in which hDevice is valid */
+      KeAttachProcess(Win32kDeviceProcess);
+    }
+
   Status = ObReferenceObjectByHandle(hDevice,
                                     FILE_READ_DATA | FILE_WRITE_DATA,
                                     IoFileObjectType,
                                     KernelMode,
                                     (PVOID *)&FileObject,
                                     NULL);
-   if (!NT_SUCCESS(Status))
-     {
-       return(Status);
-     }
+  if (CurrentProcess != Win32kDeviceProcess)
+    {
+      KeDetachProcess();
+    }
+
+  if (!NT_SUCCESS(Status))
+    {
+      return(Status);
+    }
 
   Irp = IoBuildDeviceIoControlRequest(dwIoControlCode,
                                      FileObject->DeviceObject,
@@ -57,5 +93,8 @@ EngDeviceIoControl(HANDLE  hDevice,
     (void) KeWaitForSingleObject(&Event, Executive, KernelMode, TRUE, 0);
   }
 
+  ObDereferenceObject(FileObject);
+
   return (Status);
 }
+/* EOF */