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 //io completion port?
241 if (FileInformationClass == FileCompletionInformation)
245 if (Length < sizeof(FILE_COMPLETION_INFORMATION))
247 Status = STATUS_INFO_LENGTH_MISMATCH;
251 Status = ObReferenceObjectByHandle(((PFILE_COMPLETION_INFORMATION)FileInformation)->IoCompletionHandle,
252 IO_COMPLETION_MODIFY_STATE,//???
257 if (NT_SUCCESS(Status))
259 //FIXME: maybe use lookaside list
260 FileObject->CompletionContext = ExAllocatePool(NonPagedPool, sizeof(IO_COMPLETION_CONTEXT));
261 FileObject->CompletionContext->Key = ((PFILE_COMPLETION_INFORMATION)FileInformation)->CompletionKey;
262 FileObject->CompletionContext->Port = Queue;
264 ObDereferenceObject(Queue);
268 ObDereferenceObject(FileObject);
272 DeviceObject = FileObject->DeviceObject;
274 Irp = IoAllocateIrp(DeviceObject->StackSize,
278 ObDereferenceObject(FileObject);
279 return STATUS_INSUFFICIENT_RESOURCES;
282 SystemBuffer = ExAllocatePoolWithTag(NonPagedPool,
285 if (SystemBuffer == NULL)
288 ObDereferenceObject(FileObject);
289 return(STATUS_INSUFFICIENT_RESOURCES);
292 MmSafeCopyFromUser(SystemBuffer,
296 Irp->AssociatedIrp.SystemBuffer = SystemBuffer;
297 Irp->UserIosb = &IoSB;
298 Irp->UserEvent = &FileObject->Event;
299 KeResetEvent( &FileObject->Event );
301 StackPtr = IoGetNextIrpStackLocation(Irp);
302 StackPtr->MajorFunction = IRP_MJ_SET_INFORMATION;
303 StackPtr->MinorFunction = 0;
305 StackPtr->Control = 0;
306 StackPtr->DeviceObject = DeviceObject;
307 StackPtr->FileObject = FileObject;
309 StackPtr->Parameters.SetFile.FileInformationClass =
310 FileInformationClass;
311 StackPtr->Parameters.SetFile.Length = Length;
314 * Pass the IRP to the FSD (and wait for
317 DPRINT("FileObject->DeviceObject %x\n", FileObject->DeviceObject);
318 Status = IoCallDriver(FileObject->DeviceObject,
320 if (Status == STATUS_PENDING && !(FileObject->Flags & FO_SYNCHRONOUS_IO))
322 KeWaitForSingleObject(&FileObject->Event,
327 Status = IoSB.Status;
331 *IoStatusBlock = IoSB;
333 ExFreePool(SystemBuffer);
340 NtQueryAttributesFile(IN POBJECT_ATTRIBUTES ObjectAttributes,
341 OUT PFILE_BASIC_INFORMATION FileInformation)
343 IO_STATUS_BLOCK IoStatusBlock;
348 Status = NtOpenFile (&FileHandle,
349 SYNCHRONIZE | FILE_READ_ATTRIBUTES,
352 FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
353 FILE_SYNCHRONOUS_IO_NONALERT);
354 if (!NT_SUCCESS (Status))
356 DPRINT ("NtOpenFile() failed (Status %lx)\n", Status);
360 /* Get file attributes */
361 Status = NtQueryInformationFile (FileHandle,
364 sizeof(FILE_BASIC_INFORMATION),
365 FileBasicInformation);
366 NtClose (FileHandle);
367 if (!NT_SUCCESS (Status))
369 DPRINT ("NtQueryInformationFile() failed (Status %lx)\n", Status);
377 NtQueryFullAttributesFile(IN POBJECT_ATTRIBUTES ObjectAttributes,
378 OUT PFILE_NETWORK_OPEN_INFORMATION FileInformation)
380 IO_STATUS_BLOCK IoStatusBlock;
385 Status = NtOpenFile (&FileHandle,
386 SYNCHRONIZE | FILE_READ_ATTRIBUTES,
389 FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
390 FILE_SYNCHRONOUS_IO_NONALERT);
391 if (!NT_SUCCESS (Status))
393 DPRINT ("NtOpenFile() failed (Status %lx)\n", Status);
397 /* Get file attributes */
398 Status = NtQueryInformationFile (FileHandle,
401 sizeof(FILE_NETWORK_OPEN_INFORMATION),
402 FileNetworkOpenInformation);
403 NtClose (FileHandle);
404 if (!NT_SUCCESS (Status))
406 DPRINT ("NtQueryInformationFile() failed (Status %lx)\n", Status);
414 NtQueryEaFile(IN HANDLE FileHandle,
415 OUT PIO_STATUS_BLOCK IoStatusBlock,
418 IN BOOLEAN ReturnSingleEntry,
419 IN PVOID EaList OPTIONAL,
420 IN ULONG EaListLength,
421 IN PULONG EaIndex OPTIONAL,
422 IN BOOLEAN RestartScan)
425 return STATUS_NOT_IMPLEMENTED;
430 NtSetEaFile(IN HANDLE FileHandle,
431 IN PIO_STATUS_BLOCK IoStatusBlock,
433 IN ULONG EaBufferSize)
436 return STATUS_NOT_IMPLEMENTED;