2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS system libraries
4 * FILE: lib/kernel32/file/deviceio.c
5 * PURPOSE: Device I/O and Overlapped Result functions
6 * PROGRAMMER: Ariadne (ariadne@xs4all.nl)
12 #include <ddk/ntddk.h>
15 #include <kernel32/kernel32.h>
22 DWORD dwIoControlCode
,
27 LPDWORD lpBytesReturned
,
28 LPOVERLAPPED lpOverlapped
33 PIO_STATUS_BLOCK IoStatusBlock
;
34 IO_STATUS_BLOCK IIosb
;
36 WINBOOL bFsIoControlCode
= FALSE
;
38 if ( lpBytesReturned
== NULL
) {
39 SetLastError(RtlNtStatusToDosError(STATUS_INVALID_PARAMETER
));
43 if( ( ( dwIoControlCode
>> 16 ) & FILE_DEVICE_FILE_SYSTEM
) == FILE_DEVICE_FILE_SYSTEM
)
44 bFsIoControlCode
= TRUE
;
46 bFsIoControlCode
= FALSE
;
48 if(lpOverlapped
!= NULL
) {
49 hEvent
= lpOverlapped
->hEvent
;
50 lpOverlapped
->Internal
= STATUS_PENDING
;
51 IoStatusBlock
= (PIO_STATUS_BLOCK
)lpOverlapped
;
54 IoStatusBlock
= &IIosb
;
58 if(bFsIoControlCode
== TRUE
) {
59 errCode
= NtFsControlFile(hDevice
,hEvent
,NULL
,NULL
,IoStatusBlock
,dwIoControlCode
,lpInBuffer
, nInBufferSize
, lpOutBuffer
, nOutBufferSize
);
61 errCode
= NtDeviceIoControlFile(hDevice
,hEvent
,NULL
,NULL
,IoStatusBlock
,dwIoControlCode
, lpInBuffer
, nInBufferSize
, lpOutBuffer
, nOutBufferSize
);
64 if(errCode
== STATUS_PENDING
) {
66 if(NtWaitForSingleObject(hDevice
,FALSE
,NULL
) < 0) {
67 *lpBytesReturned
= IoStatusBlock
->Information
;
68 SetLastError(RtlNtStatusToDosError(errCode
));
72 } else if ( !NT_SUCCESS(errCode
) ) {
73 SetLastError(RtlNtStatusToDosError(errCode
));
78 *lpBytesReturned
= lpOverlapped
->InternalHigh
;
80 *lpBytesReturned
= IoStatusBlock
->Information
;
91 LPOVERLAPPED lpOverlapped
,
92 LPDWORD lpNumberOfBytesTransferred
,
98 if ( lpOverlapped
== NULL
) {
99 SetLastError(RtlNtStatusToDosError(STATUS_INVALID_PARAMETER
));
102 if ( lpOverlapped
->Internal
== STATUS_PENDING
) {
103 if ( lpNumberOfBytesTransferred
== 0 ) {
104 SetLastError(RtlNtStatusToDosError(STATUS_PENDING
));
107 else if ( bWait
== TRUE
) {
108 if ( lpOverlapped
->hEvent
!= NULL
) {
109 WaitStatus
= WaitForSingleObject(lpOverlapped
->hEvent
,-1);
110 if ( WaitStatus
== STATUS_TIMEOUT
) {
111 SetLastError(ERROR_IO_INCOMPLETE
);
115 return GetOverlappedResult(hFile
,lpOverlapped
,lpNumberOfBytesTransferred
,FALSE
);
120 *lpNumberOfBytesTransferred
= lpOverlapped
->InternalHigh
;
121 if ( lpOverlapped
->Internal
< 0 ) {
122 SetLastError(RtlNtStatusToDosError(lpOverlapped
->Internal
));