:pserver:cvsanon@mok.lvcm.com:/CVS/ReactOS reactos
[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
13 #define NDEBUG
14 #include <debug.h>
15
16 DWORD STDCALL
17 EngDeviceIoControl(HANDLE  hDevice,
18                    DWORD   dwIoControlCode,
19                    LPVOID  lpInBuffer,
20                    DWORD   nInBufferSize,
21                    LPVOID  lpOutBuffer,
22                    DWORD   nOutBufferSize,
23                    DWORD *lpBytesReturned)
24 {
25   PIRP Irp;
26   NTSTATUS Status;
27   KEVENT Event;
28   IO_STATUS_BLOCK Iosb;
29   PFILE_OBJECT FileObject;
30
31   DPRINT("EngDeviceIoControl() called\n");
32
33   KeInitializeEvent(&Event, SynchronizationEvent, FALSE);
34
35   Status = ObReferenceObjectByHandle(hDevice,
36                                      FILE_READ_DATA | FILE_WRITE_DATA,
37                                      IoFileObjectType,
38                                      KernelMode,
39                                      (PVOID *)&FileObject,
40                                      NULL);
41    if (!NT_SUCCESS(Status))
42      {
43         return(Status);
44      }
45
46   Irp = IoBuildDeviceIoControlRequest(dwIoControlCode,
47                                       FileObject->DeviceObject,
48                                       lpInBuffer,
49                                       nInBufferSize,
50                                       lpOutBuffer,
51                                       nOutBufferSize, FALSE, &Event, &Iosb);
52
53   Status = IoCallDriver(FileObject->DeviceObject, Irp);
54
55   if (Status == STATUS_PENDING)
56   {
57     (void) KeWaitForSingleObject(&Event, Executive, KernelMode, TRUE, 0);
58   }
59
60   return (Status);
61 }