2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS system libraries
4 * FILE: lib/kernel32/file/rw.c
5 * PURPOSE: Read/write functions
6 * PROGRAMMER: Ariadne ( ariadne@xs4all.nl)
11 /* INCLUDES ****************************************************************/
14 #include <ddk/ntddk.h>
19 #include <kernel32/kernel32.h>
21 /* FUNCTIONS ****************************************************************/
26 WINBOOL STDCALL
WriteFile(HANDLE hFile
,
28 DWORD nNumberOfBytesToWrite
,
29 LPDWORD lpNumberOfBytesWritten
,
30 LPOVERLAPPED lpOverLapped
)
35 IO_STATUS_BLOCK IIosb
;
36 PIO_STATUS_BLOCK IoStatusBlock
;
37 PLARGE_INTEGER ptrOffset
;
39 DPRINT("WriteFile(hFile %x)\n",hFile
);
41 if (lpOverLapped
!= NULL
)
43 Offset
.u
.LowPart
= lpOverLapped
->Offset
;
44 Offset
.u
.HighPart
= lpOverLapped
->OffsetHigh
;
45 lpOverLapped
->Internal
= STATUS_PENDING
;
46 hEvent
= lpOverLapped
->hEvent
;
47 IoStatusBlock
= (PIO_STATUS_BLOCK
)lpOverLapped
;
53 IoStatusBlock
= &IIosb
;
57 errCode
= NtWriteFile(hFile
,
63 nNumberOfBytesToWrite
,
66 if (!NT_SUCCESS(errCode
))
68 SetLastError(RtlNtStatusToDosError(errCode
));
69 DPRINT("WriteFile() failed\n");
72 if (lpNumberOfBytesWritten
!= NULL
)
74 *lpNumberOfBytesWritten
= IoStatusBlock
->Information
;
76 DPRINT("WriteFile() succeeded\n");
82 WINBOOL STDCALL
ReadFile(HANDLE hFile
,
84 DWORD nNumberOfBytesToRead
,
85 LPDWORD lpNumberOfBytesRead
,
86 LPOVERLAPPED lpOverLapped
)
91 IO_STATUS_BLOCK IIosb
;
92 PIO_STATUS_BLOCK IoStatusBlock
;
93 PLARGE_INTEGER ptrOffset
;
95 if (lpOverLapped
!= NULL
)
97 Offset
.u
.LowPart
= lpOverLapped
->Offset
;
98 Offset
.u
.HighPart
= lpOverLapped
->OffsetHigh
;
99 lpOverLapped
->Internal
= STATUS_PENDING
;
100 hEvent
= lpOverLapped
->hEvent
;
101 IoStatusBlock
= (PIO_STATUS_BLOCK
)lpOverLapped
;
107 IoStatusBlock
= &IIosb
;
110 errCode
= NtReadFile(hFile
,
116 nNumberOfBytesToRead
,
120 if (errCode
!= STATUS_PENDING
&& lpNumberOfBytesRead
!= NULL
)
122 *lpNumberOfBytesRead
= IoStatusBlock
->Information
;
125 if (!NT_SUCCESS(errCode
))
127 SetLastError(RtlNtStatusToDosError(errCode
));
133 VOID
ApcRoutine(PVOID ApcContext
, struct _IO_STATUS_BLOCK
* IoStatusBlock
, ULONG NumberOfBytesTransfered
)
136 LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
= (LPOVERLAPPED_COMPLETION_ROUTINE
)ApcContext
;
138 dwErrorCode
= RtlNtStatusToDosError( IoStatusBlock
->Status
);
139 lpCompletionRoutine( dwErrorCode
, NumberOfBytesTransfered
, (LPOVERLAPPED
)IoStatusBlock
);
146 DWORD nNumberOfBytesToWrite
,
147 LPOVERLAPPED lpOverLapped
,
148 LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
152 LARGE_INTEGER Offset
;
154 PIO_STATUS_BLOCK IoStatusBlock
;
155 PLARGE_INTEGER ptrOffset
;
157 DPRINT("WriteFileEx(hFile %x)\n",hFile
);
159 if (lpOverLapped
== NULL
)
162 Offset
.u
.LowPart
= lpOverLapped
->Offset
;
163 Offset
.u
.HighPart
= lpOverLapped
->OffsetHigh
;
164 lpOverLapped
->Internal
= STATUS_PENDING
;
165 IoStatusBlock
= (PIO_STATUS_BLOCK
)lpOverLapped
;
170 errCode
= NtWriteFile(hFile
,
176 nNumberOfBytesToWrite
,
179 if (!NT_SUCCESS(errCode
))
181 SetLastError(RtlNtStatusToDosError(errCode
));
182 DPRINT("WriteFileEx() failed\n");
186 DPRINT("WriteFileEx() succeeded\n");
190 WINBOOL STDCALL
ReadFileEx(HANDLE hFile
,
192 DWORD nNumberOfBytesToRead
,
193 LPOVERLAPPED lpOverLapped
,
194 LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
)
196 LARGE_INTEGER Offset
;
198 PIO_STATUS_BLOCK IoStatusBlock
;
199 PLARGE_INTEGER ptrOffset
;
201 if (lpOverLapped
== NULL
)
204 Offset
.u
.LowPart
= lpOverLapped
->Offset
;
205 Offset
.u
.HighPart
= lpOverLapped
->OffsetHigh
;
206 lpOverLapped
->Internal
= STATUS_PENDING
;
207 IoStatusBlock
= (PIO_STATUS_BLOCK
)lpOverLapped
;
211 errCode
= NtReadFile(hFile
,
217 nNumberOfBytesToRead
,
222 if (!NT_SUCCESS(errCode
))
224 SetLastError(RtlNtStatusToDosError(errCode
));