1 /* $Id: file.c,v 1.16 2002/04/07 18:36:13 phreak 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 Class %d)\n",
52 FileInformationClass
);
54 Status
= ObReferenceObjectByHandle(FileHandle
,
60 if (!NT_SUCCESS(Status
))
64 DPRINT("FileObject %x\n", FileObject
);
66 DeviceObject
= FileObject
->DeviceObject
;
68 Irp
= IoAllocateIrp(DeviceObject
->StackSize
,
72 ObDereferenceObject(FileObject
);
73 return STATUS_INSUFFICIENT_RESOURCES
;
76 SystemBuffer
= ExAllocatePoolWithTag(NonPagedPool
,
79 if (SystemBuffer
== NULL
)
82 ObDereferenceObject(FileObject
);
83 return(STATUS_INSUFFICIENT_RESOURCES
);
86 Irp
->AssociatedIrp
.SystemBuffer
= SystemBuffer
;
87 Irp
->UserIosb
= &IoSB
;
88 Irp
->UserEvent
= &FileObject
->Event
;
89 KeResetEvent( &FileObject
->Event
);
91 StackPtr
= IoGetNextIrpStackLocation(Irp
);
92 StackPtr
->MajorFunction
= IRP_MJ_QUERY_INFORMATION
;
93 StackPtr
->MinorFunction
= 0;
95 StackPtr
->Control
= 0;
96 StackPtr
->DeviceObject
= DeviceObject
;
97 StackPtr
->FileObject
= FileObject
;
99 StackPtr
->Parameters
.QueryFile
.FileInformationClass
=
100 FileInformationClass
;
101 StackPtr
->Parameters
.QueryFile
.Length
= Length
;
103 Status
= IoCallDriver(FileObject
->DeviceObject
,
105 if (Status
==STATUS_PENDING
&& !(FileObject
->Flags
& FO_SYNCHRONOUS_IO
))
107 KeWaitForSingleObject(&FileObject
->Event
,
112 Status
= IoSB
.Status
;
116 *IoStatusBlock
= IoSB
;
119 if (NT_SUCCESS(Status
))
121 DPRINT("Information %lu\n", IoStatusBlock
->Information
);
122 MmSafeCopyToUser(FileInformation
,
124 IoStatusBlock
->Information
);
127 ExFreePool(SystemBuffer
);
128 ObDereferenceObject(FileObject
);
135 IoQueryFileInformation(IN PFILE_OBJECT FileObject
,
136 IN FILE_INFORMATION_CLASS FileInformationClass
,
138 OUT PVOID FileInformation
,
139 OUT PULONG ReturnedLength
)
141 IO_STATUS_BLOCK IoStatusBlock
;
143 PDEVICE_OBJECT DeviceObject
;
144 PIO_STACK_LOCATION StackPtr
;
147 assert(FileInformation
!= NULL
)
149 Status
= ObReferenceObjectByPointer(FileObject
,
150 FILE_READ_ATTRIBUTES
,
153 if (!NT_SUCCESS(Status
))
158 DPRINT("FileObject %x\n", FileObject
);
160 DeviceObject
= FileObject
->DeviceObject
;
162 Irp
= IoAllocateIrp(DeviceObject
->StackSize
,
166 ObDereferenceObject(FileObject
);
167 return STATUS_INSUFFICIENT_RESOURCES
;
170 Irp
->AssociatedIrp
.SystemBuffer
= FileInformation
;
171 Irp
->UserIosb
= &IoStatusBlock
;
172 Irp
->UserEvent
= &FileObject
->Event
;
173 KeResetEvent( &FileObject
->Event
);
175 StackPtr
= IoGetNextIrpStackLocation(Irp
);
176 StackPtr
->MajorFunction
= IRP_MJ_QUERY_INFORMATION
;
177 StackPtr
->MinorFunction
= 0;
179 StackPtr
->Control
= 0;
180 StackPtr
->DeviceObject
= DeviceObject
;
181 StackPtr
->FileObject
= FileObject
;
183 StackPtr
->Parameters
.QueryFile
.FileInformationClass
=
184 FileInformationClass
;
185 StackPtr
->Parameters
.QueryFile
.Length
= Length
;
187 Status
= IoCallDriver(FileObject
->DeviceObject
,
189 if (Status
==STATUS_PENDING
&& !(FileObject
->Flags
& FO_SYNCHRONOUS_IO
))
191 KeWaitForSingleObject(&FileObject
->Event
,
196 Status
= IoStatusBlock
.Status
;
199 if (ReturnedLength
!= NULL
)
201 *ReturnedLength
= IoStatusBlock
.Information
;
204 ObDereferenceObject(FileObject
);
211 NtSetInformationFile(HANDLE FileHandle
,
212 PIO_STATUS_BLOCK IoStatusBlock
,
213 PVOID FileInformation
,
215 FILE_INFORMATION_CLASS FileInformationClass
)
217 PIO_STACK_LOCATION StackPtr
;
218 PFILE_OBJECT FileObject
;
219 PDEVICE_OBJECT DeviceObject
;
223 IO_STATUS_BLOCK IoSB
;
225 assert(IoStatusBlock
!= NULL
)
226 assert(FileInformation
!= NULL
)
228 DPRINT("NtSetInformationFile(Handle %x StatBlk %x FileInfo %x Length %d Class %d)\n",
233 FileInformationClass
);
235 /* Get the file object from the file handle */
236 Status
= ObReferenceObjectByHandle(FileHandle
,
237 FILE_WRITE_ATTRIBUTES
,
240 (PVOID
*)&FileObject
,
242 if (!NT_SUCCESS(Status
))
247 DPRINT("FileObject %x\n", FileObject
);
249 DeviceObject
= FileObject
->DeviceObject
;
251 Irp
= IoAllocateIrp(DeviceObject
->StackSize
,
255 ObDereferenceObject(FileObject
);
256 return STATUS_INSUFFICIENT_RESOURCES
;
259 SystemBuffer
= ExAllocatePoolWithTag(NonPagedPool
,
262 if (SystemBuffer
== NULL
)
265 ObDereferenceObject(FileObject
);
266 return(STATUS_INSUFFICIENT_RESOURCES
);
269 MmSafeCopyFromUser(SystemBuffer
,
273 Irp
->AssociatedIrp
.SystemBuffer
= SystemBuffer
;
274 Irp
->UserIosb
= &IoSB
;
275 Irp
->UserEvent
= &FileObject
->Event
;
276 KeResetEvent( &FileObject
->Event
);
278 StackPtr
= IoGetNextIrpStackLocation(Irp
);
279 StackPtr
->MajorFunction
= IRP_MJ_SET_INFORMATION
;
280 StackPtr
->MinorFunction
= 0;
282 StackPtr
->Control
= 0;
283 StackPtr
->DeviceObject
= DeviceObject
;
284 StackPtr
->FileObject
= FileObject
;
286 StackPtr
->Parameters
.SetFile
.FileInformationClass
=
287 FileInformationClass
;
288 StackPtr
->Parameters
.SetFile
.Length
= Length
;
291 * Pass the IRP to the FSD (and wait for
294 DPRINT("FileObject->DeviceObject %x\n", FileObject
->DeviceObject
);
295 Status
= IoCallDriver(FileObject
->DeviceObject
,
297 if (Status
== STATUS_PENDING
&& !(FileObject
->Flags
& FO_SYNCHRONOUS_IO
))
299 KeWaitForSingleObject(&FileObject
->Event
,
304 Status
= IoSB
.Status
;
308 *IoStatusBlock
= IoSB
;
310 ExFreePool(SystemBuffer
);
311 ObDereferenceObject(FileObject
);
318 NtQueryAttributesFile(IN POBJECT_ATTRIBUTES ObjectAttributes
,
322 return STATUS_NOT_IMPLEMENTED
;
327 NtQueryFullAttributesFile(IN HANDLE FileHandle
,
331 return STATUS_NOT_IMPLEMENTED
;
336 NtQueryEaFile(IN HANDLE FileHandle
,
337 OUT PIO_STATUS_BLOCK IoStatusBlock
,
340 IN BOOLEAN ReturnSingleEntry
,
341 IN PVOID EaList OPTIONAL
,
342 IN ULONG EaListLength
,
343 IN PULONG EaIndex OPTIONAL
,
344 IN BOOLEAN RestartScan
)
347 return STATUS_NOT_IMPLEMENTED
;
352 NtSetEaFile(IN HANDLE FileHandle
,
353 IN PIO_STATUS_BLOCK IoStatusBlock
,
355 IN ULONG EaBufferSize
)
358 return STATUS_NOT_IMPLEMENTED
;