2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS kernel
4 * FILE: ntoskrnl/io/rw.c
5 * PURPOSE: Implements read/write APIs
6 * PROGRAMMER: David Welch (welch@cwcom.net)
11 /* INCLUDES ****************************************************************/
13 #include <ddk/ntddk.h>
14 #include <internal/io.h>
16 #include <internal/string.h>
17 #include <internal/ob.h>
20 #include <internal/debug.h>
22 /* FUNCTIONS ***************************************************************/
24 NTSTATUS
NtReadFile(HANDLE FileHandle
,
26 PIO_APC_ROUTINE ApcRoutine
,
28 PIO_STATUS_BLOCK IoStatusBlock
,
31 PLARGE_INTEGER ByteOffset
,
34 return(ZwReadFile(FileHandle
,
45 NTSTATUS
ZwReadFile(HANDLE FileHandle
,
47 PIO_APC_ROUTINE ApcRoutine
,
49 PIO_STATUS_BLOCK IoStatusBlock
,
52 PLARGE_INTEGER ByteOffset
,
56 PFILE_OBJECT FileObject
;
58 PIO_STACK_LOCATION StackPtr
;
59 PKEVENT ptrEvent
= NULL
;
62 assert(KeGetCurrentIrql()==PASSIVE_LEVEL
);
64 DPRINT("ZwReadFile(FileHandle %x Buffer %x Length %x ByteOffset %x, "
65 "IoStatusBlock %x)\n",
66 FileHandle
,Buffer
,Length
,ByteOffset
,IoStatusBlock
);
68 Status
= ObReferenceObjectByHandle(FileHandle
,
72 (PVOID
*) &FileObject
,
74 if (!NT_SUCCESS(STATUS_SUCCESS
))
76 DPRINT("ZwReadFile() = %x\n",Status
);
80 DPRINT("ByteOffset %x FileObject->CurrentByteOffset %d\n",
82 FileObject
->CurrentByteOffset
.LowPart
);
85 ByteOffset
= &(FileObject
->CurrentByteOffset
);
88 if (EventHandle
!= NULL
)
90 Status
= ObReferenceObjectByHandle(EventHandle
,
96 if (!NT_SUCCESS(Status
))
103 KeInitializeEvent(&Event
,NotificationEvent
,FALSE
);
107 DPRINT("FileObject %x\n",FileObject
);
108 Irp
= IoBuildSynchronousFsdRequest(IRP_MJ_READ
,
109 FileObject
->DeviceObject
,
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
,Irp
);
128 if (Status
== STATUS_PENDING
&& (FileObject
->Flags
& FO_SYNCHRONOUS_IO
))
130 KeWaitForSingleObject(&Event
,Executive
,KernelMode
,FALSE
,NULL
);
131 Status
= IoStatusBlock
->Status
;
133 DPRINT("ZwReadFile() = %x\n",Status
);
137 NTSTATUS
NtWriteFile(HANDLE FileHandle
,
139 PIO_APC_ROUTINE ApcRoutine
,
141 PIO_STATUS_BLOCK IoStatusBlock
,
144 PLARGE_INTEGER ByteOffset
,
147 return(ZwWriteFile(FileHandle
,
158 NTSTATUS
ZwWriteFile(HANDLE FileHandle
,
160 PIO_APC_ROUTINE ApcRoutine
,
162 PIO_STATUS_BLOCK IoStatusBlock
,
165 PLARGE_INTEGER ByteOffset
,
169 PFILE_OBJECT FileObject
;
171 PIO_STACK_LOCATION StackPtr
;
174 DPRINT("ZwWriteFile(FileHandle %x, Buffer %x, Length %d)\n",
175 FileHandle
,Buffer
,Length
);
177 Status
= ObReferenceObjectByHandle(FileHandle
,
181 (PVOID
*) &FileObject
,
183 if (Status
!= STATUS_SUCCESS
)
187 if (ByteOffset
==NULL
)
189 ByteOffset
= &(FileObject
->CurrentByteOffset
);
192 KeInitializeEvent(&Event
,NotificationEvent
,FALSE
);
193 Irp
= IoBuildSynchronousFsdRequest(IRP_MJ_WRITE
,
194 FileObject
->DeviceObject
,
200 DPRINT("FileObject->DeviceObject %x\n",FileObject
->DeviceObject
);
201 StackPtr
= IoGetNextIrpStackLocation(Irp
);
202 StackPtr
->FileObject
= FileObject
;
205 StackPtr
->Parameters
.Write
.Key
= *Key
;
209 StackPtr
->Parameters
.Write
.Key
= 0;
211 Status
= IoCallDriver(FileObject
->DeviceObject
,Irp
);
212 if (Status
== STATUS_PENDING
&& (FileObject
->Flags
& FO_SYNCHRONOUS_IO
))
214 KeWaitForSingleObject(&Event
,Executive
,KernelMode
,FALSE
,NULL
);
215 Status
= Irp
->IoStatus
.Status
;
220 NTSTATUS STDCALL
NtReadFileScatter(IN HANDLE FileHandle
,
221 IN HANDLE Event OPTIONAL
,
222 IN PIO_APC_ROUTINE UserApcRoutine OPTIONAL
,
223 IN PVOID UserApcContext OPTIONAL
,
224 OUT PIO_STATUS_BLOCK UserIoStatusBlock
,
225 IN FILE_SEGMENT_ELEMENT BufferDescription
[],
226 IN ULONG BufferLength
,
227 IN PLARGE_INTEGER ByteOffset
,
228 IN PULONG Key OPTIONAL
)
230 return(ZwReadFileScatter(FileHandle
,
241 NTSTATUS STDCALL
ZwReadFileScatter(IN HANDLE FileHandle
,
242 IN HANDLE Event OPTIONAL
,
243 IN PIO_APC_ROUTINE UserApcRoutine OPTIONAL
,
244 IN PVOID UserApcContext OPTIONAL
,
245 OUT PIO_STATUS_BLOCK UserIoStatusBlock
,
246 IN FILE_SEGMENT_ELEMENT BufferDescription
[],
247 IN ULONG BufferLength
,
248 IN PLARGE_INTEGER ByteOffset
,
249 IN PULONG Key OPTIONAL
)
255 NTSTATUS STDCALL
NtWriteFileGather(IN HANDLE FileHandle
,
256 IN HANDLE Event OPTIONAL
,
257 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL
,
258 IN PVOID ApcContext OPTIONAL
,
259 OUT PIO_STATUS_BLOCK IoStatusBlock
,
260 IN FILE_SEGMENT_ELEMENT BufferDescription
[],
261 IN ULONG BufferLength
,
262 IN PLARGE_INTEGER ByteOffset
,
263 IN PULONG Key OPTIONAL
)
265 return(ZwWriteFileGather(FileHandle
,
276 NTSTATUS STDCALL
ZwWriteFileGather(IN HANDLE FileHandle
,
277 IN HANDLE Event OPTIONAL
,
278 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL
,
279 IN PVOID ApcContext OPTIONAL
,
280 OUT PIO_STATUS_BLOCK IoStatusBlock
,
281 IN FILE_SEGMENT_ELEMENT BufferDescription
[],
282 IN ULONG BufferLength
,
283 IN PLARGE_INTEGER ByteOffset
,
284 IN PULONG Key OPTIONAL
)