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)
77 Status = ObReferenceObjectByHandle(EventHandle,
83 if (!NT_SUCCESS(Status))
85 ObDereferenceObject(FileObject);
91 Event = &FileObject->Event;
95 if (FileObject->Flags & FO_SYNCHRONOUS_IO)
97 IoStatusBlock = &Iosb;
101 IoStatusBlock = UserIoStatusBlock;
104 Irp = IoBuildSynchronousFsdRequest(IRP_MJ_READ,
105 FileObject->DeviceObject,
112 Irp->Overlay.AsynchronousParameters.UserApcRoutine = ApcRoutine;
113 Irp->Overlay.AsynchronousParameters.UserApcContext = ApcContext;
115 StackPtr = IoGetNextIrpStackLocation(Irp);
116 StackPtr->FileObject = FileObject;
119 StackPtr->Parameters.Read.Key = *Key;
123 StackPtr->Parameters.Read.Key = 0;
126 Status = IoCallDriver(FileObject->DeviceObject, Irp);
127 if (Status == STATUS_PENDING && FileObject->Flags & FO_SYNCHRONOUS_IO)
131 if (FileObject->Flags & FO_ALERTABLE_IO)
140 Status = KeWaitForSingleObject(Event,
145 if (Status != STATUS_WAIT_0)
150 Status = Iosb.Status;
153 if (FileObject->Flags & FO_SYNCHRONOUS_IO)
155 *UserIoStatusBlock = Iosb;
161 /**********************************************************************
174 NTSTATUS STDCALL NtWriteFile(HANDLE FileHandle,
176 PIO_APC_ROUTINE ApcRoutine,
178 PIO_STATUS_BLOCK UserIoStatusBlock,
181 PLARGE_INTEGER ByteOffset,
185 PFILE_OBJECT FileObject;
187 PIO_STACK_LOCATION StackPtr;
188 PKEVENT Event = NULL;
189 IO_STATUS_BLOCK Iosb;
190 PIO_STATUS_BLOCK IoStatusBlock;
192 DPRINT("NtWriteFile(FileHandle %x Buffer %x Length %x ByteOffset %x, "
193 "IoStatusBlock %x)\n", FileHandle, Buffer, Length, ByteOffset,
196 Status = ObReferenceObjectByHandle(FileHandle,
202 if (!NT_SUCCESS(Status))
207 if (ByteOffset == NULL)
209 ByteOffset = &FileObject->CurrentByteOffset;
212 if (EventHandle != NULL)
214 Status = ObReferenceObjectByHandle(EventHandle,
220 if (!NT_SUCCESS(Status))
222 ObDereferenceObject(FileObject);
228 Event = &FileObject->Event;
232 if (FileObject->Flags & FO_SYNCHRONOUS_IO)
234 IoStatusBlock = &Iosb;
238 IoStatusBlock = UserIoStatusBlock;
241 Irp = IoBuildSynchronousFsdRequest(IRP_MJ_WRITE,
242 FileObject->DeviceObject,
249 Irp->Overlay.AsynchronousParameters.UserApcRoutine = ApcRoutine;
250 Irp->Overlay.AsynchronousParameters.UserApcContext = ApcContext;
252 StackPtr = IoGetNextIrpStackLocation(Irp);
253 StackPtr->FileObject = FileObject;
256 StackPtr->Parameters.Write.Key = *Key;
260 StackPtr->Parameters.Write.Key = 0;
263 Status = IoCallDriver(FileObject->DeviceObject, Irp);
264 if (Status == STATUS_PENDING && FileObject->Flags & FO_SYNCHRONOUS_IO)
268 if (FileObject->Flags & FO_ALERTABLE_IO)
277 Status = KeWaitForSingleObject(Event,
282 if (Status != STATUS_WAIT_0)
287 Status = Iosb.Status;
290 if (FileObject->Flags & FO_SYNCHRONOUS_IO)
292 *UserIoStatusBlock = Iosb;
298 /**********************************************************************
314 IN HANDLE FileHandle,
315 IN HANDLE Event OPTIONAL,
316 IN PIO_APC_ROUTINE UserApcRoutine OPTIONAL,
317 IN PVOID UserApcContext OPTIONAL,
318 OUT PIO_STATUS_BLOCK UserIoStatusBlock,
319 IN FILE_SEGMENT_ELEMENT BufferDescription [],
320 IN ULONG BufferLength,
321 IN PLARGE_INTEGER ByteOffset,
322 IN PULONG Key OPTIONAL
329 /**********************************************************************
345 IN HANDLE FileHandle,
346 IN HANDLE Event OPTIONAL,
347 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
348 IN PVOID ApcContext OPTIONAL,
349 OUT PIO_STATUS_BLOCK IoStatusBlock,
350 IN FILE_SEGMENT_ELEMENT BufferDescription [],
351 IN ULONG BufferLength,
352 IN PLARGE_INTEGER ByteOffset,
353 IN PULONG Key OPTIONAL