1 /* $Id: rw.c,v 1.33 2000/10/22 16:36:50 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>
16 #include <internal/ob.h>
19 #include <internal/debug.h>
21 /* DATA ********************************************************************/
25 /* FUNCTIONS ***************************************************************/
28 /**********************************************************************
41 NTSTATUS STDCALL
NtReadFile(HANDLE FileHandle
,
43 PIO_APC_ROUTINE ApcRoutine
,
45 PIO_STATUS_BLOCK IoStatusBlock
,
48 PLARGE_INTEGER ByteOffset
,
52 PFILE_OBJECT FileObject
;
54 PIO_STACK_LOCATION StackPtr
;
55 PKEVENT ptrEvent
= NULL
;
58 DPRINT("NtReadFile(FileHandle %x Buffer %x Length %x ByteOffset %x, "
59 "IoStatusBlock %x)\n", FileHandle
, Buffer
, Length
, ByteOffset
,
62 Status
= ObReferenceObjectByHandle(FileHandle
,
68 if (!NT_SUCCESS(Status
))
70 DPRINT("NtReadFile() = %x\n",Status
);
74 if (ByteOffset
== NULL
)
76 ByteOffset
= &FileObject
->CurrentByteOffset
;
79 if (EventHandle
!= NULL
)
81 Status
= ObReferenceObjectByHandle(EventHandle
,
87 if (!NT_SUCCESS(Status
))
89 ObDereferenceObject(FileObject
);
93 else if (FileObject
->Flags
& FO_SYNCHRONOUS_IO
)
95 KeInitializeEvent(&Event
,
105 Irp
= IoBuildSynchronousFsdRequest(IRP_MJ_READ
,
106 FileObject
->DeviceObject
,
113 Irp
->Overlay
.AsynchronousParameters
.UserApcRoutine
= ApcRoutine
;
114 Irp
->Overlay
.AsynchronousParameters
.UserApcContext
= ApcContext
;
116 StackPtr
= IoGetNextIrpStackLocation(Irp
);
117 StackPtr
->FileObject
= FileObject
;
120 StackPtr
->Parameters
.Read
.Key
= *Key
;
124 StackPtr
->Parameters
.Read
.Key
= 0;
127 Status
= IoCallDriver(FileObject
->DeviceObject
,
129 if ((Status
== STATUS_PENDING
) &&
130 (FileObject
->Flags
& FO_SYNCHRONOUS_IO
))
134 if (FileObject
->Flags
& FO_ALERTABLE_IO
)
143 KeWaitForSingleObject(&Event
,
148 Status
= IoStatusBlock
->Status
;
155 /**********************************************************************
168 NTSTATUS STDCALL
NtWriteFile(HANDLE FileHandle
,
170 PIO_APC_ROUTINE ApcRoutine
,
172 PIO_STATUS_BLOCK IoStatusBlock
,
175 PLARGE_INTEGER ByteOffset
,
179 PFILE_OBJECT FileObject
;
181 PIO_STACK_LOCATION StackPtr
;
185 DPRINT("NtWriteFile(FileHandle %x, Buffer %x, Length %d)\n",
186 FileHandle
, Buffer
, Length
);
188 Status
= ObReferenceObjectByHandle(FileHandle
,
194 if (!NT_SUCCESS(Status
))
199 if (ByteOffset
== NULL
)
201 ByteOffset
= &FileObject
->CurrentByteOffset
;
204 if (EventHandle
!= NULL
)
206 Status
= ObReferenceObjectByHandle(EventHandle
,
212 if (!NT_SUCCESS(Status
))
214 ObDereferenceObject(FileObject
);
218 else if (FileObject
->Flags
& FO_SYNCHRONOUS_IO
)
220 KeInitializeEvent(&Event
,
230 KeInitializeEvent(&Event
,
233 Irp
= IoBuildSynchronousFsdRequest(IRP_MJ_WRITE
,
234 FileObject
->DeviceObject
,
241 Irp
->Overlay
.AsynchronousParameters
.UserApcRoutine
= ApcRoutine
;
242 Irp
->Overlay
.AsynchronousParameters
.UserApcContext
= ApcContext
;
244 DPRINT("FileObject->DeviceObject %x\n",FileObject
->DeviceObject
);
246 StackPtr
= IoGetNextIrpStackLocation(Irp
);
247 StackPtr
->FileObject
= FileObject
;
250 StackPtr
->Parameters
.Write
.Key
= *Key
;
254 StackPtr
->Parameters
.Write
.Key
= 0;
256 Status
= IoCallDriver(FileObject
->DeviceObject
, Irp
);
257 if ((Status
== STATUS_PENDING
) &&
258 (FileObject
->Flags
& FO_SYNCHRONOUS_IO
))
260 KeWaitForSingleObject(&Event
,
265 Status
= Irp
->IoStatus
.Status
;
271 /**********************************************************************
287 IN HANDLE FileHandle
,
288 IN HANDLE Event OPTIONAL
,
289 IN PIO_APC_ROUTINE UserApcRoutine OPTIONAL
,
290 IN PVOID UserApcContext OPTIONAL
,
291 OUT PIO_STATUS_BLOCK UserIoStatusBlock
,
292 IN FILE_SEGMENT_ELEMENT BufferDescription
[],
293 IN ULONG BufferLength
,
294 IN PLARGE_INTEGER ByteOffset
,
295 IN PULONG Key OPTIONAL
302 /**********************************************************************
318 IN HANDLE FileHandle
,
319 IN HANDLE Event OPTIONAL
,
320 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL
,
321 IN PVOID ApcContext OPTIONAL
,
322 OUT PIO_STATUS_BLOCK IoStatusBlock
,
323 IN FILE_SEGMENT_ELEMENT BufferDescription
[],
324 IN ULONG BufferLength
,
325 IN PLARGE_INTEGER ByteOffset
,
326 IN PULONG Key OPTIONAL