@@ -573,6 +573,11 @@ NTSTATUS KphpExtractNameFileObject(
573
573
PFILE_OBJECT relatedFileObject ;
574
574
575
575
PAGED_PASSIVE ();
576
+
577
+ if (FlagOn (FileObject -> Flags , FO_CLEANUP_COMPLETE ))
578
+ {
579
+ return STATUS_FILE_CLOSED ;
580
+ }
576
581
577
582
if (BufferLength < sizeof (OBJECT_NAME_INFORMATION ))
578
583
{
@@ -731,56 +736,50 @@ NTSTATUS KphQueryNameFileObject(
731
736
{
732
737
NTSTATUS status ;
733
738
PFLT_FILE_NAME_INFORMATION fileNameInfo ;
739
+ FLT_FILE_NAME_OPTIONS nameOptions ;
734
740
735
741
PAGED_PASSIVE ();
736
742
737
- fileNameInfo = NULL ;
743
+ nameOptions = FLT_FILE_NAME_NORMALIZED ;
738
744
739
745
if (IoGetTopLevelIrp () || KeAreAllApcsDisabled ())
740
746
{
741
- status = STATUS_POSSIBLE_DEADLOCK ;
747
+ nameOptions |= FLT_FILE_NAME_QUERY_CACHE_ONLY ;
742
748
}
743
749
else
744
750
{
745
- status = FltGetFileNameInformationUnsafe (FileObject ,
746
- NULL ,
747
- (FLT_FILE_NAME_NORMALIZED |
748
- FLT_FILE_NAME_QUERY_DEFAULT ),
749
- & fileNameInfo );
750
- if (!NT_SUCCESS (status ))
751
- {
752
- fileNameInfo = NULL ;
753
- }
754
- else
755
- {
756
- * ReturnLength = sizeof (OBJECT_NAME_INFORMATION );
757
- * ReturnLength += fileNameInfo -> Name .Length ;
758
- if (BufferLength < * ReturnLength )
759
- {
760
- status = STATUS_BUFFER_TOO_SMALL ;
761
- goto Exit ;
762
- }
763
-
764
- Buffer -> Name .Length = 0 ;
765
- Buffer -> Name .MaximumLength = (USHORT )(BufferLength - sizeof (OBJECT_NAME_INFORMATION ));
766
- Buffer -> Name .Buffer = (PWSTR )Add2Ptr (Buffer , sizeof (OBJECT_NAME_INFORMATION ));
767
-
768
- RtlCopyUnicodeString (& Buffer -> Name , & fileNameInfo -> Name );
769
-
770
- status = STATUS_SUCCESS ;
771
- goto Exit ;
772
- }
751
+ nameOptions |= FLT_FILE_NAME_QUERY_ALWAYS_ALLOW_CACHE_LOOKUP ;
773
752
}
774
753
775
- if (!NT_SUCCESS (status ) &&
776
- !BooleanFlagOn (FileObject -> Flags , FO_CLEANUP_COMPLETE ))
754
+ status = FltGetFileNameInformationUnsafe (FileObject ,
755
+ NULL ,
756
+ nameOptions ,
757
+ & fileNameInfo );
758
+ if (!NT_SUCCESS (status ))
777
759
{
760
+ fileNameInfo = NULL ;
761
+
778
762
status = KphpExtractNameFileObject (FileObject ,
779
763
Buffer ,
780
764
BufferLength ,
781
765
ReturnLength );
766
+ goto Exit ;
782
767
}
783
768
769
+ * ReturnLength = sizeof (OBJECT_NAME_INFORMATION );
770
+ * ReturnLength += fileNameInfo -> Name .Length ;
771
+ if (BufferLength < * ReturnLength )
772
+ {
773
+ status = STATUS_BUFFER_TOO_SMALL ;
774
+ goto Exit ;
775
+ }
776
+
777
+ Buffer -> Name .Length = 0 ;
778
+ Buffer -> Name .MaximumLength = (USHORT )(BufferLength - sizeof (OBJECT_NAME_INFORMATION ));
779
+ Buffer -> Name .Buffer = (PWSTR )Add2Ptr (Buffer , sizeof (OBJECT_NAME_INFORMATION ));
780
+
781
+ RtlCopyUnicodeString (& Buffer -> Name , & fileNameInfo -> Name );
782
+
784
783
Exit :
785
784
786
785
if (fileNameInfo )
0 commit comments