3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * FILE: ntoskrnl/io/rw.c
6 * PURPOSE: Implements read/write APIs
7 * PROGRAMMER: David Welch (welch@cwcom.net)
12 /* INCLUDES ****************************************************************/
14 #include <ddk/ntddk.h>
15 #include <internal/io.h>
16 #include <internal/ob.h>
19 #include <internal/debug.h>
21 /* FUNCTIONS ***************************************************************/
24 /**********************************************************************
37 NTSTATUS STDCALL NtReadFile(HANDLE FileHandle,
39 PIO_APC_ROUTINE ApcRoutine,
41 PIO_STATUS_BLOCK UserIoStatusBlock,
44 PLARGE_INTEGER ByteOffset,
48 PFILE_OBJECT FileObject;
50 PIO_STACK_LOCATION StackPtr;
53 PIO_STATUS_BLOCK IoStatusBlock;
55 DPRINT("NtReadFile(FileHandle %x Buffer %x Length %x ByteOffset %x, "
56 "IoStatusBlock %x)\n", FileHandle, Buffer, Length, ByteOffset,
59 Status = ObReferenceObjectByHandle(FileHandle,
65 if (!NT_SUCCESS(Status))
70 if (ByteOffset == NULL)
72 ByteOffset = &FileObject->CurrentByteOffset;
75 if (EventHandle != NULL)
78 Status = ObReferenceObjectByHandle(EventHandle,
84 if (!NT_SUCCESS(Status))
86 ObDereferenceObject(FileObject);
89 #else /* !LIBCAPTIVE */
91 #endif /* LIBCAPTIVE */
95 Event = &FileObject->Event;
99 if (FileObject->Flags & FO_SYNCHRONOUS_IO)
101 IoStatusBlock = &Iosb;
105 IoStatusBlock = UserIoStatusBlock;
108 Irp = IoBuildSynchronousFsdRequest(IRP_MJ_READ,
109 FileObject->DeviceObject,
116 Irp->Overlay.AsynchronousParameters.UserApcRoutine = ApcRoutine;
117 Irp->Overlay.AsynchronousParameters.UserApcContext = ApcContext;
119 StackPtr = IoGetNextIrpStackLocation(Irp);
120 StackPtr->FileObject = FileObject;
123 StackPtr->Parameters.Read.Key = *Key;
127 StackPtr->Parameters.Read.Key = 0;
130 Status = IoCallDriver(FileObject->DeviceObject, Irp);
131 if (Status == STATUS_PENDING && FileObject->Flags & FO_SYNCHRONOUS_IO)
135 if (FileObject->Flags & FO_ALERTABLE_IO)
144 Status = KeWaitForSingleObject(Event,
149 if (Status != STATUS_WAIT_0)
154 Status = Iosb.Status;
157 if (FileObject->Flags & FO_SYNCHRONOUS_IO)
159 *UserIoStatusBlock = Iosb;
166 /**********************************************************************
179 NTSTATUS STDCALL NtWriteFile(HANDLE FileHandle,
181 PIO_APC_ROUTINE ApcRoutine,
183 PIO_STATUS_BLOCK UserIoStatusBlock,
186 PLARGE_INTEGER ByteOffset,
190 PFILE_OBJECT FileObject;
192 PIO_STACK_LOCATION StackPtr;
193 PKEVENT Event = NULL;
194 IO_STATUS_BLOCK Iosb;
195 PIO_STATUS_BLOCK IoStatusBlock;
197 DPRINT("NtReadFile(FileHandle %x Buffer %x Length %x ByteOffset %x, "
198 "IoStatusBlock %x)\n", FileHandle, Buffer, Length, ByteOffset,
201 Status = ObReferenceObjectByHandle(FileHandle,
207 if (!NT_SUCCESS(Status))
212 if (ByteOffset == NULL)
214 ByteOffset = &FileObject->CurrentByteOffset;
217 if (EventHandle != NULL)
219 Status = ObReferenceObjectByHandle(EventHandle,
225 if (!NT_SUCCESS(Status))
227 ObDereferenceObject(FileObject);
233 Event = &FileObject->Event;
237 if (FileObject->Flags & FO_SYNCHRONOUS_IO)
239 IoStatusBlock = &Iosb;
243 IoStatusBlock = UserIoStatusBlock;
246 Irp = IoBuildSynchronousFsdRequest(IRP_MJ_WRITE,
247 FileObject->DeviceObject,
254 Irp->Overlay.AsynchronousParameters.UserApcRoutine = ApcRoutine;
255 Irp->Overlay.AsynchronousParameters.UserApcContext = ApcContext;
257 StackPtr = IoGetNextIrpStackLocation(Irp);
258 StackPtr->FileObject = FileObject;
261 StackPtr->Parameters.Write.Key = *Key;
265 StackPtr->Parameters.Write.Key = 0;
268 Status = IoCallDriver(FileObject->DeviceObject, Irp);
269 if (Status == STATUS_PENDING && FileObject->Flags & FO_SYNCHRONOUS_IO)
273 if (FileObject->Flags & FO_ALERTABLE_IO)
282 Status = KeWaitForSingleObject(Event,
287 if (Status != STATUS_WAIT_0)
292 Status = Iosb.Status;
295 if (FileObject->Flags & FO_SYNCHRONOUS_IO)
297 *UserIoStatusBlock = Iosb;
303 /**********************************************************************
319 IN HANDLE FileHandle,
320 IN HANDLE Event OPTIONAL,
321 IN PIO_APC_ROUTINE UserApcRoutine OPTIONAL,
322 IN PVOID UserApcContext OPTIONAL,
323 OUT PIO_STATUS_BLOCK UserIoStatusBlock,
324 IN FILE_SEGMENT_ELEMENT BufferDescription [],
325 IN ULONG BufferLength,
326 IN PLARGE_INTEGER ByteOffset,
327 IN PULONG Key OPTIONAL
334 /**********************************************************************
350 IN HANDLE FileHandle,
351 IN HANDLE Event OPTIONAL,
352 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
353 IN PVOID ApcContext OPTIONAL,
354 OUT PIO_STATUS_BLOCK IoStatusBlock,
355 IN FILE_SEGMENT_ELEMENT BufferDescription [],
356 IN ULONG BufferLength,
357 IN PLARGE_INTEGER ByteOffset,
358 IN PULONG Key OPTIONAL
364 #endif /* LIBCAPTIVE */