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