Several bug fixes
[reactos.git] / reactos / ntoskrnl / io / file.c
1 /*
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)
7 * UPDATE HISTORY:
8 * Created 22/05/98
9 */
10
11 /* INCLUDES *****************************************************************/
12
13 #include <ddk/ntddk.h>
14 #include <internal/io.h>
15
16 #define NDEBUG
17 #include <internal/debug.h>
18
19 /* FUNCTIONS *****************************************************************/
20
21 NTSTATUS STDCALL NtQueryInformationFile(HANDLE FileHandle,
22 PIO_STATUS_BLOCK IoStatusBlock,
23 PVOID FileInformation,
24 ULONG Length,
25 FILE_INFORMATION_CLASS FileInformationClass)
26 {
27 return ZwQueryInformationFile(FileHandle,
28 IoStatusBlock,
29 FileInformation,
30 Length,
31 FileInformationClass);
32 }
33
34 NTSTATUS STDCALL ZwQueryInformationFile(HANDLE FileHandle,
35 PIO_STATUS_BLOCK IoStatusBlock,
36 PVOID FileInformation,
37 ULONG Length,
38 FILE_INFORMATION_CLASS FileInformationClass)
39 {
40 NTSTATUS Status;
41 PFILE_OBJECT FileObject;
42 PIRP Irp;
43 PIO_STACK_LOCATION StackPtr;
44 KEVENT Event;
45
46 DPRINT("ZwQueryInformation(Handle %x StatBlk %x FileInfo %x Length %d Class %d)\n",
47 FileHandle,
48 IoStatusBlock,
49 FileInformation,
50 Length,
51 FileInformationClass);
52
53 /* Get the file object from the file handle */
54 Status = ObReferenceObjectByHandle(FileHandle,
55 FILE_READ_ATTRIBUTES,
56 IoFileType,
57 UserMode,
58 (PVOID *) &FileObject,
59 NULL);
60 if (!NT_SUCCESS(Status))
61 {
62 return Status;
63 }
64 DPRINT("FileObject %x\n", FileObject);
65
66 /* initialize an event object to wait on for the request */
67 KeInitializeEvent(&Event, NotificationEvent, FALSE);
68
69 /* build the IRP to be sent to the driver for the request */
70 Irp = IoBuildSynchronousFsdRequest(IRP_MJ_QUERY_INFORMATION,
71 FileObject->DeviceObject,
72 FileInformation,
73 Length,
74 0,
75 &Event,
76 IoStatusBlock);
77 StackPtr = IoGetNextIrpStackLocation(Irp);
78 StackPtr->FileObject = FileObject;
79 StackPtr->Parameters.QueryFile.Length = Length;
80 StackPtr->Parameters.QueryFile.FileInformationClass = FileInformationClass;
81
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))
86 {
87 KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL);
88 Status = Irp->IoStatus.Status;
89 }
90
91 return Status;
92 }
93
94 NTSTATUS NtSetInformationFile(HANDLE FileHandle,
95 PIO_STATUS_BLOCK IoStatusBlock,
96 PVOID FileInformation,
97 ULONG Length,
98 FILE_INFORMATION_CLASS FileInformationClass)
99 {
100 return ZwSetInformationFile(FileHandle,
101 IoStatusBlock,
102 FileInformation,
103 Length,
104 FileInformationClass);
105 }
106
107 NTSTATUS ZwSetInformationFile(HANDLE FileHandle,
108 PIO_STATUS_BLOCK IoStatusBlock,
109 PVOID FileInformation,
110 ULONG Length,
111 FILE_INFORMATION_CLASS FileInformationClass)
112 {
113 NTSTATUS Status;
114 PFILE_OBJECT FileObject;
115 PIRP Irp;
116 PIO_STACK_LOCATION StackPtr;
117 KEVENT Event;
118
119 DPRINT("ZwSetInformation(Handle %x StatBlk %x FileInfo %x Length %d Class %d)\n",
120 FileHandle,
121 IoStatusBlock,
122 FileInformation,
123 Length,
124 FileInformationClass);
125
126 /* Get the file object from the file handle */
127 Status = ObReferenceObjectByHandle(FileHandle,
128 FILE_WRITE_ATTRIBUTES,
129 IoFileType,
130 UserMode,
131 (PVOID *) &FileObject,
132 NULL);
133 if (!NT_SUCCESS(Status))
134 {
135 return Status;
136 }
137 DPRINT("FileObject %x\n", FileObject);
138
139 /* initialize an event object to wait on for the request */
140 KeInitializeEvent(&Event, NotificationEvent, FALSE);
141
142 /* build the IRP to be sent to the driver for the request */
143 Irp = IoBuildSynchronousFsdRequest(IRP_MJ_SET_INFORMATION,
144 FileObject->DeviceObject,
145 FileInformation,
146 Length,
147 0,
148 &Event,
149 IoStatusBlock);
150 StackPtr = IoGetNextIrpStackLocation(Irp);
151 StackPtr->FileObject = FileObject;
152 StackPtr->Parameters.SetFile.Length = Length;
153 StackPtr->Parameters.SetFile.FileInformationClass = FileInformationClass;
154
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))
159 {
160 KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL);
161 Status = Irp->IoStatus.Status;
162 }
163
164 return Status;
165 }
166
167 PGENERIC_MAPPING IoGetFileObjectGenericMapping(VOID)
168 {
169 UNIMPLEMENTED;
170 }
171
172 NTSTATUS STDCALL NtQueryAttributesFile(IN HANDLE FileHandle,
173 IN PVOID Buffer)
174 {
175 return ZwQueryAttributesFile(FileHandle, Buffer);
176 }
177
178 NTSTATUS STDCALL ZwQueryAttributesFile(IN HANDLE FileHandle, IN PVOID Buffer)
179 {
180 UNIMPLEMENTED;
181 }
182
183 NTSTATUS STDCALL NtQueryFullAttributesFile(IN HANDLE FileHandle,
184 IN PVOID Attributes)
185 {
186 return ZwQueryFullAttributesFile(FileHandle, Attributes);
187 }
188
189 NTSTATUS STDCALL ZwQueryFullAttributesFile(IN HANDLE FileHandle,
190 IN PVOID Attributes)
191 {
192 UNIMPLEMENTED;
193 }
194
195 NTSTATUS STDCALL NtQueryEaFile(IN HANDLE FileHandle,
196 OUT PIO_STATUS_BLOCK IoStatusBlock,
197 OUT PVOID Buffer,
198 IN ULONG Length,
199 IN BOOLEAN ReturnSingleEntry,
200 IN PVOID EaList OPTIONAL,
201 IN ULONG EaListLength,
202 IN PULONG EaIndex OPTIONAL,
203 IN BOOLEAN RestartScan)
204 {
205 return NtQueryEaFile(FileHandle,
206 IoStatusBlock,
207 Buffer,
208 Length,
209 ReturnSingleEntry,
210 EaList,
211 EaListLength,
212 EaIndex,
213 RestartScan);
214 }
215
216 NTSTATUS STDCALL ZwQueryEaFile(IN HANDLE FileHandle,
217 OUT PIO_STATUS_BLOCK IoStatusBlock,
218 OUT PVOID Buffer,
219 IN ULONG Length,
220 IN BOOLEAN ReturnSingleEntry,
221 IN PVOID EaList OPTIONAL,
222 IN ULONG EaListLength,
223 IN PULONG EaIndex OPTIONAL,
224 IN BOOLEAN RestartScan)
225 {
226 UNIMPLEMENTED;
227 }
228
229 NTSTATUS STDCALL NtSetEaFile(IN HANDLE FileHandle,
230 IN PIO_STATUS_BLOCK IoStatusBlock,
231 PVOID EaBuffer,
232 ULONG EaBufferSize)
233 {
234 return ZwSetEaFile(FileHandle,
235 IoStatusBlock,
236 EaBuffer,
237 EaBufferSize);
238 }
239
240 NTSTATUS STDCALL ZwSetEaFile(IN HANDLE FileHandle,
241 IN PIO_STATUS_BLOCK IoStatusBlock,
242 PVOID EaBuffer,
243 ULONG EaBufferSize)
244 {
245 UNIMPLEMENTED;
246 }
247
248