Skip to content

Commit 24725cb

Browse files
committed
kph allow flt name cache
1 parent ee2f79a commit 24725cb

File tree

1 file changed

+31
-32
lines changed

1 file changed

+31
-32
lines changed

KSystemInformer/object.c

Lines changed: 31 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -573,6 +573,11 @@ NTSTATUS KphpExtractNameFileObject(
573573
PFILE_OBJECT relatedFileObject;
574574

575575
PAGED_PASSIVE();
576+
577+
if (FlagOn(FileObject->Flags, FO_CLEANUP_COMPLETE))
578+
{
579+
return STATUS_FILE_CLOSED;
580+
}
576581

577582
if (BufferLength < sizeof(OBJECT_NAME_INFORMATION))
578583
{
@@ -731,56 +736,50 @@ NTSTATUS KphQueryNameFileObject(
731736
{
732737
NTSTATUS status;
733738
PFLT_FILE_NAME_INFORMATION fileNameInfo;
739+
FLT_FILE_NAME_OPTIONS nameOptions;
734740

735741
PAGED_PASSIVE();
736742

737-
fileNameInfo = NULL;
743+
nameOptions = FLT_FILE_NAME_NORMALIZED;
738744

739745
if (IoGetTopLevelIrp() || KeAreAllApcsDisabled())
740746
{
741-
status = STATUS_POSSIBLE_DEADLOCK;
747+
nameOptions |= FLT_FILE_NAME_QUERY_CACHE_ONLY;
742748
}
743749
else
744750
{
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;
773752
}
774753

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))
777759
{
760+
fileNameInfo = NULL;
761+
778762
status = KphpExtractNameFileObject(FileObject,
779763
Buffer,
780764
BufferLength,
781765
ReturnLength);
766+
goto Exit;
782767
}
783768

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+
784783
Exit:
785784

786785
if (fileNameInfo)

0 commit comments

Comments
 (0)