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;