Explorar o código

Update external/extractarchive/download file entry processing as well.

Basically, ApplyPathRedirRules is now always called as soon as source or dest path value is read from the entry to process, just like ExpandConst already was.

Update ProcessFileEntry like CreateDirs was already updated.

Updating RegisterFiles is still todo.
Martijn Laan hai 1 mes
pai
achega
832b26fa9f

+ 16 - 22
Projects/Src/Compression.SevenZipDLLDecoder.pas

@@ -35,10 +35,8 @@ procedure ExtractArchive(const ArchiveFilename, DestDir, Password: String; const
 type
   TArchiveFindHandle = type NativeUInt;
   TOnExtractToHandleProgress = procedure(const Bytes, Param: Int64);
-function ArchiveFindFirstFileRedir(const DisableFsRedir: Boolean;
-  const ArchiveFilename, DestDir, Password: String;
-  const RecurseSubDirs, ExtractIntent: Boolean;
-  out FindFileData: TWin32FindData): TArchiveFindHandle;
+function ArchiveFindFirstFile(const ArchiveFilename, DestDir, Password: String;
+  const RecurseSubDirs, ExtractIntent: Boolean; out FindFileData: TWin32FindData): TArchiveFindHandle;
 function ArchiveFindNextFile(const FindFile: TArchiveFindHandle; out FindFileData: TWin32FindData): Boolean;
 function ArchiveFindClose(const FindFile: TArchiveFindHandle): Boolean;
 procedure ArchiveFindExtract(const FindFile: TArchiveFindHandle; const DestF: TFile;
@@ -51,7 +49,7 @@ uses
   Compression.SevenZipDLLDecoder.Interfaces, PathFunc,
   Shared.SetupMessageIDs, Shared.CommonFunc,
   SetupLdrAndSetup.Messages,
-  Setup.RedirFunc, Setup.LoggingFunc, Setup.MainFunc, Setup.InstFunc;
+  Setup.LoggingFunc, Setup.MainFunc, Setup.InstFunc;
 
 type
   TInStream = class(TInterfacedObject, IInStream)
@@ -103,14 +101,13 @@ type
 
   TArchiveOpenFileCallback = class(TArchiveOpenCallback, IArchiveOpenVolumeCallback)
   private
-    FDisableFsRedir: Boolean;
     FArchiveFilename: String;
   protected
     { IArchiveOpenVolumeCallback - queried for by 7-Zip on IArchiveOpenCallback }
     function GetProperty(propID: PROPID; var value: OleVariant): HRESULT; stdcall;
     function GetStream(const name: PChar; var inStream: IInStream): HRESULT; stdcall;
   public
-    constructor Create(const DisableFsRedir: Boolean; const ArchiveFilename, Password: String);
+    constructor Create(const ArchiveFilename, Password: String);
   end;
 
   TArchiveExtractBaseCallback = class(TArchiveCallback, IArchiveExtractCallback)
@@ -423,11 +420,9 @@ end;
 
 { TArchiveOpenFileCallback }
 
-constructor TArchiveOpenFileCallback.Create(const DisableFsRedir: Boolean; const ArchiveFilename,
-  Password: String);
+constructor TArchiveOpenFileCallback.Create(const ArchiveFilename, Password: String);
 begin
   inherited Create(Password);
-  FDisableFsRedir := DisableFsRedir;
   FArchiveFilename := ArchiveFilename;
 end;
 
@@ -450,8 +445,8 @@ begin
     S_FALSE or set instream to nil when it tries to open a volume which doesn't exists (like
     archive.7z.003 when there's two volumes only). }
   try
-    if NewFileExistsRedir(FDisableFsRedir, name) then begin
-      const F = TFileRedir.Create(FDisableFsRedir, name, fdOpenExisting, faRead, fsRead);
+    if NewFileExists(name) then begin
+      const F = TFile.Create(name, fdOpenExisting, faRead, fsRead);
       instream := TInStream.Create(F);
     end else
       instream := nil;
@@ -993,8 +988,8 @@ begin
   end;
 end;
 
-function OpenArchiveRedir(const DisableFsRedir: Boolean;
-  const ArchiveFilename, Password: String; const clsid: TGUID; out numItems: UInt32): IInArchive;
+function OpenArchive(const ArchiveFilename, Password: String; const clsid: TGUID;
+  out numItems: UInt32): IInArchive;
 const
   DefaultScanSize: Int64 = 1 shl 23; { From Client7z.cpp }
 begin
@@ -1005,17 +1000,17 @@ begin
   { Open }
   var F: TFile := nil; { Set to nil to silence compiler }
   try
-    F := TFileRedir.Create(DisableFsRedir, ArchiveFilename, fdOpenExisting, faRead, fsRead);
+    F := TFile.Create(ArchiveFilename, fdOpenExisting, faRead, fsRead);
   except
     on E: EFileError do
       SevenZipWin32Error('CreateFile', E.ErrorCode);
   end;
   const InStream: IInStream = TInStream.Create(F); { InStream now owns F }
   var ScanSize := DefaultScanSize;
-  const OpenCallback: IArchiveOpenCallback = TArchiveOpenFileCallback.Create(DisableFsRedir, ArchiveFileName, Password);
+  const OpenCallback: IArchiveOpenCallback = TArchiveOpenFileCallback.Create(ArchiveFileName, Password);
   if Result.Open(InStream, @ScanSize, OpenCallback) <> S_OK then begin
     if clsid = CLSID_HandlerRar then { Try RAR5 instead of RAR4 }
-      Exit(OpenArchiveRedir(DisableFsRedir, ArchiveFilename, Password, CLSID_HandlerRar5, numItems))
+      Exit(OpenArchive(ArchiveFilename, Password, CLSID_HandlerRar5, numItems))
     else
       SevenZipError(SetupMessages[msgArchiveIsCorrupted], 'Cannot open file as archive' { Just like Client7z.cpp });
   end;
@@ -1087,7 +1082,7 @@ begin
 
   { Open }
   var numItems: UInt32;
-  const InArchive = OpenArchiveRedir(False, ArchiveFilename, Password,
+  const InArchive = OpenArchive(ArchiveFilename, Password,
     clsid, numItems);
 
   { Extract }
@@ -1161,9 +1156,8 @@ begin
   end;
 end;
 
-function ArchiveFindFirstFileRedir(const DisableFsRedir: Boolean;
-  const ArchiveFilename, DestDir, Password: String; const RecurseSubDirs,
-  ExtractIntent: Boolean; out FindFileData: TWin32FindData): TArchiveFindHandle;
+function ArchiveFindFirstFile(const ArchiveFilename, DestDir, Password: String;
+  const RecurseSubDirs, ExtractIntent: Boolean; out FindFileData: TWin32FindData): TArchiveFindHandle;
 begin
   LogArchiveExtractionModeOnce;
 
@@ -1176,7 +1170,7 @@ begin
 
   { Open }
   var State := Default(TArchiveFindState);
-  State.InArchive := OpenArchiveRedir(DisableFsRedir, ArchiveFilename, Password, clsid, State.numItems);
+  State.InArchive := OpenArchive(ArchiveFilename, Password, clsid, State.numItems);
   if DestDir <> '' then begin
     var ExpandedDestDir: String;
     if not PathConvertNormalToSuper(DestDir, ExpandedDestDir, True) then

+ 44 - 42
Projects/Src/Setup.Install.pas

@@ -498,7 +498,7 @@ begin
 end;
 
 procedure DoHandleFailedDeleteOrMoveFileTry(const CurFile: PSetupFileEntry;
-  const AIs64Bit: Boolean; const Func, TempFile, DestFile: String;
+  const Is64Bit: Boolean; const Func, TempFile, DestFile: String;
   const LastError: DWORD; var RetriesLeft: Integer; var LastOperation: String;
   var NeedsRestart, ReplaceOnRestart: Boolean;
   var NextAction: TFileOperationFailingNextAction);
@@ -511,7 +511,7 @@ begin
       'Will replace on restart.', [Func, LastError]);
     LastOperation := SetupMessages[msgErrorRestartReplace];
     NeedsRestart := True;
-    RestartReplace(AIs64Bit, TempFile, DestFile);
+    RestartReplace(Is64Bit, TempFile, DestFile);
     ReplaceOnRestart := True;
     NextAction := naStopAndSucceed;
   end else if RetriesLeft > 0 then begin
@@ -529,7 +529,7 @@ type
 
 procedure ProcessFileEntry(const UninstLog: TUninstallLog; const ExpandedAppId: String;
   const RegisterFilesList: TList; const CurFile: PSetupFileEntry;
-  const DisableFsRedir: Boolean; AExternalSourceFile, ADestFile: String;
+  const Is64Bit: Boolean; AExternalSourceFile, ADestFile: String;
   const FileLocationFilenames: TStringList; const AExternalSize: Int64;
   var ConfirmOverwriteOverwriteAll, PromptIfOlderOverwriteAll: TOverwriteAll;
   var WarnedPerUserFonts: Boolean; const AExternalFileDate: PFileTime;
@@ -703,7 +703,7 @@ Retry:
     try
       ReplaceOnRestart := False;
       DeleteFlags := 0;
-      if DisableFsRedir then
+      if Is64Bit then
         DeleteFlags := DeleteFlags or utDeleteFile_DisableFsRedir;
       if foRegisterServer in CurFile^.Options then
         DeleteFlags := DeleteFlags or utDeleteFile_RegisteredServer;
@@ -723,10 +723,9 @@ Retry:
           ftUninstExe: DestFile := UninstallExeFilename;
         else
           if ADestFile = '' then
-            DestFile := ExpandConst(CurFile^.DestName)
+            DestFile := ApplyPathRedirRules(Is64Bit, ExpandConst(CurFile^.DestName))
           else
             DestFile := ADestFile;
-          DestFile := ApplyPathRedirRules(DisableFsRedir, DestFile);
         end;
       except
         { If an exception occurred, reset DestFile back to an empty string
@@ -742,8 +741,8 @@ Retry:
         SetStatusLabelText(SetupMessages[msgStatusExtractFiles], False);
       SetFilenameLabelText(PathConvertSuperToNormal(DestFile), True);
       LogFmt('Dest filename: %s', [DestFile]);
-      if DisableFsRedir <> InstallDefaultDisableFsRedir then begin
-        if DisableFsRedir then
+      if Is64Bit <> InstallDefaultDisableFsRedir then begin
+        if Is64Bit then
           Log('Non-default bitness: 64-bit')
         else
           Log('Non-default bitness: 32-bit');
@@ -783,7 +782,7 @@ Retry:
           CurFileDate := AExternalFileDate^;
           CurFileDateValid := CurFileDate.HasTime;
         end else if not(foDownload in CurFile^.Options) then
-          CurFileDateValid := GetFileDateTime(ApplyPathRedirRules(DisableFsRedir, AExternalSourceFile), CurFileDate)
+          CurFileDateValid := GetFileDateTime(AExternalSourceFile, CurFileDate)
         else begin
           CurFileDateValid := False;
           CurFileDateDidRead := False;
@@ -823,8 +822,7 @@ Retry:
             CurFileVersionInfo.LS := CurFileLocation^.FileVersionLS;
           end
           else
-            CurFileVersionInfoValid := GetVersionNumbers(
-                ApplyPathRedirRules(DisableFsRedir, AExternalSourceFile), CurFileVersionInfo);
+            CurFileVersionInfoValid := GetVersionNumbers(AExternalSourceFile, CurFileVersionInfo);
           if CurFileVersionInfoValid then
             LogFmt('Version of our file: %u.%u.%u.%u',
               [LongRec(CurFileVersionInfo.MS).Hi, LongRec(CurFileVersionInfo.MS).Lo,
@@ -878,7 +876,7 @@ Retry:
                       { This GetSHA256OfFile call could raise an exception, but
                         it's very unlikely since we were already able to
                         successfully read the file's version info. }
-                      CurFileHash := GetSHA256OfFile(ApplyPathRedirRules(DisableFsRedir, AExternalSourceFile));
+                      CurFileHash := GetSHA256OfFile(AExternalSourceFile);
                       LastOperation := SetupMessages[msgErrorReadingExistingDest];
                     end;
                     { If the two files' SHA-256 hashes are equal, skip the file }
@@ -1147,7 +1145,7 @@ Retry:
           end,
           procedure(const LastError: Cardinal; var RetriesLeft: Integer; var NextAction: TFileOperationFailingNextAction)
           begin
-            DoHandleFailedDeleteOrMoveFileTry(CurFile, DisableFsRedir, 'DeleteFile', TempFile, DestFile,
+            DoHandleFailedDeleteOrMoveFileTry(CurFile, Is64Bit, 'DeleteFile', TempFile, DestFile,
               LastError, RetriesLeft, LastOperation, NeedsRestart, ReplaceOnRestart, NextAction);
           end,
           procedure(const LastError: Cardinal; var TryOnceMore: Boolean)
@@ -1176,7 +1174,7 @@ Retry:
           end,
           procedure(const LastError: Cardinal; var RetriesLeft: Integer; var NextAction: TFileOperationFailingNextAction)
           begin
-            DoHandleFailedDeleteOrMoveFileTry(CurFile, DisableFsRedir, 'MoveFile', TempFile, DestFile,
+            DoHandleFailedDeleteOrMoveFileTry(CurFile, Is64Bit, 'MoveFile', TempFile, DestFile,
               LastError, RetriesLeft, LastOperation, NeedsRestart, ReplaceOnRestart, NextAction);
           end,
           procedure(const LastError: Cardinal; var TryOnceMore: Boolean)
@@ -1261,7 +1259,7 @@ Retry:
           Log('Will register the file (a DLL/OCX) later.');
         New(RegisterRec);
         RegisterRec^.Filename := DestFile;
-        RegisterRec^.Is64Bit := DisableFsRedir;
+        RegisterRec^.Is64Bit := Is64Bit;
         RegisterRec^.TypeLib := foRegisterTypeLib in CurFile^.Options;
         RegisterRec^.NoErrorMessages := foNoRegError in CurFile^.Options;
         RegisterFilesList.Add(RegisterRec);
@@ -1274,7 +1272,7 @@ Retry:
         added). }
       if foSharedFile in CurFile^.Options then begin
         LastOperation := '';
-        if DisableFsRedir then begin
+        if Is64Bit then begin
           Log('Incrementing shared file count (64-bit).');
           IncrementSharedCount(rv64Bit, DestFile, DestFileExistedBefore);
         end
@@ -1284,7 +1282,7 @@ Retry:
         end;
         if not(foUninsNeverUninstall in CurFile^.Options) then begin
           DeleteFlags := DeleteFlags or utDeleteFile_SharedFile;
-          if DisableFsRedir then
+          if Is64Bit then
             DeleteFlags := DeleteFlags or utDeleteFile_SharedFileIn64BitKey;
           if foUninsNoSharedFilePrompt in CurFile^.Options then
             DeleteFlags := DeleteFlags or utDeleteFile_NoSharedFilePrompt;
@@ -1293,7 +1291,7 @@ Retry:
             CurFile^.StrongAssemblyName], DeleteFlags);
         end
         else begin
-          if DisableFsRedir then
+          if Is64Bit then
             UninstLog.Add(utDecrementSharedCount, [DestFile],
               utDecrementSharedCount_64BitKey)
           else
@@ -1382,7 +1380,7 @@ procedure CopyFiles(const UninstLog: TUninstallLog; const ExpandedAppId: String;
   var UninstallTempExeFilename: String; var UninstallExeCreated: TUninstallExeCreated);
 { Copies all the application's files }
 
-  function RecurseExternalCopyFiles(const DisableFsRedir: Boolean;
+  function RecurseExternalCopyFiles(const Is64Bit: Boolean;
     const SearchBaseDir, SearchSubDir, SearchWildcard: String; const SourceIsWildcard: Boolean;
     const Excludes: TStrings; const CurFile: PSetupFileEntry; var ExpectedBytesLeft: Int64;
     var ConfirmOverwriteOverwriteAll, PromptIfOlderOverwriteAll: TOverwriteAll;
@@ -1394,7 +1392,7 @@ procedure CopyFiles(const UninstLog: TUninstallLog; const ExpandedAppId: String;
     Result := False;
 
     var FindData: TWin32FindData;
-    var H := FindFirstFileRedir(DisableFsRedir, SearchBaseDir + SearchSubDir + SearchWildcard, FindData);
+    var H := FindFirstFile(PChar(SearchBaseDir + SearchSubDir + SearchWildcard), FindData);
     if H <> INVALID_HANDLE_VALUE then begin
       try
         repeat
@@ -1421,6 +1419,7 @@ procedure CopyFiles(const UninstLog: TUninstallLog; const ExpandedAppId: String;
               DestFile := DestFile + SearchSubDir + FileName
             else if SearchSubDir <> '' then
               DestFile := PathExtractPath(DestFile) + SearchSubDir + PathExtractName(DestFile);
+            DestFile := ApplyPathRedirRules(Is64Bit, DestFile);
             var Size := FindDataFileSizeToInt64(FindData);
             if Size > ExpectedBytesLeft then begin
               { Don't allow the progress bar to overflow if the size of the
@@ -1428,7 +1427,7 @@ procedure CopyFiles(const UninstLog: TUninstallLog; const ExpandedAppId: String;
               Size := ExpectedBytesLeft;
             end;
             ProcessFileEntry(UninstLog, ExpandedAppId, RegisterFilesList,
-              CurFile, DisableFsRedir, SourceFile, DestFile, nil,
+              CurFile, Is64Bit, SourceFile, DestFile, nil,
               Size, ConfirmOverwriteOverwriteAll, PromptIfOlderOverwriteAll,
               WarnedPerUserFonts, nil, UninstallTempExeFilename, UninstallExeCreated);
             Dec(ExpectedBytesLeft, Size);
@@ -1440,12 +1439,12 @@ procedure CopyFiles(const UninstLog: TUninstallLog; const ExpandedAppId: String;
     end;
 
     if foRecurseSubDirsExternal in CurFile^.Options then begin
-      H := FindFirstFileRedir(DisableFsRedir, SearchBaseDir + SearchSubDir + '*', FindData);
+      H := FindFirstFile(PChar(SearchBaseDir + SearchSubDir + '*'), FindData);
       if H <> INVALID_HANDLE_VALUE then begin
         try
           repeat
             if IsRecurseableDirectory(FindData) then
-              Result := RecurseExternalCopyFiles(DisableFsRedir, SearchBaseDir,
+              Result := RecurseExternalCopyFiles(Is64Bit, SearchBaseDir,
                 SearchSubDir + FindData.cFileName + '\', SearchWildcard,
                 SourceIsWildcard, Excludes, CurFile, ExpectedBytesLeft,
                 ConfirmOverwriteOverwriteAll, PromptIfOlderOverwriteAll,
@@ -1466,10 +1465,11 @@ procedure CopyFiles(const UninstLog: TUninstallLog; const ExpandedAppId: String;
           DestName := DestName + SearchSubDir
         else
           DestName := PathExtractPath(DestName) + SearchSubDir;
+        DestName := ApplyPathRedirRules(Is64Bit, DestName);
         var Flags: TMakeDirFlags := [];
         if foUninsNeverUninstall in CurFile^.Options then Include(Flags, mdNoUninstall);
         if foDeleteAfterInstall in CurFile^.Options then Include(Flags, mdDeleteAfterInstall);
-        MakeDir(UninstLog, ApplyPathRedirRules(DisableFsRedir, DestName), Flags);
+        MakeDir(UninstLog, DestName, Flags);
         Result := True;
       end;
     end;
@@ -1480,7 +1480,7 @@ procedure CopyFiles(const UninstLog: TUninstallLog; const ExpandedAppId: String;
     ProcessEvents;
   end;
 
-  function RecurseExternalArchiveCopyFiles(const DisableFsRedir: Boolean;
+  function RecurseExternalArchiveCopyFiles(const Is64Bit: Boolean;
     const ArchiveFilename: String; const Excludes: TStrings;
     const CurFile: PSetupFileEntry; var ExpectedBytesLeft: Int64;
     var ConfirmOverwriteOverwriteAll, PromptIfOlderOverwriteAll: TOverwriteAll;
@@ -1492,13 +1492,13 @@ procedure CopyFiles(const UninstLog: TUninstallLog; const ExpandedAppId: String;
       a msgSourceDoesntExist message. All other errors we handle ourselves
       with a msgErrorExtracting message, without informing the caller, unless
       you count EAbort. }
-    Result := NewFileExistsRedir(DisableFsRedir, ArchiveFilename);
+    Result := NewFileExists(ArchiveFilename);
     if not Result then
       Exit;
 
     if foCustomDestName in CurFile^.Options then
       InternalError('Unexpected custom DestName');
-    const DestDir = ExpandConst(CurFile^.DestName);
+    const DestDir = ApplyPathRedirRules(Is64Bit, ExpandConst(CurFile^.DestName));
 
     Log('-- Archive entry --');
 
@@ -1511,7 +1511,7 @@ procedure CopyFiles(const UninstLog: TUninstallLog; const ExpandedAppId: String;
         try
           if CurFile^.Verification.Typ <> fvNone then begin
             if VerifySourceF = nil then
-              VerifySourceF := TFileRedir.Create(DisableFsRedir, ArchiveFilename, fdOpenExisting, faRead, fsRead);
+              VerifySourceF := TFile.Create(ArchiveFilename, fdOpenExisting, faRead, fsRead);
             var ExpectedFileHash: TSHA256Digest;
             if CurFile^.Verification.Typ = fvHash then
               ExpectedFileHash := CurFile^.Verification.Hash
@@ -1527,7 +1527,7 @@ procedure CopyFiles(const UninstLog: TUninstallLog; const ExpandedAppId: String;
             { Keep VerifySourceF open until extraction has completed to prevent TOCTOU problem }
           end;
 
-          H := ArchiveFindFirstFileRedir(DisableFsRedir, ArchiveFilename, DestDir,
+          H := ArchiveFindFirstFile(ArchiveFilename, DestDir,
             ExpandConst(CurFile^.ExtractArchivePassword), foRecurseSubDirsExternal in CurFile^.Options,
             True, FindData);
           Failed := '';
@@ -1557,7 +1557,7 @@ procedure CopyFiles(const UninstLog: TUninstallLog; const ExpandedAppId: String;
                 Size := ExpectedBytesLeft;
               end;
               ProcessFileEntry(UninstLog, ExpandedAppId, RegisterFilesList,
-                CurFile, DisableFsRedir, SourceFile, DestFile,
+                CurFile, Is64Bit, SourceFile, DestFile,
                 nil, Size, ConfirmOverwriteOverwriteAll, PromptIfOlderOverwriteAll,
                 WarnedPerUserFonts, @FindData.ftLastWriteTime,
                 UninstallTempExeFilename, UninstallExeCreated);
@@ -1566,7 +1566,7 @@ procedure CopyFiles(const UninstLog: TUninstallLog; const ExpandedAppId: String;
               var Flags: TMakeDirFlags := [];
               if foUninsNeverUninstall in CurFile^.Options then Include(Flags, mdNoUninstall);
               if foDeleteAfterInstall in CurFile^.Options then Include(Flags, mdDeleteAfterInstall);
-              MakeDir(UninstLog, ApplyPathRedirRules(DisableFsRedir, DestDir + FindData.cFileName), Flags);
+              MakeDir(UninstLog, DestDir + FindData.cFileName, Flags);
               Result := True;
             end;
           until not ArchiveFindNextFile(H, FindData);
@@ -1585,7 +1585,7 @@ procedure CopyFiles(const UninstLog: TUninstallLog; const ExpandedAppId: String;
 var
   CurFile: PSetupFileEntry;
   SourceWildcard: String;
-  DisableFsRedir, FoundFiles: Boolean;
+  FoundFiles: Boolean;
   ConfirmOverwriteOverwriteAll, PromptIfOlderOverwriteAll: TOverwriteAll;
   WarnedPerUserFonts: Boolean;
 begin
@@ -1611,18 +1611,18 @@ begin
         DebugNotifyEntry(seFile, CurFileNumber);
         NotifyBeforeInstallFileEntry(CurFile);
 
-        DisableFsRedir := InstallDefaultDisableFsRedir;
+        var Is64Bit := InstallDefaultDisableFsRedir;
         if fo32Bit in CurFile^.Options then
-          DisableFsRedir := False;
+          Is64Bit := False;
         if fo64Bit in CurFile^.Options then begin
           if not IsWin64 then
             InternalError('Cannot install files to 64-bit locations on this version of Windows');
-          DisableFsRedir := True;
+          Is64Bit := True;
         end;
 
         if CurFile^.LocationEntry <> -1 then begin
           ProcessFileEntry(UninstLog, ExpandedAppId, RegisterFilesList,
-            CurFile, DisableFsRedir, '', '', FileLocationFilenames, 0,
+            CurFile, Is64Bit, '', '', FileLocationFilenames, 0,
             ConfirmOverwriteOverwriteAll, PromptIfOlderOverwriteAll, WarnedPerUserFonts, nil,
             UninstallTempExeFilename, UninstallExeCreated);
         end
@@ -1631,10 +1631,12 @@ begin
           if CurFile^.FileType = ftUninstExe then begin
             { This is the file entry for the uninstaller program }
             SourceWildcard := NewParamStr(0);
-            DisableFsRedir := IsCurrentProcess64Bit;
-          end
-          else
+            Is64Bit := IsCurrentProcess64Bit;
+          end else begin
             SourceWildcard := ExpandConst(CurFile^.SourceFilename);
+            if not(foDownload in CurFile^.Options) then
+              SourceWildcard := ApplyPathRedirRules(Is64Bit, SourceWildcard);
+          end;
           Excludes.DelimitedText := CurFile^.Excludes;
           var ProgressBefore := CurProgress;
           repeat
@@ -1650,18 +1652,18 @@ begin
                 InternalError('Expected CustomDestName flag');
               { CurFile^.DestName now includes a filename, see TSetupCompiler.EnumFilesProc.ProcessFileList }
               ProcessFileEntry(UninstLog, ExpandedAppId, RegisterFilesList,
-                CurFile, DisableFsRedir, SourceWildcard, ExpandConst(CurFile^.DestName),
+                CurFile, Is64Bit, SourceWildcard, ApplyPathRedirRules(Is64Bit, ExpandConst(CurFile^.DestName)),
                 nil, ExpectedBytesLeft, ConfirmOverwriteOverwriteAll, PromptIfOlderOverwriteAll,
                 WarnedPerUserFonts, nil,
                 UninstallTempExeFilename, UninstallExeCreated);
               FoundFiles := True;
             end else if foExtractArchive in CurFile^.Options then
-              FoundFiles := RecurseExternalArchiveCopyFiles(DisableFsRedir,
+              FoundFiles := RecurseExternalArchiveCopyFiles(Is64Bit,
                 SourceWildcard, Excludes, CurFile,
                 ExpectedBytesLeft, ConfirmOverwriteOverwriteAll, PromptIfOlderOverwriteAll,
                 WarnedPerUserFonts)
             else
-              FoundFiles := RecurseExternalCopyFiles(DisableFsRedir,
+              FoundFiles := RecurseExternalCopyFiles(Is64Bit,
                 PathExtractPath(SourceWildcard), '', PathExtractName(SourceWildcard),
                 IsWildcard(SourceWildcard), Excludes, CurFile,
                 ExpectedBytesLeft, ConfirmOverwriteOverwriteAll, PromptIfOlderOverwriteAll,

+ 29 - 29
Projects/Src/Setup.MainFunc.pas

@@ -1936,7 +1936,7 @@ end;
 function EnumFiles(const EnumFilesProc: TEnumFilesProc;
   const WizardComponents, WizardTasks: TStringList; const Param: Pointer): Boolean;
 
-  function RecurseExternalFiles(const DisableFsRedir: Boolean;
+  function RecurseExternalFiles(const Is64Bit: Boolean;
     const SearchBaseDir, SearchSubDir, SearchWildcard: String;
     const SourceIsWildcard: Boolean; const Excludes: TStrings; const CurFile: PSetupFileEntry): Boolean;
   begin
@@ -1945,7 +1945,7 @@ function EnumFiles(const EnumFilesProc: TEnumFilesProc;
     Result := True;
 
     var FindData: TWin32FindData;
-    var H := FindFirstFileRedir(DisableFsRedir, SearchBaseDir + SearchSubDir + SearchWildcard, FindData);
+    var H := FindFirstFile(PChar(SearchBaseDir + SearchSubDir + SearchWildcard), FindData);
     if H <> INVALID_HANDLE_VALUE then begin
       try
         repeat
@@ -1965,7 +1965,8 @@ function EnumFiles(const EnumFilesProc: TEnumFilesProc;
               DestFile := DestFile + SearchSubDir + FindData.cFileName
             else if SearchSubDir <> '' then
               DestFile := PathExtractPath(DestFile) + SearchSubDir + PathExtractName(DestFile);
-            if not EnumFilesProc(DisableFsRedir, DestFile, Param) then begin
+            DestFile := ApplyPathRedirRules(Is64Bit, DestFile);
+            if not EnumFilesProc(Is64Bit, DestFile, Param) then begin
               Result := False;
               Exit;
             end;
@@ -1977,12 +1978,12 @@ function EnumFiles(const EnumFilesProc: TEnumFilesProc;
     end;
 
     if foRecurseSubDirsExternal in CurFile^.Options then begin
-      H := FindFirstFileRedir(DisableFsRedir, SearchBaseDir + SearchSubDir + '*', FindData);
+      H := FindFirstFile(PChar(SearchBaseDir + SearchSubDir + '*'), FindData);
       if H <> INVALID_HANDLE_VALUE then begin
         try
           repeat
             if IsRecurseableDirectory(FindData) then
-              if not RecurseExternalFiles(DisableFsRedir, SearchBaseDir,
+              if not RecurseExternalFiles(Is64Bit, SearchBaseDir,
                  SearchSubDir + FindData.cFileName + '\', SearchWildcard,
                  SourceIsWildcard, Excludes, CurFile) then
                 Exit(False);
@@ -1994,22 +1995,22 @@ function EnumFiles(const EnumFilesProc: TEnumFilesProc;
     end;
   end;
 
-  function RecurseExternalArchiveFiles(const DisableFsRedir: Boolean;
+  function RecurseExternalArchiveFiles(const Is64Bit: Boolean;
     const ArchiveFilename: String; const Excludes: TStrings;
     const CurFile: PSetupFileEntry): Boolean;
   begin
     { See above }
     Result := True;
 
-    if not NewFileExistsRedir(DisableFsRedir, ArchiveFilename) then
+    if not NewFileExists(ArchiveFilename) then
       Exit;
 
     if foCustomDestName in CurFile^.Options then
       InternalError('Unexpected CustomDestName flag');
-    const DestDir = ExpandConst(CurFile^.DestName);
+    const DestDir = ApplyPathRedirRules(Is64Bit, ExpandConst(CurFile^.DestName));
 
     var FindData: TWin32FindData;
-    var H := ArchiveFindFirstFileRedir(DisableFsRedir, ArchiveFilename, DestDir,
+    var H := ArchiveFindFirstFile(ArchiveFilename, DestDir,
       ExpandConst(CurFile^.ExtractArchivePassword), foRecurseSubDirsExternal in CurFile^.Options,
       False, FindData);
     if H <> INVALID_HANDLE_VALUE then begin
@@ -2021,7 +2022,7 @@ function EnumFiles(const EnumFilesProc: TEnumFilesProc;
               Continue;
 
             const DestFile = DestDir + FindData.cFileName;
-            if not EnumFilesProc(DisableFsRedir, DestFile, Param) then
+            if not EnumFilesProc(Is64Bit, DestFile, Param) then
               Exit(False);
           end;
         until not ArchiveFindNextFile(H, FindData);
@@ -2033,7 +2034,6 @@ function EnumFiles(const EnumFilesProc: TEnumFilesProc;
 
 var
   CurFile: PSetupFileEntry;
-  DisableFsRedir: Boolean;
   SourceWildcard: String;
 begin
   Result := True;
@@ -2048,10 +2048,10 @@ begin
       CurFile := PSetupFileEntry(Entries[seFile][I]);
       if (CurFile^.FileType = ftUserFile) and
          ShouldProcessFileEntry(WizardComponents, WizardTasks, CurFile, False) then begin
-        DisableFsRedir := ShouldDisableFsRedirForFileEntry(CurFile);
+        const Is64Bit = ShouldDisableFsRedirForFileEntry(CurFile);
         if CurFile^.LocationEntry <> -1 then begin
           { Non-external file }
-          if not EnumFilesProc(DisableFsRedir, ExpandConst(CurFile^.DestName), Param) then begin
+          if not EnumFilesProc(Is64Bit, ApplyPathRedirRules(Is64Bit, ExpandConst(CurFile^.DestName)), Param) then begin
             Result := False;
             Exit;
           end;
@@ -2065,14 +2065,14 @@ begin
             if not(foCustomDestName in CurFile^.Options) then
               InternalError('Expected CustomDestName flag');
             { CurFile^.DestName now includes a filename, see TSetupCompiler.EnumFilesProc.ProcessFileList }
-            if not EnumFilesProc(DisableFsRedir, ExpandConst(CurFile^.DestName), Param) then
+            if not EnumFilesProc(Is64Bit, ApplyPathRedirRules(Is64Bit, ExpandConst(CurFile^.DestName)), Param) then
               Exit(False);
           end else begin
-	          SourceWildcard := ExpandConst(CurFile^.SourceFilename);
+	          SourceWildcard := ApplyPathRedirRules(Is64Bit, ExpandConst(CurFile^.SourceFilename));
 	          Excludes.DelimitedText := CurFile^.Excludes;
 	          if foExtractArchive in CurFile^.Options then begin
 	            try
-	              if not RecurseExternalArchiveFiles(DisableFsRedir, SourceWildcard,
+	              if not RecurseExternalArchiveFiles(Is64Bit, SourceWildcard,
 	                 Excludes, CurFile) then
 	                Exit(False);
 	            except on E: ESevenZipError do
@@ -2080,7 +2080,7 @@ begin
 	                installation }
 	            end;
 	          end else begin
-	            if not RecurseExternalFiles(DisableFsRedir, PathExtractPath(SourceWildcard), '',
+	            if not RecurseExternalFiles(Is64Bit, PathExtractPath(SourceWildcard), '',
 	               PathExtractName(SourceWildcard), IsWildcard(SourceWildcard), Excludes, CurFile) then
                 Exit(False);
             end;
@@ -3018,7 +3018,7 @@ var
       InstallMode := imSilent;
   end;
 
-  function RecurseExternalGetSizeOfFiles(const DisableFsRedir: Boolean;
+  function RecurseExternalGetSizeOfFiles(const Is64Bit: Boolean;
     const SearchBaseDir, SearchSubDir, SearchWildcard: String;
     const SourceIsWildcard: Boolean; const Excludes: TStrings;
     const RecurseSubDirs: Boolean): Int64;
@@ -3028,7 +3028,7 @@ var
     Result := 0;
 
     var FindData: TWin32FindData;
-    var H := FindFirstFileRedir(DisableFsRedir, SearchBaseDir + SearchSubDir + SearchWildcard, FindData);
+    var H := FindFirstFile(PChar(SearchBaseDir + SearchSubDir + SearchWildcard), FindData);
     if H <> INVALID_HANDLE_VALUE then begin
       repeat
         if FindData.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY = 0 then begin
@@ -3047,12 +3047,12 @@ var
     end;
 
     if RecurseSubDirs then begin
-      H := FindFirstFileRedir(DisableFsRedir, SearchBaseDir + SearchSubDir + '*', FindData);
+      H := FindFirstFile(PChar(SearchBaseDir + SearchSubDir + '*'), FindData);
       if H <> INVALID_HANDLE_VALUE then begin
         try
           repeat
             if IsRecurseableDirectory(FindData) then begin
-              var I := RecurseExternalGetSizeOfFiles(DisableFsRedir, SearchBaseDir,
+              var I := RecurseExternalGetSizeOfFiles(Is64Bit, SearchBaseDir,
                 SearchSubDir + FindData.cFileName + '\', SearchWildcard,
                 SourceIsWildcard, Excludes, RecurseSubDirs);
               Inc(Result, I);
@@ -3065,18 +3065,18 @@ var
     end;
   end;
 
-  function RecurseExternalArchiveGetSizeOfFiles(const DisableFsRedir: Boolean;
+  function RecurseExternalArchiveGetSizeOfFiles(const Is64Bit: Boolean;
     const ArchiveFilename, Password: String; const Excludes: TStrings;
     const RecurseSubDirs: Boolean): Int64;
   begin
     { See above }
     Result := 0;
 
-    if not NewFileExistsRedir(DisableFsRedir, ArchiveFilename) then
+    if not NewFileExists(ArchiveFilename) then
       Exit;
 
     var FindData: TWin32FindData;
-    var H := ArchiveFindFirstFileRedir(DisableFsRedir, ArchiveFilename,
+    var H := ArchiveFindFirstFile(ArchiveFilename,
       AddBackslash(TempInstallDir), { DestDir isn't known yet, pass a placeholder }
       Password, RecurseSubDirs, False, FindData);
     if H <> INVALID_HANDLE_VALUE then begin
@@ -3875,19 +3875,19 @@ begin
               InternalError('Unexpected download flag');
             try
               LExcludes.DelimitedText := Excludes;
+              const Is64Bit = ShouldDisableFsRedirForFileEntry(PSetupFileEntry(Entries[seFile][I]));
               if foExtractArchive in Options then begin
                 ExternalSize := RecurseExternalArchiveGetSizeOfFiles(
-                  ShouldDisableFsRedirForFileEntry(PSetupFileEntry(Entries[seFile][I])),
-                  ExpandConst(SourceFilename), ExpandConst(ExtractArchivePassword), LExcludes,
+                  Is64Bit, ApplyPathRedirRules(Is64Bit, ExpandConst(SourceFilename)),
+                  ExpandConst(ExtractArchivePassword), LExcludes,
                   foRecurseSubDirsExternal in Options);
               end else begin
                 if FileType <> ftUserFile then
                   SourceWildcard := NewParamStr(0)
                 else
-                  SourceWildcard := ExpandConst(SourceFilename);
+                  SourceWildcard := ApplyPathRedirRules(Is64Bit, ExpandConst(SourceFilename));
                 ExternalSize := RecurseExternalGetSizeOfFiles(
-                  ShouldDisableFsRedirForFileEntry(PSetupFileEntry(Entries[seFile][I])),
-                  PathExtractPath(SourceWildcard),
+                  Is64Bit, PathExtractPath(SourceWildcard),
                   '', PathExtractName(SourceWildcard), IsWildcard(SourceWildcard),
                   LExcludes, foRecurseSubDirsExternal in Options);
               end;