update for HEAD-2003050101
[reactos.git] / subsys / win32k / eng / device.c
1 /*
2  * COPYRIGHT:         See COPYING in the top level directory
3  * PROJECT:           ReactOS kernel
4  * PURPOSE:           GDI Driver Device Functions
5  * FILE:              subsys/win32k/eng/device.c
6  * PROGRAMER:         Jason Filby
7  * REVISION HISTORY:
8  *                 3/7/1999: Created
9  */
10
11 #include <ddk/ntddk.h>
12 #include <win32k/misc.h>
13
14 #define NDEBUG
15 #include <debug.h>
16
17 DWORD STDCALL
18 EngDeviceIoControl(HANDLE  hDevice,
19                    DWORD   dwIoControlCode,
20                    LPVOID  lpInBuffer,
21                    DWORD   nInBufferSize,
22                    LPVOID  lpOutBuffer,
23                    DWORD   nOutBufferSize,
24                    DWORD *lpBytesReturned)
25 {
26   PIRP Irp;
27   NTSTATUS Status;
28   KEVENT Event;
29   IO_STATUS_BLOCK Iosb;
30   PFILE_OBJECT FileObject;
31
32   DPRINT("EngDeviceIoControl() called\n");
33
34   KeInitializeEvent(&Event, SynchronizationEvent, FALSE);
35
36   /* Switch to process context in which hDevice is valid */
37   KeAttachProcess(W32kDeviceProcess);
38
39   Status = ObReferenceObjectByHandle(hDevice,
40                                      FILE_READ_DATA | FILE_WRITE_DATA,
41                                      IoFileObjectType,
42                                      KernelMode,
43                                      (PVOID *)&FileObject,
44                                      NULL);
45   KeDetachProcess();
46
47   if (!NT_SUCCESS(Status))
48     {
49       return(Status);
50     }
51
52   Irp = IoBuildDeviceIoControlRequest(dwIoControlCode,
53                                       FileObject->DeviceObject,
54                                       lpInBuffer,
55                                       nInBufferSize,
56                                       lpOutBuffer,
57                                       nOutBufferSize, FALSE, &Event, &Iosb);
58
59   Status = IoCallDriver(FileObject->DeviceObject, Irp);
60
61   if (Status == STATUS_PENDING)
62   {
63     (void) KeWaitForSingleObject(&Event, Executive, KernelMode, TRUE, 0);
64   }
65
66   return (Status);
67 }