update for HEAD-2003091401
[reactos.git] / subsys / win32k / misc / driver.c
index c701f6f..095a8e7 100644 (file)
@@ -1,3 +1,21 @@
+/*
+ *  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$
  * 
  * GDI Driver support routines
@@ -32,7 +50,7 @@ typedef struct _GRAPHICS_DRIVER
 static PGRAPHICS_DRIVER  DriverList;
 static PGRAPHICS_DRIVER  GenericDriver = 0;
 
-BOOL  DRIVER_RegisterDriver(LPCWSTR  Name, PGD_ENABLEDRIVER  EnableDriver)
+BOOL DRIVER_RegisterDriver(LPCWSTR  Name, PGD_ENABLEDRIVER  EnableDriver)
 {
   PGRAPHICS_DRIVER  Driver = ExAllocatePoolWithTag(NonPagedPool, sizeof(*Driver), DRIVER_TAG);
   DPRINT( "DRIVER_RegisterDriver( Name: %S )\n", Name );
@@ -139,10 +157,10 @@ PGD_ENABLEDRIVER DRIVER_FindDDIDriver(LPCWSTR Name)
   return (PGD_ENABLEDRIVER)GdiDriverInfo.EntryPoint;
 }
 
-BOOL  DRIVER_BuildDDIFunctions(PDRVENABLEDATA  DED, 
+BOOL DRIVER_BuildDDIFunctions(PDRVENABLEDATA  DED, 
                                PDRIVER_FUNCTIONS  DF)
 {
-  int i;
+  ULONG i;
 
   for (i=0; i<DED->c; i++)
   {
@@ -226,9 +244,14 @@ HANDLE DRIVER_FindMPDriver(LPCWSTR  Name)
   IO_STATUS_BLOCK Iosb;
   HANDLE DisplayHandle;
   NTSTATUS Status;
+  PEPROCESS CurrentProcess;
 
-  /* Switch to process context in which handle is to be valid */
-  KeAttachProcess(W32kDeviceProcess);
+  CurrentProcess = PsGetCurrentProcess();
+  if (CurrentProcess != Win32kDeviceProcess)
+    {
+      /* Switch to process context in which handle is to be valid */
+      KeAttachProcess(Win32kDeviceProcess);
+    }
 
   RtlInitUnicodeStringFromLiteral(&DeviceName, L"\\??\\DISPLAY1");
   InitializeObjectAttributes(&ObjectAttributes,
@@ -243,7 +266,10 @@ HANDLE DRIVER_FindMPDriver(LPCWSTR  Name)
                      0,
                      FILE_SYNCHRONOUS_IO_ALERT);
 
-  KeDetachProcess();
+  if (CurrentProcess != Win32kDeviceProcess)
+    {
+      KeDetachProcess();
+    }
 
   if (!NT_SUCCESS(Status))
     {
@@ -255,7 +281,7 @@ HANDLE DRIVER_FindMPDriver(LPCWSTR  Name)
 }
 
 
-BOOL  DRIVER_UnregisterDriver(LPCWSTR  Name)
+BOOL DRIVER_UnregisterDriver(LPCWSTR  Name)
 {
   PGRAPHICS_DRIVER  Driver = NULL;
   
@@ -300,7 +326,7 @@ BOOL  DRIVER_UnregisterDriver(LPCWSTR  Name)
   }
 }
 
-INT  DRIVER_ReferenceDriver (LPCWSTR  Name)
+INT DRIVER_ReferenceDriver (LPCWSTR  Name)
 {
   GRAPHICS_DRIVER *Driver = DriverList;
   
@@ -318,7 +344,7 @@ INT  DRIVER_ReferenceDriver (LPCWSTR  Name)
   return ++GenericDriver->ReferenceCount;
 }
 
-INT  DRIVER_UnreferenceDriver (LPCWSTR  Name)
+INT DRIVER_UnreferenceDriver (LPCWSTR  Name)
 {
   GRAPHICS_DRIVER *Driver = DriverList;
   
@@ -335,3 +361,4 @@ INT  DRIVER_UnreferenceDriver (LPCWSTR  Name)
   assert( GenericDriver != 0 );
   return --GenericDriver->ReferenceCount;
 }
+/* EOF */