update for HEAD-2003091401
[reactos.git] / subsys / win32k / eng / device.c
1 /*
2  *  ReactOS W32 Subsystem
3  *  Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 ReactOS Team
4  *
5  *  This program is free software; you can redistribute it and/or modify
6  *  it under the terms of the GNU General Public License as published by
7  *  the Free Software Foundation; either version 2 of the License, or
8  *  (at your option) any later version.
9  *
10  *  This program is distributed in the hope that it will be useful,
11  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  *  GNU General Public License for more details.
14  *
15  *  You should have received a copy of the GNU General Public License
16  *  along with this program; if not, write to the Free Software
17  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18  */
19 /* $Id$
20  * 
21  * COPYRIGHT:         See COPYING in the top level directory
22  * PROJECT:           ReactOS kernel
23  * PURPOSE:           GDI Driver Device Functions
24  * FILE:              subsys/win32k/eng/device.c
25  * PROGRAMER:         Jason Filby
26  * REVISION HISTORY:
27  *                 3/7/1999: Created
28  */
29
30 #include <ddk/ntddk.h>
31 #include <win32k/misc.h>
32
33 #define NDEBUG
34 #include <debug.h>
35
36 /*
37  * @implemented
38  */
39 DWORD STDCALL
40 EngDeviceIoControl(HANDLE  hDevice,
41                    DWORD   dwIoControlCode,
42                    LPVOID  lpInBuffer,
43                    DWORD   nInBufferSize,
44                    LPVOID  lpOutBuffer,
45                    DWORD   nOutBufferSize,
46                    DWORD *lpBytesReturned)
47 {
48   PIRP Irp;
49   NTSTATUS Status;
50   KEVENT Event;
51   IO_STATUS_BLOCK Iosb;
52   PFILE_OBJECT FileObject;
53   PEPROCESS CurrentProcess;
54
55   DPRINT("EngDeviceIoControl() called\n");
56
57   KeInitializeEvent(&Event, SynchronizationEvent, FALSE);
58
59   CurrentProcess = PsGetCurrentProcess();
60   if (CurrentProcess != Win32kDeviceProcess)
61     {  
62       /* Switch to process context in which hDevice is valid */
63       KeAttachProcess(Win32kDeviceProcess);
64     }
65
66   Status = ObReferenceObjectByHandle(hDevice,
67                                      FILE_READ_DATA | FILE_WRITE_DATA,
68                                      IoFileObjectType,
69                                      KernelMode,
70                                      (PVOID *)&FileObject,
71                                      NULL);
72   if (CurrentProcess != Win32kDeviceProcess)
73     {
74       KeDetachProcess();
75     }
76
77   if (!NT_SUCCESS(Status))
78     {
79       return(Status);
80     }
81
82   Irp = IoBuildDeviceIoControlRequest(dwIoControlCode,
83                                       FileObject->DeviceObject,
84                                       lpInBuffer,
85                                       nInBufferSize,
86                                       lpOutBuffer,
87                                       nOutBufferSize, FALSE, &Event, &Iosb);
88
89   Status = IoCallDriver(FileObject->DeviceObject, Irp);
90
91   if (Status == STATUS_PENDING)
92   {
93     (void) KeWaitForSingleObject(&Event, Executive, KernelMode, TRUE, 0);
94   }
95
96   ObDereferenceObject(FileObject);
97
98   return (Status);
99 }
100 /* EOF */