c5cdd1c2df1e235ee28aa52a8b86130d630416bb
[reactos.git] / reactos / ntoskrnl / fs / util.c
1 /* $Id: util.c,v 1.16 2004/06/23 00:42:21 ion Exp $
2 *
3 * reactos/ntoskrnl/fs/util.c
4 *
5 */
6 #include <ddk/ntddk.h>
7 #include <ddk/ntifs.h>
8
9 #define NDEBUG
10 #include <internal/debug.h>
11
12 /**********************************************************************
13 * NAME EXPORTED
14 * FsRtlIsTotalDeviceFailure@4
15 *
16 * DESCRIPTION
17 * Check if an NTSTATUS error code represents a
18 * disk hardware failure.
19 *
20 * ARGUMENTS
21 * NtStatus
22 * NTSTATUS to test.
23 *
24 * RETURN VALUE
25 * FALSE if either (NtStatus >= STATUS_SUCCESS),
26 * STATUS_CRC_ERROR, STATUS_DEVICE_DATA_ERROR;
27 * TRUE otherwise.
28 *
29 * @implemented
30 */
31 BOOLEAN
32 STDCALL
33 FsRtlIsTotalDeviceFailure (
34 IN NTSTATUS NtStatus
35 )
36 {
37 return (
38 (NT_SUCCESS(NtStatus))
39 || (STATUS_CRC_ERROR == NtStatus)
40 || (STATUS_DEVICE_DATA_ERROR == NtStatus)
41 ? FALSE
42 : TRUE
43 );
44 }
45
46
47 /**********************************************************************
48 * NAME EXPORTED
49 * FsRtlIsNtstatusExpected/1
50 * stack32 = 4
51 *
52 * DESCRIPTION
53 * Check an NTSTATUS value is expected by the FS kernel
54 * subsystem.
55 *
56 * ARGUMENTS
57 * NtStatus
58 * NTSTATUS to test.
59 *
60 * RETURN VALUE
61 * TRUE if NtStatus is NOT one out of:
62 * - STATUS_ACCESS_VIOLATION
63 * - STATUS_ILLEGAL_INSTRUCTION
64 * - STATUS_DATATYPE_MISALIGNMENT
65 * - STATUS_INSTRUCTION_MISALIGNMENT
66 * which are the forbidden return stati in the FsRtl
67 * subsystem; FALSE otherwise.
68 *
69 * REVISIONS
70 * 2002-01-17 Fixed a bad bug reported by Bo Brantén.
71 * Up to version 1.8, this function's semantics was
72 * exactly the opposite! Thank you Bo.
73 *
74 * @implemented
75 */
76 BOOLEAN
77 STDCALL
78 FsRtlIsNtstatusExpected (
79 IN NTSTATUS NtStatus
80 )
81 {
82 return (
83 (STATUS_DATATYPE_MISALIGNMENT == NtStatus)
84 || (STATUS_ACCESS_VIOLATION == NtStatus)
85 || (STATUS_ILLEGAL_INSTRUCTION == NtStatus)
86 || (STATUS_INSTRUCTION_MISALIGNMENT == NtStatus)
87 )
88 ? FALSE
89 : TRUE;
90 }
91
92 /*
93 * @unimplemented
94 */
95 ULONG
96 FsRtlIsPagingFile (
97 IN PFILE_OBJECT FileObject
98 )
99 {
100 UNIMPLEMENTED;
101 return 0;
102 }
103
104
105 /**********************************************************************
106 * NAME EXPORTED
107 * FsRtlNormalizeNtstatus@8
108 *
109 * DESCRIPTION
110 * Normalize an NTSTATUS value for using in the FS subsystem.
111 *
112 * ARGUMENTS
113 * NtStatusToNormalize
114 * NTSTATUS to normalize.
115 * NormalizedNtStatus
116 * NTSTATUS to return if the NtStatusToNormalize
117 * value is unexpected by the FS kernel subsystem.
118 *
119 * RETURN VALUE
120 * NtStatusToNormalize if it is an expected value,
121 * otherwise NormalizedNtStatus.
122 *
123 * @implemented
124 */
125 NTSTATUS
126 STDCALL
127 FsRtlNormalizeNtstatus (
128 IN NTSTATUS NtStatusToNormalize,
129 IN NTSTATUS NormalizedNtStatus
130 )
131 {
132 return
133 (TRUE == FsRtlIsNtstatusExpected(NtStatusToNormalize))
134 ? NtStatusToNormalize
135 : NormalizedNtStatus;
136 }
137
138
139 /**********************************************************************
140 * Miscellanea (they may fit somewhere else)
141 *********************************************************************/
142
143
144 /**********************************************************************
145 * NAME EXPORTED
146 * FsRtlAllocateResource@0
147 *
148 * DESCRIPTION
149 *
150 * ARGUMENTS
151 *
152 * RETURN VALUE
153 *
154 *
155 * @unimplemented
156 */
157 DWORD
158 STDCALL
159 FsRtlAllocateResource (VOID)
160 {
161 return 0;
162 }
163
164
165 /**********************************************************************
166 * NAME EXPORTED
167 * FsRtlBalanceReads@4
168 *
169 * DESCRIPTION
170 *
171 * ARGUMENTS
172 *
173 * RETURN VALUE
174 *
175 *
176 * @unimplemented
177 */
178 DWORD
179 STDCALL
180 FsRtlBalanceReads (
181 DWORD Unknown0
182 )
183 {
184 return 0;
185 }
186
187
188 /**********************************************************************
189 * NAME EXPORTED
190 * FsRtlCopyRead@32
191 *
192 * DESCRIPTION
193 *
194 * ARGUMENTS
195 *
196 * RETURN VALUE
197 *
198 * NOTE
199 * From Bo Branten's ntifs.h v12.
200 *
201 * @unimplemented
202 */
203 BOOLEAN
204 STDCALL
205 FsRtlCopyRead (
206 IN PFILE_OBJECT FileObject,
207 IN PLARGE_INTEGER FileOffset,
208 IN ULONG Length,
209 IN BOOLEAN Wait,
210 IN ULONG LockKey,
211 OUT PVOID Buffer,
212 OUT PIO_STATUS_BLOCK IoStatus,
213 IN PDEVICE_OBJECT DeviceObject
214 )
215 {
216 return FALSE;
217 }
218
219
220 /**********************************************************************
221 * NAME EXPORTED
222 * FsRtlCopyWrite@32
223 *
224 * DESCRIPTION
225 *
226 * ARGUMENTS
227 *
228 * RETURN VALUE
229 *
230 * NOTE
231 * From Bo Branten's ntifs.h v12.
232 *
233 * @unimplemented
234 */
235 BOOLEAN
236 STDCALL
237 FsRtlCopyWrite (
238 IN PFILE_OBJECT FileObject,
239 IN PLARGE_INTEGER FileOffset,
240 IN ULONG Length,
241 IN BOOLEAN Wait,
242 IN ULONG LockKey,
243 IN PVOID Buffer,
244 OUT PIO_STATUS_BLOCK IoStatus,
245 IN PDEVICE_OBJECT DeviceObject
246 )
247 {
248 return FALSE;
249 }
250
251
252 /**********************************************************************
253 * NAME EXPORTED
254 * FsRtlGetFileSize@8
255 *
256 * DESCRIPTION
257 *
258 * ARGUMENTS
259 *
260 * RETURN VALUE
261 *
262 * @implemented
263 */
264 NTSTATUS
265 STDCALL
266 FsRtlGetFileSize (
267 IN PFILE_OBJECT FileObject,
268 IN OUT PLARGE_INTEGER FileSize
269 )
270 {
271 FILE_STANDARD_INFORMATION Info;
272 NTSTATUS Status;
273 ULONG Length;
274
275 Status = IoQueryFileInformation(FileObject,
276 FileStandardInformation,
277 sizeof(Info),
278 &Info,
279 &Length);
280 if (NT_SUCCESS(Status))
281 {
282 FileSize->QuadPart = Info.EndOfFile.QuadPart;
283 }
284
285 return Status;
286 }
287
288 /*
289 * @unimplemented
290 */
291 STDCALL
292 NTSTATUS
293 FsRtlInsertPerStreamContext (
294 IN PFSRTL_ADVANCED_FCB_HEADER PerStreamContext,
295 IN PFSRTL_PER_STREAM_CONTEXT Ptr
296 )
297 {
298 UNIMPLEMENTED;
299 return STATUS_NOT_IMPLEMENTED;
300 }
301
302 /*
303 * @unimplemented
304 */
305 STDCALL
306 PFSRTL_PER_STREAM_CONTEXT
307 FsRtlRemovePerStreamContext (
308 IN PFSRTL_ADVANCED_FCB_HEADER StreamContext,
309 IN PVOID OwnerId OPTIONAL,
310 IN PVOID InstanceId OPTIONAL
311 )
312 {
313 UNIMPLEMENTED;
314 return NULL;
315 }
316
317 /*
318 * @unimplemented
319 */
320 STDCALL
321 NTSTATUS
322 FsRtlInsertPerFileObjectContext (
323 IN PFSRTL_ADVANCED_FCB_HEADER PerFileObjectContext,
324 IN PVOID /* PFSRTL_PER_FILE_OBJECT_CONTEXT*/ Ptr
325 )
326 {
327 UNIMPLEMENTED;
328 return STATUS_NOT_IMPLEMENTED;
329 }
330
331 /**********************************************************************
332 * NAME EXPORTED
333 * FsRtlPostPagingFileStackOverflow@12
334 *
335 * DESCRIPTION
336 *
337 * ARGUMENTS
338 *
339 * RETURN VALUE
340 *
341 * @unimplemented
342 */
343 VOID
344 STDCALL
345 FsRtlPostPagingFileStackOverflow (
346 DWORD Unknown0,
347 DWORD Unknown1,
348 DWORD Unknown2
349 )
350 {
351 }
352
353
354 /**********************************************************************
355 * NAME EXPORTED
356 * FsRtlPostStackOverflow@12
357 *
358 * DESCRIPTION
359 *
360 * ARGUMENTS
361 *
362 * RETURN VALUE
363 *
364 * @unimplemented
365 */
366 VOID
367 STDCALL
368 FsRtlPostStackOverflow (
369 DWORD Unknown0,
370 DWORD Unknown1,
371 DWORD Unknown2
372 )
373 {
374 }
375
376
377 /*
378 * @unimplemented
379 */
380 STDCALL
381 PVOID /* PFSRTL_PER_FILE_OBJECT_CONTEXT*/
382 FsRtlRemovePerFileObjectContext (
383 IN PFSRTL_ADVANCED_FCB_HEADER PerFileObjectContext,
384 IN PVOID OwnerId OPTIONAL,
385 IN PVOID InstanceId OPTIONAL
386 )
387 {
388 UNIMPLEMENTED;
389 return NULL;
390 }
391
392 /**********************************************************************
393 * NAME EXPORTED
394 * FsRtlSyncVolumes@12
395 *
396 * DESCRIPTION
397 * Obsolete function.
398 *
399 * ARGUMENTS
400 *
401 * RETURN VALUE
402 * It always returns STATUS_SUCCESS.
403 *
404 * @implemented
405 */
406 NTSTATUS
407 STDCALL
408 FsRtlSyncVolumes (
409 DWORD Unknown0,
410 DWORD Unknown1,
411 DWORD Unknown2
412 )
413 {
414 return STATUS_SUCCESS;
415 }
416
417
418 /*
419 * @unimplemented
420 */
421 STDCALL
422 VOID
423 FsRtlTeardownPerStreamContexts (
424 IN PFSRTL_ADVANCED_FCB_HEADER AdvancedHeader
425 )
426 {
427 UNIMPLEMENTED;
428 }
429
430 /* EOF */