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;
165 /**********************************************************************
178 NTSTATUS STDCALL NtWriteFile(HANDLE FileHandle,
180 PIO_APC_ROUTINE ApcRoutine,
182 PIO_STATUS_BLOCK UserIoStatusBlock,
185 PLARGE_INTEGER ByteOffset,
189 PFILE_OBJECT FileObject;
191 PIO_STACK_LOCATION StackPtr;
192 PKEVENT Event = NULL;
193 IO_STATUS_BLOCK Iosb;
194 PIO_STATUS_BLOCK IoStatusBlock;
196 DPRINT("NtReadFile(FileHandle %x Buffer %x Length %x ByteOffset %x, "
197 "IoStatusBlock %x)\n", FileHandle, Buffer, Length, ByteOffset,
200 Status = ObReferenceObjectByHandle(FileHandle,
206 if (!NT_SUCCESS(Status))
211 if (ByteOffset == NULL)
213 ByteOffset = &FileObject->CurrentByteOffset;
216 if (EventHandle != NULL)
219 Status = ObReferenceObjectByHandle(EventHandle,
225 if (!NT_SUCCESS(Status))
227 ObDereferenceObject(FileObject);
230 #else /* !LIBCAPTIVE */
232 #endif /* LIBCAPTIVE */
236 Event = &FileObject->Event;
240 if (FileObject->Flags & FO_SYNCHRONOUS_IO)
242 IoStatusBlock = &Iosb;
246 IoStatusBlock = UserIoStatusBlock;
249 Irp = IoBuildSynchronousFsdRequest(IRP_MJ_WRITE,
250 FileObject->DeviceObject,
257 Irp->Overlay.AsynchronousParameters.UserApcRoutine = ApcRoutine;
258 Irp->Overlay.AsynchronousParameters.UserApcContext = ApcContext;
260 StackPtr = IoGetNextIrpStackLocation(Irp);
261 StackPtr->FileObject = FileObject;
264 StackPtr->Parameters.Write.Key = *Key;
268 StackPtr->Parameters.Write.Key = 0;
271 Status = IoCallDriver(FileObject->DeviceObject, Irp);
272 if (Status == STATUS_PENDING && FileObject->Flags & FO_SYNCHRONOUS_IO)
276 if (FileObject->Flags & FO_ALERTABLE_IO)
285 Status = KeWaitForSingleObject(Event,
290 if (Status != STATUS_WAIT_0)
295 Status = Iosb.Status;
298 if (FileObject->Flags & FO_SYNCHRONOUS_IO)
300 *UserIoStatusBlock = Iosb;
307 /**********************************************************************
323 IN HANDLE FileHandle,
324 IN HANDLE Event OPTIONAL,
325 IN PIO_APC_ROUTINE UserApcRoutine OPTIONAL,
326 IN PVOID UserApcContext OPTIONAL,
327 OUT PIO_STATUS_BLOCK UserIoStatusBlock,
328 IN FILE_SEGMENT_ELEMENT BufferDescription [],
329 IN ULONG BufferLength,
330 IN PLARGE_INTEGER ByteOffset,
331 IN PULONG Key OPTIONAL
338 /**********************************************************************
354 IN HANDLE FileHandle,
355 IN HANDLE Event OPTIONAL,
356 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
357 IN PVOID ApcContext OPTIONAL,
358 OUT PIO_STATUS_BLOCK IoStatusBlock,
359 IN FILE_SEGMENT_ELEMENT BufferDescription [],
360 IN ULONG BufferLength,
361 IN PLARGE_INTEGER ByteOffset,
362 IN PULONG Key OPTIONAL
368 #endif /* LIBCAPTIVE */