2 * COPYRIGHT: GNU GENERAL PUBLIC LICENSE VERSION 2
3 * PROJECT: ReiserFs file system driver for Windows NT/2000/XP/Vista.
6 * PROGRAMMER: Mark Piper, Matt Wu, Bo Brantén.
11 /* INCLUDES *****************************************************************/
15 /* GLOBALS ***************************************************************/
17 extern PRFSD_GLOBAL RfsdGlobal
;
19 /* DEFINITIONS *************************************************************/
23 #pragma alloc_text(PAGE, RfsdFastIoRead)
25 #pragma alloc_text(PAGE, RfsdFastIoWrite)
26 #endif // !RFSD_READ_ONLY
28 #pragma alloc_text(PAGE, RfsdFastIoCheckIfPossible)
29 #pragma alloc_text(PAGE, RfsdFastIoQueryBasicInfo)
30 #pragma alloc_text(PAGE, RfsdFastIoQueryStandardInfo)
31 #pragma alloc_text(PAGE, RfsdFastIoQueryNetworkOpenInfo)
32 #pragma alloc_text(PAGE, RfsdFastIoLock)
33 #pragma alloc_text(PAGE, RfsdFastIoUnlockSingle)
34 #pragma alloc_text(PAGE, RfsdFastIoUnlockAll)
35 #pragma alloc_text(PAGE, RfsdFastIoUnlockAllByKey)
39 RfsdFastIoCheckIfPossible (
40 IN PFILE_OBJECT FileObject
,
41 IN PLARGE_INTEGER FileOffset
,
45 IN BOOLEAN CheckForReadOperation
,
46 OUT PIO_STATUS_BLOCK IoStatus
,
47 IN PDEVICE_OBJECT DeviceObject
50 BOOLEAN bPossible
= FastIoIsNotPossible
;
52 LARGE_INTEGER lLength
;
56 lLength
.QuadPart
= Length
;
62 FsRtlEnterFileSystem();
64 if (DeviceObject
== RfsdGlobal
->DeviceObject
) {
68 Fcb
= (PRFSD_FCB
) FileObject
->FsContext
;
72 if (Fcb
->Identifier
.Type
== RFSDVCB
) {
76 ASSERT((Fcb
->Identifier
.Type
== RFSDFCB
) &&
77 (Fcb
->Identifier
.Size
== sizeof(RFSD_FCB
)));
79 if (IsDirectory(Fcb
)) {
83 if (CheckForReadOperation
) {
85 bPossible
= FsRtlFastCheckLockForRead(
91 PsGetCurrentProcess());
95 if (IsFlagOn(Fcb
->Vcb
->Flags
, VCB_READ_ONLY
) ||
96 IsFlagOn(Fcb
->Vcb
->Flags
, VCB_WRITE_PROTECTED
)) {
97 bPossible
= FastIoIsNotPossible
;
99 bPossible
= FsRtlFastCheckLockForWrite(
100 &Fcb
->FileLockAnchor
,
105 PsGetCurrentProcess());
109 RfsdPrint((DBG_INFO
, "RfsdFastIoCheckIfPossible: %s %s %s\n",
110 RfsdGetCurrentProcessName(),
111 "FASTIO_CHECK_IF_POSSIBLE",
112 Fcb
->AnsiFileName
.Buffer
116 "RfsdFastIoCheckIfPossible: Offset: %I64xg Length: %xh Key: %u %s %s\n",
117 FileOffset
->QuadPart
,
120 (CheckForReadOperation
? "CheckForReadOperation:" :
121 "CheckForWriteOperation:"),
122 (bPossible
? "Succeeded" : "Failed")));
123 } _SEH2_EXCEPT (EXCEPTION_EXECUTE_HANDLER
) {
124 bPossible
= FastIoIsNotPossible
;
129 FsRtlExitFileSystem();
138 RfsdFastIoRead (IN PFILE_OBJECT FileObject
,
139 IN PLARGE_INTEGER FileOffset
,
144 OUT PIO_STATUS_BLOCK IoStatus
,
145 IN PDEVICE_OBJECT DeviceObject
)
152 Fcb
= (PRFSD_FCB
) FileObject
->FsContext
;
156 ASSERT((Fcb
->Identifier
.Type
== RFSDFCB
) &&
157 (Fcb
->Identifier
.Size
== sizeof(RFSD_FCB
)));
159 RfsdPrint((DBG_INFO
, "RfsdFastIoRead: %s %s %s\n",
160 RfsdGetCurrentProcessName(),
162 Fcb
->AnsiFileName
.Buffer
));
164 RfsdPrint((DBG_INFO
, "RfsdFastIoRead: Offset: %I64xh Length: %xh Key: %u\n",
165 FileOffset
->QuadPart
,
169 Status
= FsRtlCopyRead (
170 FileObject
, FileOffset
, Length
, Wait
,
171 LockKey
, Buffer
, IoStatus
, DeviceObject
);
180 IN PFILE_OBJECT FileObject
,
181 IN PLARGE_INTEGER FileOffset
,
186 OUT PIO_STATUS_BLOCK IoStatus
,
187 IN PDEVICE_OBJECT DeviceObject
)
194 Fcb
= (PRFSD_FCB
) FileObject
->FsContext
;
198 ASSERT((Fcb
->Identifier
.Type
== RFSDFCB
) &&
199 (Fcb
->Identifier
.Size
== sizeof(RFSD_FCB
)));
202 "RfsdFastIoWrite: %s %s %s\n",
203 RfsdGetCurrentProcessName(),
205 Fcb
->AnsiFileName
.Buffer
));
208 "RfsdFastIoWrite: Offset: %I64xh Length: %xh Key: %xh\n",
209 FileOffset
->QuadPart
,
213 if (IsFlagOn(Fcb
->Vcb
->Flags
, VCB_READ_ONLY
)) {
218 bRet
= FsRtlCopyWrite (
219 FileObject
, FileOffset
, Length
, Wait
,
220 LockKey
, Buffer
, IoStatus
, DeviceObject
);
225 #endif // !RFSD_READ_ONLY
230 RfsdFastIoQueryBasicInfo (IN PFILE_OBJECT FileObject
,
232 OUT PFILE_BASIC_INFORMATION Buffer
,
233 OUT PIO_STATUS_BLOCK IoStatus
,
234 IN PDEVICE_OBJECT DeviceObject
)
236 BOOLEAN Status
= FALSE
;
238 BOOLEAN FcbMainResourceAcquired
= FALSE
;
246 FsRtlEnterFileSystem();
248 if (DeviceObject
== RfsdGlobal
->DeviceObject
) {
249 IoStatus
->Status
= STATUS_INVALID_DEVICE_REQUEST
;
254 Fcb
= (PRFSD_FCB
) FileObject
->FsContext
;
258 if (Fcb
->Identifier
.Type
== RFSDVCB
) {
259 IoStatus
->Status
= STATUS_INVALID_PARAMETER
;
264 ASSERT((Fcb
->Identifier
.Type
== RFSDFCB
) &&
265 (Fcb
->Identifier
.Size
== sizeof(RFSD_FCB
)));
268 "RfsdFastIoQueryBasicInfo: %s %s %s\n",
269 RfsdGetCurrentProcessName(),
270 "FASTIO_QUERY_BASIC_INFO",
271 Fcb
->AnsiFileName
.Buffer
274 if (!ExAcquireResourceSharedLite(
281 FcbMainResourceAcquired
= TRUE
;
283 RtlZeroMemory(Buffer
, sizeof(FILE_BASIC_INFORMATION
));
286 typedef struct _FILE_BASIC_INFORMATION {
287 LARGE_INTEGER CreationTime;
288 LARGE_INTEGER LastAccessTime;
289 LARGE_INTEGER LastWriteTime;
290 LARGE_INTEGER ChangeTime;
291 ULONG FileAttributes;
292 } FILE_BASIC_INFORMATION, *PFILE_BASIC_INFORMATION;
295 Buffer
->CreationTime
= RfsdSysTime(Fcb
->Inode
->i_ctime
);
296 Buffer
->LastAccessTime
= RfsdSysTime(Fcb
->Inode
->i_atime
);
297 Buffer
->LastWriteTime
= RfsdSysTime(Fcb
->Inode
->i_mtime
);
298 Buffer
->ChangeTime
= RfsdSysTime(Fcb
->Inode
->i_mtime
);
301 Buffer
->FileAttributes
= Fcb
->RfsdMcb
->FileAttr
;
303 IoStatus
->Information
= sizeof(FILE_BASIC_INFORMATION
);
305 IoStatus
->Status
= STATUS_SUCCESS
;
308 } _SEH2_EXCEPT (EXCEPTION_EXECUTE_HANDLER
) {
310 IoStatus
->Status
= _SEH2_GetExceptionCode();
316 if (FcbMainResourceAcquired
)
318 ExReleaseResourceForThreadLite(
320 ExGetCurrentResourceThread()
324 FsRtlExitFileSystem();
328 if (Status
== FALSE
) {
330 RfsdPrint((DBG_ERROR
,
331 "RfsdFastIoQueryBasicInfo: %s %s *** Status: FALSE ***\n",
332 RfsdGetCurrentProcessName(),
333 "FASTIO_QUERY_BASIC_INFO"
335 } else if (IoStatus
->Status
!= STATUS_SUCCESS
) {
337 RfsdPrint((DBG_ERROR
,
338 "RfsdFastIoQueryBasicInfo: %s %s *** Status: %s (%#x) ***\n",
339 RfsdGetCurrentProcessName(),
340 "FASTIO_QUERY_BASIC_INFO",
341 RfsdNtStatusToString(IoStatus
->Status
),
350 RfsdFastIoQueryStandardInfo (
351 IN PFILE_OBJECT FileObject
,
353 OUT PFILE_STANDARD_INFORMATION Buffer
,
354 OUT PIO_STATUS_BLOCK IoStatus
,
355 IN PDEVICE_OBJECT DeviceObject
358 BOOLEAN Status
= FALSE
;
361 BOOLEAN FcbMainResourceAcquired
= FALSE
;
363 LONGLONG AllocationSize
;
371 FsRtlEnterFileSystem();
373 if (DeviceObject
== RfsdGlobal
->DeviceObject
) {
375 IoStatus
->Status
= STATUS_INVALID_DEVICE_REQUEST
;
380 Fcb
= (PRFSD_FCB
) FileObject
->FsContext
;
384 if (Fcb
->Identifier
.Type
== RFSDVCB
) {
385 IoStatus
->Status
= STATUS_INVALID_PARAMETER
;
390 ASSERT((Fcb
->Identifier
.Type
== RFSDFCB
) &&
391 (Fcb
->Identifier
.Size
== sizeof(RFSD_FCB
)));
394 "RfsdFastIoQueryStandardInfo: %s %s %s\n",
395 RfsdGetCurrentProcessName(),
396 "FASTIO_QUERY_STANDARD_INFO",
397 Fcb
->AnsiFileName
.Buffer
));
401 if (!ExAcquireResourceSharedLite(
408 FcbMainResourceAcquired
= TRUE
;
410 RtlZeroMemory(Buffer
, sizeof(FILE_STANDARD_INFORMATION
));
413 typedef struct _FILE_STANDARD_INFORMATION {
414 LARGE_INTEGER AllocationSize;
415 LARGE_INTEGER EndOfFile;
417 BOOLEAN DeletePending;
419 } FILE_STANDARD_INFORMATION, *PFILE_STANDARD_INFORMATION;
422 FileSize
= (LONGLONG
) Fcb
->Inode
->i_size
;
425 if (S_ISREG(Fcb
->Inode
->i_mode
))
426 FileSize
|= ((LONGLONG
)(Fcb
->Inode
->i_size_high
) << 32);
429 AllocationSize
= CEILING_ALIGNED(FileSize
, (ULONGLONG
)Vcb
->BlockSize
); // TODO: This is incorrect for file tails...
431 Buffer
->AllocationSize
.QuadPart
= AllocationSize
;
432 Buffer
->EndOfFile
.QuadPart
= FileSize
;
433 Buffer
->NumberOfLinks
= Fcb
->Inode
->i_links_count
;
435 if (IsFlagOn(Fcb
->Vcb
->Flags
, VCB_READ_ONLY
)) {
436 Buffer
->DeletePending
= FALSE
;
438 Buffer
->DeletePending
= IsFlagOn(Fcb
->Flags
, FCB_DELETE_PENDING
);
441 if (FlagOn(Fcb
->RfsdMcb
->FileAttr
, FILE_ATTRIBUTE_DIRECTORY
)) {
442 Buffer
->Directory
= TRUE
;
444 Buffer
->Directory
= FALSE
;
447 IoStatus
->Information
= sizeof(FILE_STANDARD_INFORMATION
);
449 IoStatus
->Status
= STATUS_SUCCESS
;
453 } _SEH2_EXCEPT (EXCEPTION_EXECUTE_HANDLER
) {
455 IoStatus
->Status
= _SEH2_GetExceptionCode();
460 if (FcbMainResourceAcquired
) {
461 ExReleaseResourceForThreadLite(
463 ExGetCurrentResourceThread()
467 FsRtlExitFileSystem();
471 if (Status
== FALSE
) {
473 "RfsdFastIoQueryStandardInfo: %s %s *** Status: FALSE ***\n",
474 RfsdGetCurrentProcessName(),
475 "FASTIO_QUERY_STANDARD_INFO" ));
476 } else if (IoStatus
->Status
!= STATUS_SUCCESS
) {
478 "RfsdFastIoQueryStandardInfo: %s %s *** Status: %s (%#x) ***\n",
479 RfsdGetCurrentProcessName(),
480 "FASTIO_QUERY_STANDARD_INFO",
481 RfsdNtStatusToString(IoStatus
->Status
),
491 IN PFILE_OBJECT FileObject
,
492 IN PLARGE_INTEGER FileOffset
,
493 IN PLARGE_INTEGER Length
,
494 IN PEPROCESS Process
,
496 IN BOOLEAN FailImmediately
,
497 IN BOOLEAN ExclusiveLock
,
498 OUT PIO_STATUS_BLOCK IoStatus
,
499 IN PDEVICE_OBJECT DeviceObject
502 BOOLEAN Status
= FALSE
;
511 FsRtlEnterFileSystem();
513 if (DeviceObject
== RfsdGlobal
->DeviceObject
) {
514 IoStatus
->Status
= STATUS_INVALID_DEVICE_REQUEST
;
519 Fcb
= (PRFSD_FCB
) FileObject
->FsContext
;
523 if (Fcb
->Identifier
.Type
== RFSDVCB
) {
525 IoStatus
->Status
= STATUS_INVALID_PARAMETER
;
530 ASSERT((Fcb
->Identifier
.Type
== RFSDFCB
) &&
531 (Fcb
->Identifier
.Size
== sizeof(RFSD_FCB
)));
533 if (IsDirectory(Fcb
)) {
535 IoStatus
->Status
= STATUS_INVALID_PARAMETER
;
541 "RfsdFastIoLock: %s %s %s\n",
542 RfsdGetCurrentProcessName(),
544 Fcb
->AnsiFileName
.Buffer
));
547 "RfsdFastIoLock: Offset: %I64xh Length: %I64xh Key: %u %s%s\n",
548 FileOffset
->QuadPart
,
551 (FailImmediately
? "FailImmediately " : ""),
552 (ExclusiveLock
? "ExclusiveLock " : "") ));
554 if (Fcb
->Header
.IsFastIoPossible
!= FastIoIsQuestionable
) {
556 "RfsdFastIoLock: %s %s %s\n",
557 RfsdGetCurrentProcessName(),
558 "FastIoIsQuestionable",
559 Fcb
->AnsiFileName
.Buffer
));
561 Fcb
->Header
.IsFastIoPossible
= FastIoIsQuestionable
;
565 #pragma prefast( suppress: 28159, "bug in prefast" )
567 Status
= FsRtlFastLock(
568 &Fcb
->FileLockAnchor
,
579 } _SEH2_EXCEPT (EXCEPTION_EXECUTE_HANDLER
) {
580 IoStatus
->Status
= _SEH2_GetExceptionCode();
585 FsRtlExitFileSystem();
589 if (Status
== FALSE
) {
590 RfsdPrint((DBG_ERROR
,
591 "RfsdFastIoLock: %s %s *** Status: FALSE ***\n",
592 RfsdGetCurrentProcessName(),
595 } else if (IoStatus
->Status
!= STATUS_SUCCESS
) {
596 RfsdPrint((DBG_ERROR
,
597 "RfsdFastIoLock: %s %s *** Status: %s (%#x) ***\n",
598 RfsdGetCurrentProcessName(),
600 RfsdNtStatusToString(IoStatus
->Status
),
610 RfsdFastIoUnlockSingle (
611 IN PFILE_OBJECT FileObject
,
612 IN PLARGE_INTEGER FileOffset
,
613 IN PLARGE_INTEGER Length
,
614 IN PEPROCESS Process
,
616 OUT PIO_STATUS_BLOCK IoStatus
,
617 IN PDEVICE_OBJECT DeviceObject
620 BOOLEAN Status
= FALSE
;
629 FsRtlEnterFileSystem();
631 if (DeviceObject
== RfsdGlobal
->DeviceObject
) {
632 IoStatus
->Status
= STATUS_INVALID_DEVICE_REQUEST
;
637 Fcb
= (PRFSD_FCB
) FileObject
->FsContext
;
641 if (Fcb
->Identifier
.Type
== RFSDVCB
) {
643 IoStatus
->Status
= STATUS_INVALID_PARAMETER
;
648 ASSERT((Fcb
->Identifier
.Type
== RFSDFCB
) &&
649 (Fcb
->Identifier
.Size
== sizeof(RFSD_FCB
)));
651 if (IsDirectory(Fcb
)) {
654 IoStatus
->Status
= STATUS_INVALID_PARAMETER
;
660 "RfsdFastIoUnlockSingle: %s %s %s\n",
661 RfsdGetCurrentProcessName(),
662 "FASTIO_UNLOCK_SINGLE",
663 Fcb
->AnsiFileName
.Buffer
));
666 "RfsdFastIoUnlockSingle: Offset: %I64xh Length: %I64xh Key: %u\n",
667 FileOffset
->QuadPart
,
671 IoStatus
->Status
= FsRtlFastUnlockSingle(
672 &Fcb
->FileLockAnchor
,
681 IoStatus
->Information
= 0;
684 } _SEH2_EXCEPT (EXCEPTION_EXECUTE_HANDLER
) {
685 IoStatus
->Status
= _SEH2_GetExceptionCode();
691 FsRtlExitFileSystem();
695 if (Status
== FALSE
) {
697 RfsdPrint((DBG_ERROR
,
698 "RfsdFastIoUnlockSingle: %s %s *** Status: FALSE ***\n",
699 RfsdGetCurrentProcessName(),
700 "FASTIO_UNLOCK_SINGLE" ));
701 } else if (IoStatus
->Status
!= STATUS_SUCCESS
) {
702 RfsdPrint((DBG_ERROR
,
703 "RfsdFastIoUnlockSingle: %s %s *** Status: %s (%#x) ***\n",
704 RfsdGetCurrentProcessName(),
705 "FASTIO_UNLOCK_SINGLE",
706 RfsdNtStatusToString(IoStatus
->Status
),
715 RfsdFastIoUnlockAll (
716 IN PFILE_OBJECT FileObject
,
717 IN PEPROCESS Process
,
718 OUT PIO_STATUS_BLOCK IoStatus
,
719 IN PDEVICE_OBJECT DeviceObject
)
721 BOOLEAN Status
= FALSE
;
730 FsRtlEnterFileSystem();
732 if (DeviceObject
== RfsdGlobal
->DeviceObject
) {
733 IoStatus
->Status
= STATUS_INVALID_DEVICE_REQUEST
;
738 Fcb
= (PRFSD_FCB
) FileObject
->FsContext
;
742 if (Fcb
->Identifier
.Type
== RFSDVCB
) {
744 IoStatus
->Status
= STATUS_INVALID_PARAMETER
;
749 ASSERT((Fcb
->Identifier
.Type
== RFSDFCB
) &&
750 (Fcb
->Identifier
.Size
== sizeof(RFSD_FCB
)));
752 if (IsDirectory(Fcb
)) {
754 IoStatus
->Status
= STATUS_INVALID_PARAMETER
;
760 "RfsdFastIoUnlockAll: %s %s %s\n",
761 RfsdGetCurrentProcessName(),
763 Fcb
->AnsiFileName
.Buffer
766 IoStatus
->Status
= FsRtlFastUnlockAll(
767 &Fcb
->FileLockAnchor
,
772 IoStatus
->Information
= 0;
775 } _SEH2_EXCEPT (EXCEPTION_EXECUTE_HANDLER
) {
776 IoStatus
->Status
= _SEH2_GetExceptionCode();
782 FsRtlExitFileSystem();
786 if (Status
== FALSE
) {
788 RfsdPrint((DBG_ERROR
,
789 "RfsdFastIoUnlockAll: %s %s *** Status: FALSE ***\n",
790 RfsdGetCurrentProcessName(),
793 } else if (IoStatus
->Status
!= STATUS_SUCCESS
) {
794 RfsdPrint((DBG_ERROR
,
795 "RfsdFastIoUnlockAll: %s %s *** Status: %s (%#x) ***\n",
796 RfsdGetCurrentProcessName(),
798 RfsdNtStatusToString(IoStatus
->Status
),
808 RfsdFastIoUnlockAllByKey (
809 IN PFILE_OBJECT FileObject
,
813 IN PEPROCESS Process
,
816 OUT PIO_STATUS_BLOCK IoStatus
,
817 IN PDEVICE_OBJECT DeviceObject
820 BOOLEAN Status
= FALSE
;
829 FsRtlEnterFileSystem();
831 if (DeviceObject
== RfsdGlobal
->DeviceObject
) {
832 IoStatus
->Status
= STATUS_INVALID_DEVICE_REQUEST
;
837 Fcb
= (PRFSD_FCB
) FileObject
->FsContext
;
841 if (Fcb
->Identifier
.Type
== RFSDVCB
) {
843 IoStatus
->Status
= STATUS_INVALID_PARAMETER
;
848 ASSERT((Fcb
->Identifier
.Type
== RFSDFCB
) &&
849 (Fcb
->Identifier
.Size
== sizeof(RFSD_FCB
)));
851 if (IsDirectory(Fcb
)) {
854 IoStatus
->Status
= STATUS_INVALID_PARAMETER
;
860 "RfsdFastIoUnlockAllByKey: %s %s %s\n",
861 RfsdGetCurrentProcessName(),
862 "FASTIO_UNLOCK_ALL_BY_KEY",
863 Fcb
->AnsiFileName
.Buffer
867 "RfsdFastIoUnlockAllByKey: Key: %u\n",
871 IoStatus
->Status
= FsRtlFastUnlockAllByKey(
872 &Fcb
->FileLockAnchor
,
879 IoStatus
->Information
= 0;
883 } _SEH2_EXCEPT (EXCEPTION_EXECUTE_HANDLER
) {
885 IoStatus
->Status
= _SEH2_GetExceptionCode();
890 FsRtlExitFileSystem();
894 if (Status
== FALSE
) {
896 RfsdPrint((DBG_ERROR
,
897 "RfsdFastIoUnlockAllByKey: %s %s *** Status: FALSE ***\n",
898 RfsdGetCurrentProcessName(),
899 "FASTIO_UNLOCK_ALL_BY_KEY"
901 } else if (IoStatus
->Status
!= STATUS_SUCCESS
) {
903 RfsdPrint((DBG_ERROR
,
904 "RfsdFastIoUnlockAllByKey: %s %s *** Status: %s (%#x) ***\n",
905 RfsdGetCurrentProcessName(),
906 "FASTIO_UNLOCK_ALL_BY_KEY",
907 RfsdNtStatusToString(IoStatus
->Status
),
917 RfsdFastIoQueryNetworkOpenInfo (
918 IN PFILE_OBJECT FileObject
,
920 IN OUT PFILE_NETWORK_OPEN_INFORMATION PFNOI
,
921 OUT PIO_STATUS_BLOCK IoStatus
,
922 IN PDEVICE_OBJECT DeviceObject
925 BOOLEAN bResult
= FALSE
;
926 PRFSD_FCB Fcb
= NULL
;
927 BOOLEAN FcbResourceAcquired
= FALSE
;
933 FsRtlEnterFileSystem();
935 if (DeviceObject
== RfsdGlobal
->DeviceObject
) {
936 IoStatus
->Status
= STATUS_INVALID_DEVICE_REQUEST
;
940 Fcb
= (PRFSD_FCB
) FileObject
->FsContext
;
944 if (Fcb
->Identifier
.Type
== RFSDVCB
) {
946 IoStatus
->Status
= STATUS_INVALID_PARAMETER
;
950 ASSERT((Fcb
->Identifier
.Type
== RFSDFCB
) &&
951 (Fcb
->Identifier
.Size
== sizeof(RFSD_FCB
)));
954 "%-16.16s %-31s %s\n",
955 RfsdGetCurrentProcessName(),
956 "FASTIO_QUERY_NETWORK_OPEN_INFO",
957 Fcb
->AnsiFileName
.Buffer
960 if (FileObject
->FsContext2
) {
964 if (!FlagOn(Fcb
->Flags
, FCB_PAGE_FILE
)) {
966 if (!ExAcquireResourceSharedLite(
973 FcbResourceAcquired
= TRUE
;
976 if (IsDirectory(Fcb
)) {
977 PFNOI
->AllocationSize
.QuadPart
= 0;
978 PFNOI
->EndOfFile
.QuadPart
= 0;
980 PFNOI
->AllocationSize
= Fcb
->Header
.AllocationSize
;
981 PFNOI
->EndOfFile
= Fcb
->Header
.FileSize
;
984 PFNOI
->FileAttributes
= Fcb
->RfsdMcb
->FileAttr
;
985 if (PFNOI
->FileAttributes
== 0) {
986 PFNOI
->FileAttributes
= FILE_ATTRIBUTE_NORMAL
;
989 PFNOI
->CreationTime
= RfsdSysTime(Fcb
->Inode
->i_ctime
);
990 PFNOI
->LastAccessTime
= RfsdSysTime(Fcb
->Inode
->i_atime
);
991 PFNOI
->LastWriteTime
= RfsdSysTime(Fcb
->Inode
->i_mtime
);
992 PFNOI
->ChangeTime
= RfsdSysTime(Fcb
->Inode
->i_mtime
);
996 IoStatus
->Status
= STATUS_SUCCESS
;
997 IoStatus
->Information
= sizeof(FILE_NETWORK_OPEN_INFORMATION
);
1001 if (FcbResourceAcquired
) {
1002 ExReleaseResourceLite(&Fcb
->MainResource
);
1005 FsRtlExitFileSystem();