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