1 /* $Id: rw.c,v 1.29 2000/05/09 16:13:49 ekohl Exp $
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>
17 #include <internal/string.h>
18 #include <internal/ob.h>
21 #include <internal/debug.h>
23 /* DATA ********************************************************************/
27 /* FUNCTIONS ***************************************************************/
30 /**********************************************************************
43 NTSTATUS STDCALL
NtReadFile(HANDLE FileHandle
,
45 PIO_APC_ROUTINE ApcRoutine
,
47 PIO_STATUS_BLOCK IoStatusBlock
,
50 PLARGE_INTEGER ByteOffset
,
54 PFILE_OBJECT FileObject
;
56 PIO_STACK_LOCATION StackPtr
;
57 PKEVENT ptrEvent
= NULL
;
60 DPRINT("NtReadFile(FileHandle %x Buffer %x Length %x ByteOffset %x, "
61 "IoStatusBlock %x)\n", FileHandle
, Buffer
, Length
, ByteOffset
,
64 assert_irql(PASSIVE_LEVEL
);
66 Status
= ObReferenceObjectByHandle(FileHandle
,
70 (PVOID
*) & FileObject
,
72 if (!NT_SUCCESS(Status
))
74 DPRINT("NtReadFile() = %x\n",Status
);
78 DPRINT("ByteOffset %x FileObject->CurrentByteOffset %d\n",
79 ByteOffset
, FileObject
->CurrentByteOffset
.u
.LowPart
);
80 if (ByteOffset
== NULL
)
82 ByteOffset
= &(FileObject
->CurrentByteOffset
);
85 if (EventHandle
!= NULL
)
87 Status
= ObReferenceObjectByHandle(EventHandle
,
93 if (!NT_SUCCESS(Status
))
100 KeInitializeEvent(&Event
,
106 DPRINT("FileObject %x\n",FileObject
);
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
,
132 if ((Status
== STATUS_PENDING
)
133 && (FileObject
->Flags
& FO_SYNCHRONOUS_IO
))
135 KeWaitForSingleObject(&Event
,
140 Status
= IoStatusBlock
->Status
;
143 DPRINT("NtReadFile() = %x\n",Status
);
145 assert_irql(PASSIVE_LEVEL
);
151 /**********************************************************************
169 PIO_APC_ROUTINE ApcRoutine
,
171 PIO_STATUS_BLOCK IoStatusBlock
,
174 PLARGE_INTEGER ByteOffset
,
179 PFILE_OBJECT FileObject
;
181 PIO_STACK_LOCATION StackPtr
;
185 "NtWriteFile(FileHandle %x, Buffer %x, Length %d)\n",
191 Status
= ObReferenceObjectByHandle(
196 (PVOID
*) & FileObject
,
199 if (!NT_SUCCESS(Status
))
203 if (ByteOffset
== NULL
)
205 ByteOffset
= & (FileObject
->CurrentByteOffset
);
213 Irp
= IoBuildSynchronousFsdRequest(
215 FileObject
->DeviceObject
,
223 Irp
->Overlay
.AsynchronousParameters
.UserApcRoutine
= ApcRoutine
;
224 Irp
->Overlay
.AsynchronousParameters
.UserApcContext
= ApcContext
;
226 DPRINT("FileObject->DeviceObject %x\n",FileObject
->DeviceObject
);
228 StackPtr
= IoGetNextIrpStackLocation(Irp
);
229 StackPtr
->FileObject
= FileObject
;
232 StackPtr
->Parameters
.Write
.Key
= *Key
;
236 StackPtr
->Parameters
.Write
.Key
= 0;
238 Status
= IoCallDriver(
239 FileObject
->DeviceObject
,
243 (Status
== STATUS_PENDING
)
244 && (FileObject
->Flags
& FO_SYNCHRONOUS_IO
)
247 KeWaitForSingleObject(
254 Status
= Irp
->IoStatus
.Status
;
260 /**********************************************************************
276 IN HANDLE FileHandle
,
277 IN HANDLE Event OPTIONAL
,
278 IN PIO_APC_ROUTINE UserApcRoutine OPTIONAL
,
279 IN PVOID UserApcContext OPTIONAL
,
280 OUT PIO_STATUS_BLOCK UserIoStatusBlock
,
281 IN FILE_SEGMENT_ELEMENT BufferDescription
[],
282 IN ULONG BufferLength
,
283 IN PLARGE_INTEGER ByteOffset
,
284 IN PULONG Key OPTIONAL
291 /**********************************************************************
307 IN HANDLE FileHandle
,
308 IN HANDLE Event OPTIONAL
,
309 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL
,
310 IN PVOID ApcContext OPTIONAL
,
311 OUT PIO_STATUS_BLOCK IoStatusBlock
,
312 IN FILE_SEGMENT_ELEMENT BufferDescription
[],
313 IN ULONG BufferLength
,
314 IN PLARGE_INTEGER ByteOffset
,
315 IN PULONG Key OPTIONAL