545{
565
566 DPRINT(
"NtfsQueryDirectory() called\n");
567
571
575
578
579
581 SearchPattern =
Stack->Parameters.QueryDirectory.FileName;
583 FileIndex =
Stack->Parameters.QueryDirectory.FileIndex;
584
586 {
587 DPRINT1(
"Compressed directory!\n");
590 }
591
594 {
596 }
597
598 if (SearchPattern !=
NULL)
599 {
600 if (!
Ccb->DirectorySearchPattern)
601 {
605 Ccb->DirectorySearchPattern = Pattern.
Buffer =
607 if (!
Ccb->DirectorySearchPattern)
608 {
611 }
612
614 Ccb->DirectorySearchPattern[SearchPattern->
Length /
sizeof(
WCHAR)] = 0;
615 }
616 }
617 else if (!
Ccb->DirectorySearchPattern)
618 {
621 if (!
Ccb->DirectorySearchPattern)
622 {
625 }
626
627 Ccb->DirectorySearchPattern[0] =
L'*';
628 Ccb->DirectorySearchPattern[1] = 0;
629 }
630
632 DPRINT(
"Search pattern '%S'\n",
Ccb->DirectorySearchPattern);
634
635
637 {
640 }
642 {
645 }
646
647
649
651
654 {
657 }
658
659 Written = 0;
661 {
664 {
668
670
673 {
675 continue;
676 }
677
680
683 &Written, Buffer0 ==
NULL);
684
685
686
688 {
689 break;
690 }
691
693
695 {
696
698 continue;
699 }
700
704
706 {
707 break;
708 }
709
711 continue;
712 }
713
715 &Pattern,
717 &FileRecord,
718 &MFTRecord,
721
723 {
724
725
726
727 if (MFTRecord == OldMFTRecord)
728 {
729 DPRINT1(
"Ignoring duplicate MFT entry 0x%x\n", MFTRecord);
731 ExFreeToNPagedLookasideList(&DeviceExtension->FileRecLookasideList, FileRecord);
732 continue;
733 }
734 OldMFTRecord = MFTRecord;
735
738 FileRecord,
739 MFTRecord,
743 &Written,
745
747 {
748 break;
749 }
750 }
751 else
752 {
754 break;
755 }
756
761
762 ExFreeToNPagedLookasideList(&DeviceExtension->FileRecLookasideList, FileRecord);
763
765 {
766 break;
767 }
768
770 }
771
772 if (Buffer0)
773 {
777 }
778 else
779 {
783 }
784
787
789}
static PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(PIRP Irp)
_Inout_ PFILE_OBJECT _In_ TYPE_OF_OPEN PFCB _In_opt_ PCCB Ccb
_In_ HANDLE _In_ CONST PDXGKMDT_OPM_GET_INFO_PARAMETERS Parameters
PVOID NtfsGetUserBuffer(PIRP Irp, BOOLEAN Paging)
struct NTFS_CCB * PNTFS_CCB
#define IRPCONTEXT_CANWAIT
#define CCB_RETURNED_DOTDOT
#define ExAllocatePoolWithTag(hernya, size, tag)
#define ExAcquireResourceExclusiveLite(res, wait)
#define ExAcquireResourceSharedLite(res, wait)
#define ClearFlag(_F, _SF)
#define BooleanFlagOn(F, SF)
enum _FILE_INFORMATION_CLASS FILE_INFORMATION_CLASS
struct _FILE_NAMES_INFORMATION * PFILE_NAMES_INFORMATION
NTSTATUS NtfsFindFileAt(PDEVICE_EXTENSION Vcb, PUNICODE_STRING SearchPattern, PULONG FirstEntry, PFILE_RECORD_HEADER *FileRecord, PULONGLONG MFTIndex, ULONGLONG CurrentMFTIndex, BOOLEAN CaseSensitive)
#define memcpy(s1, s2, n)
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
static NTSTATUS NtfsGetDotEntry(PDEVICE_EXTENSION DeviceExt, ULONGLONG MFTIndex, PCUNICODE_STRING Name, FILE_INFORMATION_CLASS FileInformationClass, PVOID Buffer, ULONG BufferLength, PULONG Written, BOOLEAN First)
static BOOLEAN NtfsDotNameMatches(PUNICODE_STRING Pattern, PUNICODE_STRING Name, BOOLEAN CaseSensitive)
static ULONGLONG NtfsGetParentMftIndex(PDEVICE_EXTENSION DeviceExt, ULONGLONG MFTIndex)
BOOLEAN NtfsFCBIsCompressed(PNTFS_FCB Fcb)
VOID FASTCALL ExReleaseResourceLite(IN PERESOURCE Resource)
PDEVICE_OBJECT DeviceObject
#define STATUS_NO_SUCH_FILE
#define STATUS_NO_MORE_FILES
_In_ PDEVICE_OBJECT DeviceObject
_In_ WDFREQUEST _In_ WDFFILEOBJECT FileObject
_In_ WDFREQUEST _In_ PIO_STACK_LOCATION Stack
#define SL_INDEX_SPECIFIED
#define SL_RETURN_SINGLE_ENTRY
#define SL_CASE_SENSITIVE