Преглед изворни кода

Remove ScriptFuncDisableFsRedir and [Code] function EnableFsRedirection.

Also update whatsnew for this and previous commit.

SevenZipDLLDecorder still has Redir stuff because of ArchiveFindFirstFileRedir, which is not related to ScriptFunc.

This commit also removes most of the info from help topic '64bitlimitations'. That topic still needs further updating once Redir removal is done, or perhaps the topic itself should be removed.
Martijn Laan пре 1 месец
родитељ
комит
77d017fcde

+ 0 - 16
ISHelp/isetup.xml

@@ -3329,22 +3329,6 @@ Filename: "{win}\MYPROG.INI"; Section: "InstallSettings"; Key: "InstallPath"; St
 
 <li>The System32 path returned by the <tt>{sys}</tt> constant does not always map to the 64-bit System directory. When Setup/Uninstall is running in 64-bit install mode, it maps to the 64-bit System directory when used in the [Dirs], [Files], [InstallDelete], [Run], [UninstallDelete], and [UninstallRun] sections because Setup temporarily disables <extlink href="http://msdn.microsoft.com/en-us/library/aa384187.aspx">WOW64 file system redirection</extlink> when files/directories are accessed by those sections. Elsewhere, System32 and <tt>{sys}</tt> map to the 32-bit System directory, as is normal in a 32-bit process.</li>
 
-<li>
-<p>In the [Code] section, when Setup/Uninstall is running in 64-bit install mode, functions that access files disable WOW64 file system redirection (unless overridden by a call to <link topic="isxfunc_EnableFsRedirection">EnableFsRedirection</link>). However, there are exceptions, listed below. These functions never disable file system redirection, meaning you cannot pass them (or get back) the name of a file located in the 64-bit System directory:</p>
-<table>
-<tr><td><tt>*Ini*</tt></td><td>(all of the functions that manipulate .INI files)</td></tr>
-<tr><td><tt>BrowseForFolder</tt></td></tr>
-<tr><td><tt>CreateShellLink</tt></td></tr>
-<tr><td><tt>GetOpenFileName</tt></td></tr>
-<tr><td><tt>LoadDLL</tt></td><td>(see following point)</td></tr>
-<tr><td><tt>ModifyPifFile</tt></td></tr>
-<tr><td><tt>SetCurrentDir</tt></td></tr>
-<tr><td><tt>ShellExec</tt></td><td>(use <tt>Exec</tt> instead)</td></tr>
-<tr><td><tt>UnregisterFont</tt></td></tr>
-</table>
-<p>Additionally, no VCL classes are capable of disabling file system redirection. For example, you cannot call the <tt>LoadFromFile</tt> method of <tt>TBitmap</tt> to load a bitmap file from the 64-bit System directory.</p>
-</li>
-
 </ul>
 
 </body>

+ 11 - 29
ISHelp/isxfunc.xml

@@ -1784,6 +1784,14 @@ end;</pre></example>
         <name>ApplyPathRedirRulesForCurrentProcess</name>
         <prototype>function ApplyPathRedirRulesForCurrentProcess(const A64Bit: Boolean; const APath: String): String;</prototype>
         <description><p>Calls <link topic="isxfunc_ApplyPathRedirRules">ApplyPathRedirRules</link> function with the current process as the target process.</p></description>
+        <example><p>The following example demonstrates how to launch an executable located in the 64-bit System directory from a 32-bit installer. (Note: In a 64-bit installer, it isn't necessary to call ApplyPathRedirRulesForCurrentProcess.)</p>
+<pre>var
+  ResultCode: Integer;
+begin
+  if IsWin64 then
+    Exec(ApplyPathRedirRulesForCurrentProcess(True, ExpandConstant('{cmd}')),
+      '', '', SW_SHOWNORMAL, ewWaitUntilTerminated, ResultCode);
+end;</pre></example>
       </function>
       <function>
         <name>ApplyPathRedirRules</name>
@@ -1803,34 +1811,8 @@ end;</pre></example>
       <function>
         <name>EnableFsRedirection</name>
         <prototype>function EnableFsRedirection(const Enable: Boolean): Boolean;</prototype>
-        <description><p>Controls whether built-in support functions that access files disable WOW64 file system redirection (with <link topic="64bitlimitations">some exceptions</link>). Specify True in the Enable parameter to leave redirection enabled when those functions are called; specify False to disable it. Returns the previous redirection state (True if redirection was enabled).</p>
-<p>If False is passed in the Enable parameter and the user isn't running a supported 64-bit version of Windows, an exception will be raised. To avoid the exception, call <link topic="isxfunc_IsWin64">IsWin64</link> first.</p></description>
-        <remarks><p>After you've performed the operation that required changing the redirection state, be sure to restore the previous state. Always use a <tt>try..finally</tt> language construct to ensure that the previous state is restored even if an exception occurs. See below for an example.</p>
-<p>By default, file system redirection is enabled in <link topic="32vs64bitinstalls">32-bit install mode</link>, and disabled in 64-bit install mode.</p>
-<p>This function has no effect on calls to functions in external DLLs. When invoking external functions, file system redirection is always left enabled.</p>
-<p>It is legal to call this function with True in the Enable parameter if the user isn't running a 64-bit version of Windows. In such a case, the call has no effect.</p></remarks>
-        <example><p>The following example demonstrates how to launch an executable located in the 64-bit System directory. (Note: In <link topic="32vs64bitinstalls">64-bit install mode</link>, it isn't necessary to call EnableFsRedirection because file system redirection is already disabled by default.)</p>
-<pre>var
-  OldState: Boolean;
-  ResultCode: Integer;
-begin
-  // First verify that the user is running a supported 64-bit version
-  // of Windows, because calling EnableFsRedirection(False) will
-  // raise an exception otherwise.
-  if IsWin64 then
-  begin
-    // Turn off redirection, so that cmd.exe from the 64-bit System
-    // directory is launched.
-    OldState := EnableFsRedirection(False);
-    try
-      Exec(ExpandConstant('{cmd}'), '', '', SW_SHOWNORMAL,
-        ewWaitUntilTerminated, ResultCode);
-    finally
-      // Restore the previous redirection state.
-      EnableFsRedirection(OldState);
-    end;
-  end;
-end;</pre></example>
+        <description><p>Function removed in 7.0.</p></description>
+        <remarks><p>Use <tt>{sysnative}</tt>, or a <link topic="64bit">64-bit installer</link>, or support function <link topic="isxfunc_ApplyPathRedirRulesForCurrentProcess">ApplyPathRedirRulesForCurrentProcess</link> instead.</p></remarks>
       </function>
     </subcategory>
   </category>
@@ -1849,7 +1831,7 @@ end;</pre></example>
 <p>Do not include quotes in the Filename parameter; the function will add them automatically.</p>
 <p>The WorkingDir parameter can be an empty string, in which case it will try to extract a pathname from the Filename parameter and use that as the initial current directory for the process. If no pathname was specified in Filename, a default directory will be used.</p>
 <p>If you have a single string containing both a filename and parameters (e.g. a command line obtained from an UninstallString registry value), you need not separate them yourself; just pass <tt>'>'</tt> in the Filename parameter, and the full command line in the Params parameter. (Note that when this is done, the function's special platform-independent support for .bat and .cmd files is disabled; it simply passes the specified command line to CreateProcess without any processing.)</p>
-<p>By default, when Setup/Uninstall is running in <link topic="32vs64bitinstalls">64-bit install mode</link>, this function disables WOW64 file system redirection when calling CreateProcess. It is possible to override this by calling <link topic="isxfunc_EnableFsRedirection">EnableFsRedirection</link>.</p>
+<p>To execute a 64-bit System32 binary from a 32-bit installer, use <tt>{sysnative}</tt> or <link topic="isxfunc_ApplyPathRedirRulesForCurrentProcess">ApplyPathRedirRulesForCurrentProcess</link> to rewrite the path. In a 64-bit installer the rewrite is not needed.</p>
 <p>Can't be used to execute Setup itself until the installation has started.</p>
 <p><i>Note: compared to ISPP's Exec the ShowCmd and Wait parameters are swapped!</i></p></remarks>
         <example><pre>var

+ 14 - 19
Projects/Src/Compression.SevenZipDLLDecoder.pas

@@ -2,7 +2,7 @@ unit Compression.SevenZipDLLDecoder;
 
 {
   Inno Setup
-  Copyright (C) 1997-2025 Jordan Russell
+  Copyright (C) 1997-2026 Jordan Russell
   Portions by Martijn Laan
   For conditions of distribution and use, see LICENSE.TXT.
 
@@ -23,8 +23,7 @@ procedure SevenZipDLLDeInit;
 
 procedure MapArchiveExtensions(const DestExt, SourceExt: String);
 
-procedure ExtractArchiveRedir(const DisableFsRedir: Boolean;
-  const ArchiveFilename, DestDir, Password: String; const FullPaths: Boolean;
+procedure ExtractArchive(const ArchiveFilename, DestDir, Password: String; const FullPaths: Boolean;
   const OnExtractionProgress: TOnExtractionProgress);
 
 { These functions work similar to Windows' FindFirstFile, FindNextFile, and
@@ -162,7 +161,6 @@ type
         procedure SetAttrib(const AAttrib: DWORD);
       end;
     var
-      FDisableFsRedir: Boolean;
       FExpandedDestDir: String;
       FFullPaths: Boolean;
       FExtractedArchiveName: String;
@@ -179,7 +177,7 @@ type
     procedure HandleProgress; override;
   public
     constructor Create(const InArchive: IInArchive; const numItems: UInt32;
-      const DisableFsRedir: Boolean; const ArchiveFileName, DestDir, Password: String;
+      const ArchiveFileName, DestDir, Password: String;
       const FullPaths: Boolean; const OnExtractionProgress: TOnExtractionProgress);
     destructor Destroy; override;
   end;
@@ -698,12 +696,10 @@ begin
 end;
 
 constructor TArchiveExtractAllCallback.Create(const InArchive: IInArchive;
-  const numItems: UInt32; const DisableFsRedir: Boolean;
-  const ArchiveFileName, DestDir, Password: String;
+  const numItems: UInt32; const ArchiveFileName, DestDir, Password: String;
   const FullPaths: Boolean; const OnExtractionProgress: TOnExtractionProgress);
 begin
   inherited Create(InArchive, numItems, Password);
-  FDisableFsRedir := DisableFsRedir;
   FExpandedDestDir := AddBackslash(PathExpand(DestDir));
   FFullPaths := FullPaths;
   FExtractedArchiveName := PathExtractName(ArchiveFileName);
@@ -740,7 +736,7 @@ begin
           NewCurrent.Path := Path + '\';
           if not ValidateAndCombinePath(FExpandedDestDir, Path, NewCurrent.ExpandedPath) then
             OleError(E_ACCESSDENIED);
-          ForceDirectories(FDisableFsRedir, NewCurrent.ExpandedPath);
+          ForceDirectories(False, NewCurrent.ExpandedPath);
         end;
         outStream := nil;
       end else begin
@@ -756,12 +752,12 @@ begin
         NewCurrent.Path := Path;
         if not ValidateAndCombinePath(FExpandedDestDir, Path, NewCurrent.ExpandedPath) then
           OleError(E_ACCESSDENIED);
-        ForceDirectories(FDisableFsRedir, PathExtractPath(NewCurrent.ExpandedPath));
-        const ExistingFileAttr = GetFileAttributesRedir(FDisableFsRedir, NewCurrent.ExpandedPath);
+        ForceDirectories(False, PathExtractPath(NewCurrent.ExpandedPath));
+        const ExistingFileAttr = GetFileAttributes(PChar(NewCurrent.ExpandedPath));
         if (ExistingFileAttr <> INVALID_FILE_ATTRIBUTES) and
            (ExistingFileAttr and FILE_ATTRIBUTE_READONLY <> 0) then
-          SetFileAttributesRedir(FDisableFsRedir, NewCurrent.ExpandedPath, ExistingFileAttr and not FILE_ATTRIBUTE_READONLY);
-        const DestF = TFileRedir.Create(FDisableFsRedir, NewCurrent.ExpandedPath, fdCreateAlways, faWrite, fsNone);
+          SetFileAttributes(PChar(NewCurrent.ExpandedPath), ExistingFileAttr and not FILE_ATTRIBUTE_READONLY);
+        const DestF = TFile.Create(NewCurrent.ExpandedPath, fdCreateAlways, faWrite, fsNone);
         try
           var BytesLeft: UInt64;
           if GetProperty(FInArchive, index, kpidSize, BytesLeft) then begin
@@ -813,7 +809,7 @@ begin
             @FCurrent.CTime, nil, @FCurrent.MTime);
         FCurrent.outStream := nil; { Like 7zMain.c close the file before setting attributes - note that 7-Zip has cleared its own reference as well already }
         if (FCurrent.ExpandedPath <> '') and FCurrent.HasAttrib then
-          SetFileAttributesRedir(FDisableFsRedir, FCurrent.ExpandedPath, FCurrent.Attrib);
+          SetFileAttributes(PChar(FCurrent.ExpandedPath), FCurrent.Attrib);
       end;
     finally
       FCurrent.outStream := nil;
@@ -1070,10 +1066,9 @@ begin
   end;
 end;
 
-{ ExtractArchiveRedir }
+{ ExtractArchive }
 
-procedure ExtractArchiveRedir(const DisableFsRedir: Boolean;
-  const ArchiveFilename, DestDir, Password: String;
+procedure ExtractArchive(const ArchiveFilename, DestDir, Password: String;
   const FullPaths: Boolean; const OnExtractionProgress: TOnExtractionProgress);
 begin
   LogArchiveExtractionModeOnce;
@@ -1092,12 +1087,12 @@ begin
 
   { Open }
   var numItems: UInt32;
-  const InArchive = OpenArchiveRedir(DisableFsRedir, ArchiveFilename, Password,
+  const InArchive = OpenArchiveRedir(False, ArchiveFilename, Password,
     clsid, numItems);
 
   { Extract }
   const ExtractCallback: IArchiveExtractCallback =
-    TArchiveExtractAllCallback.Create(InArchive, numItems, DisableFsRedir,
+    TArchiveExtractAllCallback.Create(InArchive, numItems,
       ArchiveFilename, DestDir, Password, FullPaths, OnExtractionProgress);
   (ExtractCallback as TArchiveExtractAllCallback).Extract;
 

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

@@ -2,7 +2,7 @@ unit Compression.SevenZipDecoder;
 
 {
   Inno Setup
-  Copyright (C) 1997-2025 Jordan Russell
+  Copyright (C) 1997-2026 Jordan Russell
   Portions by Martijn Laan
   For conditions of distribution and use, see LICENSE.TXT.
 
@@ -22,8 +22,7 @@ type
 
 procedure SevenZipError(const ExceptMessage: String; const LogMessage: String = '');
 
-procedure Extract7ZipArchiveRedir(const DisableFsRedir: Boolean;
-  const ArchiveFileName, DestDir, Password: String; const FullPaths: Boolean;
+procedure Extract7ZipArchive(const ArchiveFileName, DestDir, Password: String; const FullPaths: Boolean;
   const OnExtractionProgress: TOnExtractionProgress);
 
 implementation
@@ -32,11 +31,10 @@ uses
   Windows, Forms,
   PathFunc, UnsignedFunc,
   Shared.SetupMessageIDs, Shared.CommonFunc, SetupLdrAndSetup.Messages,
-  Setup.RedirFunc, Setup.LoggingFunc, Setup.MainFunc, Setup.InstFunc;
+  Setup.LoggingFunc, Setup.MainFunc, Setup.InstFunc;
 
 type
   TSevenZipDecodeState = record
-    DisableFsRedir: Boolean;
     ExpandedArchiveFileName, ExpandedDestDir: String;
     LogBuffer: AnsiString;
     ExtractedArchiveName: String;
@@ -68,7 +66,7 @@ function {$IFNDEF WIN64} __CreateDirectoryW {$ELSE} _CreateDirectoryW {$ENDIF}(
 begin
   var ExpandedDir: String;
   if ValidateAndCombinePath(State.ExpandedDestDir, lpPathName, ExpandedDir) then
-    Result := CreateDirectoryRedir(State.DisableFsRedir, ExpandedDir, lpSecurityAttributes)
+    Result := CreateDirectory(PChar(ExpandedDir), lpSecurityAttributes)
   else begin
     Result := False;
     SetLastError(ERROR_ACCESS_DENIED);
@@ -101,8 +99,7 @@ begin
       (PathCompare(ExpandedFileName, State.ExpandedArchiveFileName) = 0)) or
      ((dwDesiredAccess = GENERIC_WRITE) and
       ValidateAndCombinePath(State.ExpandedDestDir, lpFileName, ExpandedFileName)) then
-    Result := CreateFileRedir(State.DisableFsRedir, ExpandedFileName,
-      dwDesiredAccess, dwShareMode, lpSecurityAttributes,
+    Result := CreateFile(PChar(ExpandedFileName), dwDesiredAccess, dwShareMode, lpSecurityAttributes,
       dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile)
   else begin
     Result := INVALID_HANDLE_VALUE;
@@ -138,7 +135,7 @@ begin
   { See above }
   var ExpandedFileName: String;
   if ValidateAndCombinePath(State.ExpandedDestDir, lpFileName, ExpandedFileName) then
-    Result := GetFileAttributesRedir(State.DisableFsRedir, ExpandedFileName)
+    Result := GetFileAttributes(PChar(ExpandedFileName))
   else begin
     Result := INVALID_FILE_ATTRIBUTES;
     SetLastError(ERROR_ACCESS_DENIED);
@@ -151,7 +148,7 @@ begin
   { See above }
   var ExpandedFileName: String;
   if ValidateAndCombinePath(State.ExpandedDestDir, lpFileName, ExpandedFileName) then
-    Result := SetFileAttributesRedir(State.DisableFsRedir, ExpandedFileName, dwFileAttributes)
+    Result := SetFileAttributes(PChar(ExpandedFileName), dwFileAttributes)
   else begin
     Result := False;
     SetLastError(ERROR_ACCESS_DENIED);
@@ -335,8 +332,7 @@ begin
   raise ESevenZipError.Create(ExceptMessage);
 end;
 
-procedure Extract7ZipArchiveRedir(const DisableFsRedir: Boolean;
-  const ArchiveFileName, DestDir, Password: String; const FullPaths: Boolean;
+procedure Extract7ZipArchive(const ArchiveFileName, DestDir, Password: String; const FullPaths: Boolean;
   const OnExtractionProgress: TOnExtractionProgress);
 
   procedure BadResultError(const Res: Integer);
@@ -375,10 +371,9 @@ begin
   LogFmt('Extracting 7-Zip archive %s to %s. Full paths? %s', [ArchiveFileName,
     RemoveBackslashUnlessRoot(DestDir), SYesNo[FullPaths]]);
 
-  if not ForceDirectories(DisableFsRedir, DestDir) then
+  if not ForceDirectories(False, DestDir) then
     SevenZipError(FmtSetupMessage1(msgErrorCreatingDir, DestDir), 'Failed to create destination directory');
 
-  State.DisableFsRedir := DisableFsRedir;
   State.ExpandedArchiveFileName := PathExpand(ArchiveFileName);
   State.ExpandedDestDir := AddBackslash(PathExpand(DestDir));
   State.LogBuffer := '';

+ 1 - 2
Projects/Src/Setup.MainFunc.pas

@@ -143,7 +143,7 @@ var
     NeedPassword, NeedSerial, NeedsRestart, RestartSystem, IsWinDark, IsDarkInstallMode,
     IsUninstaller, AllowUninstallerShutdown, AcceptedQueryEndSessionInProgress,
     CustomWizardBackground: Boolean;
-  InstallDefaultDisableFsRedir, ScriptFuncDisableFsRedir: Boolean;
+  InstallDefaultDisableFsRedir: Boolean;
   InstallDefaultRegView: TRegView = rvDefault;
   HasCustomType, HasComponents, HasTasks: Boolean;
   ProcessorArchitecture: TSetupProcessorArchitecture = paUnknown;
@@ -2777,7 +2777,6 @@ procedure Initialize64BitInstallMode(const A64BitInstallMode: Boolean);
 begin
   Is64BitInstallMode := A64BitInstallMode;
   InstallDefaultDisableFsRedir := A64BitInstallMode;
-  ScriptFuncDisableFsRedir := A64BitInstallMode;
   if A64BitInstallMode then
     InstallDefaultRegView := rv64Bit
   else

+ 19 - 21
Projects/Src/Setup.ScriptFunc.HelperFunc.pas

@@ -2,7 +2,7 @@ unit Setup.ScriptFunc.HelperFunc;
 
 {
   Inno Setup
-  Copyright (C) 1997-2025 Jordan Russell
+  Copyright (C) 1997-2026 Jordan Russell
   Portions by Martijn Laan
   For conditions of distribution and use, see LICENSE.TXT.
 
@@ -74,8 +74,8 @@ procedure CrackCodeRootKey(CodeRootKey: UInt32; 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 GetMD5OfFile(const Filename: String): TMD5Digest;
+function GetSHA1OfFile(const Filename: String): TSHA1Digest;
 function GetMD5OfAnsiString(const S: AnsiString): TMD5Digest;
 function GetMD5OfUnicodeString(const S: UnicodeString): TMD5Digest;
 function GetSHA1OfAnsiString(const S: AnsiString): TSHA1Digest;
@@ -85,8 +85,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;
-  const Name, DirList: String): String;
+function NewFileSearch(const Name, DirList: String): String;
 function GetExceptionMessage(const Caller: TPSExec): String;
 function GetCodePreviousData(const ExpandedAppID, ValueName, DefaultValueData: String): String;
 function SetCodePreviousData(const PreviousDataKey: HKEY; const ValueName, ValueData: String): Boolean;
@@ -104,7 +103,7 @@ implementation
 uses
   Forms, SysUtils, Graphics,
   uPSUtils, PathFunc, ASMInline, PSStackHelper, UnsignedFunc,
-  Setup.MainFunc, Setup.RedirFunc, Setup.InstFunc,
+  Setup.MainFunc, Setup.InstFunc,
   SetupLdrAndSetup.Messages, Shared.SetupMessageIDs, Shared.Struct,
   Shared.SetupTypes, Shared.SetupSteps, Setup.LoggingFunc, Setup.SetupForm;
 
@@ -213,7 +212,7 @@ var
   FindHandle: THandle;
   FindData: TWin32FindData;
 begin
-  FindHandle := FindFirstFileRedir(ScriptFuncDisableFsRedir, FileName, FindData);
+  FindHandle := FindFirstFile(PChar(FileName), FindData);
   if FindHandle <> INVALID_HANDLE_VALUE then begin
     FindRec.FindHandle := FindHandle;
     FindDataToFindRec(FindData, FindRec);
@@ -328,7 +327,7 @@ begin
   Result := True;
 end;
 
-function GetMD5OfFile(const DisableFsRedir: Boolean; const Filename: String): TMD5Digest;
+function GetMD5OfFile(const Filename: String): TMD5Digest;
 { Gets MD5 sum of the file Filename. An exception will be raised upon
   failure. }
 var
@@ -336,7 +335,7 @@ var
 begin
   var Context: TMD5Context;
   MD5Init(Context);
-  var F := TFileRedir.Create(DisableFsRedir, Filename, fdOpenExisting, faRead, fsReadWrite);
+  var F := TFile.Create(Filename, fdOpenExisting, faRead, fsReadWrite);
   try
     while True do begin
       var NumRead := F.Read(Buf, SizeOf(Buf));
@@ -350,7 +349,7 @@ begin
   Result := MD5Final(Context);
 end;
 
-function GetSHA1OfFile(const DisableFsRedir: Boolean; const Filename: String): TSHA1Digest;
+function GetSHA1OfFile(const Filename: String): TSHA1Digest;
 { Gets SHA-1 sum of the file Filename. An exception will be raised upon
   failure. }
 var
@@ -358,7 +357,7 @@ var
 begin
   var Context: TSHA1Context;
   SHA1Init(Context);
-  var F := TFileRedir.Create(DisableFsRedir, Filename, fdOpenExisting, faRead, fsReadWrite);
+  var F := TFile.Create(Filename, fdOpenExisting, faRead, fsReadWrite);
   try
     while True do begin
       var NumRead := F.Read(Buf, SizeOf(Buf));
@@ -482,15 +481,14 @@ 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;
-  const Name, DirList: String): String;
+function NewFileSearch(const Name, DirList: String): String;
 var
   I, P, L: Integer;
 begin
   { If Name is absolute, drive-relative, or root-relative, don't search DirList }
   if PathDrivePartLengthEx(Name, True) <> 0 then begin
     Result := PathExpand(Name);
-    if NewFileExistsRedir(DisableFsRedir, Result) then
+    if NewFileExists(Result) then
       Exit;
   end
   else begin
@@ -505,7 +503,7 @@ begin
       while (P <= L) and (DirList[P] <> ';') do
         Inc(P, PathCharLength(DirList, P));
       Result := PathExpand(PathCombine(Copy(DirList, I, P - I), Name));
-      if NewFileExistsRedir(DisableFsRedir, Result) then
+      if NewFileExists(Result) then
         Exit;
     end;
   end;
@@ -552,7 +550,7 @@ var
   N: Cardinal;
 begin
   try
-    F := TFileRedir.Create(ScriptFuncDisableFsRedir, FileName, fdOpenExisting, faRead, Sharing);
+    F := TFile.Create(FileName, fdOpenExisting, faRead, Sharing);
     try
       N := F.CappedSize;
       SetLength(S, N);
@@ -573,7 +571,7 @@ var
   F: TTextFileReader;
 begin
   try
-    F := TTextFileReaderRedir.Create(ScriptFuncDisableFsRedir, FileName, fdOpenExisting, faRead, Sharing);
+    F := TTextFileReader.Create(FileName, fdOpenExisting, faRead, Sharing);
     try
       var ArrayBuilder := Stack.InitArrayBuilder(ItemNo);
       while not F.Eof do
@@ -594,9 +592,9 @@ var
 begin
   try
     if Append then
-      F := TFileRedir.Create(ScriptFuncDisableFsRedir, FileName, fdOpenAlways, faWrite, fsNone)
+      F := TFile.Create(FileName, fdOpenAlways, faWrite, fsNone)
     else
-      F := TFileRedir.Create(ScriptFuncDisableFsRedir, FileName, fdCreateAlways, faWrite, fsNone);
+      F := TFile.Create(FileName, fdCreateAlways, faWrite, fsNone);
     try
       F.SeekToEnd;
       F.WriteAnsiString(S);
@@ -617,9 +615,9 @@ var
 begin
   try
     if Append then
-      F := TTextFileWriterRedir.Create(ScriptFuncDisableFsRedir, FileName, fdOpenAlways, faWrite, fsNone)
+      F := TTextFileWriter.Create(FileName, fdOpenAlways, faWrite, fsNone)
     else
-      F := TTextFileWriterRedir.Create(ScriptFuncDisableFsRedir, FileName, fdCreateAlways, faWrite, fsNone);
+      F := TTextFileWriter.Create(FileName, fdCreateAlways, faWrite, fsNone);
     try
       if UTF8 and UTF8WithoutBOM then
         F.UTF8WithoutBOM := UTF8WithoutBOM;

+ 32 - 44
Projects/Src/Setup.ScriptFunc.pas

@@ -24,7 +24,7 @@ uses
   uPSUtils, PathFunc, ISSigFunc, ECDSA, BrowseFunc, MD5, SHA1, SHA256, BitmapButton, BitmapImage,
   PSStackHelper, UnsignedFunc,
   Shared.Struct, Setup.WizardForm.CustomPages, Setup.MainFunc, Shared.CommonFunc.Vcl,
-  Shared.CommonFunc, Shared.FileClass, SetupLdrAndSetup.InstFunc, Setup.RedirFunc,
+  Shared.CommonFunc, Shared.FileClass, SetupLdrAndSetup.InstFunc,
   Setup.DownloadFileFunc, Setup.ExtractFileFunc, Setup.ISSigVerifyFunc, Setup.InstFunc, Setup.InstFunc.Ole,
   SetupLdrAndSetup.Messages, Shared.SetupMessageIDs, Setup.NewDiskForm,
   Setup.WizardForm, Shared.VerInfoFunc, Shared.SetupTypes,
@@ -354,15 +354,15 @@ var
   begin
     RegisterScriptFunc('FILEEXISTS', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Integer)
     begin
-      Stack.SetBool(PStart, NewFileExistsRedir(ScriptFuncDisableFsRedir, Stack.GetString(PStart-1)));
+      Stack.SetBool(PStart, NewFileExists(Stack.GetString(PStart-1)));
     end);
     RegisterScriptFunc('DIREXISTS', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Integer)
     begin
-      Stack.SetBool(PStart, DirExistsRedir(ScriptFuncDisableFsRedir, Stack.GetString(PStart-1)));
+      Stack.SetBool(PStart, DirExists(Stack.GetString(PStart-1)));
     end);
     RegisterScriptFunc('FILEORDIREXISTS', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Integer)
     begin
-      Stack.SetBool(PStart, FileOrDirExistsRedir(ScriptFuncDisableFsRedir, Stack.GetString(PStart-1)));
+      Stack.SetBool(PStart, FileOrDirExists(Stack.GetString(PStart-1)));
     end);
     RegisterScriptFunc('GETINISTRING', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Integer)
     begin
@@ -436,7 +436,7 @@ var
     end);
     RegisterScriptFunc('GETSHORTNAME', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Integer)
     begin
-      Stack.SetString(PStart, GetShortNameRedir(ScriptFuncDisableFsRedir, Stack.GetString(PStart-1)));
+      Stack.SetString(PStart, GetShortName(Stack.GetString(PStart-1)));
     end);
     RegisterScriptFunc('GETWINDIR', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Integer)
     begin
@@ -478,8 +478,7 @@ var
     begin
       var ExistingFilename := Stack.GetString(PStart-1);
       if not IsProtectedSrcExe(ExistingFilename) then
-        Stack.SetBool(PStart, CopyFileRedir(ScriptFuncDisableFsRedir,
-          ExistingFilename, Stack.GetString(PStart-2), Stack.GetBool(PStart-3)))
+        Stack.SetBool(PStart, CopyFile(PChar(ExistingFilename), PChar(Stack.GetString(PStart-2)), Stack.GetBool(PStart-3)))
       else
         Stack.SetBool(PStart, False);
     end);
@@ -765,7 +764,7 @@ var
     end);
     RegisterScriptFunc('SETNTFSCOMPRESSION', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Integer)
     begin
-      Stack.SetBool(PStart, SetNTFSCompressionRedir(ScriptFuncDisableFsRedir, Stack.GetString(PStart-1), Stack.GetBool(PStart-2)));
+      Stack.SetBool(PStart, SetNTFSCompression(Stack.GetString(PStart-1), Stack.GetBool(PStart-2)));
     end);
     RegisterScriptFunc('ISWILDCARD', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Integer)
     begin
@@ -941,15 +940,15 @@ var
     end);
     RegisterScriptFunc('DELAYDELETEFILE', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Integer)
     begin
-      DelayDeleteFile(ScriptFuncDisableFsRedir, Stack.GetString(PStart), Stack.GetInt(PStart-1), 250, 250);
+      DelayDeleteFile(False, Stack.GetString(PStart), Stack.GetInt(PStart-1), 250, 250);
     end);
     RegisterScriptFunc('DELTREE', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Integer)
     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, DelTree(False, 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: Integer)
     begin
-      Stack.SetString(PStart, GenerateUniqueName(ScriptFuncDisableFsRedir, Stack.GetString(PStart-1), Stack.GetString(PStart-2)));
+      Stack.SetString(PStart, GenerateUniqueName(False, Stack.GetString(PStart-1), Stack.GetString(PStart-2)));
     end);
     RegisterScriptFunc('GETCOMPUTERNAMESTRING', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Integer)
     begin
@@ -957,7 +956,7 @@ var
     end);
     RegisterScriptFunc('GETMD5OFFILE', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Integer)
     begin
-      Stack.SetString(PStart, MD5DigestToString(GetMD5OfFile(ScriptFuncDisableFsRedir, Stack.GetString(PStart-1))));
+      Stack.SetString(PStart, MD5DigestToString(GetMD5OfFile(Stack.GetString(PStart-1))));
     end);
     RegisterScriptFunc('GETMD5OFSTRING', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Integer)
     begin
@@ -969,7 +968,7 @@ var
     end);
     RegisterScriptFunc('GETSHA1OFFILE', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Integer)
     begin
-      Stack.SetString(PStart, SHA1DigestToString(GetSHA1OfFile(ScriptFuncDisableFsRedir, Stack.GetString(PStart-1))));
+      Stack.SetString(PStart, SHA1DigestToString(GetSHA1OfFile(Stack.GetString(PStart-1))));
     end);
     RegisterScriptFunc('GETSHA1OFSTRING', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Integer)
     begin
@@ -981,7 +980,7 @@ var
     end);
     RegisterScriptFunc('GETSHA256OFFILE', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Integer)
     begin
-      Stack.SetString(PStart, SHA256DigestToString(GetSHA256OfFile(ScriptFuncDisableFsRedir, Stack.GetString(PStart-1))));
+      Stack.SetString(PStart, SHA256DigestToString(GetSHA256OfFile(False, Stack.GetString(PStart-1))));
     end);
     RegisterScriptFunc('GETSHA256OFSTREAM', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Integer)
     begin
@@ -998,7 +997,7 @@ var
     RegisterScriptFunc('GETSPACEONDISK', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Integer)
     begin
       var FreeBytes, TotalBytes: Int64;
-      if GetSpaceOnDisk(ScriptFuncDisableFsRedir, Stack.GetString(PStart-1), FreeBytes, TotalBytes) then begin
+      if GetSpaceOnDisk(False, Stack.GetString(PStart-1), FreeBytes, TotalBytes) then begin
         if Stack.GetBool(PStart-2) then begin
           FreeBytes := FreeBytes div (1024*1024);
           TotalBytes := TotalBytes div (1024*1024);
@@ -1018,7 +1017,7 @@ var
     RegisterScriptFunc('GETSPACEONDISK64', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Integer)
     begin
       var FreeBytes, TotalBytes: Int64;
-      if GetSpaceOnDisk(ScriptFuncDisableFsRedir, Stack.GetString(PStart-1), FreeBytes, TotalBytes) then begin
+      if GetSpaceOnDisk(False, Stack.GetString(PStart-1), FreeBytes, TotalBytes) then begin
         Stack.SetInt64(PStart-2, FreeBytes);
         Stack.SetInt64(PStart-3, TotalBytes);
         Stack.SetBool(PStart, True);
@@ -1067,7 +1066,7 @@ var
           var ResultCode: DWORD;
           try
             Stack.SetBool(PStart, InstExecEx(RunAsOriginalUser,
-              ScriptFuncDisableFsRedir, Filename, Stack.GetString(PStart-2),
+              False, Filename, Stack.GetString(PStart-2),
               Stack.GetString(PStart-3), ExecWait,
               Stack.GetInt(PStart-4), ProcessMessagesProc, OutputReader, ResultCode));
           finally
@@ -1115,7 +1114,7 @@ var
     end);
     RegisterScriptFunc('ISPROTECTEDSYSTEMFILE', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Integer)
     begin
-      Stack.SetBool(PStart, IsProtectedSystemFile(ScriptFuncDisableFsRedir, Stack.GetString(PStart-1)));
+      Stack.SetBool(PStart, IsProtectedSystemFile(False, Stack.GetString(PStart-1)));
     end);
     RegisterScriptFunc('MAKEPENDINGFILERENAMEOPERATIONSCHECKSUM', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Integer)
     begin
@@ -1144,11 +1143,11 @@ var
     end);
     RegisterScriptFunc('RESTARTREPLACE', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Integer)
     begin
-      RestartReplace(ScriptFuncDisableFsRedir, Stack.GetString(PStart), Stack.GetString(PStart-1));
+      RestartReplace(False, Stack.GetString(PStart), Stack.GetString(PStart-1));
     end);
     RegisterScriptFunc('FORCEDIRECTORIES', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Integer)
     begin
-      Stack.SetBool(PStart, ForceDirectories(ScriptFuncDisableFsRedir, Stack.GetString(PStart-1)));
+      Stack.SetBool(PStart, ForceDirectories(False, Stack.GetString(PStart-1)));
     end);
   end;
 
@@ -1338,7 +1337,7 @@ var
     RegisterScriptFunc('FILESIZE', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Integer)
     begin
       try
-        var F := TFileRedir.Create(ScriptFuncDisableFsRedir, Stack.GetString(PStart-1), fdOpenExisting, faRead, fsReadWrite);
+        var F := TFile.Create(Stack.GetString(PStart-1), fdOpenExisting, faRead, fsReadWrite);
         try
           Stack.SetInt(PStart-2, Integer(F.CappedSize)); { Even though CappedSize returns Cardinal, it's capped at High(Int32) }
           Stack.SetBool(PStart, True);
@@ -1352,7 +1351,7 @@ var
     RegisterScriptFunc('FILESIZE64', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Integer)
     begin
       try
-        var F := TFileRedir.Create(ScriptFuncDisableFsRedir, Stack.GetString(PStart-1), fdOpenExisting, faRead, fsReadWrite);
+        var F := TFile.Create(Stack.GetString(PStart-1), fdOpenExisting, faRead, fsReadWrite);
         try
           Stack.SetInt64(PStart-2, F.Size);
           Stack.SetBool(PStart, True);
@@ -1413,27 +1412,27 @@ var
     end);
     RegisterScriptFunc('FILESEARCH', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Integer)
     begin
-      Stack.SetString(PStart, NewFileSearch(ScriptFuncDisableFsRedir, Stack.GetString(PStart-1), Stack.GetString(PStart-2)));
+      Stack.SetString(PStart, NewFileSearch(Stack.GetString(PStart-1), Stack.GetString(PStart-2)));
     end);
     RegisterScriptFunc('RENAMEFILE', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Integer)
     begin
       var OldName := Stack.GetString(PStart-1);
       if not IsProtectedSrcExe(OldName) then
-        Stack.SetBool(PStart, MoveFileRedir(ScriptFuncDisableFsRedir, OldName, Stack.GetString(PStart-2)))
+        Stack.SetBool(PStart, MoveFile(PChar(OldName), PChar(Stack.GetString(PStart-2))))
       else
         Stack.SetBool(PStart, False);
     end);
     RegisterScriptFunc('DELETEFILE', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Integer)
     begin
-      Stack.SetBool(PStart, DeleteFileRedir(ScriptFuncDisableFsRedir, Stack.GetString(PStart-1)));
+      Stack.SetBool(PStart, Windows.DeleteFile(PChar(Stack.GetString(PStart-1))));
     end);
     RegisterScriptFunc('CREATEDIR', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Integer)
     begin
-      Stack.SetBool(PStart, CreateDirectoryRedir(ScriptFuncDisableFsRedir, Stack.GetString(PStart-1)));
+      Stack.SetBool(PStart, CreateDirectory(PChar(Stack.GetString(PStart-1)), nil));
     end);
     RegisterScriptFunc('REMOVEDIR', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Integer)
     begin
-      Stack.SetBool(PStart, RemoveDirectoryRedir(ScriptFuncDisableFsRedir, Stack.GetString(PStart-1)));
+      Stack.SetBool(PStart, RemoveDirectory(PChar(Stack.GetString(PStart-1))));
     end);
     RegisterScriptFunc('COMPARESTR', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Integer)
     begin
@@ -1479,7 +1478,7 @@ var
     RegisterScriptFunc('GETVERSIONNUMBERS', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Integer)
     begin
       var VersionNumbers: TFileVersionNumbers;
-      if GetVersionNumbersRedir(ScriptFuncDisableFsRedir, Stack.GetString(PStart-1), VersionNumbers) then begin
+      if GetVersionNumbers(Stack.GetString(PStart-1), VersionNumbers) then begin
         Stack.SetUInt(PStart-2, VersionNumbers.MS);
         Stack.SetUInt(PStart-3, VersionNumbers.LS);
         Stack.SetBool(PStart, True);
@@ -1489,7 +1488,7 @@ var
     RegisterScriptFunc('GETVERSIONCOMPONENTS', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Integer)
     begin
       var VersionNumbers: TFileVersionNumbers;
-      if GetVersionNumbersRedir(ScriptFuncDisableFsRedir, Stack.GetString(PStart-1), VersionNumbers) then begin
+      if GetVersionNumbers(Stack.GetString(PStart-1), VersionNumbers) then begin
         Stack.SetUInt(PStart-2, VersionNumbers.MS shr 16);
         Stack.SetUInt(PStart-3, VersionNumbers.MS and $FFFF);
         Stack.SetUInt(PStart-4, VersionNumbers.LS shr 16);
@@ -1501,7 +1500,7 @@ var
     RegisterScriptFunc('GETVERSIONNUMBERSSTRING', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Integer)
     begin
       var VersionNumbers: TFileVersionNumbers;
-      if GetVersionNumbersRedir(ScriptFuncDisableFsRedir, Stack.GetString(PStart-1), VersionNumbers) then begin
+      if GetVersionNumbers(Stack.GetString(PStart-1), VersionNumbers) then begin
         Stack.SetString(PStart-2, Format('%u.%u.%u.%u', [VersionNumbers.MS shr 16,
           VersionNumbers.MS and $FFFF, VersionNumbers.LS shr 16, VersionNumbers.LS and $FFFF]));
         Stack.SetBool(PStart, True);
@@ -1511,7 +1510,7 @@ var
     RegisterScriptFunc('GETPACKEDVERSION', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Integer)
     begin
       var VersionNumbers: TFileVersionNumbers;
-      if GetVersionNumbersRedir(ScriptFuncDisableFsRedir, Stack.GetString(PStart-1), VersionNumbers) then begin
+      if GetVersionNumbers(Stack.GetString(PStart-1), VersionNumbers) then begin
         Stack.SetInt64(PStart-2, VersionNumbersToInt64(VersionNumbers));
         Stack.SetBool(PStart, True);
       end else
@@ -1855,17 +1854,6 @@ var
     begin
       Stack.SetBool(PStart, SaveStringsToFile(Stack.GetString(PStart-1), Stack, PStart-2, Stack.GetBool(PStart-3), True, True));
     end);
-    RegisterScriptFunc('ENABLEFSREDIRECTION', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Integer)
-    begin
-      Stack.SetBool(PStart, not ScriptFuncDisableFsRedir);
-      if Stack.GetBool(PStart-1) then
-        ScriptFuncDisableFsRedir := False
-      else begin
-        if not IsWin64 then
-          InternalError('Cannot disable FS redirection on this version of Windows');
-        ScriptFuncDisableFsRedir := True;
-      end;
-    end);
     RegisterScriptFunc('GETUNINSTALLPROGRESSFORM', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Integer)
     begin
       Stack.SetClass(PStart, GetUninstallProgressForm);
@@ -1921,10 +1909,10 @@ var
       try
         try
           if SetupHeader.SevenZipLibraryName <> '' then
-            ExtractArchiveRedir(ScriptFuncDisableFsRedir, Stack.GetString(PStart), Stack.GetString(PStart-1),
+            ExtractArchive(Stack.GetString(PStart), Stack.GetString(PStart-1),
               Password, Stack.GetBool(FullDirsItemNo), Throttler.OnExtractionProgress)
           else
-            Extract7ZipArchiveRedir(ScriptFuncDisableFsRedir, Stack.GetString(PStart), Stack.GetString(PStart-1),
+            Extract7ZipArchive(Stack.GetString(PStart), Stack.GetString(PStart-1),
               Password, Stack.GetBool(FullDirsItemNo), Throttler.OnExtractionProgress);
         except
           on E: EAbort do

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

@@ -2,7 +2,7 @@ unit Setup.WizardForm.CustomPages;
 
 {
   Inno Setup
-  Copyright (C) 1997-2025 Jordan Russell
+  Copyright (C) 1997-2026 Jordan Russell
   Portions by Martijn Laan
   For conditions of distribution and use, see LICENSE.TXT.
 
@@ -1286,9 +1286,9 @@ begin
     for var A in FArchives do begin
       { Don't need to set DownloadTemporaryFileOrExtractArchiveProcessMessages before extraction since we already process messages ourselves }
       if SetupHeader.SevenZipLibraryName <> '' then
-        ExtractArchiveRedir(ScriptFuncDisableFsRedir, A.FileName, A.DestDir, A.Password, A.FullPaths, InternalOnExtractionProgress)
+        ExtractArchive(A.FileName, A.DestDir, A.Password, A.FullPaths, InternalOnExtractionProgress)
       else
-        Extract7ZipArchiveRedir(ScriptFuncDisableFsRedir, A.FileName, A.DestDir, A.Password, A.FullPaths, InternalOnExtractionProgress);
+        Extract7ZipArchive(A.FileName, A.DestDir, A.Password, A.FullPaths, InternalOnExtractionProgress);
     end;
   except
     on E: EAbort do

+ 0 - 1
Projects/Src/Shared.ScriptFunc.pas

@@ -559,7 +559,6 @@ initialization
     'function SaveStringsToFile(const FileName: String; const S: TArrayOfString; const Append: Boolean): Boolean;',
     'function SaveStringsToUTF8File(const FileName: String; const S: TArrayOfString; const Append: Boolean): Boolean;',
     'function SaveStringsToUTF8FileWithoutBOM(const FileName: String; const S: TArrayOfString; const Append: Boolean): Boolean;',
-    'function EnableFsRedirection(const Enable: Boolean): Boolean;',
     'function GetUninstallProgressForm: TUninstallProgressForm;',
     'function CreateCallback(Method: AnyMethod): NativeInt;',
     'function IsDotNetInstalled(const MinVersion: TDotNetVersion; const MinServicePack: Cardinal): Boolean;',

+ 2 - 1
whatsnew.htm

@@ -102,7 +102,8 @@ For conditions of distribution and use, see <a href="files/is/license.txt">LICEN
 <li>The Compiler IDE has been renamed from <tt>Compil32.exe</tt> to <tt>ISIDE.exe</tt>.</li>
 <li>Pascal Scripting:
 <ul>
-  <li>Added support function <tt>IsCurrentProcess64Bit</tt>.</li>
+  <li>Removed support function <tt>EnableFsRedirection</tt>. Use <tt>{sysnative}</tt>, or a 64-bit installer, or new support function <tt>ApplyPathRedirRulesForCurrentProcess</tt> instead.</li>
+  <li>Added support functions <tt>ApplyPathRedirRules</tt> and <tt>IsCurrentProcess64Bit</tt>.</li>
   <li>Added types <tt>UInt64</tt>, <tt>NativeInt</tt>, <tt>NativeUInt</tt>, <tt>THandle</tt>, <tt>HWND</tt>, <tt>HDC</tt>, <tt>HBITMAP</tt>, <tt>HFONT</tt>, <tt>HKEY</tt>, <tt>HMODULE</tt>, <tt>LRESULT</tt>, <tt>WPARAM</tt>, and <tt>LPARAM</tt>.</li>
   <li>Support function <tt>Chr</tt> now correctly accepts ordinal values greater than 255.</li>
   <li>Support function <tt>FloatToStr</tt> no longer outputs unnecessary trailing zeros.</li>