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 ****************************************************************/
14 #include <ddk/ntddk.h>
20 #include <kernel32/kernel32.h>
21 #include <kernel32/error.h>
24 /* 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 (IsConsoleHandle(hFile))
43 return(WriteConsoleA(hFile,
45 nNumberOfBytesToWrite,
46 lpNumberOfBytesWritten,
50 if (lpOverLapped != NULL)
52 Offset.u.LowPart = lpOverLapped->Offset;
53 Offset.u.HighPart = lpOverLapped->OffsetHigh;
54 lpOverLapped->Internal = STATUS_PENDING;
55 hEvent = lpOverLapped->hEvent;
56 IoStatusBlock = (PIO_STATUS_BLOCK)lpOverLapped;
62 IoStatusBlock = &IIosb;
66 errCode = NtWriteFile(hFile,
72 nNumberOfBytesToWrite,
75 if (!NT_SUCCESS(errCode))
77 SetLastErrorByStatus (errCode);
78 DPRINT("WriteFile() failed\n");
81 if (lpNumberOfBytesWritten != NULL )
83 *lpNumberOfBytesWritten = IoStatusBlock->Information;
85 DPRINT("WriteFile() succeeded\n");
91 WINBOOL STDCALL ReadFile(HANDLE hFile,
93 DWORD nNumberOfBytesToRead,
94 LPDWORD lpNumberOfBytesRead,
95 LPOVERLAPPED lpOverLapped)
100 IO_STATUS_BLOCK IIosb;
101 PIO_STATUS_BLOCK IoStatusBlock;
102 PLARGE_INTEGER ptrOffset;
104 if (IsConsoleHandle(hFile))
106 return(ReadConsoleA(hFile,
108 nNumberOfBytesToRead,
113 if (lpOverLapped != NULL)
115 Offset.u.LowPart = lpOverLapped->Offset;
116 Offset.u.HighPart = lpOverLapped->OffsetHigh;
117 lpOverLapped->Internal = STATUS_PENDING;
118 hEvent = lpOverLapped->hEvent;
119 IoStatusBlock = (PIO_STATUS_BLOCK)lpOverLapped;
125 IoStatusBlock = &IIosb;
128 errCode = NtReadFile(hFile,
134 nNumberOfBytesToRead,
138 if (errCode != STATUS_PENDING && lpNumberOfBytesRead != NULL)
140 *lpNumberOfBytesRead = IoStatusBlock->Information;
143 if (!NT_SUCCESS(errCode) && errCode != STATUS_END_OF_FILE)
145 SetLastErrorByStatus (errCode);
151 VOID STDCALL ApcRoutine(PVOID ApcContext,
152 struct _IO_STATUS_BLOCK* IoStatusBlock,
153 ULONG NumberOfBytesTransfered)
156 LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine =
157 (LPOVERLAPPED_COMPLETION_ROUTINE)ApcContext;
159 dwErrorCode = RtlNtStatusToDosError(IoStatusBlock->Status);
160 lpCompletionRoutine(dwErrorCode,
161 NumberOfBytesTransfered,
162 (LPOVERLAPPED)IoStatusBlock);
167 WriteFileEx (HANDLE hFile,
169 DWORD nNumberOfBytesToWrite,
170 LPOVERLAPPED lpOverLapped,
171 LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine)
174 LARGE_INTEGER Offset;
176 PIO_STATUS_BLOCK IoStatusBlock;
177 PLARGE_INTEGER ptrOffset;
179 DPRINT("WriteFileEx(hFile %x)\n",hFile);
181 if (lpOverLapped == NULL)
184 Offset.u.LowPart = lpOverLapped->Offset;
185 Offset.u.HighPart = lpOverLapped->OffsetHigh;
186 lpOverLapped->Internal = STATUS_PENDING;
187 IoStatusBlock = (PIO_STATUS_BLOCK)lpOverLapped;
190 errCode = NtWriteFile(hFile,
196 nNumberOfBytesToWrite,
199 if (!NT_SUCCESS(errCode))
201 SetLastErrorByStatus (errCode);
202 DPRINT("WriteFileEx() failed\n");
206 DPRINT("WriteFileEx() succeeded\n");
210 WINBOOL STDCALL ReadFileEx(HANDLE hFile,
212 DWORD nNumberOfBytesToRead,
213 LPOVERLAPPED lpOverLapped,
214 LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine)
216 LARGE_INTEGER Offset;
218 PIO_STATUS_BLOCK IoStatusBlock;
219 PLARGE_INTEGER ptrOffset;
221 if (lpOverLapped == NULL)
224 Offset.u.LowPart = lpOverLapped->Offset;
225 Offset.u.HighPart = lpOverLapped->OffsetHigh;
226 lpOverLapped->Internal = STATUS_PENDING;
227 IoStatusBlock = (PIO_STATUS_BLOCK)lpOverLapped;
230 errCode = NtReadFile(hFile,
236 nNumberOfBytesToRead,
240 if (!NT_SUCCESS(errCode))
242 SetLastErrorByStatus (errCode);