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 PFILE_OBJECT FileObject
;
43 PIO_STACK_LOCATION StackPtr
;
46 DPRINT("ZwQueryInformation(Handle %x StatBlk %x FileInfo %x Length %d Class %d)\n",
51 FileInformationClass
);
53 /* Get the file object from the file handle */
54 Status
= ObReferenceObjectByHandle(FileHandle
,
58 (PVOID
*) &FileObject
,
60 if (!NT_SUCCESS(Status
))
64 DPRINT("FileObject %x\n", FileObject
);
66 /* initialize an event object to wait on for the request */
67 KeInitializeEvent(&Event
, NotificationEvent
, FALSE
);
69 /* build the IRP to be sent to the driver for the request */
70 Irp
= IoBuildSynchronousFsdRequest(IRP_MJ_QUERY_INFORMATION
,
71 FileObject
->DeviceObject
,
77 StackPtr
= IoGetNextIrpStackLocation(Irp
);
78 StackPtr
->FileObject
= FileObject
;
79 StackPtr
->Parameters
.QueryFile
.Length
= Length
;
80 StackPtr
->Parameters
.QueryFile
.FileInformationClass
= FileInformationClass
;
82 /* Pass the IRP to the FSD (and wait for it if required) */
83 DPRINT("FileObject->DeviceObject %x\n", FileObject
->DeviceObject
);
84 Status
= IoCallDriver(FileObject
->DeviceObject
, Irp
);
85 if (Status
== STATUS_PENDING
&& (FileObject
->Flags
& FO_SYNCHRONOUS_IO
))
87 KeWaitForSingleObject(&Event
, Executive
, KernelMode
, FALSE
, NULL
);
88 Status
= Irp
->IoStatus
.Status
;
94 NTSTATUS
NtSetInformationFile(HANDLE FileHandle
,
95 PIO_STATUS_BLOCK IoStatusBlock
,
96 PVOID FileInformation
,
98 FILE_INFORMATION_CLASS FileInformationClass
)
100 return ZwSetInformationFile(FileHandle
,
104 FileInformationClass
);
107 NTSTATUS
ZwSetInformationFile(HANDLE FileHandle
,
108 PIO_STATUS_BLOCK IoStatusBlock
,
109 PVOID FileInformation
,
111 FILE_INFORMATION_CLASS FileInformationClass
)
114 PFILE_OBJECT FileObject
;
116 PIO_STACK_LOCATION StackPtr
;
119 DPRINT("ZwSetInformation(Handle %x StatBlk %x FileInfo %x Length %d Class %d)\n",
124 FileInformationClass
);
126 /* Get the file object from the file handle */
127 Status
= ObReferenceObjectByHandle(FileHandle
,
128 FILE_WRITE_ATTRIBUTES
,
131 (PVOID
*) &FileObject
,
133 if (!NT_SUCCESS(Status
))
137 DPRINT("FileObject %x\n", FileObject
);
139 /* initialize an event object to wait on for the request */
140 KeInitializeEvent(&Event
, NotificationEvent
, FALSE
);
142 /* build the IRP to be sent to the driver for the request */
143 Irp
= IoBuildSynchronousFsdRequest(IRP_MJ_SET_INFORMATION
,
144 FileObject
->DeviceObject
,
150 StackPtr
= IoGetNextIrpStackLocation(Irp
);
151 StackPtr
->FileObject
= FileObject
;
152 StackPtr
->Parameters
.SetFile
.Length
= Length
;
153 StackPtr
->Parameters
.SetFile
.FileInformationClass
= FileInformationClass
;
155 /* Pass the IRP to the FSD (and wait for it if required) */
156 DPRINT("FileObject->DeviceObject %x\n", FileObject
->DeviceObject
);
157 Status
= IoCallDriver(FileObject
->DeviceObject
, Irp
);
158 if (Status
== STATUS_PENDING
&& (FileObject
->Flags
& FO_SYNCHRONOUS_IO
))
160 KeWaitForSingleObject(&Event
, Executive
, KernelMode
, FALSE
, NULL
);
161 Status
= Irp
->IoStatus
.Status
;
167 PGENERIC_MAPPING
IoGetFileObjectGenericMapping(VOID
)
172 NTSTATUS STDCALL
NtQueryAttributesFile(IN HANDLE FileHandle
,
175 return ZwQueryAttributesFile(FileHandle
, Buffer
);
178 NTSTATUS STDCALL
ZwQueryAttributesFile(IN HANDLE FileHandle
, IN PVOID Buffer
)
183 NTSTATUS STDCALL
NtQueryFullAttributesFile(IN HANDLE FileHandle
,
186 return ZwQueryFullAttributesFile(FileHandle
, Attributes
);
189 NTSTATUS STDCALL
ZwQueryFullAttributesFile(IN HANDLE FileHandle
,
195 NTSTATUS STDCALL
NtQueryEaFile(IN HANDLE FileHandle
,
196 OUT PIO_STATUS_BLOCK IoStatusBlock
,
199 IN BOOLEAN ReturnSingleEntry
,
200 IN PVOID EaList OPTIONAL
,
201 IN ULONG EaListLength
,
202 IN PULONG EaIndex OPTIONAL
,
203 IN BOOLEAN RestartScan
)
205 return NtQueryEaFile(FileHandle
,
216 NTSTATUS STDCALL
ZwQueryEaFile(IN HANDLE FileHandle
,
217 OUT PIO_STATUS_BLOCK IoStatusBlock
,
220 IN BOOLEAN ReturnSingleEntry
,
221 IN PVOID EaList OPTIONAL
,
222 IN ULONG EaListLength
,
223 IN PULONG EaIndex OPTIONAL
,
224 IN BOOLEAN RestartScan
)
229 NTSTATUS STDCALL
NtSetEaFile(IN HANDLE FileHandle
,
230 IN PIO_STATUS_BLOCK IoStatusBlock
,
234 return ZwSetEaFile(FileHandle
,
240 NTSTATUS STDCALL
ZwSetEaFile(IN HANDLE FileHandle
,
241 IN PIO_STATUS_BLOCK IoStatusBlock
,