1 /* $Id: file.c,v 1.21 2002/09/08 10:23:24 chorns Exp $
3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * FILE: ntoskrnl/io/file.c
6 * PURPOSE: Graceful system shutdown if a bug is detected
7 * PROGRAMMER: David Welch (welch@mcmail.com)
12 /* INCLUDES *****************************************************************/
14 #include <ddk/ntddk.h>
15 #include <internal/io.h>
16 #include <internal/mm.h>
19 #include <internal/debug.h>
22 /* GLOBALS *******************************************************************/
24 #define TAG_SYSB TAG('S', 'Y', 'S', 'B')
27 /* FUNCTIONS *****************************************************************/
30 NtQueryInformationFile(HANDLE FileHandle
,
31 PIO_STATUS_BLOCK IoStatusBlock
,
32 PVOID FileInformation
,
34 FILE_INFORMATION_CLASS FileInformationClass
)
36 PFILE_OBJECT FileObject
;
39 PDEVICE_OBJECT DeviceObject
;
40 PIO_STACK_LOCATION StackPtr
;
44 assert(IoStatusBlock
!= NULL
);
45 assert(FileInformation
!= NULL
);
47 DPRINT("NtQueryInformationFile(Handle %x StatBlk %x FileInfo %x Length %d "
48 "Class %d)\n", FileHandle
, IoStatusBlock
, FileInformation
,
49 Length
, FileInformationClass
);
51 Status
= ObReferenceObjectByHandle(FileHandle
,
57 if (!NT_SUCCESS(Status
))
61 DPRINT("FileObject %x\n", FileObject
);
63 DeviceObject
= FileObject
->DeviceObject
;
65 Irp
= IoAllocateIrp(DeviceObject
->StackSize
,
69 ObDereferenceObject(FileObject
);
70 return STATUS_INSUFFICIENT_RESOURCES
;
73 SystemBuffer
= ExAllocatePoolWithTag(NonPagedPool
,
76 if (SystemBuffer
== NULL
)
79 ObDereferenceObject(FileObject
);
80 return(STATUS_INSUFFICIENT_RESOURCES
);
83 Irp
->AssociatedIrp
.SystemBuffer
= SystemBuffer
;
84 Irp
->UserIosb
= &IoSB
;
85 Irp
->UserEvent
= &FileObject
->Event
;
86 KeResetEvent( &FileObject
->Event
);
88 StackPtr
= IoGetNextIrpStackLocation(Irp
);
89 StackPtr
->MajorFunction
= IRP_MJ_QUERY_INFORMATION
;
90 StackPtr
->MinorFunction
= 0;
92 StackPtr
->Control
= 0;
93 StackPtr
->DeviceObject
= DeviceObject
;
94 StackPtr
->FileObject
= FileObject
;
96 StackPtr
->Parameters
.QueryFile
.FileInformationClass
=
98 StackPtr
->Parameters
.QueryFile
.Length
= Length
;
100 Status
= IoCallDriver(FileObject
->DeviceObject
,
102 if (Status
==STATUS_PENDING
&& !(FileObject
->Flags
& FO_SYNCHRONOUS_IO
))
104 KeWaitForSingleObject(&FileObject
->Event
,
109 Status
= IoSB
.Status
;
113 *IoStatusBlock
= IoSB
;
116 if (NT_SUCCESS(Status
))
118 DPRINT("Information %lu\n", IoStatusBlock
->Information
);
119 MmSafeCopyToUser(FileInformation
,
121 IoStatusBlock
->Information
);
124 ExFreePool(SystemBuffer
);
130 IoQueryFileInformation(IN PFILE_OBJECT FileObject
,
131 IN FILE_INFORMATION_CLASS FileInformationClass
,
133 OUT PVOID FileInformation
,
134 OUT PULONG ReturnedLength
)
136 IO_STATUS_BLOCK IoStatusBlock
;
138 PDEVICE_OBJECT DeviceObject
;
139 PIO_STACK_LOCATION StackPtr
;
142 assert(FileInformation
!= NULL
)
144 Status
= ObReferenceObjectByPointer(FileObject
,
145 FILE_READ_ATTRIBUTES
,
148 if (!NT_SUCCESS(Status
))
153 DPRINT("FileObject %x\n", FileObject
);
155 DeviceObject
= FileObject
->DeviceObject
;
157 Irp
= IoAllocateIrp(DeviceObject
->StackSize
,
161 ObDereferenceObject(FileObject
);
162 return STATUS_INSUFFICIENT_RESOURCES
;
165 Irp
->AssociatedIrp
.SystemBuffer
= FileInformation
;
166 Irp
->UserIosb
= &IoStatusBlock
;
167 Irp
->UserEvent
= &FileObject
->Event
;
168 KeResetEvent( &FileObject
->Event
);
170 StackPtr
= IoGetNextIrpStackLocation(Irp
);
171 StackPtr
->MajorFunction
= IRP_MJ_QUERY_INFORMATION
;
172 StackPtr
->MinorFunction
= 0;
174 StackPtr
->Control
= 0;
175 StackPtr
->DeviceObject
= DeviceObject
;
176 StackPtr
->FileObject
= FileObject
;
178 StackPtr
->Parameters
.QueryFile
.FileInformationClass
=
179 FileInformationClass
;
180 StackPtr
->Parameters
.QueryFile
.Length
= Length
;
182 Status
= IoCallDriver(FileObject
->DeviceObject
,
184 if (Status
==STATUS_PENDING
&& !(FileObject
->Flags
& FO_SYNCHRONOUS_IO
))
186 KeWaitForSingleObject(&FileObject
->Event
,
191 Status
= IoStatusBlock
.Status
;
194 if (ReturnedLength
!= NULL
)
196 *ReturnedLength
= IoStatusBlock
.Information
;
205 NtSetInformationFile(HANDLE FileHandle
,
206 PIO_STATUS_BLOCK IoStatusBlock
,
207 PVOID FileInformation
,
209 FILE_INFORMATION_CLASS FileInformationClass
)
211 PIO_STACK_LOCATION StackPtr
;
212 PFILE_OBJECT FileObject
;
213 PDEVICE_OBJECT DeviceObject
;
217 IO_STATUS_BLOCK IoSB
;
219 assert(IoStatusBlock
!= NULL
)
220 assert(FileInformation
!= NULL
)
222 DPRINT("NtSetInformationFile(Handle %x StatBlk %x FileInfo %x Length %d "
223 "Class %d)\n", FileHandle
, IoStatusBlock
, FileInformation
,
224 Length
, FileInformationClass
);
226 /* Get the file object from the file handle */
227 Status
= ObReferenceObjectByHandle(FileHandle
,
228 FILE_WRITE_ATTRIBUTES
,
231 (PVOID
*)&FileObject
,
233 if (!NT_SUCCESS(Status
))
238 DPRINT("FileObject %x\n", FileObject
);
240 DeviceObject
= FileObject
->DeviceObject
;
242 Irp
= IoAllocateIrp(DeviceObject
->StackSize
,
246 ObDereferenceObject(FileObject
);
247 return STATUS_INSUFFICIENT_RESOURCES
;
250 SystemBuffer
= ExAllocatePoolWithTag(NonPagedPool
,
253 if (SystemBuffer
== NULL
)
256 ObDereferenceObject(FileObject
);
257 return(STATUS_INSUFFICIENT_RESOURCES
);
260 MmSafeCopyFromUser(SystemBuffer
,
264 Irp
->AssociatedIrp
.SystemBuffer
= SystemBuffer
;
265 Irp
->UserIosb
= &IoSB
;
266 Irp
->UserEvent
= &FileObject
->Event
;
267 KeResetEvent( &FileObject
->Event
);
269 StackPtr
= IoGetNextIrpStackLocation(Irp
);
270 StackPtr
->MajorFunction
= IRP_MJ_SET_INFORMATION
;
271 StackPtr
->MinorFunction
= 0;
273 StackPtr
->Control
= 0;
274 StackPtr
->DeviceObject
= DeviceObject
;
275 StackPtr
->FileObject
= FileObject
;
277 StackPtr
->Parameters
.SetFile
.FileInformationClass
=
278 FileInformationClass
;
279 StackPtr
->Parameters
.SetFile
.Length
= Length
;
282 * Pass the IRP to the FSD (and wait for
285 DPRINT("FileObject->DeviceObject %x\n", FileObject
->DeviceObject
);
286 Status
= IoCallDriver(FileObject
->DeviceObject
,
288 if (Status
== STATUS_PENDING
&& !(FileObject
->Flags
& FO_SYNCHRONOUS_IO
))
290 KeWaitForSingleObject(&FileObject
->Event
,
295 Status
= IoSB
.Status
;
299 *IoStatusBlock
= IoSB
;
301 ExFreePool(SystemBuffer
);
308 NtQueryAttributesFile(IN POBJECT_ATTRIBUTES ObjectAttributes
,
309 OUT PFILE_BASIC_INFORMATION FileInformation
)
312 return STATUS_NOT_IMPLEMENTED
;
317 NtQueryFullAttributesFile(IN POBJECT_ATTRIBUTES ObjectAttributes
,
318 OUT PFILE_NETWORK_OPEN_INFORMATION FileInformation
)
321 return STATUS_NOT_IMPLEMENTED
;
326 NtQueryEaFile(IN HANDLE FileHandle
,
327 OUT PIO_STATUS_BLOCK IoStatusBlock
,
330 IN BOOLEAN ReturnSingleEntry
,
331 IN PVOID EaList OPTIONAL
,
332 IN ULONG EaListLength
,
333 IN PULONG EaIndex OPTIONAL
,
334 IN BOOLEAN RestartScan
)
337 return STATUS_NOT_IMPLEMENTED
;
342 NtSetEaFile(IN HANDLE FileHandle
,
343 IN PIO_STATUS_BLOCK IoStatusBlock
,
345 IN ULONG EaBufferSize
)
348 return STATUS_NOT_IMPLEMENTED
;