1 /* $Id: deviceio.c,v 1.7 2000/06/03 14:47:32 ea Exp $
3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS system libraries
5 * FILE: lib/kernel32/file/deviceio.c
6 * PURPOSE: Device I/O and Overlapped Result functions
7 * PROGRAMMER: Ariadne (ariadne@xs4all.nl)
12 #include <ddk/ntddk.h>
16 #include <kernel32/kernel32.h>
17 #include <kernel32/error.h>
24 DWORD dwIoControlCode
,
29 LPDWORD lpBytesReturned
,
30 LPOVERLAPPED lpOverlapped
35 PIO_STATUS_BLOCK IoStatusBlock
;
36 IO_STATUS_BLOCK IIosb
;
38 WINBOOL bFsIoControlCode
= FALSE
;
40 if (lpBytesReturned
== NULL
)
42 SetLastErrorByStatus (STATUS_INVALID_PARAMETER
);
46 if (((dwIoControlCode
>> 16) & FILE_DEVICE_FILE_SYSTEM
) == FILE_DEVICE_FILE_SYSTEM
)
47 bFsIoControlCode
= TRUE
;
49 bFsIoControlCode
= FALSE
;
51 if(lpOverlapped
!= NULL
)
53 hEvent
= lpOverlapped
->hEvent
;
54 lpOverlapped
->Internal
= STATUS_PENDING
;
55 IoStatusBlock
= (PIO_STATUS_BLOCK
)lpOverlapped
;
59 IoStatusBlock
= &IIosb
;
62 if (bFsIoControlCode
== TRUE
)
64 errCode
= NtFsControlFile (hDevice
,
77 errCode
= NtDeviceIoControlFile (hDevice
,
89 if (errCode
== STATUS_PENDING
)
91 if (NtWaitForSingleObject(hDevice
,FALSE
,NULL
) < 0)
93 *lpBytesReturned
= IoStatusBlock
->Information
;
94 SetLastErrorByStatus (errCode
);
98 else if (!NT_SUCCESS(errCode
))
100 SetLastErrorByStatus (errCode
);
105 *lpBytesReturned
= lpOverlapped
->InternalHigh
;
107 *lpBytesReturned
= IoStatusBlock
->Information
;
115 GetOverlappedResult (
117 LPOVERLAPPED lpOverlapped
,
118 LPDWORD lpNumberOfBytesTransferred
,
124 if (lpOverlapped
== NULL
)
126 SetLastErrorByStatus(STATUS_INVALID_PARAMETER
);
130 if (lpOverlapped
->Internal
== STATUS_PENDING
)
132 if (lpNumberOfBytesTransferred
== 0)
134 SetLastErrorByStatus (STATUS_PENDING
);
137 else if (bWait
== TRUE
)
139 if (lpOverlapped
->hEvent
!= NULL
)
141 WaitStatus
= WaitForSingleObject (lpOverlapped
->hEvent
,
143 if (WaitStatus
== STATUS_TIMEOUT
)
145 SetLastError (ERROR_IO_INCOMPLETE
);
149 return GetOverlappedResult (hFile
,
151 lpNumberOfBytesTransferred
,
157 *lpNumberOfBytesTransferred
= lpOverlapped
->InternalHigh
;
159 if (lpOverlapped
->Internal
< 0)
161 SetLastErrorByStatus (lpOverlapped
->Internal
);