fixed GetFileAttributes()
[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 PIRP Irp;
41 PDEVICE_OBJECT DeviceObject;
42 PFILE_OBJECT FileObject;
43 NTSTATUS Status;
44 KEVENT Event;
45 PIO_STACK_LOCATION StackPtr;
46
47 DPRINT("ZwQueryInformationFile(Handle %x StatBlk %x FileInfo %x Length %d Class %d)\n",
48 FileHandle,
49 IoStatusBlock,
50 FileInformation,
51 Length,
52 FileInformationClass);
53
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 KeInitializeEvent(&Event,NotificationEvent,FALSE);
67 DeviceObject = FileObject->DeviceObject;
68
69 Irp = IoAllocateIrp(DeviceObject->StackSize, TRUE);
70 if (Irp==NULL)
71 {
72 ObDereferenceObject(FileObject);
73 return STATUS_UNSUCCESSFUL;
74 }
75
76 Irp->UserIosb = IoStatusBlock;
77 Irp->UserEvent = &Event;
78 Irp->UserBuffer=FileInformation;
79
80 StackPtr = IoGetNextIrpStackLocation(Irp);
81 StackPtr->MajorFunction = IRP_MJ_QUERY_INFORMATION;
82 StackPtr->MinorFunction = 0;
83 StackPtr->Flags = 0;
84 StackPtr->Control = 0;
85 StackPtr->DeviceObject = DeviceObject;
86 StackPtr->FileObject = FileObject;
87
88 StackPtr->Parameters.QueryFile.FileInformationClass =
89 FileInformationClass;
90 StackPtr->Parameters.QueryFile.Length = Length;
91
92 Status = IoCallDriver(FileObject->DeviceObject,Irp);
93 if (Status==STATUS_PENDING && (FileObject->Flags & FO_SYNCHRONOUS_IO))
94 {
95 KeWaitForSingleObject(&Event,Executive,KernelMode,FALSE,NULL);
96 Status = Irp->IoStatus.Status;
97 }
98 return(Status);
99 }
100
101 NTSTATUS NtSetInformationFile(HANDLE FileHandle,
102 PIO_STATUS_BLOCK IoStatusBlock,
103 PVOID FileInformation,
104 ULONG Length,
105 FILE_INFORMATION_CLASS FileInformationClass)
106 {
107 return ZwSetInformationFile(FileHandle,
108 IoStatusBlock,
109 FileInformation,
110 Length,
111 FileInformationClass);
112 }
113
114 NTSTATUS ZwSetInformationFile(HANDLE FileHandle,
115 PIO_STATUS_BLOCK IoStatusBlock,
116 PVOID FileInformation,
117 ULONG Length,
118 FILE_INFORMATION_CLASS FileInformationClass)
119 {
120 NTSTATUS Status;
121 PFILE_OBJECT FileObject;
122 PIRP Irp;
123 PIO_STACK_LOCATION StackPtr;
124 KEVENT Event;
125
126 DPRINT("ZwSetInformationFile(Handle %x StatBlk %x FileInfo %x Length %d Class %d)\n",
127 FileHandle,
128 IoStatusBlock,
129 FileInformation,
130 Length,
131 FileInformationClass);
132
133 /* Get the file object from the file handle */
134 Status = ObReferenceObjectByHandle(FileHandle,
135 FILE_WRITE_ATTRIBUTES,
136 IoFileType,
137 UserMode,
138 (PVOID *) &FileObject,
139 NULL);
140 if (!NT_SUCCESS(Status))
141 {
142 return Status;
143 }
144 DPRINT("FileObject %x\n", FileObject);
145
146 /* initialize an event object to wait on for the request */
147 KeInitializeEvent(&Event, NotificationEvent, FALSE);
148
149 /* build the IRP to be sent to the driver for the request */
150 Irp = IoBuildSynchronousFsdRequest(IRP_MJ_SET_INFORMATION,
151 FileObject->DeviceObject,
152 FileInformation,
153 Length,
154 0,
155 &Event,
156 IoStatusBlock);
157 StackPtr = IoGetNextIrpStackLocation(Irp);
158 StackPtr->FileObject = FileObject;
159 StackPtr->Parameters.SetFile.Length = Length;
160 StackPtr->Parameters.SetFile.FileInformationClass = FileInformationClass;
161
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))
166 {
167 KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL);
168 Status = Irp->IoStatus.Status;
169 }
170
171 return Status;
172 }
173
174 PGENERIC_MAPPING IoGetFileObjectGenericMapping(VOID)
175 {
176 UNIMPLEMENTED;
177 }
178
179 NTSTATUS STDCALL NtQueryAttributesFile(IN HANDLE FileHandle,
180 IN PVOID Buffer)
181 {
182 return ZwQueryAttributesFile(FileHandle, Buffer);
183 }
184
185 NTSTATUS STDCALL ZwQueryAttributesFile(IN HANDLE FileHandle, IN PVOID Buffer)
186 {
187 UNIMPLEMENTED;
188 }
189
190 NTSTATUS STDCALL NtQueryFullAttributesFile(IN HANDLE FileHandle,
191 IN PVOID Attributes)
192 {
193 return ZwQueryFullAttributesFile(FileHandle, Attributes);
194 }
195
196 NTSTATUS STDCALL ZwQueryFullAttributesFile(IN HANDLE FileHandle,
197 IN PVOID Attributes)
198 {
199 UNIMPLEMENTED;
200 }
201
202 NTSTATUS STDCALL NtQueryEaFile(IN HANDLE FileHandle,
203 OUT PIO_STATUS_BLOCK IoStatusBlock,
204 OUT PVOID Buffer,
205 IN ULONG Length,
206 IN BOOLEAN ReturnSingleEntry,
207 IN PVOID EaList OPTIONAL,
208 IN ULONG EaListLength,
209 IN PULONG EaIndex OPTIONAL,
210 IN BOOLEAN RestartScan)
211 {
212 return NtQueryEaFile(FileHandle,
213 IoStatusBlock,
214 Buffer,
215 Length,
216 ReturnSingleEntry,
217 EaList,
218 EaListLength,
219 EaIndex,
220 RestartScan);
221 }
222
223 NTSTATUS STDCALL ZwQueryEaFile(IN HANDLE FileHandle,
224 OUT PIO_STATUS_BLOCK IoStatusBlock,
225 OUT PVOID Buffer,
226 IN ULONG Length,
227 IN BOOLEAN ReturnSingleEntry,
228 IN PVOID EaList OPTIONAL,
229 IN ULONG EaListLength,
230 IN PULONG EaIndex OPTIONAL,
231 IN BOOLEAN RestartScan)
232 {
233 UNIMPLEMENTED;
234 }
235
236 NTSTATUS STDCALL NtSetEaFile(IN HANDLE FileHandle,
237 IN PIO_STATUS_BLOCK IoStatusBlock,
238 PVOID EaBuffer,
239 ULONG EaBufferSize)
240 {
241 return ZwSetEaFile(FileHandle,
242 IoStatusBlock,
243 EaBuffer,
244 EaBufferSize);
245 }
246
247 NTSTATUS STDCALL ZwSetEaFile(IN HANDLE FileHandle,
248 IN PIO_STATUS_BLOCK IoStatusBlock,
249 PVOID EaBuffer,
250 ULONG EaBufferSize)
251 {
252 UNIMPLEMENTED;
253 }
254
255