ソースを参照

Merge branch 'main' into 7zdll

Martijn Laan 3 ヶ月 前
コミット
70c5323a61

+ 2 - 2
Projects/SetupLdr.dpr

@@ -2,7 +2,7 @@ program SetupLdr;
 
 {
   Inno Setup
-  Copyright (C) 1997-2024 Jordan Russell
+  Copyright (C) 1997-2025 Jordan Russell
   Portions by Martijn Laan
   For conditions of distribution and use, see LICENSE.TXT.
 
@@ -509,7 +509,7 @@ begin
         { Even though Setup has terminated by now, the system may still have
           the file locked for a short period of time (esp. on multiprocessor
           systems), so use DelayDeleteFile to delete it. }
-        DelayDeleteFile(False, TempFile, 13, 50, 250);
+        DelayDeleteFileRedir(False, TempFile, 13, 50, 250);
       if TempDir <> '' then
         RemoveDirectory(PChar(TempDir));
       if SetupLdrWnd <> 0 then

+ 16 - 9
Projects/Src/Compression.SevenZipDecoder.pas

@@ -15,18 +15,21 @@ interface
 type
   TOnExtractionProgress = function(const ArchiveName, FileName: string; const Progress, ProgressMax: Int64): Boolean of object;
 
-procedure Extract7ZipArchive(const ArchiveFileName, DestDir: String;
-  const FullPaths: Boolean; const OnExtractionProgress: TOnExtractionProgress);
+procedure Extract7ZipArchiveRedir(const DisableFsRedir: Boolean;
+  const ArchiveFileName, DestDir: String; const FullPaths: Boolean;
+  const OnExtractionProgress: TOnExtractionProgress);
 
 implementation
 
 uses
   Windows, SysUtils, Forms,
   PathFunc,
-  Shared.SetupMessageIDs, SetupLdrAndSetup.Messages, Setup.LoggingFunc, Setup.MainFunc, Setup.InstFunc;
+  Shared.SetupMessageIDs, SetupLdrAndSetup.Messages, SetupLdrAndSetup.RedirFunc,
+  Setup.LoggingFunc, Setup.MainFunc, Setup.InstFunc;
 
 type
   TSevenZipDecodeState = record
+    DisableFsRedir: Boolean;
     ExpandedArchiveFileName, ExpandedDestDir: String;
     LogBuffer: AnsiString;
     ExtractedArchiveName: String;
@@ -51,7 +54,7 @@ function __CreateDirectoryW(lpPathName: LPCWSTR;
 begin
   var ExpandedDir: String;
   if ValidateAndCombinePath(State.ExpandedDestDir, lpPathName, ExpandedDir) then
-    Result := CreateDirectoryW(PChar(ExpandedDir), lpSecurityAttributes)
+    Result := CreateDirectoryRedir(State.DisableFsRedir, ExpandedDir, lpSecurityAttributes)
   else begin
     Result := False;
     SetLastError(ERROR_ACCESS_DENIED);
@@ -82,7 +85,9 @@ begin
       (PathCompare(ExpandedFileName, State.ExpandedArchiveFileName) = 0)) or
      ((dwDesiredAccess = GENERIC_WRITE) and
       ValidateAndCombinePath(State.ExpandedDestDir, lpFileName, ExpandedFileName)) then
-    Result := CreateFileW(PChar(ExpandedFileName), dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile)
+    Result := CreateFileRedir(State.DisableFsRedir, ExpandedFileName,
+      dwDesiredAccess, dwShareMode, lpSecurityAttributes,
+      dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile)
   else begin
     Result := INVALID_HANDLE_VALUE;
     SetLastError(ERROR_ACCESS_DENIED);
@@ -110,7 +115,7 @@ end;
 
 function __SetFileAttributesW(lpFileName: LPCWSTR; dwFileAttributes: DWORD): BOOL; cdecl;
 begin
-  Result := SetFileAttributesW(lpFileName, dwFileAttributes);
+  Result := SetFileAttributesRedir(State.DisableFsRedir, lpFileName, dwFileAttributes);
 end;
 
 function __SetFilePointer(hFile: THandle; lDistanceToMove: Longint;
@@ -266,8 +271,9 @@ begin
     State.Aborted := True;
 end;
 
-procedure Extract7ZipArchive(const ArchiveFileName, DestDir: String;
-  const FullPaths: Boolean; const OnExtractionProgress: TOnExtractionProgress);
+procedure Extract7ZipArchiveRedir(const DisableFsRedir: Boolean;
+  const ArchiveFileName, DestDir: String; const FullPaths: Boolean;
+  const OnExtractionProgress: TOnExtractionProgress);
 begin
   if ArchiveFileName = '' then
     InternalError('Extract7ZipArchive: Invalid ArchiveFileName value');
@@ -277,9 +283,10 @@ begin
   LogFmt('Extracting 7-Zip archive %s to %s. Full paths? %s', [ArchiveFileName, DestDir, SYesNo[FullPaths]]);
 
   var SaveCurDir := GetCurrentDir;
-  if not ForceDirectories(False, DestDir) or not SetCurrentDir(DestDir) then
+  if not ForceDirectoriesRedir(False, DestDir) or not SetCurrentDir(DestDir) then
     raise Exception.Create(FmtSetupMessage(msgErrorExtractionFailed, ['-1']));
   try
+    State.DisableFsRedir := DisableFsRedir;
     State.ExpandedArchiveFileName := PathExpand(ArchiveFileName);
     State.ExpandedDestDir := AddBackslash(PathExpand(DestDir));
     State.LogBuffer := '';

+ 23 - 23
Projects/Src/Setup.InstFunc.pas

@@ -47,7 +47,7 @@ type
 function CheckForMutexes(const Mutexes: String): Boolean;
 procedure CreateMutexes(const Mutexes: String);
 function DecrementSharedCount(const RegView: TRegView; const Filename: String): Boolean;
-function DelTree(const DisableFsRedir: Boolean; const Path: String;
+function DelTreeRedir(const DisableFsRedir: Boolean; const Path: String;
   const IsDir, DeleteFiles, DeleteSubdirsAlso, BreakOnError: Boolean;
   const DeleteDirProc: TDeleteDirProc; const DeleteFileProc: TDeleteFileProc;
   const Param: Pointer): Boolean;
@@ -56,20 +56,20 @@ procedure EnumFileReplaceOperationsFilenames(const EnumFunc: TEnumFROFilenamesPr
 function GenerateNonRandomUniqueTempDir(const LimitCurrentUserSidAccess: Boolean;
   Path: String; var TempDir: String): Boolean;
 function GetComputerNameString: String;
-function GetFileDateTime(const DisableFsRedir: Boolean; const Filename: String;
+function GetFileDateTimeRedir(const DisableFsRedir: Boolean; const Filename: String;
   var DateTime: TFileTime): Boolean;
-function GetSHA256OfFile(const DisableFsRedir: Boolean; const Filename: String): TSHA256Digest;
+function GetSHA256OfFileRedir(const DisableFsRedir: Boolean; const Filename: String): TSHA256Digest;
 function GetSHA256OfAnsiString(const S: AnsiString): TSHA256Digest;
 function GetSHA256OfUnicodeString(const S: UnicodeString): TSHA256Digest;
 function GetRegRootKeyName(const RootKey: HKEY): String;
-function GetSpaceOnDisk(const DisableFsRedir: Boolean; const DriveRoot: String;
+function GetSpaceOnDiskRedir(const DisableFsRedir: Boolean; const DriveRoot: String;
   var FreeBytes, TotalBytes: Integer64): Boolean;
-function GetSpaceOnNearestMountPoint(const DisableFsRedir: Boolean;
+function GetSpaceOnNearestMountPointRedir(const DisableFsRedir: Boolean;
   const StartDir: String; var FreeBytes, TotalBytes: Integer64): Boolean;
 function GetUserNameString: String;
 procedure IncrementSharedCount(const RegView: TRegView; const Filename: String;
   const AlreadyExisted: Boolean);
-function InstExec(const DisableFsRedir: Boolean; const Filename, Params: String;
+function InstExecRedir(const DisableFsRedir: Boolean; const Filename, Params: String;
   WorkingDir: String; const Wait: TExecWait; const ShowCmd: Integer;
   const ProcessMessagesProc: TProcedure; const OutputReader: TCreateProcessOutputReader;
   var ResultCode: Integer): Boolean;
@@ -78,8 +78,8 @@ function InstShellExec(const Verb, Filename, Params: String; WorkingDir: String;
   const ProcessMessagesProc: TProcedure; var ResultCode: Integer): Boolean;
 procedure InternalError(const Id: String);
 procedure InternalErrorFmt(const S: String; const Args: array of const);
-function IsDirEmpty(const DisableFsRedir: Boolean; const Dir: String): Boolean;
-function IsProtectedSystemFile(const DisableFsRedir: Boolean;
+function IsDirEmptyRedir(const DisableFsRedir: Boolean; const Dir: String): Boolean;
+function IsProtectedSystemFileRedir(const DisableFsRedir: Boolean;
   const Filename: String): Boolean;
 function MakePendingFileRenameOperationsChecksum: TSHA256Digest;
 function ModifyPifFile(const Filename: String; const CloseOnExit: Boolean): Boolean;
@@ -89,11 +89,11 @@ procedure RefreshEnvironment;
 function ReplaceSystemDirWithSysWow64(const Path: String): String;
 function ReplaceSystemDirWithSysNative(Path: String; const IsWin64: Boolean): String;
 procedure UnregisterFont(const FontName, FontFilename: String; const PerUserFont: Boolean);
-procedure RestartReplace(const DisableFsRedir: Boolean; TempFile, DestFile: String);
+procedure RestartReplaceRedir(const DisableFsRedir: Boolean; TempFile, DestFile: String);
 procedure SplitNewParamStr(const Index: Integer; var AName, AValue: String);
 procedure Win32ErrorMsg(const FunctionName: String);
 procedure Win32ErrorMsgEx(const FunctionName: String; const ErrorCode: DWORD);
-function ForceDirectories(const DisableFsRedir: Boolean; Dir: String): Boolean;
+function ForceDirectoriesRedir(const DisableFsRedir: Boolean; Dir: String): Boolean;
 
 implementation
 
@@ -252,7 +252,7 @@ begin
   Result := Path;
 end;
 
-procedure RestartReplace(const DisableFsRedir: Boolean; TempFile, DestFile: String);
+procedure RestartReplaceRedir(const DisableFsRedir: Boolean; TempFile, DestFile: String);
 { Renames TempFile to DestFile the next time Windows is started. If DestFile
   already existed, it will be overwritten. If DestFile is '' then TempFile
   will be deleted.. }
@@ -274,7 +274,7 @@ begin
     Win32ErrorMsg('MoveFileEx');
 end;
 
-function DelTree(const DisableFsRedir: Boolean; const Path: String;
+function DelTreeRedir(const DisableFsRedir: Boolean; const Path: String;
   const IsDir, DeleteFiles, DeleteSubdirsAlso, BreakOnError: Boolean;
   const DeleteDirProc: TDeleteDirProc; const DeleteFileProc: TDeleteFileProc;
   const Param: Pointer): Boolean;
@@ -325,7 +325,7 @@ begin
             end
             else begin
               if DeleteSubdirsAlso then
-                if not DelTree(DisableFsRedir, BasePath + S, True, True, True, BreakOnError,
+                if not DelTreeRedir(DisableFsRedir, BasePath + S, True, True, True, BreakOnError,
                    DeleteDirProc, DeleteFileProc, Param) then
                   Result := False;
             end;
@@ -348,7 +348,7 @@ begin
   end;
 end;
 
-function IsDirEmpty(const DisableFsRedir: Boolean; const Dir: String): Boolean;
+function IsDirEmptyRedir(const DisableFsRedir: Boolean; const Dir: String): Boolean;
 { Returns True if Dir contains no files or subdirectories.
   Note: If Dir does not exist or lacks list permission, False will be
   returned. }
@@ -530,7 +530,7 @@ begin
   end;
 end;
 
-function GetFileDateTime(const DisableFsRedir: Boolean; const Filename: String;
+function GetFileDateTimeRedir(const DisableFsRedir: Boolean; const Filename: String;
   var DateTime: TFileTime): Boolean;
 var
   Handle: THandle;
@@ -550,7 +550,7 @@ begin
   DateTime.dwHighDateTime := 0;
 end;
 
-function GetSHA256OfFile(const DisableFsRedir: Boolean; const Filename: String): TSHA256Digest;
+function GetSHA256OfFileRedir(const DisableFsRedir: Boolean; const Filename: String): TSHA256Digest;
 { Gets SHA-256 sum as a string of the file Filename. An exception will be raised upon
   failure. }
 var
@@ -586,7 +586,7 @@ var
   SFCInitialized: Boolean;
   SfcIsFileProtectedFunc: function(RpcHandle: THandle; ProtFileName: PWideChar): BOOL; stdcall;
 
-function IsProtectedSystemFile(const DisableFsRedir: Boolean;
+function IsProtectedSystemFileRedir(const DisableFsRedir: Boolean;
   const Filename: String): Boolean;
 { Returns True if the specified file is protected by Windows File Protection
   (and therefore can't be replaced). }
@@ -656,7 +656,7 @@ begin
   end;
 end;
 
-function InstExec(const DisableFsRedir: Boolean; const Filename, Params: String;
+function InstExecRedir(const DisableFsRedir: Boolean; const Filename, Params: String;
   WorkingDir: String; const Wait: TExecWait; const ShowCmd: Integer;
   const ProcessMessagesProc: TProcedure; const OutputReader: TCreateProcessOutputReader;
   var ResultCode: Integer): Boolean;
@@ -950,7 +950,7 @@ begin
     SendNotifyMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);
 end;
 
-function GetSpaceOnDisk(const DisableFsRedir: Boolean; const DriveRoot: String;
+function GetSpaceOnDiskRedir(const DisableFsRedir: Boolean; const DriveRoot: String;
   var FreeBytes, TotalBytes: Integer64): Boolean;
 var
   GetDiskFreeSpaceExFunc: function(lpDirectoryName: PChar;
@@ -993,7 +993,7 @@ begin
   end;
 end;
 
-function GetSpaceOnNearestMountPoint(const DisableFsRedir: Boolean;
+function GetSpaceOnNearestMountPointRedir(const DisableFsRedir: Boolean;
   const StartDir: String; var FreeBytes, TotalBytes: Integer64): Boolean;
 { Gets the free and total space available on the specified directory. If that
   fails (e.g. if the directory does not exist), then it strips off the last
@@ -1007,7 +1007,7 @@ begin
   Dir := RemoveBackslashUnlessRoot(StartDir);
   LastLen := 0;
   while Length(Dir) <> LastLen do begin
-    if GetSpaceOnDisk(DisableFsRedir, Dir, FreeBytes, TotalBytes) then begin
+    if GetSpaceOnDiskRedir(DisableFsRedir, Dir, FreeBytes, TotalBytes) then begin
       Result := True;
       Break;
     end;
@@ -1053,13 +1053,13 @@ begin
   AValue := '';
 end;
 
-function ForceDirectories(const DisableFsRedir: Boolean; Dir: String): Boolean;
+function ForceDirectoriesRedir(const DisableFsRedir: Boolean; Dir: String): Boolean;
 begin
   Dir := RemoveBackslashUnlessRoot(Dir);
   if (PathExtractPath(Dir) = Dir) or DirExistsRedir(DisableFsRedir, Dir) then
     Result := True
   else
-    Result := ForceDirectories(DisableFsRedir, PathExtractPath(Dir)) and
+    Result := ForceDirectoriesRedir(DisableFsRedir, PathExtractPath(Dir)) and
       CreateDirectoryRedir(DisableFsRedir, Dir);
 end;
 

+ 50 - 51
Projects/Src/Setup.Install.pas

@@ -238,12 +238,12 @@ begin
     Result := '(invalid)';
 end;
 
-function TryToGetSHA256OfFile(const DisableFsRedir: Boolean; const Filename: String;
+function TryToGetSHA256OfFileRedir(const DisableFsRedir: Boolean; const Filename: String;
   var Sum: TSHA256Digest): Boolean;
 { Like GetSHA256OfFile but traps exceptions locally. Returns True if successful. }
 begin
   try
-    Sum := GetSHA256OfFile(DisableFsRedir, Filename);
+    Sum := GetSHA256OfFileRedir(DisableFsRedir, Filename);
     Result := True;
   except
     Result := False;
@@ -349,7 +349,7 @@ begin
   SetProgress(AMaxProgress);
 end;
 
-procedure AddAttributesToFile(const DisableFsRedir: Boolean;
+procedure AddAttributesToFileRedir(const DisableFsRedir: Boolean;
   const Filename: String; Attribs: Integer);
 var
   ExistingAttr: DWORD;
@@ -804,7 +804,7 @@ var
   type
     TMakeDirFlags = set of (mdNoUninstall, mdAlwaysUninstall, mdDeleteAfterInstall,
       mdNotifyChange);
-  function MakeDir(const DisableFsRedir: Boolean; Dir: String;
+  function MakeDirRedir(const DisableFsRedir: Boolean; Dir: String;
     const Flags: TMakeDirFlags): Boolean;
   { Returns True if a new directory was created.
     Note: If DisableFsRedir is True, the mdNotifyChange flag should not be
@@ -822,7 +822,7 @@ var
         Exit;
     end
     else begin
-      MakeDir(DisableFsRedir, PathExtractDir(Dir), Flags - [mdAlwaysUninstall]);
+      MakeDirRedir(DisableFsRedir, PathExtractDir(Dir), Flags - [mdAlwaysUninstall]);
       LogFmt('Creating directory: %s', [Dir]);
       if not CreateDirectoryRedir(DisableFsRedir, Dir) then begin
         ErrorCode := GetLastError;
@@ -854,7 +854,7 @@ var
   procedure CreateDirs;
   { Creates the application's directories }
 
-    procedure ApplyPermissions(const DisableFsRedir: Boolean;
+    procedure ApplyPermissionsRedir(const DisableFsRedir: Boolean;
       const Filename: String; const PermsEntry: Integer);
     var
       P: PSetupPermissionEntry;
@@ -862,14 +862,14 @@ var
       if PermsEntry <> -1 then begin
         LogFmt('Setting permissions on directory: %s', [Filename]);
         P := Entries[sePermission][PermsEntry];
-        if not GrantPermissionOnFile(DisableFsRedir, Filename,
+        if not GrantPermissionOnFileRedir(DisableFsRedir, Filename,
            TGrantPermissionEntry(Pointer(P.Permissions)^),
            Length(P.Permissions) div SizeOf(TGrantPermissionEntry)) then
           LogFmt('Failed to set permissions on directory (%d).', [GetLastError]);
       end;
     end;
 
-    procedure ApplyNTFSCompression(const DisableFsRedir: Boolean;
+    procedure ApplyNTFSCompressionRedir(const DisableFsRedir: Boolean;
       const Filename: String; const Compress: Boolean);
     begin
       if Compress then
@@ -886,7 +886,7 @@ var
     N: String;
   begin
     { Create main application directory }
-    MakeDir(InstallDefaultDisableFsRedir, WizardDirValue, []);
+    MakeDirRedir(InstallDefaultDisableFsRedir, WizardDirValue, []);
 
     { Create the rest of the directories, if any }
     for CurDirNumber := 0 to Entries[seDir].Count-1 do
@@ -899,11 +899,11 @@ var
           if doDeleteAfterInstall in Options then Include(Flags, mdDeleteAfterInstall);
           if doUninsAlwaysUninstall in Options then Include(Flags, mdAlwaysUninstall);
           N := RemoveBackslashUnlessRoot(PathExpand(ExpandConst(DirName)));
-          MakeDir(InstallDefaultDisableFsRedir, N, Flags);
-          AddAttributesToFile(InstallDefaultDisableFsRedir, N, Attribs);
-          ApplyPermissions(InstallDefaultDisableFsRedir, N, PermissionsEntry);
+          MakeDirRedir(InstallDefaultDisableFsRedir, N, Flags);
+          AddAttributesToFileRedir(InstallDefaultDisableFsRedir, N, Attribs);
+          ApplyPermissionsRedir(InstallDefaultDisableFsRedir, N, PermissionsEntry);
           if (doSetNTFSCompression in Options) or (doUnsetNTFSCompression in Options) then
-            ApplyNTFSCompression(InstallDefaultDisableFsRedir, N, doSetNTFSCompression in Options);
+            ApplyNTFSCompressionRedir(InstallDefaultDisableFsRedir, N, doSetNTFSCompression in Options);
           NotifyAfterInstallEntry(AfterInstall);
         end;
       end;
@@ -1043,7 +1043,7 @@ var
       FileLocationFilenames.Objects[LocationEntry] := Pointer(Hash);
     end;
 
-    procedure ApplyPermissions(const DisableFsRedir: Boolean;
+    procedure ApplyPermissionsRedir(const DisableFsRedir: Boolean;
       const Filename: String; const PermsEntry: Integer);
     var
       Attr: DWORD;
@@ -1054,7 +1054,7 @@ var
         if (Attr <> INVALID_FILE_ATTRIBUTES) and (Attr and FILE_ATTRIBUTE_DIRECTORY = 0) then begin
           LogFmt('Setting permissions on file: %s', [Filename]);
           P := Entries[sePermission][PermsEntry];
-          if not GrantPermissionOnFile(DisableFsRedir, Filename,
+          if not GrantPermissionOnFileRedir(DisableFsRedir, Filename,
              TGrantPermissionEntry(Pointer(P.Permissions)^),
              Length(P.Permissions) div SizeOf(TGrantPermissionEntry)) then
             LogFmt('Failed to set permissions on file (%d).', [GetLastError]);
@@ -1062,7 +1062,7 @@ var
       end;
     end;
 
-    procedure ApplyNTFSCompression(const DisableFsRedir: Boolean;
+    procedure ApplyNTFSCompressionRedir(const DisableFsRedir: Boolean;
       const Filename: String; const Compress: Boolean);
     begin
       if Compress then
@@ -1085,7 +1085,7 @@ var
           'Will replace on restart.', [Func, LastError]);
         LastOperation := SetupMessages[msgErrorRestartReplace];
         NeedsRestart := True;
-        RestartReplace(DisableFsRedir, TempFile, DestFile);
+        RestartReplaceRedir(DisableFsRedir, TempFile, DestFile);
         ReplaceOnRestart := True;
         DoBreak := True;
         DoContinue := False;
@@ -1213,7 +1213,7 @@ var
         end;
 
         { See if it's a protected system file.  }
-        if IsProtectedSystemFile(DisableFsRedir, DestFile) then begin
+        if IsProtectedSystemFileRedir(DisableFsRedir, DestFile) then begin
           Log('Dest file is protected by Windows File Protection.');
           IsProtectedFile := (CurFile^.FileType = ftUserFile);
         end else
@@ -1235,7 +1235,7 @@ var
           CurFileDateValid := True;
         end
         else
-          CurFileDateValid := GetFileDateTime(DisableFsRedir, ASourceFile, CurFileDate);
+          CurFileDateValid := GetFileDateTimeRedir(DisableFsRedir, ASourceFile, CurFileDate);
         if CurFileDateValid then
           LogFmt('Time stamp of our file: %s', [FileTimeToStr(CurFileDate)])
         else
@@ -1250,7 +1250,7 @@ var
 
           LastOperation := SetupMessages[msgErrorReadingExistingDest];
 
-          ExistingFileDateValid := GetFileDateTime(DisableFsRedir, DestFile, ExistingFileDate);
+          ExistingFileDateValid := GetFileDateTimeRedir(DisableFsRedir, DestFile, ExistingFileDate);
           if ExistingFileDateValid then
             LogFmt('Time stamp of existing file: %s', [FileTimeToStr(ExistingFileDate)])
           else
@@ -1311,7 +1311,7 @@ var
                    not(foOverwriteSameVersion in CurFile^.Options) then begin
                   if foReplaceSameVersionIfContentsDiffer in CurFile^.Options then begin
                     { Get the two files' SHA-256 hashes and compare them }
-                    if TryToGetSHA256OfFile(DisableFsRedir, DestFile, ExistingFileHash) then begin
+                    if TryToGetSHA256OfFileRedir(DisableFsRedir, DestFile, ExistingFileHash) then begin
                       if Assigned(CurFileLocation) then
                         CurFileHash := CurFileLocation^.SHA256Sum
                       else begin
@@ -1319,7 +1319,7 @@ var
                         { 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(DisableFsRedir, ASourceFile);
+                        CurFileHash := GetSHA256OfFileRedir(DisableFsRedir, ASourceFile);
                         LastOperation := SetupMessages[msgErrorReadingExistingDest];
                       end;
                       { If the two files' SHA-256 hashes are equal, skip the file }
@@ -1474,11 +1474,11 @@ var
         { Extract or copy the file to a temporary file. Create the destination
           file's directory if it didn't already exist. }
         LastOperation := SetupMessages[msgErrorCreatingTemp];
-        TempFile := GenerateUniqueName(DisableFsRedir, PathExtractPath(DestFile), '.tmp');
+        TempFile := GenerateUniqueNameRedir(DisableFsRedir, PathExtractPath(DestFile), '.tmp');
         Flags := [];
         if foUninsNeverUninstall in CurFile^.Options then Include(Flags, mdNoUninstall);
         if foDeleteAfterInstall in CurFile^.Options then Include(Flags, mdDeleteAfterInstall);
-        MakeDir(DisableFsRedir, PathExtractDir(TempFile), Flags);
+        MakeDirRedir(DisableFsRedir, PathExtractDir(TempFile), Flags);
         DestF := TFileRedir.Create(DisableFsRedir, TempFile, fdCreateAlways, faReadWrite, fsNone);
         try
           TempFileLeftOver := True;
@@ -1609,7 +1609,7 @@ var
               DeleteFilesAfterInstallList.AddObject(DestFile, Pointer(Ord(DisableFsRedir)));
             { Set file attributes *after* renaming the file since Novell
               reportedly can't rename read-only files. }
-            AddAttributesToFile(DisableFsRedir, DestFile, CurFile^.Attribs);
+            AddAttributesToFileRedir(DisableFsRedir, DestFile, CurFile^.Attribs);
           end;
         end;
 
@@ -1625,7 +1625,7 @@ var
           Log('Leaving temporary file in place for now.');
           if AllowFileToBeDuplicated then
             SetFileLocationFilename(CurFile^.LocationEntry, TempFile);
-          AddAttributesToFile(DisableFsRedir, TempFile, CurFile^.Attribs);
+          AddAttributesToFileRedir(DisableFsRedir, TempFile, CurFile^.Attribs);
         end;
 
         { If it's a font, register it }
@@ -1716,17 +1716,17 @@ var
         { Apply permissions (even if the file wasn't replaced) }
         LastOperation := '';
         if TempFile <> '' then
-          ApplyPermissions(DisableFsRedir, TempFile, CurFile^.PermissionsEntry)
+          ApplyPermissionsRedir(DisableFsRedir, TempFile, CurFile^.PermissionsEntry)
         else
-          ApplyPermissions(DisableFsRedir, DestFile, CurFile^.PermissionsEntry);
+          ApplyPermissionsRedir(DisableFsRedir, DestFile, CurFile^.PermissionsEntry);
 
         { Set NTFS compression (even if the file wasn't replaced) }
         if (foSetNTFSCompression in CurFile^.Options) or (foUnsetNTFSCompression in CurFile^.Options) then begin
           LastOperation := '';
           if TempFile <> '' then
-            ApplyNTFSCompression(DisableFsRedir, TempFile, foSetNTFSCompression in CurFile^.Options)
+            ApplyNTFSCompressionRedir(DisableFsRedir, TempFile, foSetNTFSCompression in CurFile^.Options)
           else
-            ApplyNTFSCompression(DisableFsRedir, DestFile, foSetNTFSCompression in CurFile^.Options);
+            ApplyNTFSCompressionRedir(DisableFsRedir, DestFile, foSetNTFSCompression in CurFile^.Options);
         end;
 
         { Install into GAC (even if the file wasn't replaced) }
@@ -1789,7 +1789,7 @@ var
   procedure CopyFiles(const Uninstallable: Boolean);
   { Copies all the application's files }
 
-    function RecurseExternalCopyFiles(const DisableFsRedir: Boolean;
+    function RecurseExternalCopyFilesRedir(const DisableFsRedir: Boolean;
       const SearchBaseDir, SearchSubDir, SearchWildcard: String; const SourceIsWildcard: Boolean;
       const Excludes: TStringList; const CurFile: PSetupFileEntry; const FileLocationFilenames: TStringList;
       var ExpectedBytesLeft: Integer64; var ConfirmOverwriteOverwriteAll, PromptIfOlderOverwriteAll: TOverwriteAll;
@@ -1853,7 +1853,7 @@ var
           try
             repeat
               if IsRecurseableDirectory(FindData) then
-                Result := RecurseExternalCopyFiles(DisableFsRedir, SearchBaseDir,
+                Result := RecurseExternalCopyFilesRedir(DisableFsRedir, SearchBaseDir,
                   SearchSubDir + FindData.cFileName + '\', SearchWildcard,
                   SourceIsWildcard, Excludes, CurFile, FileLocationFileNames,
                   ExpectedBytesLeft, ConfirmOverwriteOverwriteAll, PromptIfOlderOverwriteAll,
@@ -1877,7 +1877,7 @@ var
           Flags := [];
           if foUninsNeverUninstall in CurFile^.Options then Include(Flags, mdNoUninstall);
           if foDeleteAfterInstall in CurFile^.Options then Include(Flags, mdDeleteAfterInstall);
-          MakeDir(DisableFsRedir, DestName, Flags);
+          MakeDirRedir(DisableFsRedir, DestName, Flags);
           Result := True;
         end;
       end;
@@ -1950,7 +1950,7 @@ var
             repeat
               SetProgress(ProgressBefore);
               ExpectedBytesLeft := CurFile^.ExternalSize;
-              FoundFiles := RecurseExternalCopyFiles(DisableFsRedir,
+              FoundFiles := RecurseExternalCopyFilesRedir(DisableFsRedir,
                 PathExtractPath(SourceWildcard), '', PathExtractName(SourceWildcard),
                 IsWildcard(SourceWildcard), Excludes, CurFile, FileLocationFileNames,
                 ExpectedBytesLeft, ConfirmOverwriteOverwriteAll, PromptIfOlderOverwriteAll,
@@ -2072,7 +2072,7 @@ var
         ProbableFilename := LinkFilename;
       LogFmt('Dest filename: %s', [ProbableFilename]);
       SetFilenameLabelText(ProbableFilename, True);
-      MakeDir(False, PathExtractDir(ProbableFilename), Flags);
+      MakeDirRedir(False, PathExtractDir(ProbableFilename), Flags);
 
       { Delete any old files first }
       DeleteFile(LinkFilename);
@@ -2234,7 +2234,7 @@ var
             if IniDir <> '' then begin
               while True do begin
                 try
-                  MakeDir(False, IniDir, []);
+                  MakeDirRedir(False, IniDir, []);
                   Break;
                 except
                   if AbortRetryIgnoreTaskDialogMsgBox(
@@ -2569,7 +2569,7 @@ var
         NumRead: Cardinal;
         Buf: array[0..16383] of Byte;
       begin
-        ExeFilename := GenerateUniqueName(False, Dir, '.exe');
+        ExeFilename := GenerateUniqueNameRedir(False, Dir, '.exe');
         DestF := nil;
         SourceF := TFile.Create(NewParamStr(0), fdOpenExisting, faRead, fsRead);
         try
@@ -2794,10 +2794,10 @@ var
           NotifyBeforeInstallEntry(BeforeInstall);
           case DeleteType of
             dfFiles, dfFilesAndOrSubdirs:
-              DelTree(InstallDefaultDisableFsRedir, ExpandConst(Name), False, True, DeleteType = dfFilesAndOrSubdirs, False,
+              DelTreeRedir(InstallDefaultDisableFsRedir, ExpandConst(Name), False, True, DeleteType = dfFilesAndOrSubdirs, False,
                 nil, nil, nil);
             dfDirIfEmpty:
-              DelTree(InstallDefaultDisableFsRedir, ExpandConst(Name), True, False, False, False, nil, nil, nil);
+              DelTreeRedir(InstallDefaultDisableFsRedir, ExpandConst(Name), True, False, False, False, nil, nil, nil);
           end;
           NotifyAfterInstallEntry(AfterInstall);
         end;
@@ -2940,7 +2940,7 @@ var
       when using a 64-bit Uninstall key) }
     BaseDir := ReplaceSystemDirWithSysWow64(PathExpand(ExpandConst(SetupHeader.UninstallFilesDir)));
     LogFmt('Directory for uninstall files: %s', [BaseDir]);
-    MakeDir(False, BaseDir, []);
+    MakeDirRedir(False, BaseDir, []);
 
     FillChar(ExistingFiles, SizeOf(ExistingFiles), 0);  { set all to False }
     FindFiles;
@@ -3358,7 +3358,6 @@ procedure InternalExtractTemporaryFile(const DestName: String;
   const CurFile: PSetupFileEntry; const CurFileLocation: PSetupFileLocationEntry;
   const CreateDirs: Boolean);
 var
-  DisableFsRedir: Boolean;
   DestFile: String;
   DestF: TFile;
   CurFileDate: TFileTime;
@@ -3367,9 +3366,10 @@ begin
 
   Log('Extracting temporary file: ' + DestFile);
 
-  DisableFsRedir := InstallDefaultDisableFsRedir;
+  const DisableFsRedir = False; { Like everything else working on the temp dir }
+
   if CreateDirs then
-    ForceDirectories(DisableFsRedir, PathExtractPath(DestFile));
+    ForceDirectoriesRedir(DisableFsRedir, PathExtractPath(DestFile));
   DestF := TFileRedir.Create(DisableFsRedir, DestFile, fdCreateAlways, faWrite, fsNone);
   try
     try
@@ -3389,7 +3389,7 @@ begin
     DeleteFileRedir(DisableFsRedir, DestFile);
     raise;
   end;
-  AddAttributesToFile(DisableFsRedir, DestFile, CurFile^.Attribs);
+  AddAttributesToFileRedir(DisableFsRedir, DestFile, CurFile^.Attribs);
 end;
 
 procedure ExtractTemporaryFile(const BaseName: String);
@@ -3561,7 +3561,6 @@ end;
 
 function DownloadTemporaryFile(const Url, BaseName, RequiredSHA256OfFile: String; const OnDownloadProgress: TOnDownloadProgress): Int64;
 var
-  DisableFsRedir: Boolean;
   DestFile, TempFile: String;
   TempF: TFileRedir;
   HandleStream: THandleStream;
@@ -3585,20 +3584,20 @@ begin
 
   LogFmt('Downloading temporary file from %s: %s', [MaskPasswordInURL(Url), DestFile]);
 
-  DisableFsRedir := InstallDefaultDisableFsRedir;
+  const DisableFsRedir = False; { Like everything else working on the temp dir }
 
   { Prepare directory }
   if FileExists(DestFile) then begin
     if (RequiredSHA256OfFile <> '') and
-       (RequiredSHA256OfFile = SHA256DigestToString(GetSHA256OfFile(DisableFsRedir, DestFile))) then begin
+       (RequiredSHA256OfFile = SHA256DigestToString(GetSHA256OfFileRedir(DisableFsRedir, DestFile))) then begin
       Log('  File already downloaded.');
       Result := 0;
       Exit;
     end;
     SetFileAttributesRedir(DisableFsRedir, DestFile, GetFileAttributesRedir(DisableFsRedir, DestFile) and not FILE_ATTRIBUTE_READONLY);
-    DelayDeleteFile(DisableFsRedir, DestFile, 13, 50, 250);
+    DelayDeleteFileRedir(DisableFsRedir, DestFile, 13, 50, 250);
   end else
-    ForceDirectories(DisableFsRedir, PathExtractPath(DestFile));
+    ForceDirectoriesRedir(DisableFsRedir, PathExtractPath(DestFile));
 
   HTTPDataReceiver := nil;
   HTTPClient := nil;
@@ -3621,7 +3620,7 @@ begin
     HTTPClient.OnReceiveData := HTTPDataReceiver.OnReceiveData;
 
     { Create temporary file }
-    TempFile := GenerateUniqueName(DisableFsRedir, PathExtractPath(DestFile), '.tmp');
+    TempFile := GenerateUniqueNameRedir(DisableFsRedir, PathExtractPath(DestFile), '.tmp');
     TempF := TFileRedir.Create(DisableFsRedir, TempFile, fdCreateAlways, faWrite, fsNone);
     TempFileLeftOver := True;
 
@@ -3653,7 +3652,7 @@ begin
       { Check hash if specified, otherwise check everything else we can check }
       if RequiredSHA256OfFile <> '' then begin
         try
-          SHA256OfFile := SHA256DigestToString(GetSHA256OfFile(DisableFsRedir, TempFile));
+          SHA256OfFile := SHA256DigestToString(GetSHA256OfFileRedir(DisableFsRedir, TempFile));
         except on E: Exception do
           raise Exception.Create(FmtSetupMessage(msgErrorFileHash1, [E.Message]));
         end;

+ 25 - 20
Projects/Src/Setup.MainFunc.pas

@@ -206,7 +206,7 @@ procedure NotifyAfterInstallFileEntry(const FileEntry: PSetupFileEntry);
 procedure NotifyBeforeInstallEntry(const BeforeInstall: String);
 procedure NotifyBeforeInstallFileEntry(const FileEntry: PSetupFileEntry);
 function PreviousInstallCompleted(const WizardComponents, WizardTasks: TStringList): Boolean;
-function CodeRegisterExtraCloseApplicationsResource(const DisableFsRedir: Boolean; const AFilename: String): Boolean;
+function CodeRegisterExtraCloseApplicationsResourceRedir(const DisableFsRedir: Boolean; const AFilename: String): Boolean;
 procedure RegisterResourcesWithRestartManager(const WizardComponents, WizardTasks: TStringList);
 procedure RemoveTempInstallDir;
 procedure SaveInf(const FileName: String);
@@ -1483,7 +1483,7 @@ begin
   if TempInstallDir <> '' then begin
     if Debugging then
       DebugNotifyTempDir('');
-    if not DelTree(False, TempInstallDir, True, True, True, False, nil,
+    if not DelTreeRedir(False, TempInstallDir, True, True, True, False, nil,
        TempDeleteFileProc, Pointer(GetTickCount())) then
       Log('Failed to remove temporary directory: ' + TempInstallDir);
   end;
@@ -1742,7 +1742,7 @@ end;
 function EnumFiles(const EnumFilesProc: TEnumFilesProc;
   const WizardComponents, WizardTasks: TStringList; const Param: Pointer): Boolean;
 
-  function RecurseExternalFiles(const DisableFsRedir: Boolean;
+  function RecurseExternalFilesRedir(const DisableFsRedir: Boolean;
     const SearchBaseDir, SearchSubDir, SearchWildcard: String;
     const SourceIsWildcard: Boolean; const Excludes: TStringList; const CurFile: PSetupFileEntry): Boolean;
   var
@@ -1789,7 +1789,7 @@ function EnumFiles(const EnumFilesProc: TEnumFilesProc;
         try
           repeat
             if IsRecurseableDirectory(FindData) then
-              if not RecurseExternalFiles(DisableFsRedir, SearchBaseDir,
+              if not RecurseExternalFilesRedir(DisableFsRedir, SearchBaseDir,
                  SearchSubDir + FindData.cFileName + '\', SearchWildcard,
                  SourceIsWildcard, Excludes, CurFile) then begin
                 Result := False;
@@ -1833,7 +1833,7 @@ begin
           { External file }
           SourceWildcard := ExpandConst(CurFile^.SourceFilename);
           Excludes.DelimitedText := CurFile^.Excludes;
-          if not RecurseExternalFiles(DisableFsRedir, PathExtractPath(SourceWildcard), '',
+          if not RecurseExternalFilesRedir(DisableFsRedir, PathExtractPath(SourceWildcard), '',
              PathExtractName(SourceWildcard), IsWildcard(SourceWildcard), Excludes, CurFile) then begin
             Result := False;
             Exit;
@@ -1851,13 +1851,13 @@ begin
         if ShouldProcessEntry(WizardComponents, WizardTasks, Components, Tasks, Languages, Check) then begin
           case DeleteType of
             dfFiles, dfFilesAndOrSubdirs:
-              if not DelTree(InstallDefaultDisableFsRedir, ExpandConst(Name), False, True, DeleteType = dfFilesAndOrSubdirs, True,
+              if not DelTreeRedir(InstallDefaultDisableFsRedir, ExpandConst(Name), False, True, DeleteType = dfFilesAndOrSubdirs, True,
                  DummyDeleteDirProc, EnumFilesProc, Param) then begin
                 Result := False;
                 Exit;
               end;
             dfDirIfEmpty:
-              if not DelTree(InstallDefaultDisableFsRedir, ExpandConst(Name), True, False, False, True,
+              if not DelTreeRedir(InstallDefaultDisableFsRedir, ExpandConst(Name), True, False, False, True,
                  DummyDeleteDirProc, EnumFilesProc, Param) then begin
                 Result := False;
                 Exit;
@@ -1874,7 +1874,7 @@ end;
 var
   CheckForFileSL: TStringList;
 
-function CheckForFile(const DisableFsRedir: Boolean; const AFilename: String;
+function CheckForFileProc(const DisableFsRedir: Boolean; const AFilename: String;
   const Param: Pointer): Boolean;
 var
   Filename: String;
@@ -1905,7 +1905,7 @@ begin
     EnumFileReplaceOperationsFilenames(EnumProc, CheckForFileSL);
     if CheckForFileSL.Count = 0 then
       Exit;
-    Result := EnumFiles(CheckForFile, WizardComponents, WizardTasks, nil);
+    Result := EnumFiles(CheckForFileProc, WizardComponents, WizardTasks, nil);
   finally
     CheckForFileSL.Free;
   end;
@@ -1919,18 +1919,17 @@ var
   RegisterFileBatchFilenames: PArrayOfPWideChar;
   RegisterFileFilenamesBatchMax, RegisterFileFilenamesBatchCount: Integer;
 
-function RegisterFile(const DisableFsRedir: Boolean; const AFilename: String;
-  const Param: Pointer): Boolean;
+function RegisterFileRedir(const DisableFsRedir: Boolean; const AFilename: String;
+  const CheckFilter: Boolean): Boolean;
 var
   Filename, Text: String;
   I, Len: Integer;
-  CheckFilter, Match: Boolean;
+  Match: Boolean;
 begin
   Filename := AFilename;
 
   { First: check filters and self. }
   if Filename <> '' then begin
-    CheckFilter := Boolean(Param);
     if CheckFilter then begin
       Match := False;
       Text := PathLowercase(PathExtractName(Filename));
@@ -1999,14 +1998,20 @@ begin
   Result := RmSessionStarted; { Break the enum if there was an error, else continue. }
 end;
 
+function RegisterFileProc(const DisableFsRedir: Boolean; const AFilename: String;
+  const Param: Pointer): Boolean;
+begin
+  Result := RegisterFileRedir(DisableFsRedir, AFilename, Boolean(Param));
+end;
+
 { Helper function for [Code] to register extra files. }
 var
   AllowCodeRegisterExtraCloseApplicationsResource: Boolean;
 
-function CodeRegisterExtraCloseApplicationsResource(const DisableFsRedir: Boolean; const AFilename: String): Boolean;
+function CodeRegisterExtraCloseApplicationsResourceRedir(const DisableFsRedir: Boolean; const AFilename: String): Boolean;
 begin
   if AllowCodeRegisterExtraCloseApplicationsResource then
-    Result := RegisterFile(DisableFsRedir, AFilename, Pointer(False))
+    Result := RegisterFileRedir(DisableFsRedir, AFilename, False)
   else begin
     InternalError('Cannot call "RegisterExtraCloseApplicationsResource" function at this time');
     Result := False;
@@ -2025,7 +2030,7 @@ begin
   try
     { Register our files. }
     RmRegisteredFilesCount := 0;
-    EnumFiles(RegisterFile, WizardComponents, WizardTasks, Pointer(True));
+    EnumFiles(RegisterFileProc, WizardComponents, WizardTasks, Pointer(True));
     { Ask [Code] for more files. }
     if CodeRunner <> nil then begin
       AllowCodeRegisterExtraCloseApplicationsResource := True;
@@ -2042,7 +2047,7 @@ begin
     end;
     { Don't forget to register leftovers. }
     if RmSessionStarted then
-      RegisterFile(False, '', nil);
+      RegisterFileRedir(False, '', False);
   finally
     for I := 0 to RegisterFileFilenamesBatchCount-1 do
       FreeMem(RegisterFileBatchFilenames[I]);
@@ -2686,7 +2691,7 @@ var
       InstallMode := imSilent;
   end;
 
-  function RecurseExternalGetSizeOfFiles(const DisableFsRedir: Boolean;
+  function RecurseExternalGetSizeOfFilesRedir(const DisableFsRedir: Boolean;
     const SearchBaseDir, SearchSubDir, SearchWildcard: String;
     const SourceIsWildcard: Boolean; const RecurseSubDirs: Boolean): Integer64;
   var
@@ -2722,7 +2727,7 @@ var
         try
           repeat
             if IsRecurseableDirectory(FindData) then begin
-              I := RecurseExternalGetSizeOfFiles(DisableFsRedir, SearchBaseDir,
+              I := RecurseExternalGetSizeOfFilesRedir(DisableFsRedir, SearchBaseDir,
                 SearchSubDir + FindData.cFileName + '\', SearchWildcard,
                 SourceIsWildcard, RecurseSubDirs);
               Inc6464(Result, I);
@@ -3385,7 +3390,7 @@ begin
               SourceWildcard := NewParamStr(0)
             else
               SourceWildcard := ExpandConst(SourceFilename);
-            ExternalSize := RecurseExternalGetSizeOfFiles(
+            ExternalSize := RecurseExternalGetSizeOfFilesRedir(
               ShouldDisableFsRedirForFileEntry(PSetupFileEntry(Entries[seFile][I])),
               PathExtractPath(SourceWildcard),
               '', PathExtractName(SourceWildcard), IsWildcard(SourceWildcard),

+ 3 - 3
Projects/Src/Setup.RegSvr.pas

@@ -2,7 +2,7 @@ unit Setup.RegSvr;
 
 {
   Inno Setup
-  Copyright (C) 1997-2024 Jordan Russell
+  Copyright (C) 1997-2025 Jordan Russell
   Portions by Martijn Laan
   For conditions of distribution and use, see LICENSE.TXT.
 
@@ -98,9 +98,9 @@ begin
   DeleteOldTempFiles(PathExtractPath(SelfFilename));
   NewFilename := RenameToNonRandomTempName(SelfFilename);
   if NewFilename <> '' then
-    RestartReplace(False, NewFilename, '')
+    RestartReplaceRedir(False, NewFilename, '')
   else
-    RestartReplace(False, SelfFilename, '');
+    RestartReplaceRedir(False, SelfFilename, '');
 end;
 
 procedure RunRegSvr;

+ 2 - 2
Projects/Src/Setup.ScriptDlg.pas

@@ -2,7 +2,7 @@ unit Setup.ScriptDlg;
 
 {
   Inno Setup
-  Copyright (C) 1997-2012 Jordan Russell
+  Copyright (C) 1997-2025 Jordan Russell
   Portions by Martijn Laan
   For conditions of distribution and use, see LICENSE.TXT.
 
@@ -1185,7 +1185,7 @@ begin
 
   for var A in FArchives do begin
     { Don't need to set DownloadTemporaryFileOrExtract7ZipArchiveProcessMessages before extraction since we already process messages ourselves. }
-    Extract7ZipArchive(A.FileName, A.DestDir, A.FullPaths, InternalOnExtractionProgress);
+    Extract7ZipArchiveRedir(ScriptFuncDisableFsRedir, A.FileName, A.DestDir, A.FullPaths, InternalOnExtractionProgress);
   end;
 end;
 

+ 7 - 7
Projects/Src/Setup.ScriptFunc.HelperFunc.pas

@@ -2,7 +2,7 @@ unit Setup.ScriptFunc.HelperFunc;
 
 {
   Inno Setup
-  Copyright (C) 1997-2024 Jordan Russell
+  Copyright (C) 1997-2025 Jordan Russell
   Portions by Martijn Laan
   For conditions of distribution and use, see LICENSE.TXT.
 
@@ -65,8 +65,8 @@ procedure CrackCodeRootKey(CodeRootKey: HKEY; var RegView: TRegView;
   var RootKey: HKEY);
 function GetSubkeyOrValueNames(const RegView: TRegView; const RootKey: HKEY;
   const SubKeyName: String; const Stack: TPSStack; const ItemNo: Longint; const Subkey: Boolean): Boolean;
-function GetMD5OfFile(const DisableFsRedir: Boolean; const Filename: String): TMD5Digest;
-function GetSHA1OfFile(const DisableFsRedir: Boolean; const Filename: String): TSHA1Digest;
+function GetMD5OfFileRedir(const DisableFsRedir: Boolean; const Filename: String): TMD5Digest;
+function GetSHA1OfFileRedir(const DisableFsRedir: Boolean; const Filename: String): TSHA1Digest;
 function GetMD5OfAnsiString(const S: AnsiString): TMD5Digest;
 function GetMD5OfUnicodeString(const S: UnicodeString): TMD5Digest;
 function GetSHA1OfAnsiString(const S: AnsiString): TSHA1Digest;
@@ -76,7 +76,7 @@ procedure ExecAndLogOutputLog(const S: String; const Error, FirstLine: Boolean;
 procedure ExecAndLogOutputLogCustom(const S: String; const Error, FirstLine: Boolean; const Data: NativeInt);
 function CustomMessage(const MsgName: String): String;
 function NewExtractRelativePath(BaseName, DestName: string): string;
-function NewFileSearch(const DisableFsRedir: Boolean;
+function NewFileSearchRedir(const DisableFsRedir: Boolean;
   const Name, DirList: String): String;
 function GetExceptionMessage(const Caller: TPSExec): String;
 function GetCodePreviousData(const ExpandedAppID, ValueName, DefaultValueData: String): String;
@@ -301,7 +301,7 @@ begin
   Result := True;
 end;
 
-function GetMD5OfFile(const DisableFsRedir: Boolean; const Filename: String): TMD5Digest;
+function GetMD5OfFileRedir(const DisableFsRedir: Boolean; const Filename: String): TMD5Digest;
 { Gets MD5 sum of the file Filename. An exception will be raised upon
   failure. }
 var
@@ -323,7 +323,7 @@ begin
   Result := MD5Final(Context);
 end;
 
-function GetSHA1OfFile(const DisableFsRedir: Boolean; const Filename: String): TSHA1Digest;
+function GetSHA1OfFileRedir(const DisableFsRedir: Boolean; const Filename: String): TSHA1Digest;
 { Gets SHA-1 sum of the file Filename. An exception will be raised upon
   failure. }
 var
@@ -455,7 +455,7 @@ end;
   - it uses NewFileExistsRedir instead of FileExists
   - it doesn't search the current directory unless it's told to
   - it always returns a fully-qualified path }
-function NewFileSearch(const DisableFsRedir: Boolean;
+function NewFileSearchRedir(const DisableFsRedir: Boolean;
   const Name, DirList: String): String;
 var
   I, P, L: Integer;

+ 14 - 14
Projects/Src/Setup.ScriptFunc.pas

@@ -838,15 +838,15 @@ var
     end);
     RegisterScriptFunc('DELAYDELETEFILE', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
     begin
-      DelayDeleteFile(ScriptFuncDisableFsRedir, Stack.GetString(PStart), Stack.GetInt(PStart-1), 250, 250);
+      DelayDeleteFileRedir(ScriptFuncDisableFsRedir, Stack.GetString(PStart), Stack.GetInt(PStart-1), 250, 250);
     end);
     RegisterScriptFunc('DELTREE', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
     begin
-      Stack.SetBool(PStart, DelTree(ScriptFuncDisableFsRedir, Stack.GetString(PStart-1), Stack.GetBool(PStart-2), Stack.GetBool(PStart-3), Stack.GetBool(PStart-4), False, nil, nil, nil));
+      Stack.SetBool(PStart, DelTreeRedir(ScriptFuncDisableFsRedir, Stack.GetString(PStart-1), Stack.GetBool(PStart-2), Stack.GetBool(PStart-3), Stack.GetBool(PStart-4), False, nil, nil, nil));
     end);
     RegisterScriptFunc('GENERATEUNIQUENAME', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
     begin
-      Stack.SetString(PStart, GenerateUniqueName(ScriptFuncDisableFsRedir, Stack.GetString(PStart-1), Stack.GetString(PStart-2)));
+      Stack.SetString(PStart, GenerateUniqueNameRedir(ScriptFuncDisableFsRedir, Stack.GetString(PStart-1), Stack.GetString(PStart-2)));
     end);
     RegisterScriptFunc('GETCOMPUTERNAMESTRING', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
     begin
@@ -854,7 +854,7 @@ var
     end);
     RegisterScriptFunc('GETMD5OFFILE', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
     begin
-      Stack.SetString(PStart, MD5DigestToString(GetMD5OfFile(ScriptFuncDisableFsRedir, Stack.GetString(PStart-1))));
+      Stack.SetString(PStart, MD5DigestToString(GetMD5OfFileRedir(ScriptFuncDisableFsRedir, Stack.GetString(PStart-1))));
     end);
     RegisterScriptFunc('GETMD5OFSTRING', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
     begin
@@ -866,7 +866,7 @@ var
     end);
     RegisterScriptFunc('GETSHA1OFFILE', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
     begin
-      Stack.SetString(PStart, SHA1DigestToString(GetSHA1OfFile(ScriptFuncDisableFsRedir, Stack.GetString(PStart-1))));
+      Stack.SetString(PStart, SHA1DigestToString(GetSHA1OfFileRedir(ScriptFuncDisableFsRedir, Stack.GetString(PStart-1))));
     end);
     RegisterScriptFunc('GETSHA1OFSTRING', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
     begin
@@ -878,7 +878,7 @@ var
     end);
     RegisterScriptFunc('GETSHA256OFFILE', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
     begin
-      Stack.SetString(PStart, SHA256DigestToString(GetSHA256OfFile(ScriptFuncDisableFsRedir, Stack.GetString(PStart-1))));
+      Stack.SetString(PStart, SHA256DigestToString(GetSHA256OfFileRedir(ScriptFuncDisableFsRedir, Stack.GetString(PStart-1))));
     end);
     RegisterScriptFunc('GETSHA256OFSTREAM', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
     begin
@@ -895,7 +895,7 @@ var
     RegisterScriptFunc('GETSPACEONDISK', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
     begin
       var FreeBytes, TotalBytes: Integer64;
-      if GetSpaceOnDisk(ScriptFuncDisableFsRedir, Stack.GetString(PStart-1), FreeBytes, TotalBytes) then begin
+      if GetSpaceOnDiskRedir(ScriptFuncDisableFsRedir, Stack.GetString(PStart-1), FreeBytes, TotalBytes) then begin
         if Stack.GetBool(PStart-2) then begin
           Div64(FreeBytes, 1024*1024);
           Div64(TotalBytes, 1024*1024);
@@ -914,7 +914,7 @@ var
     RegisterScriptFunc('GETSPACEONDISK64', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
     begin
       var FreeBytes, TotalBytes: Integer64;
-      if GetSpaceOnDisk(ScriptFuncDisableFsRedir, Stack.GetString(PStart-1), FreeBytes, TotalBytes) then begin
+      if GetSpaceOnDiskRedir(ScriptFuncDisableFsRedir, Stack.GetString(PStart-1), FreeBytes, TotalBytes) then begin
         Stack.SetInt64(PStart-2, Int64(FreeBytes.Hi) shl 32 + FreeBytes.Lo);
         Stack.SetInt64(PStart-3, Int64(TotalBytes.Hi) shl 32 + TotalBytes.Lo);
         Stack.SetBool(PStart, True);
@@ -1011,7 +1011,7 @@ var
     end);
     RegisterScriptFunc('ISPROTECTEDSYSTEMFILE', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
     begin
-      Stack.SetBool(PStart, IsProtectedSystemFile(ScriptFuncDisableFsRedir, Stack.GetString(PStart-1)));
+      Stack.SetBool(PStart, IsProtectedSystemFileRedir(ScriptFuncDisableFsRedir, Stack.GetString(PStart-1)));
     end);
     RegisterScriptFunc('MAKEPENDINGFILERENAMEOPERATIONSCHECKSUM', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
     begin
@@ -1040,11 +1040,11 @@ var
     end);
     RegisterScriptFunc('RESTARTREPLACE', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
     begin
-      RestartReplace(ScriptFuncDisableFsRedir, Stack.GetString(PStart), Stack.GetString(PStart-1));
+      RestartReplaceRedir(ScriptFuncDisableFsRedir, Stack.GetString(PStart), Stack.GetString(PStart-1));
     end);
     RegisterScriptFunc('FORCEDIRECTORIES', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
     begin
-      Stack.SetBool(PStart, ForceDirectories(ScriptFuncDisableFsRedir, Stack.GetString(PStart-1)));
+      Stack.SetBool(PStart, ForceDirectoriesRedir(ScriptFuncDisableFsRedir, Stack.GetString(PStart-1)));
     end);
   end;
 
@@ -1178,7 +1178,7 @@ var
     end);
     RegisterScriptFunc('REGISTEREXTRACLOSEAPPLICATIONSRESOURCE', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
     begin
-      Stack.SetBool(PStart, CodeRegisterExtraCloseApplicationsResource(Stack.GetBool(PStart-1), Stack.GetString(PStart-2)));
+      Stack.SetBool(PStart, CodeRegisterExtraCloseApplicationsResourceRedir(Stack.GetBool(PStart-1), Stack.GetString(PStart-2)));
     end);
     RegisterScriptFunc('GETWIZARDFORM', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
     begin
@@ -1326,7 +1326,7 @@ var
     end);
     RegisterScriptFunc('FILESEARCH', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
     begin
-      Stack.SetString(PStart, NewFileSearch(ScriptFuncDisableFsRedir, Stack.GetString(PStart-1), Stack.GetString(PStart-2)));
+      Stack.SetString(PStart, NewFileSearchRedir(ScriptFuncDisableFsRedir, Stack.GetString(PStart-1), Stack.GetString(PStart-2)));
     end);
     RegisterScriptFunc('RENAMEFILE', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
     begin
@@ -1786,7 +1786,7 @@ var
     end);
     RegisterScriptFunc('EXTRACT7ZIPARCHIVE', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
     begin
-      Extract7ZipArchive(Stack.GetString(PStart), Stack.GetString(PStart-1), Stack.GetBool(PStart-2), TOnExtractionProgress(Stack.GetProc(PStart-3, Caller)));
+      Extract7ZipArchiveRedir(ScriptFuncDisableFsRedir, Stack.GetString(PStart), Stack.GetString(PStart-1), Stack.GetBool(PStart-2), TOnExtractionProgress(Stack.GetProc(PStart-3, Caller)));
     end);
     RegisterScriptFunc('INIT7ZIPLIBRARY', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
     begin

+ 3 - 3
Projects/Src/Setup.SecurityFunc.pas

@@ -2,7 +2,7 @@ unit Setup.SecurityFunc;
 
 {
   Inno Setup
-  Copyright (C) 1997-2024 Jordan Russell
+  Copyright (C) 1997-2025 Jordan Russell
   Portions by Martijn Laan
   For conditions of distribution and use, see LICENSE.TXT.
 
@@ -14,7 +14,7 @@ interface
 uses
   Windows, SysUtils, Shared.CommonFunc, Shared.Struct;
 
-function GrantPermissionOnFile(const DisableFsRedir: Boolean; Filename: String;
+function GrantPermissionOnFileRedir(const DisableFsRedir: Boolean; Filename: String;
   const Entries: TGrantPermissionEntry; const EntryCount: Integer): Boolean;
 function GrantPermissionOnKey(const RegView: TRegView; const RootKey: HKEY;
   const Subkey: String; const Entries: TGrantPermissionEntry;
@@ -157,7 +157,7 @@ const
   OBJECT_INHERIT_ACE    = 1;
   CONTAINER_INHERIT_ACE = 2;
 
-function GrantPermissionOnFile(const DisableFsRedir: Boolean; Filename: String;
+function GrantPermissionOnFileRedir(const DisableFsRedir: Boolean; Filename: String;
   const Entries: TGrantPermissionEntry; const EntryCount: Integer): Boolean;
 { Grants the specified access to the specified file/directory. Returns True if
   successful. On failure, the thread's last error code is set. }

+ 2 - 2
Projects/Src/Setup.SpawnClient.pas

@@ -2,7 +2,7 @@ unit Setup.SpawnClient;
 
 {
   Inno Setup
-  Copyright (C) 1997-2024 Jordan Russell
+  Copyright (C) 1997-2025 Jordan Russell
   Portions by Martijn Laan
   For conditions of distribution and use, see LICENSE.TXT.
 
@@ -144,7 +144,7 @@ var
   M: TMemoryStream;
 begin
   if not RunAsOriginalUser or not SpawnServerPresent then begin
-    Result := InstExec(DisableFsRedir, Filename, Params, WorkingDir,
+    Result := InstExecRedir(DisableFsRedir, Filename, Params, WorkingDir,
       Wait, ShowCmd, ProcessMessagesProc, OutputReader, ResultCode);
     Exit;
   end;

+ 2 - 2
Projects/Src/Setup.SpawnServer.pas

@@ -2,7 +2,7 @@ unit Setup.SpawnServer;
 
 {
   Inno Setup
-  Copyright (C) 1997-2024 Jordan Russell
+  Copyright (C) 1997-2025 Jordan Russell
   Portions by Martijn Laan
   For conditions of distribution and use, see LICENSE.TXT.
 
@@ -379,7 +379,7 @@ begin
           TExecWait(EWait), EShowCmd, ProcessMessagesProc, FResultCode);
       end
       else begin
-        ExecResult := InstExec(EDisableFsRedir <> 0, EFilename, EParams, EWorkingDir,
+        ExecResult := InstExecRedir(EDisableFsRedir <> 0, EFilename, EParams, EWorkingDir,
           TExecWait(EWait), EShowCmd, ProcessMessagesProc, nil, FResultCode);
       end;
       if ExecResult then

+ 3 - 3
Projects/Src/Setup.Uninstall.pas

@@ -237,7 +237,7 @@ begin
       Sleep(500);
   end;
   UninstallExitCode := 0;
-  DelayDeleteFile(False, UninstExeFilename, 13, 50, 250);
+  DelayDeleteFileRedir(False, UninstExeFilename, 13, 50, 250);
   if Debugging then
     DebugNotifyUninstExe('');
   { Pre-Windows 2000 Add/Remove Programs will try to bring itself to the
@@ -371,8 +371,8 @@ begin
   TempFile := AddBackslash(TempDir) + '_unins.tmp';
   if not TempDirExisted then
     try
-      RestartReplace(False, TempFile, '');
-      RestartReplace(False, TempDir, '');
+      RestartReplaceRedir(False, TempFile, '');
+      RestartReplaceRedir(False, TempDir, '');
     except
       { ignore exceptions }
     end;

+ 10 - 10
Projects/Src/Setup.UninstallLog.pas

@@ -2,7 +2,7 @@ unit Setup.UninstallLog;
 
 {
   Inno Setup
-  Copyright (C) 1997-2024 Jordan Russell
+  Copyright (C) 1997-2025 Jordan Russell
   Portions by Martijn Laan
   For conditions of distribution and use, see LICENSE.TXT.
 
@@ -245,7 +245,7 @@ begin
   Result := False;
 end;
 
-procedure LoggedRestartDeleteDir(const DisableFsRedir: Boolean; Dir: String);
+procedure LoggedRestartDeleteDirRedir(const DisableFsRedir: Boolean; Dir: String);
 begin
   Dir := PathExpand(Dir);
   if not DisableFsRedir then begin
@@ -262,7 +262,7 @@ const
   drFalse = '0';
   drTrue = '1';
 
-function LoggedDeleteDir(const DisableFsRedir: Boolean; const DirName: String;
+function LoggedDeleteDirRedir(const DisableFsRedir: Boolean; const DirName: String;
   const DirsNotRemoved, RestartDeleteDirList: TSimpleStringList): Boolean;
 const
   FILE_ATTRIBUTE_REPARSE_POINT = $00000400;
@@ -278,7 +278,7 @@ begin
     { If the directory has the read-only attribute, strip it first }
     if Attribs and FILE_ATTRIBUTE_READONLY <> 0 then begin
       if (Attribs and FILE_ATTRIBUTE_REPARSE_POINT <> 0) or
-         IsDirEmpty(DisableFsRedir, DirName) then begin
+         IsDirEmptyRedir(DisableFsRedir, DirName) then begin
         if SetFileAttributesRedir(DisableFsRedir, DirName, Attribs and not FILE_ATTRIBUTE_READONLY) then
           Log('Stripped read-only attribute.')
         else
@@ -299,7 +299,7 @@ begin
          ListContainsPathOrSubdir(RestartDeleteDirList, DirName) then begin
         LogFmt('Failed to delete directory (%d). Will delete on restart (if empty).',
           [LastError]);
-        LoggedRestartDeleteDir(DisableFsRedir, DirName);
+        LoggedRestartDeleteDirRedir(DisableFsRedir, DirName);
       end
       else
         LogFmt('Failed to delete directory (%d).', [LastError]);
@@ -452,7 +452,7 @@ type
 function LoggedDeleteDirProc(const DisableFsRedir: Boolean; const DirName: String;
   const Param: Pointer): Boolean;
 begin
-  Result := LoggedDeleteDir(DisableFsRedir, DirName, PDeleteDirData(Param)^.DirsNotRemoved, nil);
+  Result := LoggedDeleteDirRedir(DisableFsRedir, DirName, PDeleteDirData(Param)^.DirsNotRemoved, nil);
 end;
 
 function LoggedDeleteFileProc(const DisableFsRedir: Boolean; const FileName: String;
@@ -608,7 +608,7 @@ var
           LogFmt('The file appears to be in use (%d). Will delete on restart.',
             [LastError]);
           try
-            RestartReplace(DisableFsRedir, Filename, '');
+            RestartReplaceRedir(DisableFsRedir, Filename, '');
             NeedRestart := True;
             { Add the file's directory to the list of directories that should
               be restart-deleted later }
@@ -715,7 +715,7 @@ var
         (e.g. '0C:\Program Files\My Program') }
       DisableFsRedir := (S[1] = drTrue);
       System.Delete(S, 1, 1);
-      LoggedDeleteDir(DisableFsRedir, S, nil, RestartDeleteDirList[DisableFsRedir]);
+      LoggedDeleteDirRedir(DisableFsRedir, S, nil, RestartDeleteDirList[DisableFsRedir]);
     end;
   end;
   
@@ -817,7 +817,7 @@ begin
                   try
                     if GetLogActive and (CurRec^.ExtraData and utRun_LogOutput <> 0) then
                       OutputReader := TCreateProcessOutputReader.Create(RunExecLog, 0);
-                    if not InstExec(CurRec^.ExtraData and utRun_DisableFsRedir <> 0,
+                    if not InstExecRedir(CurRec^.ExtraData and utRun_DisableFsRedir <> 0,
                        CurRecData[0], CurRecData[1], CurRecData[2], Wait,
                        ShowCmd, ProcessMessagesProc, OutputReader, ErrorCode) then begin
                       LogFmt('CreateProcess failed (%d).', [ErrorCode]);
@@ -964,7 +964,7 @@ begin
             end;
           utDeleteDirOrFiles:
             if (CallFromUninstaller or (CurRec^.ExtraData and utDeleteDirOrFiles_Extra = 0)) then begin
-              if DelTree(CurRec^.ExtraData and utDeleteDirOrFiles_DisableFsRedir <> 0,
+              if DelTreeRedir(CurRec^.ExtraData and utDeleteDirOrFiles_DisableFsRedir <> 0,
                  CurRecData[0], CurRec^.ExtraData and utDeleteDirOrFiles_IsDir <> 0,
                  CurRec^.ExtraData and utDeleteDirOrFiles_DeleteFiles <> 0,
                  CurRec^.ExtraData and utDeleteDirOrFiles_DeleteSubdirsAlso <> 0,

+ 3 - 3
Projects/Src/Setup.WizardForm.pas

@@ -2,7 +2,7 @@ unit Setup.WizardForm;
 
 {
   Inno Setup
-  Copyright (C) 1997-2024 Jordan Russell
+  Copyright (C) 1997-2025 Jordan Russell
   Portions by Martijn Laan
   For conditions of distribution and use, see LICENSE.TXT.
 
@@ -2374,7 +2374,7 @@ procedure TWizardForm.NextButtonClick(Sender: TObject);
 
     if InstallMode = imNormal then begin
       { Check if there's enough free disk space }
-      if GetSpaceOnNearestMountPoint(False, T, FreeSpace, TotalSpace) then begin
+      if GetSpaceOnNearestMountPointRedir(False, T, FreeSpace, TotalSpace) then begin
         if Compare64(FreeSpace, MinimumSpace) < 0 then
           { If not, show warning }
           if LoggedMsgBox(FmtSetupMessage(msgDiskSpaceWarning,
@@ -2414,7 +2414,7 @@ procedure TWizardForm.NextButtonClick(Sender: TObject);
     Result := False;
 
     if InstallMode = imNormal then begin
-      if GetSpaceOnNearestMountPoint(False, DirEdit.Text, FreeSpace, TotalSpace) then begin
+      if GetSpaceOnNearestMountPointRedir(False, DirEdit.Text, FreeSpace, TotalSpace) then begin
         if Compare64(FreeSpace, CurrentComponentsSpace) < 0 then
           if LoggedMsgBox(FmtSetupMessage(msgDiskSpaceWarning,
                [IntToKBStr(CurrentComponentsSpace), IntToKBStr(FreeSpace)]),

+ 6 - 6
Projects/Src/SetupLdrAndSetup.InstFunc.pas

@@ -2,7 +2,7 @@ unit SetupLdrAndSetup.InstFunc;
 
 {
   Inno Setup
-  Copyright (C) 1997-2024 Jordan Russell
+  Copyright (C) 1997-2025 Jordan Russell
   Portions by Martijn Laan
   For conditions of distribution and use, see LICENSE.TXT.
 
@@ -21,7 +21,7 @@ type
 function CreateTempDir(const LimitCurrentUserSidAccess: Boolean;
   var Protected: Boolean): String; overload;
 function CreateTempDir(const LimitCurrentUserSidAccess: Boolean): String; overload;
-procedure DelayDeleteFile(const DisableFsRedir: Boolean; const Filename: String;
+procedure DelayDeleteFileRedir(const DisableFsRedir: Boolean; const Filename: String;
   const MaxTries, FirstRetryDelayMS, SubsequentRetryDelayMS: Integer);
 function DetermineDefaultLanguage(const GetLanguageEntryProc: TGetLanguageEntryProc;
   const Method: TSetupLanguageDetectionMethod; const LangParameter: String;
@@ -35,7 +35,7 @@ function CreateSafeDirectory(const LimitCurrentUserSidAccess: Boolean; Path: Str
 function CreateSafeDirectory(const LimitCurrentUserSidAccess: Boolean; Path: String;
   var ErrorCode: DWORD): Boolean; overload;
 function IntToBase32(Number: Longint): String;
-function GenerateUniqueName(const DisableFsRedir: Boolean; Path: String;
+function GenerateUniqueNameRedir(const DisableFsRedir: Boolean; Path: String;
   const Extension: String): String;
 
 implementation
@@ -146,7 +146,7 @@ begin
   end;
 end;
 
-function GenerateUniqueName(const DisableFsRedir: Boolean; Path: String;
+function GenerateUniqueNameRedir(const DisableFsRedir: Boolean; Path: String;
   const Extension: String): String;
 var
   Rand, RandOrig: Longint;
@@ -177,7 +177,7 @@ var
   ErrorCode: DWORD;
 begin
   while True do begin
-    Dir := GenerateUniqueName(False, GetTempDir, '.tmp');
+    Dir := GenerateUniqueNameRedir(False, GetTempDir, '.tmp');
     if CreateSafeDirectory(LimitCurrentUserSidAccess, Dir, ErrorCode, Protected) then
       Break;
     if ErrorCode <> ERROR_ALREADY_EXISTS then
@@ -235,7 +235,7 @@ begin
     WM_QUERYENDSESSION and WM_ENDSESSION messages. }
 end;
 
-procedure DelayDeleteFile(const DisableFsRedir: Boolean; const Filename: String;
+procedure DelayDeleteFileRedir(const DisableFsRedir: Boolean; const Filename: String;
   const MaxTries, FirstRetryDelayMS, SubsequentRetryDelayMS: Integer);
 { Attempts to delete Filename up to MaxTries times, retrying if the file is
   in use. It sleeps FirstRetryDelayMS msec after the first try, and

+ 30 - 4
Projects/Src/SetupLdrAndSetup.RedirFunc.pas

@@ -2,7 +2,7 @@ unit SetupLdrAndSetup.RedirFunc;
 
 {
   Inno Setup
-  Copyright (C) 1997-2024 Jordan Russell
+  Copyright (C) 1997-2025 Jordan Russell
   Portions by Martijn Laan
   For conditions of distribution and use, see LICENSE.TXT.
 
@@ -29,7 +29,11 @@ function DisableFsRedirectionIf(const Disable: Boolean;
   var PreviousState: TPreviousFsRedirectionState): Boolean;
 procedure RestoreFsRedirection(const PreviousState: TPreviousFsRedirectionState);
 
-function CreateDirectoryRedir(const DisableFsRedir: Boolean; const Filename: String): BOOL;
+function CreateFileRedir(const DisableFsRedir: Boolean; const FileName: String;
+  const DesiredAccess, ShareMode: DWORD; const SecurityAttributes: PSecurityAttributes;
+  const CreationDisposition, FlagsAndAttributes: DWORD; TemplateFile: THandle): THandle;
+function CreateDirectoryRedir(const DisableFsRedir: Boolean; const Filename: String;
+  const SecurityAttributes: PSecurityAttributes = nil): BOOL;
 function CreateProcessRedir(const DisableFsRedir: Boolean;
   const lpApplicationName: PChar; const lpCommandLine: PChar;
   const lpProcessAttributes, lpThreadAttributes: PSecurityAttributes;
@@ -157,7 +161,29 @@ end;
 
 { *Redir functions }
 
-function CreateDirectoryRedir(const DisableFsRedir: Boolean; const Filename: String): BOOL;
+function CreateFileRedir(const DisableFsRedir: Boolean; const FileName: String;
+  const DesiredAccess, ShareMode: DWORD; const SecurityAttributes: PSecurityAttributes;
+  const CreationDisposition, FlagsAndAttributes: DWORD; TemplateFile: THandle): THandle;
+var
+  PrevState: TPreviousFsRedirectionState;
+  ErrorCode: DWORD;
+begin
+  if not DisableFsRedirectionIf(DisableFsRedir, PrevState) then begin
+    Result := INVALID_HANDLE_VALUE;
+    Exit;
+  end;
+  try
+    Result := CreateFile(PChar(Filename), DesiredAccess, ShareMode, SecurityAttributes,
+      CreationDisposition, FlagsAndAttributes, TemplateFile);
+    ErrorCode := GetLastError;
+  finally
+    RestoreFsRedirection(PrevState);
+  end;
+  SetLastError(ErrorCode);
+end;
+
+function CreateDirectoryRedir(const DisableFsRedir: Boolean; const Filename: String;
+  const SecurityAttributes: PSecurityAttributes): BOOL;
 var
   PrevState: TPreviousFsRedirectionState;
   ErrorCode: DWORD;
@@ -167,7 +193,7 @@ begin
     Exit;
   end;
   try
-    Result := CreateDirectory(PChar(Filename), nil);
+    Result := CreateDirectory(PChar(Filename), SecurityAttributes);
     ErrorCode := GetLastError;
   finally
     RestoreFsRedirection(PrevState);

+ 6 - 1
whatsnew.htm

@@ -112,7 +112,12 @@ issigtool --key-file="MyKey.ispublickey" verify "MyProg.dll"</pre>
 <ul>
   <li>Compiler IDE: the <i>Find in Files</i> result list will now update its line numbers when you add or delete lines.</li>
   <li><tt>[Files]</tt> section parameter <tt>Excludes</tt> can now be combined with the <tt>external</tt> flag.</li>
-  <li>Pascal Scripting: Added new <tt>GetSHA256OfStream</tt> support function.</li>
+  <li>Pascal Scripting changes:
+  <ul>
+    <li>Added new <tt>GetSHA256OfStream</tt> support function.</li>
+    <li><tt>Extract7ZipArchive</tt> now honors the file system redirection state set by <tt>EnableFsRedirection</tt> or 64-bit install mode.</li>
+  </ul>
+  </li>
   <li>Example script <i>CodeDownloadFiles.iss</i> now also demonstrates how to use the <tt>CreateExtractionPage</tt> support function to extract a 7-Zip archive. See the <a href="https://jrsoftware.org/ishelp/index.php?topic=isxfunc_extract7ziparchive">Extract7ZipArchive help topic</a> for information about this function's limitations.</li>
   <li>Documentation improvements.</li>
 </ul>