2 * COPYRIGHT: See COPYRIGHT.TXT
3 * PROJECT: Ext2 File System Driver for WinNT/2K/XP
5 * PROGRAMMER: Matt Wu <mattwu@163.com>
6 * HOMEPAGE: http://www.ext2fsd.com
10 /* INCLUDES *****************************************************************/
14 /* GLOBALS ***************************************************************/
16 extern PEXT2_GLOBAL Ext2Global
;
18 /* DEFINITIONS *************************************************************/
20 #define FASTIO_DEBUG_LEVEL DL_NVR
25 #pragma alloc_text(PAGE, Ext2FastIoRead)
26 #pragma alloc_text(PAGE, Ext2FastIoWrite)
27 #pragma alloc_text(PAGE, Ext2FastIoCheckIfPossible)
28 #pragma alloc_text(PAGE, Ext2FastIoQueryBasicInfo)
29 #pragma alloc_text(PAGE, Ext2FastIoQueryStandardInfo)
30 #pragma alloc_text(PAGE, Ext2FastIoQueryNetworkOpenInfo)
31 #pragma alloc_text(PAGE, Ext2FastIoLock)
32 #pragma alloc_text(PAGE, Ext2FastIoUnlockSingle)
33 #pragma alloc_text(PAGE, Ext2FastIoUnlockAll)
34 #pragma alloc_text(PAGE, Ext2FastIoUnlockAll)
42 FAST_IO_POSSIBLE IsPossible
= FastIoIsNotPossible
;
44 if (!Fcb
|| !FsRtlOplockIsFastIoPossible(&Fcb
->Oplock
))
47 IsPossible
= FastIoIsQuestionable
;
49 if (!FsRtlAreThereCurrentFileLocks(&Fcb
->FileLockAnchor
)) {
50 if (!IsVcbReadOnly(Fcb
->Vcb
) && !FlagOn(Fcb
->Vcb
->Flags
, VCB_VOLUME_LOCKED
)) {
51 IsPossible
= FastIoIsPossible
;
60 Ext2FastIoCheckIfPossible (
61 IN PFILE_OBJECT FileObject
,
62 IN PLARGE_INTEGER FileOffset
,
66 IN BOOLEAN CheckForReadOperation
,
67 OUT PIO_STATUS_BLOCK IoStatus
,
68 IN PDEVICE_OBJECT DeviceObject
71 BOOLEAN bPossible
= FastIoIsNotPossible
;
74 LARGE_INTEGER lLength
;
76 lLength
.QuadPart
= Length
;
80 FsRtlEnterFileSystem();
84 if (IsExt2FsDevice(DeviceObject
)) {
88 Fcb
= (PEXT2_FCB
) FileObject
->FsContext
;
89 if (Fcb
== NULL
|| Fcb
->Identifier
.Type
== EXT2VCB
) {
93 ASSERT((Fcb
->Identifier
.Type
== EXT2FCB
) &&
94 (Fcb
->Identifier
.Size
== sizeof(EXT2_FCB
)));
96 /* do nothing if target fie was deleted */
97 if (FlagOn(Fcb
->Flags
, FCB_DELETE_PENDING
)) {
101 if (IsDirectory(Fcb
)) {
105 Ccb
= (PEXT2_CCB
) FileObject
->FsContext2
;
110 if (CheckForReadOperation
) {
112 bPossible
= FsRtlFastCheckLockForRead(
113 &Fcb
->FileLockAnchor
,
118 PsGetCurrentProcess());
122 if (!IsVcbReadOnly(Fcb
->Vcb
)) {
123 bPossible
= FsRtlFastCheckLockForWrite(
124 &Fcb
->FileLockAnchor
,
129 PsGetCurrentProcess());
134 DEBUG(DL_INF
, ("Ext2FastIIOCheckPossible: %s %s %wZ\n",
135 Ext2GetCurrentProcessName(),
136 "FASTIO_CHECK_IF_POSSIBLE",
141 "Ext2FastIIOCheckPossible: Offset: %I64xg Length: %xh Key: %u %s %s\n",
142 FileOffset
->QuadPart
,
145 (CheckForReadOperation
? "CheckForReadOperation:" :
146 "CheckForWriteOperation:"),
147 (bPossible
? "Succeeded" : "Failed")));
150 } _SEH2_EXCEPT (EXCEPTION_EXECUTE_HANDLER
) {
151 bPossible
= FastIoIsNotPossible
;
156 FsRtlExitFileSystem();
164 Ext2FastIoRead (IN PFILE_OBJECT FileObject
,
165 IN PLARGE_INTEGER FileOffset
,
170 OUT PIO_STATUS_BLOCK IoStatus
,
171 IN PDEVICE_OBJECT DeviceObject
)
174 BOOLEAN Status
= FALSE
;
176 Fcb
= (PEXT2_FCB
) FileObject
->FsContext
;
181 ASSERT((Fcb
->Identifier
.Type
== EXT2FCB
) &&
182 (Fcb
->Identifier
.Size
== sizeof(EXT2_FCB
)));
184 Status
= FsRtlCopyRead (
185 FileObject
, FileOffset
, Length
, Wait
,
186 LockKey
, Buffer
, IoStatus
, DeviceObject
);
188 DEBUG(DL_IO
, ("Ext2FastIoRead: %wZ Offset: %I64xh Length: %xh Key: %u Status: %d\n",
189 &Fcb
->Mcb
->ShortName
, FileOffset
->QuadPart
, Length
, LockKey
, Status
));
196 IN PFILE_OBJECT FileObject
,
197 IN PLARGE_INTEGER FileOffset
,
202 OUT PIO_STATUS_BLOCK IoStatus
,
203 IN PDEVICE_OBJECT DeviceObject
)
205 PEXT2_FCB Fcb
= NULL
;
206 BOOLEAN Status
= FALSE
;
207 BOOLEAN Locked
= FALSE
;
209 Fcb
= (PEXT2_FCB
) FileObject
->FsContext
;
215 FsRtlEnterFileSystem();
217 ASSERT((Fcb
->Identifier
.Type
== EXT2FCB
) &&
218 (Fcb
->Identifier
.Size
== sizeof(EXT2_FCB
)));
220 if (IsVcbReadOnly(Fcb
->Vcb
)) {
224 if (!ExAcquireResourceSharedLite(Fcb
->Header
.Resource
, Wait
)) {
229 if (IsWritingToEof(*FileOffset
) ||
230 Fcb
->Header
.ValidDataLength
.QuadPart
< FileOffset
->QuadPart
+ Length
||
231 Fcb
->Header
.FileSize
.QuadPart
< FileOffset
->QuadPart
+ Length
) {
237 ExReleaseResourceLite(Fcb
->Header
.Resource
);
241 Status
= FsRtlCopyWrite(FileObject
, FileOffset
, Length
, Wait
,
242 LockKey
, Buffer
, IoStatus
, DeviceObject
);
245 Length
= (ULONG
)IoStatus
->Information
;
251 ExReleaseResourceLite(Fcb
->Header
.Resource
);
254 FsRtlExitFileSystem();
257 DEBUG(DL_IO
, ("Ext2FastIoWrite: %wZ Offset: %I64xh Length: %xh Key: %xh Status=%d\n",
258 &Fcb
->Mcb
->ShortName
, FileOffset
->QuadPart
, Length
, LockKey
, Status
));
264 Ext2FastIoQueryBasicInfo (
265 IN PFILE_OBJECT FileObject
,
267 OUT PFILE_BASIC_INFORMATION Buffer
,
268 OUT PIO_STATUS_BLOCK IoStatus
,
269 IN PDEVICE_OBJECT DeviceObject
)
271 PEXT2_FCB Fcb
= NULL
;
272 PEXT2_CCB Ccb
= NULL
;
273 PEXT2_MCB Mcb
= NULL
;
274 BOOLEAN Status
= FALSE
;
275 BOOLEAN FcbMainResourceAcquired
= FALSE
;
279 FsRtlEnterFileSystem();
283 if (IsExt2FsDevice(DeviceObject
)) {
284 IoStatus
->Status
= STATUS_INVALID_DEVICE_REQUEST
;
288 Fcb
= (PEXT2_FCB
) FileObject
->FsContext
;
289 if (Fcb
== NULL
|| Fcb
->Identifier
.Type
== EXT2VCB
) {
290 IoStatus
->Status
= STATUS_INVALID_PARAMETER
;
293 Ccb
= (PEXT2_CCB
) FileObject
->FsContext2
;
295 ASSERT((Fcb
->Identifier
.Type
== EXT2FCB
) &&
296 (Fcb
->Identifier
.Size
== sizeof(EXT2_FCB
)));
299 "Ext2FastIoQueryBasicInfo: %s %s %wZ\n",
300 Ext2GetCurrentProcessName(),
301 "FASTIO_QUERY_BASIC_INFO",
305 if (!IsFlagOn(Fcb
->Flags
, FCB_PAGE_FILE
)) {
306 if (!ExAcquireResourceSharedLite(
311 FcbMainResourceAcquired
= TRUE
;
314 RtlZeroMemory(Buffer
, sizeof(FILE_BASIC_INFORMATION
));
317 typedef struct _FILE_BASIC_INFORMATION {
318 LARGE_INTEGER CreationTime;
319 LARGE_INTEGER LastAccessTime;
320 LARGE_INTEGER LastWriteTime;
321 LARGE_INTEGER ChangeTime;
322 ULONG FileAttributes;
323 } FILE_BASIC_INFORMATION, *PFILE_BASIC_INFORMATION;
326 Buffer
->CreationTime
= Mcb
->CreationTime
;
327 Buffer
->LastAccessTime
= Mcb
->LastAccessTime
;
328 Buffer
->LastWriteTime
= Mcb
->LastWriteTime
;
329 Buffer
->ChangeTime
= Mcb
->ChangeTime
;
330 Buffer
->FileAttributes
= Mcb
->FileAttr
;
331 if (Buffer
->FileAttributes
== 0) {
332 Buffer
->FileAttributes
= FILE_ATTRIBUTE_NORMAL
;
335 IoStatus
->Information
= sizeof(FILE_BASIC_INFORMATION
);
336 IoStatus
->Status
= STATUS_SUCCESS
;
340 } _SEH2_EXCEPT (EXCEPTION_EXECUTE_HANDLER
) {
341 IoStatus
->Status
= _SEH2_GetExceptionCode();
346 if (FcbMainResourceAcquired
) {
347 ExReleaseResourceLite(&Fcb
->MainResource
);
350 FsRtlExitFileSystem();
355 if (Status
== FALSE
) {
357 DEBUG(DL_ERR
, ("Ext2FastIoQueryBasicInfo: %s %s Status: FALSE ***\n",
358 Ext2GetCurrentProcessName(),
359 "FASTIO_QUERY_BASIC_INFO"));
361 } else if (IoStatus
->Status
!= STATUS_SUCCESS
) {
364 "Ext2FastIoQueryBasicInfo: %s %s Status: %#x ***\n",
365 Ext2FastIoQueryBasicInfo
,
366 "FASTIO_QUERY_BASIC_INFO",
376 Ext2FastIoQueryStandardInfo (
377 IN PFILE_OBJECT FileObject
,
379 OUT PFILE_STANDARD_INFORMATION Buffer
,
380 OUT PIO_STATUS_BLOCK IoStatus
,
381 IN PDEVICE_OBJECT DeviceObject
385 BOOLEAN Status
= FALSE
;
386 PEXT2_VCB Vcb
= NULL
;
387 PEXT2_FCB Fcb
= NULL
;
388 BOOLEAN FcbMainResourceAcquired
= FALSE
;
392 FsRtlEnterFileSystem();
396 if (IsExt2FsDevice(DeviceObject
)) {
397 IoStatus
->Status
= STATUS_INVALID_DEVICE_REQUEST
;
401 Fcb
= (PEXT2_FCB
) FileObject
->FsContext
;
402 if (Fcb
== NULL
|| Fcb
->Identifier
.Type
== EXT2VCB
) {
403 IoStatus
->Status
= STATUS_INVALID_PARAMETER
;
407 ASSERT((Fcb
->Identifier
.Type
== EXT2FCB
) &&
408 (Fcb
->Identifier
.Size
== sizeof(EXT2_FCB
)));
412 "Ext2FastIoQueryStandardInfo: %s %s %wZ\n",
413 Ext2GetCurrentProcessName(),
414 "FASTIO_QUERY_STANDARD_INFO",
415 &Fcb
->Mcb
->FullName
));
419 if (!IsFlagOn(Fcb
->Flags
, FCB_PAGE_FILE
)) {
420 if (!ExAcquireResourceSharedLite(
425 FcbMainResourceAcquired
= TRUE
;
428 RtlZeroMemory(Buffer
, sizeof(FILE_STANDARD_INFORMATION
));
431 typedef struct _FILE_STANDARD_INFORMATION {
432 LARGE_INTEGER AllocationSize;
433 LARGE_INTEGER EndOfFile;
435 BOOLEAN DeletePending;
437 } FILE_STANDARD_INFORMATION, *PFILE_STANDARD_INFORMATION;
440 Buffer
->NumberOfLinks
= Fcb
->Inode
->i_nlink
;
441 Buffer
->DeletePending
= IsFlagOn(Fcb
->Flags
, FCB_DELETE_PENDING
);
443 if (IsDirectory(Fcb
)) {
444 Buffer
->Directory
= IsDirectory(Fcb
);
445 Buffer
->AllocationSize
.QuadPart
= 0;
446 Buffer
->EndOfFile
.QuadPart
= 0;
448 Buffer
->Directory
= FALSE
;
449 Buffer
->AllocationSize
= Fcb
->Header
.AllocationSize
;
450 Buffer
->EndOfFile
= Fcb
->Header
.FileSize
;
453 IoStatus
->Information
= sizeof(FILE_STANDARD_INFORMATION
);
454 IoStatus
->Status
= STATUS_SUCCESS
;
456 DEBUG(DL_INF
, ( "Ext2FastIoQueryStandInfo: AllocatieonSize = %I64xh FileSize = %I64xh\n",
457 Buffer
->AllocationSize
.QuadPart
, Buffer
->EndOfFile
.QuadPart
));
461 } _SEH2_EXCEPT (EXCEPTION_EXECUTE_HANDLER
) {
462 IoStatus
->Status
= _SEH2_GetExceptionCode();
467 if (FcbMainResourceAcquired
) {
468 ExReleaseResourceLite(&Fcb
->MainResource
);
471 FsRtlExitFileSystem();
475 if (Status
== FALSE
) {
477 "Ext2FastIoQueryStandardInfo: %s %s Status: FALSE ***\n",
478 Ext2GetCurrentProcessName(),
479 "FASTIO_QUERY_STANDARD_INFO" ));
480 } else if (IoStatus
->Status
!= STATUS_SUCCESS
) {
482 "Ext2FastIoQueryStandardInfo: %s %s Status: %#x ***\n",
483 Ext2GetCurrentProcessName(),
484 "FASTIO_QUERY_STANDARD_INFO",
494 IN PFILE_OBJECT FileObject
,
495 IN PLARGE_INTEGER FileOffset
,
496 IN PLARGE_INTEGER Length
,
497 IN PEPROCESS Process
,
499 IN BOOLEAN FailImmediately
,
500 IN BOOLEAN ExclusiveLock
,
501 OUT PIO_STATUS_BLOCK IoStatus
,
502 IN PDEVICE_OBJECT DeviceObject
505 BOOLEAN Status
= FALSE
;
510 FsRtlEnterFileSystem();
514 if (IsExt2FsDevice(DeviceObject
)) {
515 IoStatus
->Status
= STATUS_INVALID_DEVICE_REQUEST
;
519 Fcb
= (PEXT2_FCB
) FileObject
->FsContext
;
520 if (Fcb
== NULL
|| Fcb
->Identifier
.Type
== EXT2VCB
) {
521 IoStatus
->Status
= STATUS_INVALID_PARAMETER
;
525 ASSERT((Fcb
->Identifier
.Type
== EXT2FCB
) &&
526 (Fcb
->Identifier
.Size
== sizeof(EXT2_FCB
)));
528 if (IsDirectory(Fcb
)) {
530 IoStatus
->Status
= STATUS_INVALID_PARAMETER
;
535 "Ext2FastIoLock: %s %s %wZ\n",
536 Ext2GetCurrentProcessName(),
538 &Fcb
->Mcb
->FullName
));
541 "Ext2FastIoLock: Offset: %I64xh Length: %I64xh Key: %u %s%s\n",
542 FileOffset
->QuadPart
,
545 (FailImmediately
? "FailImmediately " : ""),
546 (ExclusiveLock
? "ExclusiveLock " : "") ));
549 if (!FsRtlOplockIsFastIoPossible(&Fcb
->Oplock
)) {
553 Status
= FsRtlFastLock(
554 &Fcb
->FileLockAnchor
,
567 Fcb
->Header
.IsFastIoPossible
= Ext2IsFastIoPossible(Fcb
);
570 } _SEH2_EXCEPT (EXCEPTION_EXECUTE_HANDLER
) {
571 IoStatus
->Status
= _SEH2_GetExceptionCode();
576 FsRtlExitFileSystem();
580 if (Status
== FALSE
) {
582 "Ext2FastIoLock: %s %s *** Status: FALSE ***\n",
583 (PUCHAR
) Process
+ ProcessNameOffset
,
586 } else if (IoStatus
->Status
!= STATUS_SUCCESS
) {
588 "Ext2FastIoLock: %s %s *** Status: %s (%#x) ***\n",
589 (PUCHAR
) Process
+ ProcessNameOffset
,
591 Ext2NtStatusToString(IoStatus
->Status
),
601 Ext2FastIoUnlockSingle (
602 IN PFILE_OBJECT FileObject
,
603 IN PLARGE_INTEGER FileOffset
,
604 IN PLARGE_INTEGER Length
,
605 IN PEPROCESS Process
,
607 OUT PIO_STATUS_BLOCK IoStatus
,
608 IN PDEVICE_OBJECT DeviceObject
611 BOOLEAN Status
= FALSE
;
616 FsRtlEnterFileSystem();
620 if (IsExt2FsDevice(DeviceObject
)) {
621 IoStatus
->Status
= STATUS_INVALID_DEVICE_REQUEST
;
625 Fcb
= (PEXT2_FCB
) FileObject
->FsContext
;
626 if (Fcb
== NULL
|| Fcb
->Identifier
.Type
== EXT2VCB
) {
628 IoStatus
->Status
= STATUS_INVALID_PARAMETER
;
632 ASSERT((Fcb
->Identifier
.Type
== EXT2FCB
) &&
633 (Fcb
->Identifier
.Size
== sizeof(EXT2_FCB
)));
635 if (IsDirectory(Fcb
)) {
637 IoStatus
->Status
= STATUS_INVALID_PARAMETER
;
643 "Ext2FastIoUnlockSingle: %s %s %wZ\n",
644 (PUCHAR
) Process
+ ProcessNameOffset
,
645 "FASTIO_UNLOCK_SINGLE",
646 &Fcb
->Mcb
->FullName
));
649 "Ext2FastIoUnlockSingle: Offset: %I64xh Length: %I64xh Key: %u\n",
650 FileOffset
->QuadPart
,
655 if (!FsRtlOplockIsFastIoPossible(&Fcb
->Oplock
)) {
659 IoStatus
->Status
= FsRtlFastUnlockSingle(
660 &Fcb
->FileLockAnchor
,
669 IoStatus
->Information
= 0;
672 Fcb
->Header
.IsFastIoPossible
= Ext2IsFastIoPossible(Fcb
);
674 } _SEH2_EXCEPT (EXCEPTION_EXECUTE_HANDLER
) {
675 IoStatus
->Status
= _SEH2_GetExceptionCode();
680 FsRtlExitFileSystem();
684 if (Status
== FALSE
) {
687 "Ext2FastIoUnlockSingle: %s %s *** Status: FALSE ***\n",
688 (PUCHAR
) Process
+ ProcessNameOffset
,
689 "FASTIO_UNLOCK_SINGLE" ));
690 } else if (IoStatus
->Status
!= STATUS_SUCCESS
) {
692 "Ext2FastIoUnlockSingle: %s %s *** Status: %s (%#x) ***\n",
693 (PUCHAR
) Process
+ ProcessNameOffset
,
694 "FASTIO_UNLOCK_SINGLE",
695 Ext2NtStatusToString(IoStatus
->Status
),
704 Ext2FastIoUnlockAll (
705 IN PFILE_OBJECT FileObject
,
706 IN PEPROCESS Process
,
707 OUT PIO_STATUS_BLOCK IoStatus
,
708 IN PDEVICE_OBJECT DeviceObject
)
710 BOOLEAN Status
= FALSE
;
715 FsRtlEnterFileSystem();
719 if (IsExt2FsDevice(DeviceObject
)) {
720 IoStatus
->Status
= STATUS_INVALID_DEVICE_REQUEST
;
724 Fcb
= (PEXT2_FCB
) FileObject
->FsContext
;
725 if (Fcb
== NULL
|| Fcb
->Identifier
.Type
== EXT2VCB
) {
727 IoStatus
->Status
= STATUS_INVALID_PARAMETER
;
731 ASSERT((Fcb
->Identifier
.Type
== EXT2FCB
) &&
732 (Fcb
->Identifier
.Size
== sizeof(EXT2_FCB
)));
734 if (IsDirectory(Fcb
)) {
736 IoStatus
->Status
= STATUS_INVALID_PARAMETER
;
741 "Ext2FastIoUnlockSingle: %s %s %wZ\n",
742 (PUCHAR
) Process
+ ProcessNameOffset
,
748 if (!FsRtlOplockIsFastIoPossible(&Fcb
->Oplock
)) {
752 IoStatus
->Status
= FsRtlFastUnlockAll(
753 &Fcb
->FileLockAnchor
,
758 IoStatus
->Information
= 0;
761 Fcb
->Header
.IsFastIoPossible
= Ext2IsFastIoPossible(Fcb
);
763 } _SEH2_EXCEPT (EXCEPTION_EXECUTE_HANDLER
) {
764 IoStatus
->Status
= _SEH2_GetExceptionCode();
769 FsRtlExitFileSystem();
773 if (Status
== FALSE
) {
776 "Ext2FastIoUnlockSingle: %s %s *** Status: FALSE ***\n",
777 (PUCHAR
) Process
+ ProcessNameOffset
,
780 } else if (IoStatus
->Status
!= STATUS_SUCCESS
) {
782 "Ext2FastIoUnlockSingle: %s %s *** Status: %s (%#x) ***\n",
783 (PUCHAR
) Process
+ ProcessNameOffset
,
785 Ext2NtStatusToString(IoStatus
->Status
),
795 Ext2FastIoUnlockAllByKey (
796 IN PFILE_OBJECT FileObject
,
800 IN PEPROCESS Process
,
803 OUT PIO_STATUS_BLOCK IoStatus
,
804 IN PDEVICE_OBJECT DeviceObject
807 BOOLEAN Status
= FALSE
;
812 FsRtlEnterFileSystem();
816 if (IsExt2FsDevice(DeviceObject
)) {
817 IoStatus
->Status
= STATUS_INVALID_DEVICE_REQUEST
;
821 Fcb
= (PEXT2_FCB
) FileObject
->FsContext
;
822 if (Fcb
== NULL
|| Fcb
->Identifier
.Type
== EXT2VCB
) {
824 IoStatus
->Status
= STATUS_INVALID_PARAMETER
;
828 ASSERT((Fcb
->Identifier
.Type
== EXT2FCB
) &&
829 (Fcb
->Identifier
.Size
== sizeof(EXT2_FCB
)));
831 if (IsDirectory(Fcb
)) {
833 IoStatus
->Status
= STATUS_INVALID_PARAMETER
;
839 "Ext2FastIoUnlockAllByKey: %s %s %wZ\n",
840 (PUCHAR
) Process
+ ProcessNameOffset
,
841 "FASTIO_UNLOCK_ALL_BY_KEY",
846 "Ext2FastIoUnlockAllByKey: Key: %u\n",
851 if (!FsRtlOplockIsFastIoPossible(&Fcb
->Oplock
)) {
855 IoStatus
->Status
= FsRtlFastUnlockAllByKey(
856 &Fcb
->FileLockAnchor
,
863 IoStatus
->Information
= 0;
866 Fcb
->Header
.IsFastIoPossible
= Ext2IsFastIoPossible(Fcb
);
868 } _SEH2_EXCEPT (EXCEPTION_EXECUTE_HANDLER
) {
869 IoStatus
->Status
= _SEH2_GetExceptionCode();
874 FsRtlExitFileSystem();
878 if (Status
== FALSE
) {
881 "Ext2FastIoUnlockAllByKey: %s %s *** Status: FALSE ***\n",
882 (PUCHAR
) Process
+ ProcessNameOffset
,
883 "FASTIO_UNLOCK_ALL_BY_KEY"
885 } else if (IoStatus
->Status
!= STATUS_SUCCESS
) {
888 "Ext2FastIoUnlockAllByKey: %s %s *** Status: %s (%#x) ***\n",
889 (PUCHAR
) Process
+ ProcessNameOffset
,
890 "FASTIO_UNLOCK_ALL_BY_KEY",
891 Ext2NtStatusToString(IoStatus
->Status
),
902 Ext2FastIoQueryNetworkOpenInfo (
903 IN PFILE_OBJECT FileObject
,
905 IN OUT PFILE_NETWORK_OPEN_INFORMATION PFNOI
,
906 OUT PIO_STATUS_BLOCK IoStatus
,
907 IN PDEVICE_OBJECT DeviceObject
910 PEXT2_FCB Fcb
= NULL
;
911 PEXT2_CCB Ccb
= NULL
;
912 PEXT2_MCB Mcb
= NULL
;
914 BOOLEAN bResult
= FALSE
;
915 BOOLEAN FcbResourceAcquired
= FALSE
;
919 FsRtlEnterFileSystem();
921 if (IsExt2FsDevice(DeviceObject
)) {
922 IoStatus
->Status
= STATUS_INVALID_DEVICE_REQUEST
;
926 Fcb
= (PEXT2_FCB
) FileObject
->FsContext
;
927 if (Fcb
== NULL
|| Fcb
->Identifier
.Type
== EXT2VCB
) {
929 IoStatus
->Status
= STATUS_INVALID_PARAMETER
;
933 ASSERT((Fcb
->Identifier
.Type
== EXT2FCB
) &&
934 (Fcb
->Identifier
.Size
== sizeof(EXT2_FCB
)));
935 Ccb
= (PEXT2_CCB
) FileObject
->FsContext2
;
941 "FASTIO_QUERY_NETWORK_OPEN_INFO",
950 if (!IsFlagOn(Fcb
->Flags
, FCB_PAGE_FILE
)) {
952 if (!ExAcquireResourceSharedLite(
959 FcbResourceAcquired
= TRUE
;
962 if (IsDirectory(Fcb
)) {
963 PFNOI
->AllocationSize
.QuadPart
= 0;
964 PFNOI
->EndOfFile
.QuadPart
= 0;
966 PFNOI
->AllocationSize
= Fcb
->Header
.AllocationSize
;
967 PFNOI
->EndOfFile
= Fcb
->Header
.FileSize
;
970 PFNOI
->FileAttributes
= Mcb
->FileAttr
;
971 if (PFNOI
->FileAttributes
== 0) {
972 PFNOI
->FileAttributes
= FILE_ATTRIBUTE_NORMAL
;
975 PFNOI
->CreationTime
= Mcb
->CreationTime
;
976 PFNOI
->LastAccessTime
= Mcb
->LastAccessTime
;
977 PFNOI
->LastWriteTime
= Mcb
->LastWriteTime
;
978 PFNOI
->ChangeTime
= Mcb
->ChangeTime
;
982 IoStatus
->Status
= STATUS_SUCCESS
;
983 IoStatus
->Information
= sizeof(FILE_NETWORK_OPEN_INFORMATION
);
987 if (FcbResourceAcquired
) {
988 ExReleaseResourceLite(&Fcb
->MainResource
);
991 FsRtlExitFileSystem();
999 Ext2AcquireForCreateSection (
1000 IN PFILE_OBJECT FileObject
1004 PEXT2_FCB Fcb
= FileObject
->FsContext
;
1006 if (Fcb
->Header
.Resource
!= NULL
) {
1007 ExAcquireResourceExclusiveLite(Fcb
->Header
.Resource
, TRUE
);
1010 DEBUG(FASTIO_DEBUG_LEVEL
, ("Ext2AcquireForCreateSection: Fcb=%p\n", Fcb
));
1014 Ext2ReleaseForCreateSection (
1015 IN PFILE_OBJECT FileObject
1018 PEXT2_FCB Fcb
= FileObject
->FsContext
;
1020 DEBUG(FASTIO_DEBUG_LEVEL
, ("Ext2ReleaseForCreateSection: Fcb=%p\n", Fcb
));
1022 if (Fcb
->Header
.Resource
!= NULL
) {
1023 ExReleaseResourceLite(Fcb
->Header
.Resource
);
1029 Ext2AcquireFileForModWrite (
1030 IN PFILE_OBJECT FileObject
,
1031 IN PLARGE_INTEGER EndingOffset
,
1032 OUT PERESOURCE
*ResourceToRelease
,
1033 IN PDEVICE_OBJECT DeviceObject
1037 BOOLEAN ResourceAcquired
= FALSE
;
1039 PEXT2_FCB Fcb
= FileObject
->FsContext
;
1041 *ResourceToRelease
= Fcb
->Header
.Resource
;
1042 ResourceAcquired
= ExAcquireResourceExclusiveLite(*ResourceToRelease
, FALSE
);
1043 if (!ResourceAcquired
) {
1044 *ResourceToRelease
= NULL
;
1047 DEBUG(FASTIO_DEBUG_LEVEL
, ("Ext2AcquireFileForModWrite: Fcb=%p Acquired=%d\n",
1048 Fcb
, ResourceAcquired
));
1050 return (ResourceAcquired
? STATUS_SUCCESS
: STATUS_CANT_WAIT
);
1054 Ext2ReleaseFileForModWrite (
1055 IN PFILE_OBJECT FileObject
,
1056 IN PERESOURCE ResourceToRelease
,
1057 IN PDEVICE_OBJECT DeviceObject
1060 PEXT2_FCB Fcb
= FileObject
->FsContext
;
1062 DEBUG(FASTIO_DEBUG_LEVEL
, ("Ext2ReleaseFileForModWrite: Fcb=%p\n", Fcb
));
1064 if (ResourceToRelease
!= NULL
) {
1065 ASSERT(ResourceToRelease
== Fcb
->Header
.Resource
);
1066 ExReleaseResourceLite(ResourceToRelease
);
1071 return STATUS_SUCCESS
;
1075 Ext2AcquireFileForCcFlush (
1076 IN PFILE_OBJECT FileObject
,
1077 IN PDEVICE_OBJECT DeviceObject
1080 PEXT2_FCB Fcb
= FileObject
->FsContext
;
1082 if (Fcb
->Header
.Resource
!= NULL
) {
1083 ExAcquireResourceExclusiveLite(Fcb
->Header
.Resource
, TRUE
);
1086 DEBUG(FASTIO_DEBUG_LEVEL
, ("Ext2AcquireFileForCcFlush: Fcb=%p\n", Fcb
));
1088 return STATUS_SUCCESS
;
1092 Ext2ReleaseFileForCcFlush (
1093 IN PFILE_OBJECT FileObject
,
1094 IN PDEVICE_OBJECT DeviceObject
1097 PEXT2_FCB Fcb
= FileObject
->FsContext
;
1099 DEBUG(FASTIO_DEBUG_LEVEL
, ("Ext2ReleaseFileForCcFlush: Fcb=%p\n", Fcb
));
1101 if (Fcb
->Header
.Resource
!= NULL
) {
1102 ExReleaseResourceLite(Fcb
->Header
.Resource
);
1105 return STATUS_SUCCESS
;
1110 Ext2PreAcquireForCreateSection(
1111 IN PFS_FILTER_CALLBACK_DATA cd
,
1115 PEXT2_FCB Fcb
= (PEXT2_FCB
)cd
->FileObject
->FsContext
;
1118 ASSERT(cd
->Operation
== FS_FILTER_ACQUIRE_FOR_SECTION_SYNCHRONIZATION
);
1119 ExAcquireResourceExclusiveLite(Fcb
->Header
.Resource
, TRUE
);
1120 if (cd
->Parameters
.AcquireForSectionSynchronization
.SyncType
!= SyncTypeCreateSection
) {
1121 status
= STATUS_FSFILTER_OP_COMPLETED_SUCCESSFULLY
;
1122 } else if (Fcb
->ShareAccess
.Writers
== 0) {
1123 status
= STATUS_FILE_LOCKED_WITH_ONLY_READERS
;
1125 status
= STATUS_FILE_LOCKED_WITH_WRITERS
;