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
18 PFILE_OBJECT pFileObject
,
19 ULONG ulMajorFunction
,
22 ULONGLONG ullStartOffset
,
23 OUT LPDWORD lpInformation
)
25 PDEVICE_OBJECT pDeviceObject
;
30 LARGE_INTEGER liStartOffset
;
32 /* Get corresponding device object */
33 pDeviceObject
= IoGetRelatedDeviceObject(pFileObject
);
36 return STATUS_INVALID_PARAMETER
;
39 /* Initialize an event */
40 KeInitializeEvent(&Event
, SynchronizationEvent
, FALSE
);
43 liStartOffset
.QuadPart
= ullStartOffset
;
44 pIrp
= IoBuildSynchronousFsdRequest(ulMajorFunction
,
53 return STATUS_INSUFFICIENT_RESOURCES
;
57 Status
= IoCallDriver(pDeviceObject
, pIrp
);
59 /* Wait if neccessary */
60 if (STATUS_PENDING
== Status
)
62 KeWaitForSingleObject(&Event
, Executive
, KernelMode
, TRUE
, 0);
66 /* Return information to the caller about the operation. */
67 *lpInformation
= Iosb
.Information
;
76 IN PFILE_OBJECT pFileObject
,
79 IN PSIZE_T lpBytesWritten
)
81 EngpFileIoRequest(pFileObject
,
92 IN PFILE_OBJECT pFileObject
,
93 IN DWORD dwIoControlCode
,
95 IN SIZE_T nInBufferSize
,
96 OUT PVOID lpOutBuffer
,
97 IN SIZE_T nOutBufferSize
,
98 OUT LPDWORD lpInformation
)
100 PDEVICE_OBJECT pDeviceObject
;
103 IO_STATUS_BLOCK Iosb
;
106 /* Get corresponding device object */
107 pDeviceObject
= IoGetRelatedDeviceObject(pFileObject
);
110 return STATUS_INVALID_PARAMETER
;
113 /* Initialize an event */
114 KeInitializeEvent(&Event
, SynchronizationEvent
, FALSE
);
116 /* Build IO control IPR */
117 pIrp
= IoBuildDeviceIoControlRequest(dwIoControlCode
,
128 return STATUS_INSUFFICIENT_RESOURCES
;
131 /* Call the driver */
132 Status
= IoCallDriver(pDeviceObject
, pIrp
);
134 /* Wait if neccessary */
135 if (Status
== STATUS_PENDING
)
137 KeWaitForSingleObject(&Event
, Executive
, KernelMode
, TRUE
, 0);
138 Status
= Iosb
.Status
;
141 /* Return information to the caller about the operation. */
142 *lpInformation
= Iosb
.Information
;
144 /* This function returns NTSTATUS */
154 DWORD dwIoControlCode
,
158 DWORD nOutBufferSize
,
159 DWORD
*lpBytesReturned
)
164 IO_STATUS_BLOCK Iosb
;
165 PDEVICE_OBJECT DeviceObject
;
167 DPRINT("EngDeviceIoControl() called\n");
169 KeInitializeEvent(&Event
, SynchronizationEvent
, FALSE
);
171 DeviceObject
= (PDEVICE_OBJECT
) hDevice
;
173 Irp
= IoBuildDeviceIoControlRequest(dwIoControlCode
,
178 nOutBufferSize
, FALSE
, &Event
, &Iosb
);
179 if (!Irp
) return ERROR_NOT_ENOUGH_MEMORY
;
181 Status
= IoCallDriver(DeviceObject
, Irp
);
183 if (Status
== STATUS_PENDING
)
185 (VOID
)KeWaitForSingleObject(&Event
, Executive
, KernelMode
, TRUE
, 0);
186 Status
= Iosb
.Status
;
189 DPRINT("EngDeviceIoControl(): Returning %X/%X\n", Iosb
.Status
,
192 /* Return information to the caller about the operation. */
193 *lpBytesReturned
= Iosb
.Information
;
195 /* Convert NT status values to win32 error codes. */
198 case STATUS_INSUFFICIENT_RESOURCES
:
199 return ERROR_NOT_ENOUGH_MEMORY
;
201 case STATUS_BUFFER_OVERFLOW
:
202 return ERROR_MORE_DATA
;
204 case STATUS_NOT_IMPLEMENTED
:
205 return ERROR_INVALID_FUNCTION
;
207 case STATUS_INVALID_PARAMETER
:
208 return ERROR_INVALID_PARAMETER
;
210 case STATUS_BUFFER_TOO_SMALL
:
211 return ERROR_INSUFFICIENT_BUFFER
;
213 case STATUS_DEVICE_DOES_NOT_EXIST
:
214 return ERROR_DEV_NOT_EXIST
;
217 return ERROR_IO_PENDING
;