2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS kernel
4 * FILE: ntoskrnl/io/file.c
5 * PURPOSE: Graceful system shutdown if a bug is detected
6 * PROGRAMMER: David Welch (welch@mcmail.com)
11 /* INCLUDES *****************************************************************/
13 #include <ddk/ntddk.h>
14 #include <internal/io.h>
17 #include <internal/debug.h>
19 /* FUNCTIONS *****************************************************************/
21 NTSTATUS STDCALL
NtQueryInformationFile(HANDLE FileHandle
,
22 PIO_STATUS_BLOCK IoStatusBlock
,
23 PVOID FileInformation
,
25 FILE_INFORMATION_CLASS FileInformationClass
)
27 return ZwQueryInformationFile(FileHandle
,
31 FileInformationClass
);
34 NTSTATUS STDCALL
ZwQueryInformationFile(HANDLE FileHandle
,
35 PIO_STATUS_BLOCK IoStatusBlock
,
36 PVOID FileInformation
,
38 FILE_INFORMATION_CLASS FileInformationClass
)
41 PDEVICE_OBJECT DeviceObject
;
42 PFILE_OBJECT FileObject
;
45 PIO_STACK_LOCATION StackPtr
;
47 DPRINT("ZwQueryInformationFile(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 KeInitializeEvent(&Event
,NotificationEvent
,FALSE
);
67 DeviceObject
= FileObject
->DeviceObject
;
69 Irp
= IoAllocateIrp(DeviceObject
->StackSize
, TRUE
);
72 ObDereferenceObject(FileObject
);
73 return STATUS_UNSUCCESSFUL
;
76 Irp
->UserIosb
= IoStatusBlock
;
77 Irp
->UserEvent
= &Event
;
78 Irp
->UserBuffer
=FileInformation
;
80 StackPtr
= IoGetNextIrpStackLocation(Irp
);
81 StackPtr
->MajorFunction
= IRP_MJ_QUERY_INFORMATION
;
82 StackPtr
->MinorFunction
= 0;
84 StackPtr
->Control
= 0;
85 StackPtr
->DeviceObject
= DeviceObject
;
86 StackPtr
->FileObject
= FileObject
;
88 StackPtr
->Parameters
.QueryFile
.FileInformationClass
=
90 StackPtr
->Parameters
.QueryFile
.Length
= Length
;
92 Status
= IoCallDriver(FileObject
->DeviceObject
,Irp
);
93 if (Status
==STATUS_PENDING
&& (FileObject
->Flags
& FO_SYNCHRONOUS_IO
))
95 KeWaitForSingleObject(&Event
,Executive
,KernelMode
,FALSE
,NULL
);
96 Status
= Irp
->IoStatus
.Status
;
101 NTSTATUS
NtSetInformationFile(HANDLE FileHandle
,
102 PIO_STATUS_BLOCK IoStatusBlock
,
103 PVOID FileInformation
,
105 FILE_INFORMATION_CLASS FileInformationClass
)
107 return ZwSetInformationFile(FileHandle
,
111 FileInformationClass
);
114 NTSTATUS
ZwSetInformationFile(HANDLE FileHandle
,
115 PIO_STATUS_BLOCK IoStatusBlock
,
116 PVOID FileInformation
,
118 FILE_INFORMATION_CLASS FileInformationClass
)
121 PFILE_OBJECT FileObject
;
123 PIO_STACK_LOCATION StackPtr
;
126 DPRINT("ZwSetInformationFile(Handle %x StatBlk %x FileInfo %x Length %d Class %d)\n",
131 FileInformationClass
);
133 /* Get the file object from the file handle */
134 Status
= ObReferenceObjectByHandle(FileHandle
,
135 FILE_WRITE_ATTRIBUTES
,
138 (PVOID
*) &FileObject
,
140 if (!NT_SUCCESS(Status
))
144 DPRINT("FileObject %x\n", FileObject
);
146 /* initialize an event object to wait on for the request */
147 KeInitializeEvent(&Event
, NotificationEvent
, FALSE
);
149 /* build the IRP to be sent to the driver for the request */
150 Irp
= IoBuildSynchronousFsdRequest(IRP_MJ_SET_INFORMATION
,
151 FileObject
->DeviceObject
,
157 StackPtr
= IoGetNextIrpStackLocation(Irp
);
158 StackPtr
->FileObject
= FileObject
;
159 StackPtr
->Parameters
.SetFile
.Length
= Length
;
160 StackPtr
->Parameters
.SetFile
.FileInformationClass
= FileInformationClass
;
162 /* Pass the IRP to the FSD (and wait for it if required) */
163 DPRINT("FileObject->DeviceObject %x\n", FileObject
->DeviceObject
);
164 Status
= IoCallDriver(FileObject
->DeviceObject
, Irp
);
165 if (Status
== STATUS_PENDING
&& (FileObject
->Flags
& FO_SYNCHRONOUS_IO
))
167 KeWaitForSingleObject(&Event
, Executive
, KernelMode
, FALSE
, NULL
);
168 Status
= Irp
->IoStatus
.Status
;
174 PGENERIC_MAPPING
IoGetFileObjectGenericMapping(VOID
)
179 NTSTATUS STDCALL
NtQueryAttributesFile(IN HANDLE FileHandle
,
182 return ZwQueryAttributesFile(FileHandle
, Buffer
);
185 NTSTATUS STDCALL
ZwQueryAttributesFile(IN HANDLE FileHandle
, IN PVOID Buffer
)
190 NTSTATUS STDCALL
NtQueryFullAttributesFile(IN HANDLE FileHandle
,
193 return ZwQueryFullAttributesFile(FileHandle
, Attributes
);
196 NTSTATUS STDCALL
ZwQueryFullAttributesFile(IN HANDLE FileHandle
,
202 NTSTATUS STDCALL
NtQueryEaFile(IN HANDLE FileHandle
,
203 OUT PIO_STATUS_BLOCK IoStatusBlock
,
206 IN BOOLEAN ReturnSingleEntry
,
207 IN PVOID EaList OPTIONAL
,
208 IN ULONG EaListLength
,
209 IN PULONG EaIndex OPTIONAL
,
210 IN BOOLEAN RestartScan
)
212 return NtQueryEaFile(FileHandle
,
223 NTSTATUS STDCALL
ZwQueryEaFile(IN HANDLE FileHandle
,
224 OUT PIO_STATUS_BLOCK IoStatusBlock
,
227 IN BOOLEAN ReturnSingleEntry
,
228 IN PVOID EaList OPTIONAL
,
229 IN ULONG EaListLength
,
230 IN PULONG EaIndex OPTIONAL
,
231 IN BOOLEAN RestartScan
)
236 NTSTATUS STDCALL
NtSetEaFile(IN HANDLE FileHandle
,
237 IN PIO_STATUS_BLOCK IoStatusBlock
,
241 return ZwSetEaFile(FileHandle
,
247 NTSTATUS STDCALL
ZwSetEaFile(IN HANDLE FileHandle
,
248 IN PIO_STATUS_BLOCK IoStatusBlock
,