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
8 * PROGRAMMERS: David Welch (welch@mcmail.com)
11 /* INCLUDES *****************************************************************/
15 #include <internal/debug.h>
18 /* GLOBALS *******************************************************************/
20 #define TAG_SYSB TAG('S', 'Y', 'S', 'B')
23 /* FUNCTIONS *****************************************************************/
29 NtQueryInformationFile(HANDLE FileHandle
,
30 PIO_STATUS_BLOCK IoStatusBlock
,
31 PVOID FileInformation
,
33 FILE_INFORMATION_CLASS FileInformationClass
)
35 PFILE_OBJECT FileObject
;
38 PDEVICE_OBJECT DeviceObject
;
39 PIO_STACK_LOCATION StackPtr
;
41 KPROCESSOR_MODE PreviousMode
;
43 ASSERT(IoStatusBlock
!= NULL
);
44 ASSERT(FileInformation
!= NULL
);
46 DPRINT("NtQueryInformationFile(Handle %x StatBlk %x FileInfo %x Length %d "
47 "Class %d)\n", FileHandle
, IoStatusBlock
, FileInformation
,
48 Length
, FileInformationClass
);
50 PreviousMode
= ExGetPreviousMode();
52 Status
= ObReferenceObjectByHandle(FileHandle
,
58 if (!NT_SUCCESS(Status
))
62 DPRINT("FileObject %x\n", FileObject
);
64 DeviceObject
= FileObject
->DeviceObject
;
66 Irp
= IoAllocateIrp(DeviceObject
->StackSize
,
70 ObDereferenceObject(FileObject
);
71 return STATUS_INSUFFICIENT_RESOURCES
;
74 SystemBuffer
= ExAllocatePoolWithTag(NonPagedPool
,
77 if (SystemBuffer
== NULL
)
80 ObDereferenceObject(FileObject
);
81 return(STATUS_INSUFFICIENT_RESOURCES
);
84 /* Trigger FileObject/Event dereferencing */
85 Irp
->Tail
.Overlay
.OriginalFileObject
= FileObject
;
86 Irp
->RequestorMode
= PreviousMode
;
87 Irp
->AssociatedIrp
.SystemBuffer
= SystemBuffer
;
88 Irp
->UserIosb
= IoStatusBlock
;
89 Irp
->UserEvent
= &FileObject
->Event
;
90 Irp
->Tail
.Overlay
.Thread
= PsGetCurrentThread();
91 KeResetEvent( &FileObject
->Event
);
93 StackPtr
= IoGetNextIrpStackLocation(Irp
);
94 StackPtr
->MajorFunction
= IRP_MJ_QUERY_INFORMATION
;
95 StackPtr
->MinorFunction
= 0;
97 StackPtr
->Control
= 0;
98 StackPtr
->DeviceObject
= DeviceObject
;
99 StackPtr
->FileObject
= FileObject
;
101 StackPtr
->Parameters
.QueryFile
.FileInformationClass
=
102 FileInformationClass
;
103 StackPtr
->Parameters
.QueryFile
.Length
= Length
;
105 Status
= IoCallDriver(FileObject
->DeviceObject
,
107 if (Status
== STATUS_PENDING
&& (FileObject
->Flags
& FO_SYNCHRONOUS_IO
))
109 KeWaitForSingleObject(&FileObject
->Event
,
112 FileObject
->Flags
& FO_ALERTABLE_IO
,
114 Status
= IoStatusBlock
->Status
;
117 if (NT_SUCCESS(Status
))
119 DPRINT("Information %lu\n", IoStatusBlock
->Information
);
120 MmSafeCopyToUser(FileInformation
,
122 IoStatusBlock
->Information
);
125 ExFreePool(SystemBuffer
);
135 NtQueryQuotaInformationFile(
136 IN HANDLE FileHandle
,
137 OUT PIO_STATUS_BLOCK IoStatusBlock
,
140 IN BOOLEAN ReturnSingleEntry
,
141 IN PVOID SidList OPTIONAL
,
142 IN ULONG SidListLength
,
143 IN PSID StartSid OPTIONAL
,
144 IN BOOLEAN RestartScan
148 return STATUS_NOT_IMPLEMENTED
;
156 NtSetQuotaInformationFile(
158 PIO_STATUS_BLOCK IoStatusBlock
,
159 PFILE_USER_QUOTA_INFORMATION Buffer
,
163 return STATUS_NOT_IMPLEMENTED
;
172 IoCheckQuerySetFileInformation(
173 IN FILE_INFORMATION_CLASS FileInformationClass
,
175 IN BOOLEAN SetOperation
179 return STATUS_NOT_IMPLEMENTED
;
187 IoCheckQuerySetVolumeInformation(
188 IN FS_INFORMATION_CLASS FsInformationClass
,
190 IN BOOLEAN SetOperation
194 return STATUS_NOT_IMPLEMENTED
;
202 IoCheckQuotaBufferValidity(
203 IN PFILE_QUOTA_INFORMATION QuotaBuffer
,
204 IN ULONG QuotaLength
,
205 OUT PULONG ErrorOffset
209 return STATUS_NOT_IMPLEMENTED
;
217 IoCreateFileSpecifyDeviceObjectHint(
218 OUT PHANDLE FileHandle
,
219 IN ACCESS_MASK DesiredAccess
,
220 IN POBJECT_ATTRIBUTES ObjectAttributes
,
221 OUT PIO_STATUS_BLOCK IoStatusBlock
,
222 IN PLARGE_INTEGER AllocationSize OPTIONAL
,
223 IN ULONG FileAttributes
,
224 IN ULONG ShareAccess
,
225 IN ULONG Disposition
,
226 IN ULONG CreateOptions
,
227 IN PVOID EaBuffer OPTIONAL
,
229 IN CREATE_FILE_TYPE CreateFileType
,
230 IN PVOID ExtraCreateParameters OPTIONAL
,
232 IN PVOID DeviceObject
236 return STATUS_NOT_IMPLEMENTED
;
244 IoCreateStreamFileObjectEx(
245 IN PFILE_OBJECT FileObject OPTIONAL
,
246 IN PDEVICE_OBJECT DeviceObject OPTIONAL
,
247 OUT PHANDLE FileObjectHandle OPTIONAL
258 IoCreateStreamFileObjectLite(
259 IN PFILE_OBJECT FileObject OPTIONAL
,
260 IN PDEVICE_OBJECT DeviceObject OPTIONAL
272 IoIsFileOriginRemote(
273 IN PFILE_OBJECT FileObject
285 IoQueryFileDosDeviceName(
286 IN PFILE_OBJECT FileObject
,
287 OUT POBJECT_NAME_INFORMATION
*ObjectNameInformation
291 return STATUS_NOT_IMPLEMENTED
;
298 IoQueryFileInformation(IN PFILE_OBJECT FileObject
,
299 IN FILE_INFORMATION_CLASS FileInformationClass
,
301 OUT PVOID FileInformation
,
302 OUT PULONG ReturnedLength
)
304 IO_STATUS_BLOCK IoStatusBlock
;
306 PDEVICE_OBJECT DeviceObject
;
307 PIO_STACK_LOCATION StackPtr
;
310 ASSERT(FileInformation
!= NULL
);
312 Status
= ObReferenceObjectByPointer(FileObject
,
313 FILE_READ_ATTRIBUTES
,
316 if (!NT_SUCCESS(Status
))
321 DPRINT("FileObject %x\n", FileObject
);
323 DeviceObject
= FileObject
->DeviceObject
;
325 Irp
= IoAllocateIrp(DeviceObject
->StackSize
,
329 ObDereferenceObject(FileObject
);
330 return STATUS_INSUFFICIENT_RESOURCES
;
333 /* Trigger FileObject/Event dereferencing */
334 Irp
->Tail
.Overlay
.OriginalFileObject
= FileObject
;
335 Irp
->RequestorMode
= KernelMode
;
336 Irp
->AssociatedIrp
.SystemBuffer
= FileInformation
;
337 Irp
->UserIosb
= &IoStatusBlock
;
338 Irp
->UserEvent
= &FileObject
->Event
;
339 Irp
->Tail
.Overlay
.Thread
= PsGetCurrentThread();
340 KeResetEvent( &FileObject
->Event
);
342 StackPtr
= IoGetNextIrpStackLocation(Irp
);
343 StackPtr
->MajorFunction
= IRP_MJ_QUERY_INFORMATION
;
344 StackPtr
->MinorFunction
= 0;
346 StackPtr
->Control
= 0;
347 StackPtr
->DeviceObject
= DeviceObject
;
348 StackPtr
->FileObject
= FileObject
;
350 StackPtr
->Parameters
.QueryFile
.FileInformationClass
=
351 FileInformationClass
;
352 StackPtr
->Parameters
.QueryFile
.Length
= Length
;
354 Status
= IoCallDriver(FileObject
->DeviceObject
,
356 if (Status
==STATUS_PENDING
&& (FileObject
->Flags
& FO_SYNCHRONOUS_IO
))
358 KeWaitForSingleObject(&FileObject
->Event
,
361 FileObject
->Flags
& FO_ALERTABLE_IO
,
363 Status
= IoStatusBlock
.Status
;
366 if (ReturnedLength
!= NULL
)
368 *ReturnedLength
= IoStatusBlock
.Information
;
380 NtSetInformationFile(HANDLE FileHandle
,
381 PIO_STATUS_BLOCK IoStatusBlock
,
382 PVOID FileInformation
,
384 FILE_INFORMATION_CLASS FileInformationClass
)
386 PIO_STACK_LOCATION StackPtr
;
387 PFILE_OBJECT FileObject
;
388 PDEVICE_OBJECT DeviceObject
;
392 KPROCESSOR_MODE PreviousMode
;
394 ASSERT(IoStatusBlock
!= NULL
);
395 ASSERT(FileInformation
!= NULL
);
397 DPRINT("NtSetInformationFile(Handle %x StatBlk %x FileInfo %x Length %d "
398 "Class %d)\n", FileHandle
, IoStatusBlock
, FileInformation
,
399 Length
, FileInformationClass
);
401 PreviousMode
= ExGetPreviousMode();
403 /* Get the file object from the file handle */
404 Status
= ObReferenceObjectByHandle(FileHandle
,
405 FILE_WRITE_ATTRIBUTES
,
408 (PVOID
*)&FileObject
,
410 if (!NT_SUCCESS(Status
))
415 DPRINT("FileObject %x\n", FileObject
);
417 /* io completion port? */
418 if (FileInformationClass
== FileCompletionInformation
)
422 if (Length
< sizeof(FILE_COMPLETION_INFORMATION
))
424 Status
= STATUS_INFO_LENGTH_MISMATCH
;
428 Status
= ObReferenceObjectByHandle(((PFILE_COMPLETION_INFORMATION
)FileInformation
)->IoCompletionHandle
,
429 IO_COMPLETION_MODIFY_STATE
,//???
434 if (NT_SUCCESS(Status
))
436 /* FIXME: maybe use lookaside list */
437 FileObject
->CompletionContext
= ExAllocatePool(NonPagedPool
, sizeof(IO_COMPLETION_CONTEXT
));
438 FileObject
->CompletionContext
->Key
= ((PFILE_COMPLETION_INFORMATION
)FileInformation
)->CompletionKey
;
439 FileObject
->CompletionContext
->Port
= Queue
;
441 ObDereferenceObject(Queue
);
445 ObDereferenceObject(FileObject
);
449 DeviceObject
= FileObject
->DeviceObject
;
451 Irp
= IoAllocateIrp(DeviceObject
->StackSize
,
455 ObDereferenceObject(FileObject
);
456 return STATUS_INSUFFICIENT_RESOURCES
;
459 SystemBuffer
= ExAllocatePoolWithTag(NonPagedPool
,
462 if (SystemBuffer
== NULL
)
465 ObDereferenceObject(FileObject
);
466 return(STATUS_INSUFFICIENT_RESOURCES
);
469 MmSafeCopyFromUser(SystemBuffer
,
473 /* Trigger FileObject/Event dereferencing */
474 Irp
->Tail
.Overlay
.OriginalFileObject
= FileObject
;
475 Irp
->RequestorMode
= PreviousMode
;
476 Irp
->AssociatedIrp
.SystemBuffer
= SystemBuffer
;
477 Irp
->UserIosb
= IoStatusBlock
;
478 Irp
->UserEvent
= &FileObject
->Event
;
479 KeResetEvent( &FileObject
->Event
);
480 Irp
->Tail
.Overlay
.Thread
= PsGetCurrentThread();
482 StackPtr
= IoGetNextIrpStackLocation(Irp
);
483 StackPtr
->MajorFunction
= IRP_MJ_SET_INFORMATION
;
484 StackPtr
->MinorFunction
= 0;
486 StackPtr
->Control
= 0;
487 StackPtr
->DeviceObject
= DeviceObject
;
488 StackPtr
->FileObject
= FileObject
;
490 StackPtr
->Parameters
.SetFile
.FileInformationClass
=
491 FileInformationClass
;
492 StackPtr
->Parameters
.SetFile
.Length
= Length
;
495 * Pass the IRP to the FSD (and wait for
498 DPRINT("FileObject->DeviceObject %x\n", FileObject
->DeviceObject
);
499 Status
= IoCallDriver(FileObject
->DeviceObject
,
501 if (Status
== STATUS_PENDING
&& (FileObject
->Flags
& FO_SYNCHRONOUS_IO
))
503 KeWaitForSingleObject(&FileObject
->Event
,
506 FileObject
->Flags
& FO_ALERTABLE_IO
,
508 Status
= IoStatusBlock
->Status
;
511 ExFreePool(SystemBuffer
);
523 IN PFILE_OBJECT FileObject
,
528 return STATUS_NOT_IMPLEMENTED
;
532 NtQueryAttributesFile(IN POBJECT_ATTRIBUTES ObjectAttributes
,
533 OUT PFILE_BASIC_INFORMATION FileInformation
)
535 IO_STATUS_BLOCK IoStatusBlock
;
540 Status
= ZwOpenFile (&FileHandle
,
541 SYNCHRONIZE
| FILE_READ_ATTRIBUTES
,
544 FILE_SHARE_READ
| FILE_SHARE_WRITE
| FILE_SHARE_DELETE
,
545 FILE_SYNCHRONOUS_IO_NONALERT
);
546 if (!NT_SUCCESS (Status
))
548 DPRINT ("ZwOpenFile() failed (Status %lx)\n", Status
);
552 /* Get file attributes */
553 Status
= ZwQueryInformationFile (FileHandle
,
556 sizeof(FILE_BASIC_INFORMATION
),
557 FileBasicInformation
);
558 ZwClose (FileHandle
);
559 if (!NT_SUCCESS (Status
))
561 DPRINT ("ZwQueryInformationFile() failed (Status %lx)\n", Status
);
569 NtQueryFullAttributesFile(IN POBJECT_ATTRIBUTES ObjectAttributes
,
570 OUT PFILE_NETWORK_OPEN_INFORMATION FileInformation
)
572 IO_STATUS_BLOCK IoStatusBlock
;
577 Status
= ZwOpenFile (&FileHandle
,
578 SYNCHRONIZE
| FILE_READ_ATTRIBUTES
,
581 FILE_SHARE_READ
| FILE_SHARE_WRITE
| FILE_SHARE_DELETE
,
582 FILE_SYNCHRONOUS_IO_NONALERT
);
583 if (!NT_SUCCESS (Status
))
585 DPRINT ("ZwOpenFile() failed (Status %lx)\n", Status
);
589 /* Get file attributes */
590 Status
= ZwQueryInformationFile (FileHandle
,
593 sizeof(FILE_NETWORK_OPEN_INFORMATION
),
594 FileNetworkOpenInformation
);
595 ZwClose (FileHandle
);
596 if (!NT_SUCCESS (Status
))
598 DPRINT ("ZwQueryInformationFile() failed (Status %lx)\n", Status
);
609 NtQueryEaFile(IN HANDLE FileHandle
,
610 OUT PIO_STATUS_BLOCK IoStatusBlock
,
613 IN BOOLEAN ReturnSingleEntry
,
614 IN PVOID EaList OPTIONAL
,
615 IN ULONG EaListLength
,
616 IN PULONG EaIndex OPTIONAL
,
617 IN BOOLEAN RestartScan
)
620 return STATUS_NOT_IMPLEMENTED
;
628 NtSetEaFile(IN HANDLE FileHandle
,
629 IN PIO_STATUS_BLOCK IoStatusBlock
,
631 IN ULONG EaBufferSize
)
634 return STATUS_NOT_IMPLEMENTED
;