From c914655a67952647bfea7d2a52b94f76acd5d93a Mon Sep 17 00:00:00 2001 From: marco Date: Wed, 26 Jun 2019 16:35:37 +0000 Subject: [PATCH] * ignore sfn in findfirst win7+ mantis #35742. Entangled with symlink support git-svn-id: trunk@42286 - --- rtl/win/sysutils.pp | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/rtl/win/sysutils.pp b/rtl/win/sysutils.pp index e7e8979f05..b95e5c0c95 100644 --- a/rtl/win/sysutils.pp +++ b/rtl/win/sysutils.pp @@ -92,6 +92,10 @@ implementation sysconst, windirs; +var + FindExInfoDefaults : TFINDEX_INFO_LEVELS = FindExInfoBasic; + FindFirstAdditionalFlags : DWord = 0; + function WinCheck(res:boolean):boolean; begin if not res then @@ -468,7 +472,7 @@ begin end; end; - Handle := FindFirstFileExW(PUnicodeChar(FileName), FindExInfoBasic, @SymLinkRec.FindData, + Handle := FindFirstFileExW(PUnicodeChar(FileName), FindExInfoDefaults , @SymLinkRec.FindData, FindExSearchNameMatch, Nil, 0); if Handle <> INVALID_HANDLE_VALUE then begin Windows.FindClose(Handle); @@ -498,7 +502,7 @@ const Handle: THandle; begin { FindFirstFileEx is faster than FindFirstFile } - Handle := FindFirstFileExW(PUnicodeChar(FileOrDirName), FindExInfoBasic, @FindData, + Handle := FindFirstFileExW(PUnicodeChar(FileOrDirName), FindExInfoDefaults , @FindData, FindExSearchNameMatch, Nil, 0); Result := Handle <> INVALID_HANDLE_VALUE; if Result then begin @@ -587,7 +591,9 @@ begin Rslt.ExcludeAttr:=(not Attr) and ($1e); { $1e = faHidden or faSysFile or faVolumeID or faDirectory } { FindFirstFile is a Win32 Call } - Rslt.FindHandle:=FindFirstFileW (PWideChar(Path),Rslt.FindData); + Rslt.FindHandle:=FindFirstFileExW(PUnicodeChar(Path), FindExInfoDefaults , @Rslt.FindData, + FindExSearchNameMatch, Nil, FindFirstAdditionalFlags); + If Rslt.FindHandle=Invalid_Handle_value then begin Result:=GetLastError; @@ -1386,6 +1392,10 @@ begin kernel32dll:=GetModuleHandle('kernel32'); if kernel32dll<>0 then GetDiskFreeSpaceEx:=TGetDiskFreeSpaceEx(GetProcAddress(kernel32dll,'GetDiskFreeSpaceExA')); + if Win32MajorVersion<6 then + FindExInfoDefaults := FindExInfoStandard; // also searches SFNs. XP only. + if (Win32MajorVersion>=6) and (Win32MinorVersion>=1) then + FindFirstAdditionalFlags := FIND_FIRST_EX_LARGE_FETCH; // win7 and 2008R2+ end; Function GetAppConfigDir(Global : Boolean) : String;