3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS system libraries
5 * FILE: lib/kernel32/file/rw.c
6 * PURPOSE: Read/write functions
7 * PROGRAMMER: Ariadne ( ariadne@xs4all.nl)
12 /* INCLUDES ****************************************************************/
17 #include <kernel32/kernel32.h>
20 /* FUNCTIONS ****************************************************************/
22 WINBOOL STDCALL WriteFile(HANDLE hFile,
24 DWORD nNumberOfBytesToWrite,
25 LPDWORD lpNumberOfBytesWritten,
26 LPOVERLAPPED lpOverLapped)
31 IO_STATUS_BLOCK IIosb;
32 PIO_STATUS_BLOCK IoStatusBlock;
33 PLARGE_INTEGER ptrOffset;
35 DPRINT("WriteFile(hFile %x)\n",hFile);
37 if (IsConsoleHandle(hFile))
39 return(WriteConsoleA(hFile,
41 nNumberOfBytesToWrite,
42 lpNumberOfBytesWritten,
46 if (lpOverLapped != NULL)
48 Offset.u.LowPart = lpOverLapped->Offset;
49 Offset.u.HighPart = lpOverLapped->OffsetHigh;
50 lpOverLapped->Internal = STATUS_PENDING;
51 hEvent = lpOverLapped->hEvent;
52 IoStatusBlock = (PIO_STATUS_BLOCK)lpOverLapped;
58 IoStatusBlock = &IIosb;
62 errCode = NtWriteFile(hFile,
68 nNumberOfBytesToWrite,
71 if (!NT_SUCCESS(errCode))
73 SetLastErrorByStatus (errCode);
74 DPRINT("WriteFile() failed\n");
77 if (lpNumberOfBytesWritten != NULL )
79 *lpNumberOfBytesWritten = IoStatusBlock->Information;
81 DPRINT("WriteFile() succeeded\n");
87 WINBOOL STDCALL ReadFile(HANDLE hFile,
89 DWORD nNumberOfBytesToRead,
90 LPDWORD lpNumberOfBytesRead,
91 LPOVERLAPPED lpOverLapped)
96 IO_STATUS_BLOCK IIosb;
97 PIO_STATUS_BLOCK IoStatusBlock;
98 PLARGE_INTEGER ptrOffset;
100 if (IsConsoleHandle(hFile))
102 return(ReadConsoleA(hFile,
104 nNumberOfBytesToRead,
109 if (lpOverLapped != NULL)
111 Offset.u.LowPart = lpOverLapped->Offset;
112 Offset.u.HighPart = lpOverLapped->OffsetHigh;
113 lpOverLapped->Internal = STATUS_PENDING;
114 hEvent = lpOverLapped->hEvent;
115 IoStatusBlock = (PIO_STATUS_BLOCK)lpOverLapped;
121 IoStatusBlock = &IIosb;
124 errCode = NtReadFile(hFile,
130 nNumberOfBytesToRead,
134 if (errCode != STATUS_PENDING && lpNumberOfBytesRead != NULL)
136 *lpNumberOfBytesRead = IoStatusBlock->Information;
139 if (!NT_SUCCESS(errCode) && errCode != STATUS_END_OF_FILE)
141 SetLastErrorByStatus (errCode);
147 VOID STDCALL ApcRoutine(PVOID ApcContext,
148 struct _IO_STATUS_BLOCK* IoStatusBlock,
149 ULONG NumberOfBytesTransfered)
152 LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine =
153 (LPOVERLAPPED_COMPLETION_ROUTINE)ApcContext;
155 dwErrorCode = RtlNtStatusToDosError(IoStatusBlock->Status);
156 lpCompletionRoutine(dwErrorCode,
157 NumberOfBytesTransfered,
158 (LPOVERLAPPED)IoStatusBlock);
163 WriteFileEx (HANDLE hFile,
165 DWORD nNumberOfBytesToWrite,
166 LPOVERLAPPED lpOverLapped,
167 LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine)
170 LARGE_INTEGER Offset;
172 PIO_STATUS_BLOCK IoStatusBlock;
173 PLARGE_INTEGER ptrOffset;
175 DPRINT("WriteFileEx(hFile %x)\n",hFile);
177 if (lpOverLapped == NULL)
180 Offset.u.LowPart = lpOverLapped->Offset;
181 Offset.u.HighPart = lpOverLapped->OffsetHigh;
182 lpOverLapped->Internal = STATUS_PENDING;
183 IoStatusBlock = (PIO_STATUS_BLOCK)lpOverLapped;
186 errCode = NtWriteFile(hFile,
192 nNumberOfBytesToWrite,
195 if (!NT_SUCCESS(errCode))
197 SetLastErrorByStatus (errCode);
198 DPRINT("WriteFileEx() failed\n");
202 DPRINT("WriteFileEx() succeeded\n");
206 WINBOOL STDCALL ReadFileEx(HANDLE hFile,
208 DWORD nNumberOfBytesToRead,
209 LPOVERLAPPED lpOverLapped,
210 LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine)
212 LARGE_INTEGER Offset;
214 PIO_STATUS_BLOCK IoStatusBlock;
215 PLARGE_INTEGER ptrOffset;
217 if (lpOverLapped == NULL)
220 Offset.u.LowPart = lpOverLapped->Offset;
221 Offset.u.HighPart = lpOverLapped->OffsetHigh;
222 lpOverLapped->Internal = STATUS_PENDING;
223 IoStatusBlock = (PIO_STATUS_BLOCK)lpOverLapped;
226 errCode = NtReadFile(hFile,
232 nNumberOfBytesToRead,
236 if (!NT_SUCCESS(errCode))
238 SetLastErrorByStatus (errCode);