Browse Source

Merge branch 'main' into msgbox-designer

Martijn Laan 5 years ago
parent
commit
ff74ca0144

+ 3 - 3
CONTRIBUTING.md

@@ -1,14 +1,14 @@
 Inno Setup
 ==========
 
-Copyright (C) 1997-2018 Jordan Russell. All rights reserved.  
-Portions Copyright (C) 2000-2018 Martijn Laan. All rights reserved.  
+Copyright (C) 1997-2020 Jordan Russell. All rights reserved.  
+Portions Copyright (C) 2000-2020 Martijn Laan. All rights reserved.  
 For conditions of distribution and use, see LICENSE.TXT.
 
 Contributing issues
 -------------------
 
-To report bugs or request new features use the [newsgroups](https://jrsoftware.org/forums.php) (web-based interface available).
+To report bugs or request new features use the [forum](https://jrsoftware.org/forums.php).
 
 Contributing new code or documentation updates
 ----------------------------------------------

BIN
Examples/MyDll.dll


BIN
Examples/MyProg-ARM64.exe


BIN
Examples/MyProg-x64.exe


BIN
Examples/MyProg.exe


+ 1 - 1
Files/Default.isl

@@ -1,4 +1,4 @@
-; *** Inno Setup version 6.0.6+ English messages ***
+; *** Inno Setup version 6.1.0+ English messages ***
 ;
 ; To download user-contributed translations of this file, go to:
 ;   https://jrsoftware.org/files/istrans/

+ 6 - 6
Files/ISPPBuiltins.iss

@@ -61,8 +61,8 @@
 #define Yes                True
 #define No								 False
 //
-#define MaxInt             0x7FFFFFFFL
-#define MinInt             0x80000000L
+#define MaxInt             0x7FFFFFFFFFFFFFFFL
+#define MinInt             0x8000000000000000L
 //
 #define NULL
 #define void
@@ -227,7 +227,7 @@
 // each element, i.e. elements must be within 0...255 range).
 //
 #define EncodeVer(int Major, int Minor, int Revision = 0, int Build = -1) \
-  Major << 24 | (Minor & 0xFF) << 16 | (Revision & 0xFF) << 8 | (Build >= 0 ? Build & 0xFF : 0)
+  (Major & 0xFF) << 24 | (Minor & 0xFF) << 16 | (Revision & 0xFF) << 8 | (Build >= 0 ? Build & 0xFF : 0)
 //
 // DecodeVer
 //
@@ -236,11 +236,11 @@
 // is 0, it won't be shown anyway).
 //
 #define DecodeVer(int Ver, int Digits = 3) \
-  Str(Ver >> 0x18 & 0xFF) + (Digits > 1 ? "." : "") + \
+  Str(Ver >> 24 & 0xFF) + (Digits > 1 ? "." : "") + \
   (Digits > 1 ? \
-    Str(Ver >> 0x10 & 0xFF) + (Digits > 2 ? "." : "") : "") + \
+    Str(Ver >> 16 & 0xFF) + (Digits > 2 ? "." : "") : "") + \
   (Digits > 2 ? \
-    Str(Ver >> 0x08 & 0xFF) + (Digits > 3 && (Local = Ver & 0xFF) ? "." : "") : "") + \
+    Str(Ver >> 8 & 0xFF) + (Digits > 3 && (Local = Ver & 0xFF) ? "." : "") : "") + \
   (Digits > 3 && Local ? \
     Str(Ver & 0xFF) : "")
 //

+ 1 - 1
Files/Languages/Corsican.isl

@@ -1,4 +1,4 @@
-; *** Inno Setup version 6.0.6+ Corsican messages ***
+; *** Inno Setup version 6.1.0+ Corsican messages ***
 ;
 ; To download user-contributed translations of this file, go to:
 ;   https://jrsoftware.org/files/istrans/

+ 1 - 1
Files/Languages/Dutch.isl

@@ -1,4 +1,4 @@
-; *** Inno Setup version 6.0.6+ Dutch messages ***
+; *** Inno Setup version 6.1.0+ Dutch messages ***
 ;
 ; This file is based on user-contributed translations by various authors
 ;

+ 2 - 2
Files/Languages/Russian.isl

@@ -1,4 +1,4 @@
-; *** Inno Setup version 6.0.6+ Russian messages ***
+; *** Inno Setup version 6.1.0+ Russian messages ***
 ;
 ; Translated from English by Dmitry Kann, yktooo at gmail.com
 ;
@@ -89,7 +89,7 @@ ButtonNewFolder=&
 
 ; *** "Select Language" dialog messages
 SelectLanguageTitle=Выберите язык установки
-SelectLanguageLabel=Выберите язык, который будет использован в  процессе установки.
+SelectLanguageLabel=Выберите язык, который будет использован в процессе установки.
 
 ; *** Common wizard text
 ClickNext=Нажмите «Далее», чтобы продолжить, или «Отмена», чтобы выйти из программы установки.

+ 1 - 1
Files/Languages/Unofficial/Lithuanian.isl

@@ -1,4 +1,4 @@
-; *** Inno Setup version 6.0.6+ Lithuanian messages ***
+; *** Inno Setup version 6.1.0+ Lithuanian messages ***
 ;
 ; To download user-contributed translations of this file, go to:
 ;   https://jrsoftware.org/files/istrans/

BIN
Files/isbunzip.dll


BIN
Files/isbzip.dll


BIN
Files/islzma.dll


BIN
Files/islzma32.exe


BIN
Files/islzma64.exe


BIN
Files/isscint.dll


BIN
Files/isunzlib.dll


BIN
Files/iszlib.dll


+ 17 - 7
ISHelp/isetup.xml

@@ -86,7 +86,7 @@
 <body>
 
 <p>
-<b>Inno Setup version 6.0.6</b><br/>
+<b>Inno Setup version 6.1.0</b><br/>
 <b>Copyright &copy; 1997-2020 Jordan Russell. All rights reserved.</b><br/>
 <b>Portions Copyright &copy; 2000-2020 Martijn Laan. All rights reserved.</b><br/>
 <extlink href="https://jrsoftware.org/">Inno Setup home page</extlink>
@@ -320,6 +320,7 @@ This " contains " embedded " quotes
 <keyword value="{autocf64}" anchor="autocf64" />
 <keyword value="{autodesktop}" anchor="autodesktop" />
 <keyword value="{autodocs}" anchor="autodocs" />
+<keyword value="{autofonts}" anchor="autofonts" />
 <keyword value="{autopf}" anchor="autopf" />
 <keyword value="{autopf32}" anchor="autopf32" />
 <keyword value="{autopf64}" anchor="autopf64" />
@@ -352,6 +353,7 @@ This " contains " embedded " quotes
 <keyword value="{dotnet4032}" anchor="dotnet4032" />
 <keyword value="{dotnet4064}" anchor="dotnet4064" />
 <keyword value="{drive:...}" anchor="drive" />
+<keyword value="{commonfonts}" anchor="commonfonts" />
 <keyword value="{fonts}" anchor="fonts" />
 <keyword value="{group}" anchor="group" />
 <keyword value="{groupname}" anchor="groupname" />
@@ -383,6 +385,7 @@ This " contains " embedded " quotes
 <keyword value="{userdesktop}" anchor="userdesktop" />
 <keyword value="{userdocs}" anchor="userdocs" />
 <keyword value="{userfavorites}" anchor="userfavorites" />
+<keyword value="{userfonts}" anchor="userfonts" />
 <keyword value="{userinfoname}" anchor="userinfoname" />
 <keyword value="{userinfoorg}" anchor="userinfoorg" />
 <keyword value="{userinfoserial}" anchor="userinfoserial" />
@@ -487,9 +490,9 @@ For example: If you used <tt>{src}\MYPROG.EXE</tt> on an entry and the user is i
 <p>Temporary directory used by Setup or Uninstall. This is <i>not</i> the value of the user's TEMP environment variable. It is a subdirectory of the user's temporary directory which is created by Setup or Uninstall at startup (with a name like "C:\WINDOWS\TEMP\IS-xxxxx.tmp"). All files and subdirectories in this directory are deleted when Setup or Uninstall exits. During Setup, this is primarily useful for extracting files that are to be executed in the [Run] section but aren't needed after the installation.</p>
 </dd>
 
-<dt><b><a name="fonts">{fonts}</a></b></dt>
+<dt><b><a name="commonfonts">{commonfonts}</a></b></dt>
 <dd>
-<p>Fonts directory. Normally named "FONTS" under the Windows directory.</p>
+<p>Fonts directory. Normally named "Fonts" under the Windows directory.</p>
 </dd>
 
 <dt><b><a name="dao">{dao}</a></b></dt>
@@ -589,6 +592,11 @@ For example: If you used <tt>{src}\MYPROG.EXE</tt> on an entry and the user is i
 <p>The path to the current user's Favorites folder. (There is no common Favorites folder.)</p>
 </dd>
 
+<dt><b><a name="userfonts">{userfonts}</a></b></dt>
+<dd>
+<p>The path to the current user's Fonts folder. Only Windows 10 Version 1803 and later supports <tt>{userfonts}</tt>. Same directory as <tt>{localappdata}\Microsoft\Windows\Fonts</tt>.</p>
+</dd>
+
 <dt><b><a name="userpf">{userpf}</a></b></dt>
 <dd>
 <p>The path to the current user's Program Files directory. Only Windows 7 and later supports <tt>{userpf}</tt>; if used on previous Windows versions, it will translate to the same directory as <tt>{localappdata}\Programs</tt>.</p>
@@ -640,6 +648,7 @@ For example: If you used <tt>{src}\MYPROG.EXE</tt> on an entry and the user is i
 <tr><td><tt><a name="autocf64">autocf64</a></tt></td><td><tt>commoncf64</tt></td><td><tt>usercf</tt></td></tr>
 <tr><td><tt><a name="autodesktop">autodesktop</a></tt></td><td><tt>commondesktop</tt></td><td><tt>userdesktop</tt></td></tr>
 <tr><td><tt><a name="autodocs">autodocs</a></tt></td><td><tt>commondocs</tt></td><td><tt>userdocs</tt></td></tr>
+<tr><td><tt><a name="autofonts">autofonts</a></tt></td><td><tt>commonfonts</tt></td><td><tt>userfonts</tt></td></tr>
 <tr><td><tt><a name="autopf">autopf</a></tt></td><td><tt>commonpf</tt></td><td><tt>userpf</tt></td></tr>
 <tr><td><tt><a name="autopf32">autopf32</a></tt></td><td><tt>commonpf32</tt></td><td><tt>userpf</tt></td></tr>
 <tr><td><tt><a name="autopf64">autopf64</a></tt></td><td><tt>commonpf64</tt></td><td><tt>userpf</tt></td></tr>
@@ -660,6 +669,7 @@ For example: If you used <tt>{src}\MYPROG.EXE</tt> on an entry and the user is i
 <tr><td><tt><a name="cf">cf</a></tt></td><td><tt>commoncf</tt></td></tr>
 <tr><td><tt><a name="cf32">cf32</a></tt></td><td><tt>commoncf32</tt></td></tr>
 <tr><td><tt><a name="cf64">cf64</a></tt></td><td><tt>commoncf64</tt></td></tr>
+<tr><td><tt><a name="fonts">fonts</a></tt></td><td><tt>commonfonts</tt></td></tr>
 <tr><td><tt><a name="pf">pf</a></tt></td><td><tt>commonpf</tt></td></tr>
 <tr><td><tt><a name="pf32">pf32</a></tt></td><td><tt>commonpf32</tt></td></tr>
 <tr><td><tt><a name="pf64">pf64</a></tt></td><td><tt>commonpf64</tt></td></tr>
@@ -1624,11 +1634,11 @@ ExternalSize: 1048576; Flags: external
 <param name="FontInstall">
 <p>Tells Setup the file is a font that needs to be installed. The value of this parameter is the name of the font as stored in the registry or WIN.INI. This must be exactly the same name as you see when you double-click the font file in Explorer. Note that Setup will automatically append " (TrueType)" to the end of the name.</p>
 <p>If the file is not a TrueType font, you must specify the flag <tt>fontisnttruetype</tt> in the Flags parameter.</p>
-<p>It's recommended that you use the flags <tt>onlyifdoesntexist</tt> and <tt>uninsneveruninstall</tt> when installing fonts to the {fonts} directory.</p>
-<p>To successfully install a font, the user must be a member of the Administrators groups.</p>
-<p>For compatibility with 64-bit Windows, fonts should not be installed to the <tt>{sys}</tt> directory. Use <tt>{fonts}</tt> as the destination directory instead.</p>
+<p>It's recommended that you use the flags <tt>onlyifdoesntexist</tt> and <tt>uninsneveruninstall</tt> when installing fonts to the {autofonts} directory.</p>
+<p>If the installation is running in <link topic="admininstallmode">non administrative install mode</link>, Windows 10 Version 1803 or later is required successfully install a font.</p>
+<p>For compatibility with 64-bit Windows, fonts should not be installed to the <tt>{sys}</tt> directory. Use <tt>{autofonts}</tt> as the destination directory instead.</p>
 <example>
-<pre>Source: "OZHANDIN.TTF"; DestDir: "{fonts}"; FontInstall: "Oz Handicraft BT"; Flags: onlyifdoesntexist uninsneveruninstall</pre>
+<pre>Source: "OZHANDIN.TTF"; DestDir: "{autofonts}"; FontInstall: "Oz Handicraft BT"; Flags: onlyifdoesntexist uninsneveruninstall</pre>
 </example>
 </param>
 

+ 109 - 77
ISHelp/isxfunc.xml

@@ -208,71 +208,6 @@ end;</pre></example>
 <p>An exception will be raised if there was an error expanding the constants.</p></description>
       </function>
     </subcategory>
-    <subcategory>
-      <function>
-        <name>ExtractTemporaryFile</name>
-        <prototype>procedure ExtractTemporaryFile(const FileName: String);</prototype>
-        <description><p>Extracts the specified file from the [Files] section to a temporary directory. To find the location of the temporary directory, use <tt>ExpandConstant('{tmp}')</tt>.</p>
-<p>The extracted files are automatically deleted when Setup exits.</p>
-<p>An exception will be raised if the file wasn't extracted successfully, if the file wasn't found, or if the file was found but couldn't be processed because of its MinVersion and/or OnlyBelowVersion parameters.</p></description>
-        <remarks><p>Use <tt>Flags: dontcopy</tt> in the [Files] section to tell Setup to skip the file during the normal file copying stage.</p>
-<p>Use <tt>Flags: noencryption</tt> in the [Files] section if encryption is enabled and you call the ExtractTemporaryFile function prior to the user entering the correct password.</p>
-<p>When solid compression is enabled, be sure to list your temporary files at (or near) the top of the [Files] section. In order to extract an arbitrary file in a solid-compressed installation, Setup must first decompress all prior files (to a temporary buffer in memory). This can result in a substantial delay if a number of other files are listed above the specified file in the [Files] section.</p></remarks>
-        <seealso><p><link topic="isxfunc_ExtractTemporaryFiles">ExtractTemporaryFiles</link></p></seealso>
-        <example><pre>[Files]
-Source: "Readme.txt"; Flags: dontcopy noencryption
-
-[Code]
-function InitializeSetup: Boolean;
-var
-  S: AnsiString;
-begin
-  // Show the contents of Readme.txt (non Unicode) in a message box
-  ExtractTemporaryFile('Readme.txt');
-  if LoadStringFromFile(ExpandConstant('{tmp}\Readme.txt'), S) then
-  begin
-    MsgBox(S, mbInformation, MB_OK);
-  end;
-
-  Result := True;
-end;</pre></example>
-      </function>
-      <function>
-        <name>ExtractTemporaryFiles</name>
-        <prototype>function ExtractTemporaryFiles(const Pattern: String): Integer;</prototype>
-        <description><p>Extracts the files matching the wildcard specified by Pattern from the [Files] section to a temporary directory. Returns the number of extracted files. To find the location of the temporary directory, use <tt>ExpandConstant('{tmp}')</tt>.</p>
-<p>The extracted files are automatically deleted when Setup exits.</p>
-<p>An exception will be raised if no files were extracted successfully, no files were found, or if files were found but none could be processed because of their MinVersion and/or OnlyBelowVersion parameters.</p></description>
-        <remarks><p>Use <tt>Flags: dontcopy</tt> in the [Files] section to tell Setup to skip the file during the normal file copying stage.</p>
-<p>When solid compression is enabled, be sure to list your temporary files at (or near) the top of the [Files] section. In order to extract an arbitrary file in a solid-compressed installation, Setup must first decompress all prior files (to a temporary buffer in memory). This can result in a substantial delay if a number of other files are listed above the specified file in the [Files] section.</p></remarks>
-        <seealso><p><link topic="isxfunc_ExtractTemporaryFile">ExtractTemporaryFile</link></p></seealso>
-        <example><pre>[Files]
-Source: "Readme.txt"; Flags: dontcopy
-Source: "MyProg.exe"; DestDir: "{app}"
-Source: "MyProg.chm"; DestDir: "{app}"
-
-[Code]
-function InitializeSetup: Boolean;
-var
-  S: AnsiString;
-  ResultCode: Integer;
-begin
-  // Show the contents of Readme.txt (non Unicode) in a message box
-  ExtractTemporaryFiles('{tmp}\Readme.txt');
-  if LoadStringFromFile(ExpandConstant('{tmp}\Readme.txt'), S) then
-  begin
-    MsgBox(S, mbInformation, MB_OK);
-  end;
-
-  // Extract all MyProg files and launch it. Note how {app} is left unexpanded.
-  ExtractTemporaryFiles('{app}\MyProg.*');
-  ExecAsOriginalUser(ExpandConstant('{tmp}\')+'{app}\MyProg.exe', '', '',
-    SW_SHOWNORMAL, ewWaitUntilTerminated, ResultCode);
-
-  Result := True;
-end;</pre></example>
-      </function>
-    </subcategory>
     <subcategory>
       <function>
         <name>GetPreviousData</name>
@@ -1012,12 +947,12 @@ end;</pre></example>
       <function>
         <name>StrToInt64Def</name>
         <prototype>function StrToInt64Def(s: string; def: Int64): Int64;</prototype>
-        <description><p>The StrToInt64Def function converts the string passed in S into a 64-bit number. If S does not represent a valid 64-bit number, StrToInt returns the 64-bit number passed in Def.</p><p>Requires Unicode Inno Setup.</p></description>
+        <description><p>The StrToInt64Def function converts the string passed in S into a 64-bit number. If S does not represent a valid 64-bit number, StrToInt returns the 64-bit number passed in Def.</p></description>
       </function>
       <function>
         <name>StrToInt64</name>
         <prototype>function StrToInt64(s: string): Int64;</prototype>
-        <description><p>The StrToInt64 function converts the string passed in S into a 64-bit number.</p><p>Requires Unicode Inno Setup.</p></description>
+        <description><p>The StrToInt64 function converts the string passed in S into a 64-bit number.</p></description>
         <remarks><p>Use of <link topic="isxfunc_StrToInt64Def">StrToInt64Def</link> instead of StrToInt64 is recommended.</p></remarks>
       </function>
       <function>
@@ -1028,12 +963,12 @@ end;</pre></example>
       <function>
         <name>IntToStr</name>
         <prototype>function IntToStr(i: Int64): String;</prototype>
-        <description><p>The IntToStr function converts an 32-bit or 64-bit number into a string.</p><p>64-bit numbers require Unicode Inno Setup.</p></description>
+        <description><p>The IntToStr function converts a 64-bit number into a string.</p></description>
       </function>
       <function>
         <name>FloatToStr</name>
         <prototype>function FloatToStr(e: extended): String;</prototype>
-        <description><p>The FloatToStr function converts a floating point number into a string.</p><p>Unicode Inno Setup: the character used for the decimal point will always be a dot. Non-Unicode Inno Setup: the character used for the decimal point is locale-dependant.</p></description>
+        <description><p>The FloatToStr function converts a floating point number into a string.</p><p>The character used for the decimal point will always be a dot.</p></description>
       </function>
     </subcategory>
     <subcategory>
@@ -1222,7 +1157,7 @@ end;
       <function>
         <name>GetMD5OfUnicodeString</name>
         <prototype>function GetMD5OfUnicodeString(const S: String): String;</prototype>
-        <description><p>Gets the MD5 sum of the specified string, as a string.</p><p>Causes an internal error if called by non Unicode Setup or Uninstall.</p></description>
+        <description><p>Gets the MD5 sum of the specified string, as a string.</p></description>
         <example><pre>var
   MD5: String;
 begin
@@ -1246,13 +1181,37 @@ end;
       <function>
         <name>GetSHA1OfUnicodeString</name>
         <prototype>function GetSHA1OfUnicodeString(const S: String): String;</prototype>
-        <description><p>Gets the SHA-1 hash of the specified string, as a string.</p><p>Causes an internal error if called by non Unicode Setup or Uninstall.</p></description>
+        <description><p>Gets the SHA-1 hash of the specified string, as a string.</p></description>
         <example><pre>var
   SHA1: String;
 begin
   SHA1 := GetSHA1OfUnicodeString('Test');
   // SHA1 = '9ab696a37604d665dc97134dbee44cfe70451b1a'
 end;
+</pre></example>
+      </function>
+      <function>
+        <name>GetSHA256OfString</name>
+        <prototype>function GetSHA256OfString(const S: AnsiString): String;</prototype>
+        <description><p>Gets the SHA-256 hash of the specified string, as a string.</p></description>
+        <example><pre>var
+  SHA256: String;
+begin
+  SHA256 := GetSHA256OfString('Test');
+  // SHA256 = '9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08'
+end;
+</pre></example>
+      </function>
+      <function>
+        <name>GetSHA256OfUnicodeString</name>
+        <prototype>function GetSHA256OfUnicodeString(const S: String): String;</prototype>
+        <description><p>Gets the SHA-256 hash of the specified string, as a string.</p></description>
+        <example><pre>var
+  SHA256: String;
+begin
+  SHA256 := GetSHA256OfUnicodeString('Test');
+  // SHA256 = 'fe520676b1a1d93dabab2319eea03674f3632eaeeb163d1e88244f5eb1de10eb'
+end;
 </pre></example>
       </function>
     </subcategory>
@@ -1307,14 +1266,13 @@ end;
       <function>
         <name>VarIsEmpty</name>
         <prototype>function VarIsEmpty(const V: Variant): Boolean;</prototype>
-        <description><p>Non Unicode Inno Setup: Returns True if the specified variant's value is undefined. Unicode Inno Setup: Returns True if the specified variant is unassigned.</p></description>
+        <description><p>Returns True if the specified variant is unassigned.</p></description>
         <seealso><p><link topic="isxfunc_VarIsClear">VarIsClear</link></p></seealso>
       </function>
       <function>
         <name>VarIsClear</name>
         <prototype>function VarIsClear(const V: Variant): Boolean;</prototype>
         <description><p>Returns True if the specified variant's value is undefined.</p></description>
-        <remarks><p>Requires Unicode Inno Setup.</p></remarks>
         <seealso><p><link topic="isxfunc_VarIsEmpty">VarIsEmpty</link></p></seealso>
       </function>
       <function>
@@ -1375,7 +1333,12 @@ const
       <function>
         <name>FileSize</name>
         <prototype>function FileSize(const Name: String; var Size: Integer): Boolean;</prototype>
-        <description><p>Sets Size to the size of the specified file in bytes. Returns True if the file size was set successfully and False otherwise. Only supports file sizes smaller than 2 GB. To get all 64 bits of the file size, use <link topic="isxfunc_FindFirst">FindFirst</link>/<link topic="isxfunc_FindClose">FindClose</link> instead.</p></description>
+        <description><p>Sets Size to the size of the specified file in bytes. Returns True if the file size was set successfully and False otherwise. Only supports file sizes smaller than 2 GB. To get all 64 bits of the file size, use <link topic="isxfunc_FileSize64">FileSize64</link> instead.</p></description>
+      </function>
+      <function>
+        <name>FileSize64</name>
+        <prototype>function FileSize64(const Name: String; var Size: Int64): Boolean;</prototype>
+        <description><p>Sets Size to the size of the specified file in bytes. Returns True if the file size was set successfully and False otherwise.</p></description>
       </function>
       <function>
         <name>GetSpaceOnDisk</name>
@@ -1403,7 +1366,6 @@ end;</pre></example>
         <name>GetSpaceOnDisk64</name>
         <prototype>function GetSpaceOnDisk64(const Path: String; var Free, Total: Int64): Boolean;</prototype>
         <description><p>Returns the number of free and total bytes on a drive. Path specifies a directory on the drive or UNC share to check; it can be either the root (e.g. <tt>C:\</tt>) or an existing subdirectory. Returns True if successful, False otherwise.</p></description>
-        <remarks><p>Requires Unicode Inno Setup.</p></remarks>
         <example><pre>var
   Path: String;
   FreeBytes, TotalBytes: Int64;
@@ -1608,6 +1570,11 @@ end;</pre></example>
         <prototype>function GetSHA1OfFile(const Filename: String): String;</prototype>
         <description><p>Gets the SHA-1 hash of the specified file, as a string. An exception will be raised upon failure.</p></description>
       </function>
+      <function>
+        <name>GetSHA256OfFile</name>
+        <prototype>function GetSHA256OfFile(const Filename: String): String;</prototype>
+        <description><p>Gets the SHA-256 hash of the specified file, as a string. An exception will be raised upon failure.</p></description>
+      </function>
     </subcategory>
     <subcategory>
       <function>
@@ -1710,6 +1677,71 @@ end;</pre></example>
 <p>Refer to the <a href="http://msdn.microsoft.com/en-us/library/windows/desktop/ms681381.aspx">system error codes on MSDN</a>.</p></remarks>
       </function>
     </subcategory>
+    <subcategory>
+      <function>
+        <name>ExtractTemporaryFile</name>
+        <prototype>procedure ExtractTemporaryFile(const FileName: String);</prototype>
+        <description><p>Extracts the specified file from the [Files] section to a temporary directory. To find the location of the temporary directory, use <tt>ExpandConstant('{tmp}')</tt>.</p>
+<p>The extracted files are automatically deleted when Setup exits.</p>
+<p>An exception will be raised if the file wasn't extracted successfully, if the file wasn't found, or if the file was found but couldn't be processed because of its MinVersion and/or OnlyBelowVersion parameters.</p></description>
+        <remarks><p>Use <tt>Flags: dontcopy</tt> in the [Files] section to tell Setup to skip the file during the normal file copying stage.</p>
+<p>Use <tt>Flags: noencryption</tt> in the [Files] section if encryption is enabled and you call the ExtractTemporaryFile function prior to the user entering the correct password.</p>
+<p>When solid compression is enabled, be sure to list your temporary files at (or near) the top of the [Files] section. In order to extract an arbitrary file in a solid-compressed installation, Setup must first decompress all prior files (to a temporary buffer in memory). This can result in a substantial delay if a number of other files are listed above the specified file in the [Files] section.</p></remarks>
+        <seealso><p><link topic="isxfunc_ExtractTemporaryFiles">ExtractTemporaryFiles</link></p></seealso>
+        <example><pre>[Files]
+Source: "Readme.txt"; Flags: dontcopy noencryption
+
+[Code]
+function InitializeSetup: Boolean;
+var
+  S: AnsiString;
+begin
+  // Show the contents of Readme.txt (non Unicode) in a message box
+  ExtractTemporaryFile('Readme.txt');
+  if LoadStringFromFile(ExpandConstant('{tmp}\Readme.txt'), S) then
+  begin
+    MsgBox(S, mbInformation, MB_OK);
+  end;
+
+  Result := True;
+end;</pre></example>
+      </function>
+      <function>
+        <name>ExtractTemporaryFiles</name>
+        <prototype>function ExtractTemporaryFiles(const Pattern: String): Integer;</prototype>
+        <description><p>Extracts the files matching the wildcard specified by Pattern from the [Files] section to a temporary directory. Returns the number of extracted files. To find the location of the temporary directory, use <tt>ExpandConstant('{tmp}')</tt>.</p>
+<p>The extracted files are automatically deleted when Setup exits.</p>
+<p>An exception will be raised if no files were extracted successfully, no files were found, or if files were found but none could be processed because of their MinVersion and/or OnlyBelowVersion parameters.</p></description>
+        <remarks><p>Use <tt>Flags: dontcopy</tt> in the [Files] section to tell Setup to skip the file during the normal file copying stage.</p>
+<p>When solid compression is enabled, be sure to list your temporary files at (or near) the top of the [Files] section. In order to extract an arbitrary file in a solid-compressed installation, Setup must first decompress all prior files (to a temporary buffer in memory). This can result in a substantial delay if a number of other files are listed above the specified file in the [Files] section.</p></remarks>
+        <seealso><p><link topic="isxfunc_ExtractTemporaryFile">ExtractTemporaryFile</link></p></seealso>
+        <example><pre>[Files]
+Source: "Readme.txt"; Flags: dontcopy
+Source: "MyProg.exe"; DestDir: "{app}"
+Source: "MyProg.chm"; DestDir: "{app}"
+
+[Code]
+function InitializeSetup: Boolean;
+var
+  S: AnsiString;
+  ResultCode: Integer;
+begin
+  // Show the contents of Readme.txt (non Unicode) in a message box
+  ExtractTemporaryFiles('{tmp}\Readme.txt');
+  if LoadStringFromFile(ExpandConstant('{tmp}\Readme.txt'), S) then
+  begin
+    MsgBox(S, mbInformation, MB_OK);
+  end;
+
+  // Extract all MyProg files and launch it. Note how {app} is left unexpanded.
+  ExtractTemporaryFiles('{app}\MyProg.*');
+  ExecAsOriginalUser(ExpandConstant('{tmp}\')+'{app}\MyProg.exe', '', '',
+    SW_SHOWNORMAL, ewWaitUntilTerminated, ResultCode);
+
+  Result := True;
+end;</pre></example>
+      </function>
+    </subcategory>
     <subcategory>
       <function>
         <name>RenameFile</name>
@@ -1765,7 +1797,7 @@ end;</pre></example>
       <function>
         <name>SaveStringsToUTF8File</name>
         <prototype>function SaveStringsToUTF8File(const FileName: String; const S: TArrayOfString; const Append: Boolean): Boolean;</prototype>
-        <description><p>Saves the specified string array to the specified file with UTF8 encoding. If Append is True and the specified file already exists, it will be appended to instead of overwritten. Returns True if successful, False otherwise.</p><p>Causes an internal error if called by non Unicode Setup or Uninstall.</p></description>
+        <description><p>Saves the specified string array to the specified file with UTF8 encoding. If Append is True and the specified file already exists, it will be appended to instead of overwritten. Returns True if successful, False otherwise.</p></description>
         <seealso><p><link topic="isxfunc_SaveStringsToFile">SaveStringsToFile</link></p></seealso>
       </function>
     </subcategory>
@@ -1892,7 +1924,7 @@ end;</pre>
       </function>
       <function>
         <name>UnregisterFont</name>
-        <prototype>procedure UnregisterFont(const FontName, FontFilename: String);</prototype>
+        <prototype>procedure UnregisterFont(const FontName, FontFilename: String; const PerUserFont: Boolean);</prototype>
         <description><p>Unregisters the font with the specified face and filename.</p></description>
       </function>
       <function>

+ 5 - 5
Projects/Compile.pas

@@ -2891,21 +2891,21 @@ const
   UserConsts: array[0..3] of String = (
     'userpf', 'usercf', 'usersavedgames', 'username');
   Consts: array[0..42] of String = (
-    'src', 'srcexe', 'tmp', 'app', 'win', 'sys', 'sd', 'groupname', 'fonts', 'hwnd',
+    'src', 'srcexe', 'tmp', 'app', 'win', 'sys', 'sd', 'groupname', 'commonfonts', 'hwnd',
     'commonpf', 'commonpf32', 'commonpf64', 'commoncf', 'commoncf32', 'commoncf64',
     'autopf', 'autopf32', 'autopf64', 'autocf', 'autocf32', 'autocf64',
     'computername', 'dao', 'cmd', 'wizardhwnd', 'sysuserinfoname', 'sysuserinfoorg',
     'userinfoname', 'userinfoorg', 'userinfoserial', 'uninstallexe',
     'language', 'syswow64', 'sysnative', 'log', 'dotnet11', 'dotnet20', 'dotnet2032',
     'dotnet2064', 'dotnet40', 'dotnet4032', 'dotnet4064');
-  UserShellFolderConsts: array[0..8] of String = (
+  UserShellFolderConsts: array[0..9] of String = (
     'userdesktop', 'userstartmenu', 'userprograms', 'userstartup',
-    'userappdata', 'userdocs', 'usertemplates', 'userfavorites', 'usersendto');
-  ShellFolderConsts: array[0..16] of String = (
+    'userappdata', 'userdocs', 'usertemplates', 'userfavorites', 'usersendto', 'userfonts');
+  ShellFolderConsts: array[0..17] of String = (
     'group', 'commondesktop', 'commonstartmenu', 'commonprograms', 'commonstartup',
     'commonappdata', 'commondocs', 'commontemplates', 'localappdata',
     'autodesktop', 'autostartmenu', 'autoprograms', 'autostartup',
-    'autoappdata', 'autodocs', 'autotemplates', 'autofavorites');
+    'autoappdata', 'autodocs', 'autotemplates', 'autofavorites', 'autofonts');
   AllowedConstsNames: array[TAllowedConst] of String = (
     'olddata', 'break');
 var

+ 32 - 32
Projects/ISPP/Help/ispp.xml

@@ -59,9 +59,9 @@
 				</table>
 			</section>
 			<section title="Function prototypes documenting conventions">
-				<para>Function prototypes are shown as function result type, function name and list of formal arguments in parentheses.</para>
-				<para>Words <synel>int</synel>, <synel>str</synel>, <synel>any</synel>, and <synel>void</synel> are used to specify integer type, string type, any type, or null type (also referred to as nothing, void), respectively. Null type as function result means that function does not return any value.</para>
-				<para>Question mark (<synel>?</synel>) after the type of an argument means that this argument is optional.</para>
+				<para>Function prototypes show the function result type, function name and list of formal arguments in parentheses.</para>
+				<para>Keywords <synel>int</synel>, <synel>str</synel>, <synel>any</synel>, and <synel>void</synel> respectively specify the (signed 64-bit) integer type, the string type, any type, or the null type (also referred to as nothing, void). When the null type is specified as a function result type then the function does not return a value.</para>
+				<para>A question mark (<synel>?</synel>) after the type of an argument means that this argument is optional.</para>
 			</section>
 		</topic>
 		<topic id="directives">
@@ -632,7 +632,7 @@ The list of options is provided at the end of this topic.</para>
 					<pre>
 						<line>#pragma parseroption -b- -u+</line>
 						<line>#pragma option -c-</line>
-						<line>#pragma warning "Variable value is: " + MyVar</line>
+						<line>#pragma warning "Variable value is: " + Str(MyVar)</line>
 						<line>#pragma option -v+</line>
 						<line>#pragma verboselevel 9</line>
 						<line>#pragma inlinestart "$("</line>
@@ -767,7 +767,7 @@ The list of options is provided at the end of this topic.</para>
 					</pre>
 				</section>
 				<description>
-					<para>Returns size, in bytes, of the specified file. If the file does not exist, the result is -1. Beware of ISPP supporting only signed 32 bit integers: for files larger than 2 GB (and smaller than 4 GB) the result is negative.</para>
+					<para>Returns size, in bytes, of the specified file. If the file does not exist, the result is -1.</para>
 				</description>
 			</topic>
 			<topic id="ReadIni">
@@ -1327,7 +1327,7 @@ The list of options is provided at the end of this topic.</para>
 				<title>PackVersionComponents</title>
 				<section title="Prototype">
 					<pre>
-						<line>#define PackVersionComponents(int Major, int Minor, int Rev, int Build, *MS, *LS)</line>
+						<line><b>int</b> PackVersionComponents(<b>int</b> Major, <b>int</b> Minor, <b>int</b> Rev, <b>int</b> Build, <b>int</b> *MS, <b>int</b> *LS)</line>
 					</pre>
 				</section>
 				<description>
@@ -1347,7 +1347,7 @@ The list of options is provided at the end of this topic.</para>
 				<title>UnpackVersionComponents</title>
 				<section title="Prototype">
 					<pre>
-						<line>#define UnpackVersionComponents(int MS, int LS, *Major, *Minor, *Rev, *Build)</line>
+						<line><b>int</b> UnpackVersionComponents(<b>int</b> MS, <b>int</b> LS, <b>int</b> *Major, <b>int</b> *Minor, <b>int</b> *Rev, <b>int</b> *Build)</line>
 					</pre>
 				</section>
 				<description>
@@ -1369,7 +1369,7 @@ The list of options is provided at the end of this topic.</para>
 				<title>ParseVersion</title>
 				<section title="Prototype">
 					<pre>
-						<line>#define ParseVersion(str FileName, *Major, *Minor, *Rev, *Build)</line>
+						<line><b>str</b> ParseVersion(<b>str</b> FileName, <b>int</b> *Major, <b>int</b> *Minor, <b>int</b> *Rev, <b>int</b> *Build)</line>
 					</pre>
 				</section>
 				<description>
@@ -1381,7 +1381,7 @@ The list of options is provided at the end of this topic.</para>
 				<title>ParseVersionPacked</title>
 				<section title="Prototype">
 					<pre>
-						<line>#define ParseVersionPacked(str FileName, *MS, *LS)</line>
+						<line><b>str</b> ParseVersionPacked(<b>str</b> FileName, <b>int</b> *MS, <b>int</b> *LS)</line>
 					</pre>
 				</section>
 				<description>
@@ -1402,7 +1402,7 @@ The list of options is provided at the end of this topic.</para>
 				<title>EncodeVer</title>
 				<section title="Prototype">
 					<pre>
-						<line>#define EncodeVer(int Major, int Minor, int Revision = 0, int Build = -1)</line>
+						<line><b>int</b> EncodeVer(<b>int</b> Major, <b>int</b> Minor, <b>int</b> Revision = 0, <b>int</b> Build = -1)</line>
 					</pre>
 				</section>
 				<description>
@@ -1414,7 +1414,7 @@ The list of options is provided at the end of this topic.</para>
 				<title>DecodeVer</title>
 				<section title="Prototype">
 					<pre>
-						<line>#define DecodeVer(int Ver, int Digits = 3)</line>
+						<line><b>str</b> DecodeVer(<b>int</b> Ver, <b>int</b> Digits = 3)</line>
 					</pre>
 				</section>
 				<description>
@@ -1426,7 +1426,7 @@ The list of options is provided at the end of this topic.</para>
 				<title>FindSection</title>
 				<section title="Prototype">
 					<pre>
-						<line>#define FindSection(str Section = "Files")</line>
+						<line><b>int</b> FindSection(<b>str</b> Section = "Files")</line>
 					</pre>
 				</section>
 				<description>
@@ -1438,7 +1438,7 @@ The list of options is provided at the end of this topic.</para>
 				<title>FindSectionEnd</title>
 				<section title="Prototype">
 					<pre>
-						<line>#define FindSectionEnd(str Section = "Files")</line>
+						<line><b>int</b> FindSectionEnd(<b>str</b> Section = "Files")</line>
 					</pre>
 				</section>
 				<description>
@@ -1450,7 +1450,7 @@ The list of options is provided at the end of this topic.</para>
 				<title>FindCode</title>
 				<section title="Prototype">
 					<pre>
-						<line>#define FindCode()</line>
+						<line><b>int</b> FindCode()</line>
 					</pre>
 				</section>
 				<description>
@@ -1462,7 +1462,7 @@ The list of options is provided at the end of this topic.</para>
 				<title>ExtractFilePath</title>
 				<section title="Prototype">
 					<pre>
-						<line>#define ExtractFilePath(str PathName)</line>
+						<line><b>str</b> ExtractFilePath(<b>str</b> PathName)</line>
 					</pre>
 				</section>
 				<description>
@@ -1474,7 +1474,7 @@ The list of options is provided at the end of this topic.</para>
 				<title>ExtractFileDir</title>
 				<section title="Prototype">
 					<pre>
-						<line>#define ExtractFileDir(str PathName)</line>
+						<line><b>str</b> ExtractFileDir(<b>str</b> PathName)</line>
 					</pre>
 				</section>
 				<description>
@@ -1486,7 +1486,7 @@ The list of options is provided at the end of this topic.</para>
 				<title>ExtractFileExt</title>
 				<section title="Prototype">
 					<pre>
-						<line>#define ExtractFileExt(str PathName)</line>
+						<line><b>str</b> ExtractFileExt(<b>str</b> PathName)</line>
 					</pre>
 				</section>
 				<description>
@@ -1498,7 +1498,7 @@ The list of options is provided at the end of this topic.</para>
 				<title>ExtractFileName</title>
 				<section title="Prototype">
 					<pre>
-						<line>#define ExtractFileName(str PathName)</line>
+						<line><b>str</b> ExtractFileName(<b>str</b> PathName)</line>
 					</pre>
 				</section>
 				<description>
@@ -1510,7 +1510,7 @@ The list of options is provided at the end of this topic.</para>
 				<title>ChangeFileExt</title>
 				<section title="Prototype">
 					<pre>
-						<line>#define ChangeFileExt(str FileName, str NewExt)</line>
+						<line><b>str</b> ChangeFileExt(<b>str</b> FileName, <b>str</b> NewExt)</line>
 					</pre>
 				</section>
 				<description>
@@ -1522,7 +1522,7 @@ The list of options is provided at the end of this topic.</para>
 				<title>RemoveFileExt</title>
 				<section title="Prototype">
 					<pre>
-						<line>#define RemoveFileExt(str FileName)</line>
+						<line><b>void</b> RemoveFileExt(<b>str</b> FileName)</line>
 					</pre>
 				</section>
 				<description>
@@ -1534,11 +1534,11 @@ The list of options is provided at the end of this topic.</para>
 				<title>AddBackslash</title>
 				<section title="Prototype">
 					<pre>
-						<line>#define AddBackslash(str S)</line>
+						<line><b>str</b> AddBackslash(<b>str</b> S)</line>
 					</pre>
 				</section>
 				<description>
-					<para>Appends a backslash to the string, if it's not already there.</para>
+					<para>Appends a backslash to the string, if it's not already there, and returns the result.</para>
           <para>Declared in &builtins;.</para>
 				</description>
 			</topic>
@@ -1546,11 +1546,11 @@ The list of options is provided at the end of this topic.</para>
 				<title>RemoveBackslash</title>
 				<section title="Prototype">
 					<pre>
-						<line>#define RemoveBackslash(str S)</line>
+						<line><b>str</b> RemoveBackslash(<b>str</b> S)</line>
 					</pre>
 				</section>
 				<description>
-					<para>Removes the trailing backslash from the string unless the string points to a root directory.</para>
+					<para>Removes the trailing backslash from the string unless the string points to a root directory, and returns the result.</para>
           <para>Declared in &builtins;.</para>
 				</description>
 			</topic>
@@ -1558,7 +1558,7 @@ The list of options is provided at the end of this topic.</para>
 				<title>Delete</title>
 				<section title="Prototype">
 					<pre>
-						<line>#define Delete(str *S, int Index, int Count = MaxInt)</line>
+						<line><b>void</b> Delete(<b>str</b> *S, <b>int</b> Index, <b>int</b> Count = MaxInt)</line>
 					</pre>
 				</section>
 				<description>
@@ -1570,7 +1570,7 @@ The list of options is provided at the end of this topic.</para>
 				<title>Insert</title>
 				<section title="Prototype">
 					<pre>
-						<line>#define Insert(str *S, int Index, str Substr)</line>
+						<line><b>void</b> Insert(<b>str</b> *S, <b>int</b> Index, <b>str</b> Substr)</line>
 					</pre>
 				</section>
 				<description>
@@ -1582,7 +1582,7 @@ The list of options is provided at the end of this topic.</para>
 				<title>YesNo</title>
 				<section title="Prototype">
 					<pre>
-						<line>#define YesNo(str S)</line>
+						<line><b>int</b> YesNo(<b>str</b> S)</line>
 					</pre>
 				</section>
 				<description>
@@ -1594,7 +1594,7 @@ The list of options is provided at the end of this topic.</para>
 				<title>Power</title>
 				<section title="Prototype">
 					<pre>
-						<line>#define Power(int X, int P = 2)</line>
+						<line><b>int</b> Power(<b>int</b> X, <b>int</b> P = 2)</line>
 					</pre>
 				</section>
 				<description>
@@ -1605,7 +1605,7 @@ The list of options is provided at the end of this topic.</para>
 				<title>Min</title>
 				<section title="Prototype">
 					<pre>
-						<line>#define Min(int A, int B, int C = MaxInt)</line>
+						<line><b>int</b> Min(<b>int</b> A, <b>int</b> B, <b>int</b> C = MaxInt)</line>
 					</pre>
 				</section>
 				<description>
@@ -1616,7 +1616,7 @@ The list of options is provided at the end of this topic.</para>
 				<title>Max</title>
 				<section title="Prototype">
 					<pre>
-						<line>#define Max(int A, int B, int C = MinInt)</line>
+						<line><b>int</b> Max(<b>int</b> A, <b>int</b> B, <b>int</b> C = MinInt)</line>
 					</pre>
 				</section>
 				<description>
@@ -1627,7 +1627,7 @@ The list of options is provided at the end of this topic.</para>
 				<title>SameText</title>
 				<section title="Prototype">
 					<pre>
-						<line>#define SameText(str S1, str S2)</line>
+						<line><b>int</b> SameText(<b>str</b> S1, <b>str</b> S2)</line>
 					</pre>
 				</section>
 				<description>
@@ -1639,7 +1639,7 @@ The list of options is provided at the end of this topic.</para>
 				<title>SameStr</title>
 				<section title="Prototype">
 					<pre>
-						<line>#define SameStr(str S1, str S2)</line>
+						<line><b>int</b> SameStr(<b>str</b> S1, <b>str</b> S2)</line>
 					</pre>
 				</section>
 				<description>

+ 6 - 1
Projects/ISPP/IsppBase.pas

@@ -1,6 +1,11 @@
 {
   Inno Setup Preprocessor
   Copyright (C) 2001-2002 Alex Yackimoff
+
+  Inno Setup
+  Copyright (C) 1997-2010 Jordan Russell
+  Portions by Martijn Laan
+  For conditions of distribution and use, see LICENSE.TXT.
 }
 
 unit IsppBase;
@@ -19,7 +24,7 @@ type
     AsStr: string;
     AsCallContext: ICallContext;
     case TIsppVarType of
-      evInt: (AsInt: Longint);
+      evInt: (AsInt: Int64);
       evLValue: (AsPtr: PIsppVariant);
   end;
 

+ 11 - 10
Projects/ISPP/IsppFuncs.pas

@@ -186,19 +186,20 @@ end;
 {FileSize(<filename>)}
 function FileSize(Ext: Longint; const Params: IIsppFuncParams; const FuncResult: IIsppFuncResult): TIsppFuncResult; stdcall;
 var
-  F: file of byte;
+  SearchRec: TSearchRec;
 begin
   if CheckParams(Params, [evStr], 1, Result) then
   try
     with IInternalFuncParams(Params) do
     begin
-      {$I-}
-      FileMode := fmOpenRead;
-      AssignFile(F, PrependPath(Ext, Get(0).AsStr));
-      Reset(F);
-      MakeInt(ResPtr^, System.FileSize(F));
-      CloseFile(F);
-      {$I-}
+      if FindFirst(PrependPath(Ext, Get(0).AsStr), faAnyFile, SearchRec) = 0 then begin
+        try
+          MakeInt(ResPtr^, SearchRec.Size);
+        finally
+          FindClose(SearchRec);
+        end;
+      end else
+        MakeInt(ResPtr^, -1);
     end
   except
     on E: Exception do
@@ -1334,7 +1335,7 @@ begin
         New(FileDate);
         FileDate^ := Age;
         TPreprocessor(Ext).CollectGarbage(FileDate, GarbageReleaseDateTime);
-        MakeInt(ResPtr^, Integer(FileDate));
+        MakeInt(ResPtr^, Int64(FileDate));
       end
       else
         MakeInt(ResPtr^, -1);
@@ -1360,7 +1361,7 @@ begin
       New(DateTime);
       DateTime^ := Now;
       TPreprocessor(Ext).CollectGarbage(DateTime, GarbageReleaseDateTime);
-      MakeInt(ResPtr^, Integer(DateTime));
+      MakeInt(ResPtr^, Int64(DateTime));
     end;
   except
     on E: Exception do

+ 9 - 4
Projects/ISPP/IsppIdentMan.pas

@@ -1,6 +1,11 @@
 {
   Inno Setup Preprocessor
   Copyright (C) 2001-2002 Alex Yackimoff
+
+  Inno Setup
+  Copyright (C) 1997-2010 Jordan Russell
+  Portions by Martijn Laan
+  For conditions of distribution and use, see LICENSE.TXT.
 }
 
 unit IsppIdentMan;
@@ -546,7 +551,7 @@ type
   protected
     constructor Create(Value: PIsppVariant);
     function GetType: TIsppVarType; stdcall;
-    function GetAsInt: Integer; stdcall;
+    function GetAsInt: Int64; stdcall;
     function GetAsString(Buf: PChar; BufSize: Integer): Integer; stdcall;
   end;
 
@@ -555,7 +560,7 @@ begin
   FValue := Value
 end;
 
-function TFuncParam.GetAsInt: Integer;
+function TFuncParam.GetAsInt: Int64;
 begin
   Result := FValue^.AsInt
 end;
@@ -593,7 +598,7 @@ type
     function InternalGet(Index: Integer): PIsppVariant;
     function ResPtr: PIsppVariant;
     { IIsppFuncResult }
-    procedure SetAsInt(Value: Integer); stdcall;
+    procedure SetAsInt(Value: Int64); stdcall;
     procedure SetAsString(Value: PChar); stdcall;
     procedure SetAsNull; stdcall;
     procedure Error(Message: PChar); stdcall;
@@ -675,7 +680,7 @@ begin
   Result := @FResult
 end;
 
-procedure TFuncCallContext.SetAsInt(Value: Integer);
+procedure TFuncCallContext.SetAsInt(Value: Int64);
 begin
   MakeInt(FResult, Value)
 end;

+ 8 - 4
Projects/ISPP/IsppIntf.pas

@@ -1,7 +1,11 @@
 {
   Inno Setup Preprocessor
   Copyright (C) 2001-2002 Alex Yackimoff
-  $Id: IsppIntf.pas,v 1.2 2009/04/02 14:20:59 mlaan Exp $
+
+  Inno Setup
+  Copyright (C) 1997-2020 Jordan Russell
+  Portions by Martijn Laan
+  For conditions of distribution and use, see LICENSE.TXT.
 }
 
 unit IsppIntf;
@@ -32,12 +36,12 @@ type
 
   IIsppFuncParam = interface
     function GetType: TIsppVarType; stdcall;
-    function GetAsInt: Integer; stdcall;
+    function GetAsInt: Int64; stdcall;
     function GetAsString(Buf: PChar; BufSize: Integer): Integer; stdcall;
   end;
 
   IIsppFuncResult = interface
-    procedure SetAsInt(Value: Integer); stdcall;
+    procedure SetAsInt(Value: Int64); stdcall;
     procedure SetAsString(Value: PChar); stdcall;
     procedure SetAsNull; stdcall;
     procedure Error(Message: PChar); stdcall;
@@ -58,7 +62,7 @@ type
     const FuncResult: IIsppFuncResult): TIsppFuncResult; stdcall;
 
   IPreprocessor = interface
-    procedure DefineVariable(Name: PChar; Typ: TIsppVarType; Value: Longint);
+    procedure DefineVariable(Name: PChar; Typ: TIsppVarType; Value: Int64);
     procedure QueueLine(Line: PChar);
   end;
 

+ 15 - 10
Projects/ISPP/IsppParser.pas

@@ -1,6 +1,11 @@
 {
   Inno Setup Preprocessor
   Copyright (C) 2001-2002 Alex Yackimoff
+
+  Inno Setup
+  Copyright (C) 1997-2010 Jordan Russell
+  Portions by Martijn Laan
+  For conditions of distribution and use, see LICENSE.TXT.
 }
 
 unit IsppParser;
@@ -32,13 +37,13 @@ type
       Offset: Integer; Options: PIsppParserOptions);
     function Evaluate: TIsppVariant;
     function Expr(StopOnComma: Boolean): TIsppVariant;
-    function IntExpr(StopOnComma: Boolean): Integer;
+    function IntExpr(StopOnComma: Boolean): Int64;
     function StrExpr(StopOnComma: Boolean): string;
   end;
 
 function Parse(const VarMan: IIdentManager; const AExpr: string; Offset: Integer; Options: PIsppParserOptions): TIsppVariant;
 function ParseStr(const VarMan: IIdentManager; const AExpr: string; Offset: Integer; Options: PIsppParserOptions): string;
-function ParseInt(const VarMan: IIdentManager; const AExpr: string; Offset: Integer; Options: PIsppParserOptions): Integer;
+function ParseInt(const VarMan: IIdentManager; const AExpr: string; Offset: Integer; Options: PIsppParserOptions): Int64;
 
 implementation
 
@@ -65,7 +70,7 @@ begin
   end;
 end;
 
-function ParseInt(const VarMan: IIdentManager; const AExpr: string; Offset: Integer; Options: PIsppParserOptions): Integer;
+function ParseInt(const VarMan: IIdentManager; const AExpr: string; Offset: Integer; Options: PIsppParserOptions): Int64;
 begin
   with TParser.Create(VarMan, AExpr, Offset, Options) do
   try
@@ -195,7 +200,7 @@ function TParser.Factor(DoEval: Boolean): TIsppVariant;
   end;
 
 var
-  I: Integer;
+  I: Int64;
   IdentType: TIdentType;
   CallContext: ICallContext;
   Op: TTokenKind;
@@ -267,7 +272,7 @@ begin
       end;
     tkNumber:
       begin
-        if not TryStrToInt(TokenString, I) then
+        if not TryStrToInt64(TokenString, I) then
           ErrorFmt(SCannotConvertToInteger, [TokenString]);
         MakeInt(Result, I);
       end;
@@ -301,7 +306,7 @@ end;
 
 function TParser.PerformOperation(Op1, Op2: TIsppVariant; Op: TTokenKind): TIsppVariant;
 var
-  A, B: Integer;
+  A, B: Int64;
   AsBool: Boolean;
 begin
   MakeRValue(Op1);
@@ -342,7 +347,7 @@ begin
           opEqual: AsBool := A = 0;
           opNotEqual: AsBool := A <> 0;
         end;
-        AsInt := Integer(AsBool)
+        AsInt := Int64(AsBool)
       end;
     end
     else
@@ -371,7 +376,7 @@ begin
           opShr: AsInt := A shr B;
           opMod: AsInt := A mod B;
         end;
-        if Op in [opGreater..opNotEqual, opOr, opAnd] then AsInt := Integer(AsBool)
+        if Op in [opGreater..opNotEqual, opOr, opAnd] then AsInt := Int64(AsBool)
       end
   except
     on E: Exception do Error(E.Message);
@@ -380,7 +385,7 @@ end;
 
 function TParser.UnaryOperation(Op: TTokenKind; Op1: TIsppVariant): TIsppVariant;
 var
-  A: Integer;
+  A: Int64;
 begin
   MakeRValue(Op1);
   A := 0; // satisfy compiler
@@ -462,7 +467,7 @@ begin
   end;
 end;
 
-function TParser.IntExpr(StopOnComma: Boolean): Integer;
+function TParser.IntExpr(StopOnComma: Boolean): Int64;
 var
   V: TIsppVariant;
 begin

+ 8 - 4
Projects/ISPP/IsppVarUtils.pas

@@ -1,7 +1,11 @@
 {
   Inno Setup Preprocessor
   Copyright (C) 2001-2002 Alex Yackimoff
-  $Id: IsppVarUtils.pas,v 1.1 2004/02/26 22:24:19 mlaan Exp $
+
+  Inno Setup
+  Copyright (C) 1997-2010 Jordan Russell
+  Portions by Martijn Laan
+  For conditions of distribution and use, see LICENSE.TXT.
 }
 
 unit IsppVarUtils;
@@ -14,7 +18,7 @@ function SimplifyLValue(var Src: TIsppVariant): Boolean;
 procedure MakeRValue(var Src: TIsppVariant);
 function GetRValue(const Src: TIsppVariant): TIsppVariant;
 procedure CopyExpVar(Src: TIsppVariant; var Dest: TIsppVariant);
-procedure MakeInt(var Op: TIsppVariant; Value: Integer);
+procedure MakeInt(var Op: TIsppVariant; Value: Int64);
 procedure MakeStr(var Op: TIsppVariant; const Value: string);
 procedure MakeBool(var Op: TIsppVariant; Value: Boolean);
 function TryStrToInt(Str: string; var Int: Integer): Boolean;
@@ -59,7 +63,7 @@ begin
     Move(Src, Dest, SizeOf(TIsppVariant));
 end;
 
-procedure MakeInt(var Op: TIsppVariant; Value: Integer);
+procedure MakeInt(var Op: TIsppVariant; Value: Int64);
 begin
   Op.Typ := evInt;
   Op.AsInt := Value;
@@ -75,7 +79,7 @@ end;
 
 procedure MakeBool(var Op: TIsppVariant; Value: Boolean);
 begin
-  MakeInt(Op, Integer(Value));
+  MakeInt(Op, Int64(Value));
 end;
 
 function TryStrToInt(Str: string; var Int: Integer): Boolean;

+ 61 - 6
Projects/InstFunc.pas

@@ -2,7 +2,7 @@ unit InstFunc;
 
 {
   Inno Setup
-  Copyright (C) 1997-2019 Jordan Russell
+  Copyright (C) 1997-2020 Jordan Russell
   Portions by Martijn Laan
   For conditions of distribution and use, see LICENSE.TXT.
 
@@ -80,6 +80,11 @@ function GetSHA1OfAnsiString(const S: AnsiString): TSHA1Digest;
 {$IFDEF UNICODE}
 function GetSHA1OfUnicodeString(const S: UnicodeString): TSHA1Digest;
 {$ENDIF}
+function GetSHA256OfFile(const DisableFsRedir: Boolean; const Filename: String): String;
+function GetSHA256OfAnsiString(const S: AnsiString): String;
+{$IFDEF UNICODE}
+function GetSHA256OfUnicodeString(const S: UnicodeString): String;
+{$ENDIF}
 function GetRegRootKeyName(const RootKey: HKEY): String;
 function GetSpaceOnDisk(const DisableFsRedir: Boolean; const DriveRoot: String;
   var FreeBytes, TotalBytes: Integer64): Boolean;
@@ -106,7 +111,7 @@ procedure RaiseOleError(const FunctionName: String; const ResultCode: HRESULT);
 procedure RefreshEnvironment;
 function ReplaceSystemDirWithSysWow64(const Path: String): String;
 function ReplaceSystemDirWithSysNative(Path: String; const IsWin64: Boolean): String;
-procedure UnregisterFont(const FontName, FontFilename: String);
+procedure UnregisterFont(const FontName, FontFilename: String; const PerUserFont: Boolean);
 function RestartComputer: Boolean;
 procedure RestartReplace(const DisableFsRedir: Boolean; TempFile, DestFile: String);
 procedure SplitNewParamStr(const Index: Integer; var AName, AValue: String);
@@ -117,7 +122,7 @@ function ForceDirectories(const DisableFsRedir: Boolean; Dir: String): Boolean;
 implementation
 
 uses
-  Messages, ShellApi, PathFunc, Msgs, MsgIDs, FileClass, RedirFunc, SetupTypes;
+  Messages, ShellApi, PathFunc, Msgs, MsgIDs, FileClass, RedirFunc, SetupTypes, Hash, Classes;
 
 procedure InternalError(const Id: String);
 begin
@@ -736,6 +741,21 @@ begin
   Result := SHA1Final(Context);
 end;
 
+function GetSHA256OfFile(const DisableFsRedir: Boolean; const Filename: String): String;
+{ Gets SHA-256 sum as a string of the file Filename. An exception will be raised upon
+  failure. }
+var
+  PrevState: TPreviousFsRedirectionState;
+begin
+  if not DisableFsRedirectionIf(DisableFsRedir, PrevState) then
+    InternalError('GetSHA256OfFile: DisableFsRedirectionIf failed.');
+  try
+    Result := THashSHA2.GetHashStringFromFile(Filename, SHA256);
+  finally
+    RestoreFsRedirection(PrevState);
+  end;
+end;
+
 function GetMD5OfAnsiString(const S: AnsiString): TMD5Digest;
 begin
   Result := MD5Buf(Pointer(S)^, Length(S)*SizeOf(S[1]));
@@ -760,6 +780,36 @@ begin
 end;
 {$ENDIF}
 
+function GetSHA256OfAnsiString(const S: AnsiString): String;
+var
+  M: TMemoryStream;
+begin
+  M := TMemoryStream.Create;
+  try
+    M.Write(Pointer(S)^, Length(S)*SizeOf(S[1]));
+    M.Seek(0, soFromBeginning);
+    Result := THashSHA2.GetHashString(M, SHA256);
+  finally
+    M.Free;
+  end;
+end;
+
+{$IFDEF UNICODE}
+function GetSHA256OfUnicodeString(const S: UnicodeString): String;
+var
+  M: TMemoryStream;
+begin
+  M := TMemoryStream.Create;
+  try
+    M.Write(Pointer(S)^, Length(S)*SizeOf(S[1]));
+    M.Seek(0, soFromBeginning);
+    Result := THashSHA2.GetHashString(M, SHA256);
+  finally
+    M.Free;
+  end;
+end;
+{$ENDIF}
+
 var
   SFCInitialized: Boolean;
   SfcIsFileProtectedFunc: function(RpcHandle: THandle; ProtFileName: PWideChar): BOOL; stdcall;
@@ -1247,15 +1297,20 @@ begin
     DoNonNT;
 end;
 
-procedure UnregisterFont(const FontName, FontFilename: String);
+procedure UnregisterFont(const FontName, FontFilename: String; const PerUserFont: Boolean);
 const
   FontsKeys: array[Boolean] of PChar =
     (NEWREGSTR_PATH_SETUP + '\Fonts',
      'Software\Microsoft\Windows NT\CurrentVersion\Fonts');
 var
-  K: HKEY;
+  RootKey, K: HKEY;
 begin
-  if RegOpenKeyExView(rvDefault, HKEY_LOCAL_MACHINE, FontsKeys[UsingWinNT],
+  if PerUserFont then
+    RootKey := HKEY_CURRENT_USER
+  else
+    RootKey := HKEY_LOCAL_MACHINE;
+
+  if RegOpenKeyExView(rvDefault, RootKey, FontsKeys[UsingWinNT],
      0, KEY_SET_VALUE, K) = ERROR_SUCCESS then begin
     RegDeleteValue(K, PChar(FontName));
     RegCloseKey(K);

+ 50 - 28
Projects/Install.pas

@@ -903,35 +903,48 @@ var
   procedure ProcessFileEntry(const CurFile: PSetupFileEntry;
     const DisableFsRedir: Boolean; ASourceFile, ADestName: String;
     const FileLocationFilenames: TStringList; const AExternalSize: Integer64;
-    var ConfirmOverwriteOverwriteAll, PromptIfOlderOverwriteAll: TOverwriteAll);
+    var ConfirmOverwriteOverwriteAll, PromptIfOlderOverwriteAll: TOverwriteAll;
+    var WarnedPerUserFonts: Boolean);
 
     procedure InstallFont(const Filename, FontName: String;
-      const AddToFontTableNow: Boolean);
+      const PerUserFont, AddToFontTableNow: Boolean; var WarnedPerUserFonts: Boolean);
     const
       FontsKeys: array[Boolean] of PChar =
         (NEWREGSTR_PATH_SETUP + '\Fonts',
          'Software\Microsoft\Windows NT\CurrentVersion\Fonts');
     var
-      K: HKEY;
+      RootKey, K: HKEY;
     begin
-      { 64-bit Windows note: The Fonts key is evidently exempt from registry
-        redirection. When a 32-bit app writes to the Fonts key, it's the main
-        64-bit key that is modified. (There is actually a Fonts key under
-        Wow6432Node but it appears it's never used or updated.)
-        Also: We don't bother with any FS redirection stuff here. I'm not sure
-        it's safe to disable FS redirection when calling AddFontResource, or
-        if it would even work. Users should be installing their fonts to the
-        Fonts directory instead of the System directory anyway. }
-      if RegOpenKeyExView(rvDefault, HKEY_LOCAL_MACHINE, FontsKeys[IsNT], 0,
-         KEY_SET_VALUE, K) = ERROR_SUCCESS then begin
-        if RegSetValueEx(K, PChar(FontName), 0, REG_SZ, PChar(Filename),
-           (Length(Filename)+1)*SizeOf(Filename[1])) <> ERROR_SUCCESS then
-          Log('Failed to set value in Fonts registry key.');
-        RegCloseKey(K);
-      end
-      else
-        Log('Failed to open Fonts registry key.');
-
+      if PerUserFont and (WindowsVersion < Cardinal($0A0042EE)) then begin
+        { Per-user fonts require Windows 10 Version 1803 (10.0.17134) or newer. }
+        if not WarnedPerUserFonts then begin
+          Log('Failed to set value in Fonts registry key: per-user fonts are not supported by this version of Windows.');
+          WarnedPerUserFonts := True;
+        end;
+      end else begin
+        { 64-bit Windows note: The Fonts key is evidently exempt from registry
+          redirection. When a 32-bit app writes to the Fonts key, it's the main
+          64-bit key that is modified. (There is actually a Fonts key under
+          Wow6432Node but it appears it's never used or updated.)
+          Also: We don't bother with any FS redirection stuff here. I'm not sure
+          it's safe to disable FS redirection when calling AddFontResource, or
+          if it would even work. Users should be installing their fonts to the
+          Fonts directory instead of the System directory anyway. }
+        if PerUserFont then
+          RootKey := HKEY_CURRENT_USER
+        else
+          RootKey := HKEY_LOCAL_MACHINE;
+        if RegOpenKeyExView(rvDefault, RootKey, FontsKeys[IsNT], 0,
+           KEY_SET_VALUE, K) = ERROR_SUCCESS then begin
+          if RegSetValueEx(K, PChar(FontName), 0, REG_SZ, PChar(Filename),
+             (Length(Filename)+1)*SizeOf(Filename[1])) <> ERROR_SUCCESS then
+            Log('Failed to set value in Fonts registry key.');
+          RegCloseKey(K);
+        end
+        else
+          Log('Failed to open Fonts registry key.');
+      end;
+      
       if AddToFontTableNow then begin
         repeat
           { Note: AddFontResource doesn't set the thread's last error code }
@@ -1083,7 +1096,7 @@ var
     LastError: DWORD;
     DestF, SourceF: TFile;
     Flags: TMakeDirFlags;
-    Overwrite: Boolean;
+    Overwrite, PerUserFont: Boolean;
   label Retry, Skip;
   begin
     Log('-- File entry --');
@@ -1578,8 +1591,11 @@ var
         if CurFile^.InstallFontName <> '' then begin
           LastOperation := '';
           LogFmt('Registering file as a font ("%s")', [CurFile^.InstallFontName]);
-          InstallFont(FontFilename, CurFile^.InstallFontName, not ReplaceOnRestart);
+          PerUserFont := not IsAdminInstallMode;
+          InstallFont(FontFilename, CurFile^.InstallFontName, PerUserFont, not ReplaceOnRestart, WarnedPerUserFonts);
           DeleteFlags := DeleteFlags or utDeleteFile_IsFont;
+          if PerUserFont then
+            DeleteFlags := DeleteFlags or utDeleteFile_PerUserFont;
         end;
 
         { There were no errors so add the uninstall log entry, unless the file
@@ -1735,7 +1751,8 @@ var
     function RecurseExternalCopyFiles(const DisableFsRedir: Boolean;
       const SearchBaseDir, SearchSubDir, SearchWildcard: String; const SourceIsWildcard: Boolean;
       const CurFile: PSetupFileEntry; const FileLocationFilenames: TStringList;
-      var ExpectedBytesLeft: Integer64; var ConfirmOverwriteOverwriteAll, PromptIfOlderOverwriteAll: TOverwriteAll): Boolean;
+      var ExpectedBytesLeft: Integer64; var ConfirmOverwriteOverwriteAll, PromptIfOlderOverwriteAll: TOverwriteAll;
+      var WarnedPerUserFonts: Boolean): Boolean;
     var
       SearchFullPath, FileName, SourceFile, DestName: String;
       H: THandle;
@@ -1775,7 +1792,8 @@ var
                 Size := ExpectedBytesLeft;
               end;
               ProcessFileEntry(CurFile, DisableFsRedir, SourceFile, DestName,
-                FileLocationFilenames, Size, ConfirmOverwriteOverwriteAll, PromptIfOlderOverwriteAll);
+                FileLocationFilenames, Size, ConfirmOverwriteOverwriteAll, PromptIfOlderOverwriteAll,
+                WarnedPerUserFonts);
               Dec6464(ExpectedBytesLeft, Size);
             end;
           until not FindNextFile(H, FindData);
@@ -1793,7 +1811,8 @@ var
                 Result := RecurseExternalCopyFiles(DisableFsRedir, SearchBaseDir,
                   SearchSubDir + FindData.cFileName + '\', SearchWildcard,
                   SourceIsWildcard, CurFile, FileLocationFileNames,
-                  ExpectedBytesLeft, ConfirmOverwriteOverwriteAll, PromptIfOlderOverwriteAll) or Result;
+                  ExpectedBytesLeft, ConfirmOverwriteOverwriteAll, PromptIfOlderOverwriteAll,
+                  WarnedPerUserFonts) or Result;
             until not FindNextFile(H, FindData);
           finally
             Windows.FindClose(H);
@@ -1834,9 +1853,11 @@ var
     ProgressBefore, ExpectedBytesLeft: Integer64;
     DisableFsRedir, FoundFiles: Boolean;
     ConfirmOverwriteOverwriteAll, PromptIfOlderOverwriteAll: TOverwriteAll;
+    WarnedPerUserFonts: Boolean;
   begin
     ConfirmOverwriteOverwriteAll := oaUnknown;
     PromptIfOlderOverwriteAll := oaUnknown;
+    WarnedPerUserFonts := False;
 
     FileLocationFilenames := TStringList.Create;
     try
@@ -1862,7 +1883,7 @@ var
             ExternalSize.Hi := 0;  { not used... }
             ExternalSize.Lo := 0;
             ProcessFileEntry(CurFile, DisableFsRedir, '', '', FileLocationFilenames, ExternalSize,
-              ConfirmOverwriteOverwriteAll, PromptIfOlderOverwriteAll);
+              ConfirmOverwriteOverwriteAll, PromptIfOlderOverwriteAll, WarnedPerUserFonts);
           end
           else begin
             { File is an 'external' file }
@@ -1880,7 +1901,8 @@ var
               FoundFiles := RecurseExternalCopyFiles(DisableFsRedir,
                 PathExtractPath(SourceWildcard), '', PathExtractName(SourceWildcard),
                 IsWildcard(SourceWildcard), CurFile, FileLocationFileNames,
-                ExpectedBytesLeft, ConfirmOverwriteOverwriteAll, PromptIfOlderOverwriteAll);
+                ExpectedBytesLeft, ConfirmOverwriteOverwriteAll, PromptIfOlderOverwriteAll,
+                WarnedPerUserFonts);
             until FoundFiles or
                   (foSkipIfSourceDoesntExist in CurFile^.Options) or
                   AbortRetryIgnoreTaskDialogMsgBox(

+ 3 - 2
Projects/Main.pas

@@ -1021,10 +1021,10 @@ function ExpandIndividualConst(Cnst: String;
 const
   FolderConsts: array[Boolean, TShellFolderID] of String =
     (('userdesktop', 'userstartmenu', 'userprograms', 'userstartup',
-      'usersendto', 'fonts', 'userappdata', 'userdocs', 'usertemplates',
+      'usersendto', 'commonfonts', 'userappdata', 'userdocs', 'usertemplates',
       'userfavorites', 'localappdata'),
      ('commondesktop', 'commonstartmenu', 'commonprograms', 'commonstartup',
-      'usersendto', 'fonts', 'commonappdata', 'commondocs', 'commontemplates',
+      'usersendto', 'commonfonts', 'commonappdata', 'commondocs', 'commontemplates',
       'commonfavorites' { not accepted anymore by the compiler }, 'localappdata'));
   NoUninstallConsts: array[0..6] of String =
     ('src', 'srcexe', 'userinfoname', 'userinfoorg', 'userinfoserial', 'hwnd',
@@ -1116,6 +1116,7 @@ begin
       InternalError('Cannot expand "' + OriginalCnst + '" constant on this version of Windows');
   end
   else if Cnst = 'usersavedgames' then Result := SavedGamesUserDir
+  else if Cnst = 'userfonts' then Result := ExpandConst('{localappdata}\Microsoft\Windows\Fonts') { supported by Windows 10 Version 1803 and newer. doesn't have a KNOWNFOLDERID. }
   else if Cnst = 'dao' then Result := ExpandConst('{cf}\Microsoft Shared\DAO')
   else if Cnst = 'cmd' then Result := CmdFilename
   else if Cnst = 'computername' then Result := GetComputerNameString

+ 13 - 3
Projects/ScriptFunc.pas

@@ -128,9 +128,9 @@ const
 
   { InstFunc }
 {$IFNDEF PS_NOINT64}
-  InstFuncTable: array [0..27] of AnsiString =
+  InstFuncTable: array [0..30] of AnsiString =
 {$ELSE}
-  InstFuncTable: array [0..26] of AnsiString =
+  InstFuncTable: array [0..29] of AnsiString =
 {$ENDIF}
   (
     'function CheckForMutexes(Mutexes: String): Boolean;',
@@ -146,6 +146,9 @@ const
     'function GetSHA1OfFile(const Filename: String): String;',
     'function GetSHA1OfString(const S: AnsiString): String;',
     'function GetSHA1OfUnicodeString(const S: String): String;',
+    'function GetSHA256OfFile(const Filename: String): String;',
+    'function GetSHA256OfString(const S: AnsiString): String;',
+    'function GetSHA256OfUnicodeString(const S: String): String;',
     'function GetSpaceOnDisk(const DriveRoot: String; const InMegabytes: Boolean; var Free, Total: Cardinal): Boolean;',
 {$IFNDEF PS_NOINT64}
     'function GetSpaceOnDisk64(const DriveRoot: String; var Free, Total: Int64): Boolean;',
@@ -163,7 +166,7 @@ const
     'function ModifyPifFile(const Filename: String; const CloseOnExit: Boolean): Boolean;',
     'procedure RegisterServer(const Is64Bit: Boolean; const Filename: String; const FailCriticalErrors: Boolean);',
     'function UnregisterServer(const Is64Bit: Boolean; const Filename: String; const FailCriticalErrors: Boolean): Boolean;',
-    'procedure UnregisterFont(const FontName, FontFilename: String);',
+    'procedure UnregisterFont(const FontName, FontFilename: String; const PerUserFont: Boolean);',
     //procedure RestartComputer;
     'procedure RestartReplace(const TempFile, DestFile: String);',
     //procedure Win32ErrorMsg(const FunctionName: String);
@@ -224,10 +227,17 @@ const
   );
 
   { System }
+{$IFNDEF PS_NOINT64}
+  SystemTable: array [0..4] of AnsiString =
+{$ELSE}
   SystemTable: array [0..3] of AnsiString =
+{$ENDIF}
   (
     'function Random(const Range: Integer): Integer;',
     'function FileSize(const Name: String; var Size: Integer): Boolean;',
+{$IFNDEF PS_NOINT64}
+    'function FileSize64(const Name: String; var Size: Int64): Boolean;',
+{$ENDIF}
     'procedure Set8087CW(NewCW: Word);',
     'function Get8087CW: Word;'
   );

+ 3 - 3
Projects/ScriptFunc_C.pas

@@ -102,7 +102,7 @@ begin
   RegisterType('UINT_PTR', 'LongWord');
   RegisterType('INT_PTR', 'Longint');
 
-  ScriptCompiler.AddTypeS('TFileTime',
+  RegisterType('TFileTime',
     'record' +
     '  dwLowDateTime: DWORD;' +
     '  dwHighDateTime: DWORD;' +
@@ -118,7 +118,7 @@ begin
 
   RegisterType('TExecWait', '(ewNoWait, ewWaitUntilTerminated, ewWaitUntilIdle)');
   
-  ScriptCompiler.AddTypeS('TFindRec',
+  RegisterType('TFindRec',
     'record' +
     '  Name: String;' +
     '  Attributes: LongWord;' +
@@ -130,7 +130,7 @@ begin
     '  AlternateName: String;' +
     '  FindHandle: THandle;' +
     'end');
-  ScriptCompiler.AddTypeS('TWindowsVersion',
+  RegisterType('TWindowsVersion',
     'record' +
     '  Major: Cardinal;' +
     '  Minor: Cardinal;' +

+ 29 - 1
Projects/ScriptFunc_R.pas

@@ -809,6 +809,16 @@ begin
     Stack.SetString(PStart, SHA1DigestToString(GetSHA1OfUnicodeString(Stack.GetString(PStart-1))));
 {$ELSE}
     NoNonUnicodeFuncError(Proc.Name);
+{$ENDIF}
+  end else if Proc.Name = 'GETSHA256OFFILE' then begin
+    Stack.SetString(PStart, GetSHA256OfFile(ScriptFuncDisableFsRedir, Stack.GetString(PStart-1)));
+  end else if Proc.Name = 'GETSHA256OFSTRING' then begin
+    Stack.SetString(PStart, GetSHA256OfAnsiString(StackGetAnsiString(Stack, PStart-1)));
+  end else if Proc.Name = 'GETSHA256OFUNICODESTRING' then begin
+{$IFDEF UNICODE}
+    Stack.SetString(PStart, GetSHA256OfUnicodeString(Stack.GetString(PStart-1)));
+{$ELSE}
+    NoNonUnicodeFuncError(Proc.Name);
 {$ENDIF}
   end else if Proc.Name = 'GETSPACEONDISK' then begin
     if GetSpaceOnDisk(ScriptFuncDisableFsRedir, Stack.GetString(PStart-1), FreeBytes, TotalBytes) then begin
@@ -907,7 +917,7 @@ begin
       Stack.SetBool(PStart, False);
     end;
   end else if Proc.Name = 'UNREGISTERFONT' then begin
-    UnregisterFont(Stack.GetString(PStart), Stack.GetString(PStart-1));
+    UnregisterFont(Stack.GetString(PStart), Stack.GetString(PStart-1), Stack.GetBool(PStart-2));
   end else if Proc.Name = 'RESTARTREPLACE' then begin
     RestartReplace(ScriptFuncDisableFsRedir, Stack.GetString(PStart), Stack.GetString(PStart-1));
   end else if Proc.Name = 'FORCEDIRECTORIES' then begin
@@ -1134,6 +1144,20 @@ begin
     except
       Stack.SetBool(PStart, False);
     end;
+{$IFNDEF PS_NOINT64}
+  end else if Proc.Name = 'FILESIZE64' then begin
+    try
+      F := TFileRedir.Create(ScriptFuncDisableFsRedir, Stack.GetString(PStart-1), fdOpenExisting, faRead, fsReadWrite);
+      try
+        Stack.SetInt64(PStart-2, Int64(F.Size.Hi) shl 32 + F.Size.Lo);
+        Stack.SetBool(PStart, True);
+      finally
+        F.Free;
+      end;
+    except
+      Stack.SetBool(PStart, False);
+    end;
+{$ENDIF}
   end else if Proc.Name = 'SET8087CW' then begin
     Set8087CW(Stack.GetInt(PStart));
   end else if Proc.Name = 'GET8087CW' then begin
@@ -1721,6 +1745,10 @@ function OtherProc(Caller: TPSExec; Proc: TPSExternalProcRec; Global, Stack: TPS
     ParamCount, SwapFirst, SwapLast: Integer;
     S: tbtstring;
   begin
+    { ProcNo 0 means nil was passed by the script }
+    if P.ProcNo = 0 then
+      InternalError('Invalid Method value');
+
     { Calculate parameter count of our proc, will need this later. }
     ProcRec := Caller.GetProcNo(P.ProcNo) as TPSInternalProcRec;
     S := ProcRec.ExportDecl;

+ 3 - 1
Projects/SetupTypes.pas

@@ -274,7 +274,9 @@ procedure HandleRenamedConstants(var Cnst: String; const RenamedConstantCallback
 var
   CnstRenamed: String;
 begin
-  if Cnst = 'sendto' then
+  if Cnst = 'fonts' then
+    CnstRenamed := 'commonfonts'
+  else if Cnst = 'sendto' then
     CnstRenamed := 'usersendto'
   else if Cnst = 'pf' then
     CnstRenamed := 'commonpf'

+ 2 - 2
Projects/Struct.pas

@@ -17,8 +17,8 @@ uses
 
 const
   SetupTitle = 'Inno Setup';
-  SetupVersion = '6.0.6-dev '{$IFDEF UNICODE}+'(u)'{$ELSE}+'(a)'{$ENDIF};
-  SetupBinVersion = (6 shl 24) + (0 shl 16) + (6 shl 8) + 0;
+  SetupVersion = '6.1.0-dev '{$IFDEF UNICODE}+'(u)'{$ELSE}+'(a)'{$ENDIF};
+  SetupBinVersion = (6 shl 24) + (1 shl 16) + (0 shl 8) + 0;
 
 type
   TSetupID = array[0..63] of AnsiChar;

+ 4 - 3
Projects/Undo.pas

@@ -23,7 +23,7 @@ const
   { Each time the format of the uninstall log changes (usually a new entry type
     is added), HighestSupportedVersion and the file version number of Setup
     are incremented to match (51.x). Do NOT do this yourself; doing so could cause
-    incompatibilies with future Inno Setup releases. It's recommended that you
+    incompatibilities with future Inno Setup releases. It's recommended that you
     use the "utUserDefined" log entry type if you wish to implement your own
     custom uninstall log entries; see below for more information.
 
@@ -36,7 +36,7 @@ const
   { Values for TUninstallRecTyp.
     If you wish to define your own custom uninstall entry type, you should use
     "utUserDefined". (Do NOT define your own ut* constants; this could cause
-    incompatibilies with future Inno Setup releases.) The first field in a
+    incompatibilities with future Inno Setup releases.) The first field in a
     utUserDefined record must be a string which specifies a unique name for
     the record type. Example:
     UninstLog.Add(utUserDefined, ['MyRecordType', ... ], 0);
@@ -83,6 +83,7 @@ const
   utDeleteFile_SharedFileIn64BitKey = 1024;
   utDeleteFile_DisableFsRedir = 2048;  { also determines whether file was registered as 64-bit }
   utDeleteFile_GacInstalled = 4096;
+  utDeleteFile_PerUserFont = 8192;
   utDeleteDirOrFiles_Extra = 1;
   utDeleteDirOrFiles_IsDir = 2;
   utDeleteDirOrFiles_DeleteFiles = 4;
@@ -931,7 +932,7 @@ begin
               end;
               if CurRec^.ExtraData and utDeleteFile_IsFont <> 0 then begin
                 LogFmt('Unregistering font: %s', [CurRecData[2]]);
-                UnregisterFont(CurRecData[2], CurRecData[3]);
+                UnregisterFont(CurRecData[2], CurRecData[3], CurRec^.ExtraData and utDeleteFile_PerUserFont <> 0);
               end;
               if CurRec^.ExtraData and utDeleteFile_GacInstalled <> 0 then
                 DoUninstallAssembly(CurRecData[4]);

+ 31 - 33
Projects/Uninstall.pas

@@ -2,13 +2,11 @@ unit Uninstall;
 
 {
   Inno Setup
-  Copyright (C) 1997-2012 Jordan Russell
+  Copyright (C) 1997-2020 Jordan Russell
   Portions by Martijn Laan
   For conditions of distribution and use, see LICENSE.TXT.
 
   Uninstaller
-
-  NOTE: This unit was derived from Uninst.dpr rev 1.38.
 }
 
 interface
@@ -41,8 +39,8 @@ const
 
 var
   UninstallExitCode: DWORD = 1;
-  UninstExeFile, UninstDataFile, UninstMsgFile: String;
-  UninstLogFile: TFile;
+  UninstExeFilename, UninstDataFilename, UninstMsgFilename: String;
+  UninstDataFile: TFile;
   UninstLog: TExtUninstallLog = nil;
   Title: String;
   DidRespawn, SecondPhase: Boolean;
@@ -205,16 +203,16 @@ begin
   { Truncate the .dat file to zero bytes just before relinquishing exclusive
     access to it }
   try
-    UninstLogFile.Seek(0);
-    UninstLogFile.Truncate;
+    UninstDataFile.Seek(0);
+    UninstDataFile.Truncate;
   except
     { ignore any exceptions, just in case }
   end;
-  FreeAndNil(UninstLogFile);
+  FreeAndNil(UninstDataFile);
 
   { Delete the .dat and .msg files }
-  DeleteFile(UninstDataFile);
-  DeleteFile(UninstMsgFile);
+  DeleteFile(UninstDataFilename);
+  DeleteFile(UninstMsgFilename);
 
   { Tell the first phase to terminate, then delete its .exe }
   if FirstPhaseWnd <> 0 then begin
@@ -240,7 +238,7 @@ begin
       Sleep(500);
   end;
   UninstallExitCode := 0;
-  DelayDeleteFile(False, UninstExeFile, 13, 50, 250);
+  DelayDeleteFile(False, UninstExeFilename, 13, 50, 250);
   if Debugging then
     DebugNotifyUninstExe('');
   { Pre-Windows 2000 Add/Remove Programs will try to bring itself to the
@@ -275,7 +273,7 @@ begin
     else
     if CompareText(ParamName, '/SECONDPHASE=') = 0 then begin
       SecondPhase := True;
-      UninstExeFile := ParamValue;
+      UninstExeFilename := ParamValue;
     end
     else if CompareText(ParamName, '/FIRSTPHASEWND=') = 0 then
       FirstPhaseWnd := StrToInt(ParamValue)
@@ -317,12 +315,12 @@ function OpenUninstDataFile(const AAccess: TFileAccess): TFile;
 begin
   Result := nil;  { avoid warning }
   try
-    Result := TFile.Create(UninstDataFile, fdOpenExisting, AAccess, fsNone);
+    Result := TFile.Create(UninstDataFilename, fdOpenExisting, AAccess, fsNone);
   except
     on E: EFileError do begin
       SetLastError(E.ErrorCode);
       RaiseLastError(FmtSetupMessage1(msgUninstallOpenError,
-        UninstDataFile));
+        UninstDataFilename));
     end;
   end;
 end;
@@ -339,7 +337,7 @@ begin
 
   F := OpenUninstDataFile(faRead);
   try
-    Flags := ReadUninstallLogFlags(F, UninstDataFile);
+    Flags := ReadUninstallLogFlags(F, UninstDataFilename);
   finally
     F.Free;
   end;
@@ -350,7 +348,7 @@ begin
     SetWindowPos(Application.Handle, 0, 0, 0, 0, 0, SWP_NOSIZE or
       SWP_NOMOVE or SWP_NOZORDER or SWP_NOACTIVATE or SWP_HIDEWINDOW);
     try
-      RespawnSelfElevated(UninstExeFile,
+      RespawnSelfElevated(UninstExeFilename,
         Format('/INITPROCWND=$%x ', [Application.Handle]) + GetCmdTail,
         UninstallExitCode);
     except
@@ -379,7 +377,7 @@ begin
     except
       { ignore exceptions }
     end;
-  if not CopyFile(PChar(UninstExeFile), PChar(TempFile), False) then
+  if not CopyFile(PChar(UninstExeFilename), PChar(TempFile), False) then
     RaiseLastError(SetupMessages[msgLdrCannotCreateTemp]);
   { Don't want any attribute like read-only transferred }
   SetFileAttributes(PChar(TempFile), FILE_ATTRIBUTE_NORMAL);
@@ -506,17 +504,17 @@ begin
       end;
     end;
     Log('Setup version: ' + SetupTitle + ' version ' + SetupVersion);
-    Log('Original Uninstall EXE: ' + UninstExeFile);
-    Log('Uninstall DAT: ' + UninstDataFile);
+    Log('Original Uninstall EXE: ' + UninstExeFilename);
+    Log('Uninstall DAT: ' + UninstDataFilename);
     Log('Uninstall command line: ' + GetCmdTail);
     LogWindowsVersion;
 
     { Open the .dat file for read access }
-    UninstLogFile := OpenUninstDataFile(faRead);
+    UninstDataFile := OpenUninstDataFile(faRead);
 
     { Load contents of the .dat file }
     UninstLog := TExtUninstallLog.Create;
-    UninstLog.Load(UninstLogFile, UninstDataFile);
+    UninstLog.Load(UninstDataFile, UninstDataFilename);
 
     Title := FmtSetupMessage1(msgUninstallAppFullTitle, UninstLog.AppName);
 
@@ -540,8 +538,8 @@ begin
     { Reopen the .dat file for exclusive, read/write access and keep it
       open for the duration of the uninstall process to prevent a second
       instance of the same uninstaller from running. }
-    FreeAndNil(UninstLogFile);
-    UninstLogFile := OpenUninstDataFile(faReadWrite);
+    FreeAndNil(UninstDataFile);
+    UninstDataFile := OpenUninstDataFile(faReadWrite);
 
     if not UninstLog.ExtractLatestRecData(utCompiledCode,
          SetupBinVersion {$IFDEF UNICODE} or Longint($80000000) {$ENDIF}, CompiledCodeData) then
@@ -580,7 +578,7 @@ begin
       InitMainNonSHFolderConsts;
       LoadSHFolderDLL;
 
-      UninstallExeFilename := UninstExeFile;
+      UninstallExeFilename := UninstExeFilename;
       UninstallExpandedAppId := UninstLog.AppId;
       UninstallSilent := Silent or VerySilent;
 
@@ -733,7 +731,7 @@ begin
     UnloadSHFolderDLL;
     RemoveTempInstallDir;
     UninstLog.Free;
-    FreeAndNil(UninstLogFile);
+    FreeAndNil(UninstDataFile);
   end;
 
   if RestartSystem then begin
@@ -772,23 +770,23 @@ begin
 
     SetCurrentDir(GetSystemDir);
 
-    UninstExeFile := NewParamStr(0);
+    UninstExeFilename := NewParamStr(0);
     ProcessCommandLine;  { note: may change UninstExeFile }
-    UninstDataFile := PathChangeExt(UninstExeFile, '.dat');
-    UninstMsgFile := PathChangeExt(UninstExeFile, '.msg');
+    UninstDataFilename := PathChangeExt(UninstExeFilename, '.dat');
+    UninstMsgFilename := PathChangeExt(UninstExeFilename, '.msg');
 
     { Initialize messages }
-    F := TFile.Create(UninstExeFile, fdOpenExisting, faRead, fsRead);
+    F := TFile.Create(UninstExeFilename, fdOpenExisting, faRead, fsRead);
     try
       F.Seek(F.Size.Lo - SizeOf(UninstallerMsgTail));
       F.ReadBuffer(UninstallerMsgTail, SizeOf(UninstallerMsgTail));
       if UninstallerMsgTail.ID <> UninstallerMsgTailID then begin
         { No valid UninstallerMsgTail record found at the end of the EXE;
           load messages from an external .msg file. }
-        LoadSetupMessages(UninstMsgFile, 0, True);
+        LoadSetupMessages(UninstMsgFilename, 0, True);
       end
       else
-        LoadSetupMessages(UninstExeFile, UninstallerMsgTail.Offset, True);
+        LoadSetupMessages(UninstExeFilename, UninstallerMsgTail.Offset, True);
     finally
       F.Free;
     end;
@@ -803,8 +801,8 @@ begin
     Application.Title := SetupMessages[msgUninstallAppTitle];
 
     { Verify that uninstall data file exists }
-    if not NewFileExists(UninstDataFile) then begin
-      LoggedMessageBoxFmt1(msgUninstallNotFound, UninstDataFile,
+    if not NewFileExists(UninstDataFilename) then begin
+      LoggedMessageBoxFmt1(msgUninstallNotFound, UninstDataFilename,
         SetupMessages[msgUninstallAppTitle], MB_ICONSTOP or MB_OK, True, IDOK);
       Abort;
     end;

+ 12 - 4
README.md

@@ -140,7 +140,7 @@ performs all (un)installation-related tasks.
 Setup program into the user's TEMP directory and runs it from there. It also
 displays the "This will install..." and /HELP message boxes.
 
-**ISPP\ISPP** - This is a DLL implementing Inno Setup's preprocessor interface
+**ISPP\ISPP** - This is a DLL implementing Inno Setup's preprocessor interface.
 
 How do the projects link together?
 
@@ -168,7 +168,7 @@ Source code tips
   ``OutputBaseFilename=setup`` in your script, and copy the resulting setup-*.bin
   files to the source code directory. This way you can simulate an actual
   installation while running under the Delphi debugger.
-
+  
 - All of the forms in the Setup project, with the exception of Main.dfm, have
   Scaled set to False. This is because they dynamically scale themselves at
   run-time by calling a function named InitializeFont.
@@ -179,13 +179,21 @@ Source code tips
   data block in SETUP.EXE so it knows it's in "single EXE" form.
 
 - For compiler debugging purposes define ``STATICCOMPILER`` in CompForm.pas
-  and ``STATICPREPROC`` in Compile.pas.
+  and for preprocessor debugging also ``STATICPREPROC`` in Compile.pas.
+
+- To debug the uninstaller first run Setup.exe to completion with the
+  ``/DETACHEDMSG`` command line parameter set. Afterwards copy uninst000.dat and
+  uninst000.msg as setup.dat and setup.msg to the Projects directory in your
+  issrc path. Then open the Setup project and set the command line parameters to
+  ``/UNINSTMODE "/SECONDPHASE=<your issrc path\Projects\Setup.exe"`` and start
+  debugging. Note: each time setup.dat and setup.msg will be deleted if you
+  allow the uninstaller to complete so make sure to keep copies.
 
 
 Precompiled executables and libraries
 -------------------------------------
 
-The source code contains several precompiled executables and libraries:
+The source code contains several precompiled and signed executables and libraries:
 
 **Files\isbunzip.dll**, **Files\isbzip.dll** - Compiled by Visual Studio 2005
 from the bzlib directory in the Iscompress repository.

+ 1 - 1
build.bat

@@ -19,7 +19,7 @@ rem  Once done the installer can be found in Output
 
 setlocal
 
-set VER=6.0.6-dev
+set VER=6.1.0-dev
 
 echo Building Inno Setup %VER%...
 echo.

+ 1 - 1
setup.iss

@@ -11,7 +11,7 @@
 [Setup]
 AppName=Inno Setup
 AppId=Inno Setup 6
-AppVersion=6.0.6-dev
+AppVersion=6.1.0-dev
 AppPublisher=jrsoftware.org
 AppPublisherURL=https://www.innosetup.com/
 AppSupportURL=https://www.innosetup.com/

+ 32 - 243
whatsnew.htm

@@ -28,268 +28,57 @@ For conditions of distribution and use, see <a href="https://jrsoftware.org/file
 
 <p><b>Want to be notified by e-mail of updates?</b> Then <a href="https://jrsoftware.org/ismail.php">click here to subscribe</a> to the Inno Setup announcements mailing list.<br /><b>If you subscribed before October 2019, please resubscribe.</b></p>
 
-<p><a name="6.0.6"></a><span class="ver">6.0.6-dev </span><span class="date">(?)</span></p>
+<p><a name="6.1.0"></a><span class="ver">6.1.0-dev </span><span class="date">(?)</span></p>
+<p><span class="head2">Per-user fonts</span></p>
+<p>Per-user fonts are now supported if Setup is running on Windows 10 Version 1803 and later:</p>
 <ul>
-  <li>Added new [Run] and [UninstallRun] sections flag: <tt>dontlogparameters</tt>. If this flag is specified, the command line parameters for the program will not be included in the log file.</li>
-  <li>Compiler IDE change: <a href="https://i.imgur.com/wHoJ3FG.png">Improved highlighting</a> for the [CustomMessages] and [Messages] sections.</li>
-  <li>Pascal Scripting changes:
-  <ul>
-    <li>Added several new support functions to pack/unpack version numbers to simplify comparisons: <tt>PackVersionNumbers</tt>, <tt>PackVersionComponents</tt>, <tt>UnpackVersionNumbers</tt>, <tt>UnpackVersionComponents</tt>, and <tt>VersionToStr</tt>.</li>
-    <li><i>Fix:</i> Support function <tt>WizardSelectComponents</tt> now also updates component sizes and the current selection's required disk space.</li>
-  </ul>
-  </li>
-  <li>Inno Setup Preprocessor (ISPP) change: Added new <tt>PackVersionComponents</tt>, <tt>UnpackVersionComponents</tt>, and <tt>ParseVersionPacked</tt> support functions.</li>
-  <li>Some messages have been added in this version: (<a href="https://github.com/jrsoftware/issrc/commit/66df4cb6478ffe3bde4ff94f901089366b0358ec">View differences in Default.isl</a>).
-  <ul>
-    <li>FileExistsSelectAction, FileExists2, FileExistsOverwriteExisting, FileExistsKeepExisting, FileExistsOverwriteOrKeepAll: If the FileExists2 message is set by a translation, Setup will instead use these messages instead of the FileExist message to show <a href="https://i.imgur.com/AnF6qo8.png">more user friendly prompts</a> to overwrite or keep existing files if the <tt>confirmoverwrite</tt> flag is set.</li>
-    <li>ExistingFileNewerSelectAction, ExistingFileNewer2, ExistingFileNewerOverwriteExisting, ExistingFileNewerKeepExisting, ExistingFileNewerOverwriteOrKeepAll: If the ExistingFileNewer2 message is set by a translation, Setup will instead use these messages instead of the ExistingFileNewer message to show <a href="https://i.imgur.com/VBDuZ7U.png">more user friendly prompts</a> to keep or overwrite existing files if the <tt>promptifolder</tt> flag is set.</li>
-  </ul>
-  </li>
-  <li>Minor tweaks.</li>
-</ul>
-
-<p>Contributions via <a href="https://github.com/jrsoftware/issrc" target="_blank">GitHub</a>: Thanks to Gavin Lambert for their contributions.</p>
-
-<p><a name="6.0.5"></a><span class="ver">6.0.5 </span><span class="date">(2020-05-21)</span></p>
-<ul>
-  <li>Changes to further help protect installers against potential DLL preloading attacks.</li>
-  <li>Compiler IDE change: Added <a href="https://jrsoftware.org/ismail.php">Inno Setup Mailing List</a> menu item to the Help menu.</li>
-  <li>Inno Setup can now be installed using the new <a href="https://github.com/microsoft/winget-cli">Windows Package Manager</a>.</li>
-  <li>Minor tweaks.</li>
-</ul>
-
-<p><a name="6.0.4"></a><span class="ver">6.0.4 </span><span class="date">(2020-03-12)</span></p>
-<ul>
-  <li>[Setup] section directives <tt>LicenseFile</tt>, <tt>InfoBeforeFile</tt> and <tt>InfoAfterFile</tt> now support objects such as images in .rtf (rich text) files.</li>
-  <li>Added new constant: <tt>{usersavedgames}</tt>.</li>
-  <li>Compiler IDE changes:
-  <ul>
-    <li>The Welcome dialog is now higher and wider by default and also resizable.</li>
-    <li>Added Dark theme support to the scrollbars (on newer versions of Windows) and the bottom tab set.</li>
-  </ul>
-  </li>
-  <li>Restart Manager changes:
-  <ul>
-    <li>Setup now ignores attempts by the script to register Setup itself with Restart Manager for a being in use check.</li>
-    <li>If all files are excluded by [Setup] section directive <tt>CloseApplicationsFilter</tt>, Setup now no longer calls Restart Manager's RmGetList asking it to check 0 files.</li>
-    <li>/LOG: Now logs how many files Setup asked Restart Manager's RmGetList to check.</li>
-    <li>Added new command line parameter /LOGCLOSEAPPLICATIONS. Instructs Setup to create extra logging when closing applications for debugging purposes.</li>
-    <li><i>Fix:</i> [Setup] section directive <tt>CloseApplicationsFilter</tt> was ignored by checks for [InstallDelete] entries.</li>
-  </ul>
-  </li>
-  <li>Windows AppLocker publisher conditions are now supported by Setup up to and including the file name level.</li>
-  <li>Pascal Scripting change: Added new <tt>IsDotNetInstalled</tt> support function, based on code by <a href="http://www.kynosarges.de/DotNetVersion.html">Cristoph Nahr</a>.</li>
-  <li>Inno Setup Preprocessor (ISPP) change: Added new <tt>UpperCase</tt> support function.</li>
-  <li><i>Fix:</i> Event attributes for uninstall event functions now actually work.</li>
-  <li>Minor tweaks and documentations improvements.</li>
-  <li>Enabled HTTPS on <a href="https://jrsoftware.org/">jrsoftware.org</a>.</li>
-</ul>
-
-<p><a name="6.0.3"></a><span class="ver">6.0.3 </span><span class="date">(2019-10-11)</span></p>
-<ul>
-  <li>/LOG: Now logs Windows compatibility mode when this is activated by the user.</li>
-  <li>Added new [Setup] section directive: <tt>SignToolRunMinimized</tt>.</li>
-  <li>[Setup] section directive <tt>UsePreviousLanguage</tt> now also has an effect when the <i>Select Language</i> dialog is not displayed because Setup is for example running silently.</li>
-  <li>Checkboxes displayed by lists now look better on high DPI systems.</li>
-  <li>Compiler IDE changes:
-  <ul>
-    <li>Added Dark theme support to the toolbar.</li>
-    <li>When paused on a breakpoint in the [Code] section the new "Debug Call Stack" view now shows the call stack.</li>
-    <li>The "Compiler Output" and "Debug Output" views now support multi selection, an extra <i>Select All</i> popup menu item and <i>Ctrl+C</i> and <i>Ctrl+A</i> keyboard shortcuts. The <i>Copy</i> action now only copies the selected lines instead of all lines.</li>
-  </ul>
-  </li>
-  <li>Inno Setup Preprocessor (ISPP) changes:
-  <ul>
-    <li>Array variables declared with <tt>#dim</tt> can now be initialized directly, like <tt>#dim MyArray[3] {1, 2, 3}</tt> for example.</li>
-    <li>Added new predefined variable <tt>Tab</tt>.</li>
-  </ul>
-  </li>
-  <li>Pascal Scripting change: Added new <tt>Set8087CW</tt> and <tt>Get8087CW</tt> support functions.</li>
-  <li>Some messages have been added in this version: (<a href="https://github.com/jrsoftware/issrc/commit/dfdf02aef168be458b64e77afb20ae53a5b4f2ec">View differences in Default.isl</a>).
-  <ul>
-    <li>PrepareToInstallNeedsRestart: This message is used by the <i>Preparing to Install</i> wizard page if a restart is needed. If this message is not set by a translation, Setup will instead use FinishedRestartLabel and FinishedRestartMessage as before.</li>
-    <li>ComponentsDiskSpaceGBLabel and DiskSpaceGBLabel: These messages are used by Setup to display required disk spaces of 1000.0 MB or more in gigabytes instead of in megabytes. If these messages are not set by a translation, Setup will instead use ComponentsDiskSpaceMBLabel and DiskSpaceMBLabel as before.</li>
-  </ul>
-  </li>
-  <li>Added official Slovak translation.</li>
-  <li>Minor tweaks and cosmetic fixes.</li>
-</ul>
-
-<p>Contributions via <a href="https://github.com/jrsoftware/issrc" target="_blank">GitHub</a>: Thanks to Vizit0r for their contributions.</p>
-
-<p><a name="6.0.2"></a><span class="ver">6.0.2 </span><span class="date">(2019-04-26)</span></p>
-<ul>
-  <li>Added new <tt>{sysnative}</tt> constant.</li>
-  <li>Pascal Scripting changes:
-  <ul>
-    <li>Added new <tt>WizardSelectComponents</tt> and <tt>WizardSelectTasks</tt> support functions.</li>
-    <li>Renamed the <tt>IsComponentSelected</tt> and <tt>IsTaskSelected</tt> support functions to <tt>WizardIsComponentSelected</tt> and <tt>WizardIsTaskSelected</tt>. The old names are still supported, but it is recommended to update your scripts to the new names and the compiler will issue a warning if you don't.</li>
-  </ul>
-  </li>
-  <li>Minor cosmetic fixes.</li>
-</ul>
-
-<p><a name="6.0.1"></a><span class="ver">6.0.1-beta </span><span class="date">(2019-03-07)</span></p>
-<ul>
-  <li><i>Fix:</i> In 6.0.0 it was no longer possible to use [Setup] section directive <tt>InfoAfterFile</tt>.</li>
-  <li>Pascal Scripting changes:
-  <ul>
-    <li><i>Fix:</i> Added <tt>Anchors</tt> properties to all controls created by the <tt>Create...Page</tt> support functions to add full support for <tt>WizardResizable</tt> and <tt>WizardSizePercent</tt>.</li>
-    <li>Updated the <i>AllPagesExample.iss</i> example script with examples of all <tt>Create...Page</tt> support functions.</li>
-    <li>The multi-line edit control created by the <tt>CreateOutputMsgMemoPage</tt> support function now has a more modern look.</li>
-  </ul>
-  </li>
-  <li>Added official German translation.</li>
-  <li>Demoted the official <a href="https://raw.github.com/jrsoftware/issrc/main/Files/Languages/Unofficial/Greek.isl">Greek</a>, <a href="https://raw.github.com/jrsoftware/issrc/main/Files/Languages/Unofficial/Hungarian.isl">Hungarian</a>, and <a href="https://raw.github.com/jrsoftware/issrc/main/Files/Languages/Unofficial/ScottishGaelic.isl">Scottish Gaelic</a> translations to unofficial because of a no longer available maintainer. To send updates yourself,  use <a href="https://jrsoftware.org/files/istrans/send2.php">this form</a> to send updates (or use <a href="https://github.com/jrsoftware/issrc" target="_blank">GitHub</a>). See the <a href="https://jrsoftware.org/files/istrans/">Inno Setup Translations</a> page for more information.</li>
-  <li>Other documentation improvements.</li>
-</ul>
-
-<p><a name="6.0.0"></a><span class="ver">6.0.0-beta </span><span class="date">(2019-02-11)</span></p>
-<p>Inno Setup 6 introduces a large number of changes:</p>
-<p><span class="head2">Administrative vs. non administrative install mode</span></p>
-<p>A number of changes have been made to the administrative vs. non administrative install mode functionality:</p>
-<ul>
-  <li>Added new &quot;auto&quot; constants which automatically map to their &quot;common&quot; form unless the installation is running in non administrative install mode, in which case they map to their &quot;user&quot; form. It is recommended to update your scripts to use these "auto" constants as much as possible to avoid mistakes. The list of added &quot;auto&quot; constants is: <tt>{autoappdata}</tt>, <tt>{autocf}</tt>, <tt>{autocf32}</tt>, <tt>{autocf64}</tt>, <tt>{autodesktop}</tt>, <tt>{autodocs}</tt>, <tt>{autopf}</tt>, <tt>{autopf32}</tt>, <tt>{autopf64}</tt>, <tt>{autoprograms}</tt>, <tt>{autostartmenu}</tt><tt>, {autostartup}</tt>, and <tt>{autotemplates}</tt>.</li>
-  <li>Updated all examples and the Compiler IDE's New Script Wizard to use <tt>{autopf}</tt> instead of <tt>{pf}</tt>, etc.</li>
-  <li><b>Change in default behavior:</b> The &quot;common&quot; shell folder constants are no longer mapped to their "user" form if the installation is running in non administrative install mode. Instead they simply return the requested common directory. The list of affected &quot;common&quot; constants is: <tt>{commonappdata}</tt>, <tt>{commondesktop}</tt>, <tt>{commondocs}</tt>, <tt>{commonprograms}</tt>, <tt>{commonstartmenu}</tt><tt>, {commonstartup}</tt>, and <tt>{commontemplates}</tt>.</li>
-  <li>The <tt>{pf}</tt> and <tt>{cf}</tt> constants have been renamed to <tt>{commonpf}</tt> and <tt>{commoncf}</tt>. This includes <tt>{pf32}</tt> to <tt>{commonpf32}</tt>, etc. The old names are still supported, but it is recommended to update your scripts to the new names and the compiler will issue a warning if you don't.</tt>
-  <li>The <tt>{commonfavorites}</tt> constant has been removed: this directory doesn't exist anymore in Windows.</li>
-  <li>The <tt>{userpf}</tt>, <tt>{usercf}</tt>, and <tt>{username}</tt> constants and the <tt>AlwaysUsePersonalGroup</tt> [Setup] section directive can now correctly trigger a <a href="https://jrsoftware.org/files/is5-whatsnew.htm#useduserareaswarnings">used user areas warning</a>.</li>
-  <li>Pascal Scripting change: Removed the <tt>GetShellFolder</tt> support function. As the help file already recommended, use <tt>ExpandConstant</tt> instead.</li>
-</ul>
-<ul>
-  <li>Added new [Registry] section <tt>Root</tt> value <tt>HKA</tt>. Equals <tt>HKLM</tt> in administrative install mode, and <tt>HKCU</tt> otherwise. Also supported by <tt>{reg:...}</tt> constants and <tt>HKA32</tt>/<tt>HKA64</tt> are also supported. Note: <tt>HKA</tt> (like <tt>HKCU</tt>) should only be used for settings which are compatible with roaming profiles.</li>
-  <li>Using [Registry] section <tt>Root</tt> value <tt>HKCR</tt> is no longer recommended, use <tt>HKA</tt> with the <tt>Subkey</tt> parameter set to &quot;Software\Classes&quot; instead.</li>
-  <li>Pascal Scripting change: Added <tt>HKA</tt> and <tt>HKEY_AUTO</tt> constants. <tt>HKA32</tt>, <tt>HKA64</tt>, <tt>HKEY_AUTO_32</tt>, and <tt>HKEY_AUTO_64</tt> are also supported.</li>
-</ul>
-<ul>
-  <li>The Compiler IDE's New Script Wizard now offers an option to select administrative or non administrative install mode and outputs scripts which work in both modes.</li>
-  <li>Pascal Scripting change: Added new <tt>IsAdminInstallMode</tt> support function.</li>
-  <li>Added a <a href="https://jrsoftware.org/ishelp/index.php?topic=admininstallmode">Non Administrative Install Mode</a> topic to the help file.</li>
-</ul>
-<p><span class="head2">Overridable install mode</span></p>
-<p>Once your script is fully updated to support both administrative and non administrative install mode (for example by using the new &quot;auto&quot; constants and the new [Registry] section <tt>Root</tt> value <tt>HKA</tt>) you can then use the following:</p>
-<ul>
-  <li>Added new [Setup] section directive: <tt>PrivilegesRequiredOverridesAllowed</tt>, which can be set to one or more overrides which allow the end user to override the script's default <tt>PrivilegesRequired</tt> setting. The following overrides are supported: <tt>commandline</tt> and <tt>dialog</tt>.</li>
-  <ul>
-    <li>If override <tt>commandline</tt> is allowed then Setup will support two additional command line parameters to override the script's default <tt>PrivilegesRequired</tt> setting: /ALLUSERS and /CURRENTUSER.</li>
-    <li>If override <tt>dialog</tt> is allowed then Setup will ask the user to choose the install mode based on the script's default <tt>PrivilegesRequired</tt> setting using a suppressible dialog (<a href="https://i.imgur.com/up287vq.png">example</a> if <tt>PrivilegesRequired</tt> is set to <tt>admin</tt>). Allowing <tt>dialog</tt> automatically allows <tt>commandline</tt> and when one of the command line parameters is used then Setup will not ask the user.</li>
-  </ul>
-  <li>Added new [Setup] section directive: <tt>UsePreviousPrivileges</tt>. If this directive is set to <tt>yes</tt> (which it is by default) and <tt>PrivilegesRequiredOverridesAllowed</tt> is set to <tt>dialog</tt>, at startup Setup will look in the registry to see if the <a href="https://jrsoftware.org/ishelp/index.php?topic=sameappnotes">same application</a> is already installed in one of the two install modes, and if so, it will use that install mode and not ask the user.</li>
-</ul>
-<ul>
-  <li>The Compiler IDE's New Script Wizard now offers options to allow the <tt>commandline</tt> and <tt>dialog</tt> overrides.</li>
-  <li>Inno Setup's own installer script now supports both administrative and non administrative install mode and allows the <tt>dialog</tt> override.</li>
-</ul>
-<p><span class="head2">Side-by-side installations</span></p>
-<p>Support for <a href="https://jrsoftware.org/ishelp/index.php?topic=sidebyside">side-by-side</a> installations has been improved:</p>
-<ul>
-  <li>Two separate installation runs that do not share the same administrative or non administrative install mode no longer count as the <a href="https://jrsoftware.org/ishelp/index.php?topic=sameappnotes">same application</a>. This means you can now install these modes <a href="https://jrsoftware.org/ishelp/index.php?topic=sidebyside">side-by-side</a> even if the installers share the same <tt>AppId</tt> setting (or if <tt>AppId</tt> is not set, the same <tt>AppName</tt> setting) without the odd side effects you would get in previous versions.</li>
-  <li><b>Change in default behavior:</b> To avoid entries with identical names in the <i>Add/Remove Programs</i> Control Panel applet Setup will now automatically mark the new entry with a text like &quot;Current user&quot; or &quot;64-bit&quot; when necessary during a <a href="https://jrsoftware.org/ishelp/index.php?topic=sidebyside">side-by-side</a> installation.</a>
-  <li>Added a <a href="https://jrsoftware.org/ishelp/index.php?topic=sidebyside">Side-by-side installation</a> topic to the help file.</li>
-</ul>
-<p><span class="head2">Resizable wizard window</span></p>
-<p>The wizard window is now optionally resizable:</p>
-<ul>
-  <li>Added new [Setup] section directive: <tt>WizardResizable</tt>. If this directive is set to <tt>yes</tt>, the user will be able to resize the main Setup wizard window.</li>
-  <li>Added new [Setup] section directive: <tt>WizardSizePercent</tt>, which can be used to increase the default size of all Setup and Uninstall wizard windows without increasing the font size.</li>
-  <li>Pascal Scripting changes:
-  <ul>
-    <li>Added new <tt>Anchors</tt> property to all controls and new <tt>KeepSizeY</tt> property to <tt>TSetupForm</tt> which allows you to add full support for <tt>WizardResizable</tt> and <tt>WizardSizePercent</tt> to all your custom controls, custom wizard pages and <tt>TSetupForm</tt> forms if you have any. See the <i>CodeClasses.iss</i> example script for an example. This example also shows other changes done to <tt>TSetupForm</tt>.</li>
-    <li>Added new <tt>Constraints</tt> property to the <tt>TForm</tt> support class.</li>
-  </ul>
-  </li>
-</ul>
-<p><span class="head2">New modern wizard style</span></p>
-<p>The wizard window now supports a more modern look:</p>
-<ul>
-  <li>Added new [Setup] section directive: <tt>WizardStyle</tt>. If this directive is set to <tt>modern</tt>, Setup and Uninstall will show a more modern look and also the defaults for <tt>WizardResizable</tt> and <tt>WizardSizePercent</tt> change to respectively <tt>yes</tt> and <tt>120,120</tt>.</li>
-  <li><b>Change in default behavior:</b> Earlier versions of Inno Setup also supported <tt>WizardStyle</tt> and if you still have <tt>WizardStyle=modern</tt> in your script (which was allowed for backward compatibility but didn't actually change anything) and don't want to new modern look, you should remove this line or change it to <tt>WizardStyle=classic</tt>.</li>
-  <li>Updated all examples and the Compiler IDE's New Script Wizard to use <tt>WizardStyle=modern</tt>.</li>
-  <li>Pascal Scripting change: Added new <tt>SurfaceColor</tt> property to the <tt>TWizardPage</tt> support class.</li>
-</ul>
-<p>A few elements now always have a more modern look regardless of the <tt>WizardStyle</tt> setting:</p>
-<ul>
-  <li>The <i>Select Language</i> dialog now has more modern look, consistent with Windows 10 task dialogs and message boxes (<a href="https://i.imgur.com/4xWv5tw.png">example</a>).</li>
-  <li>Flattened a few elements of Setup's interface for a more modern look.</li>
+  <li>[Files] section parameter <tt>FontInstall</tt> can now be used in <a href="https://jrsoftware.org/ishelp/index.php?topic=admininstallmode">non administrative installs</a>. Requires Windows 10 Version 1803 or later to successfully install a font.</li>
+  <li>The <tt>{fonts}</tt> constant has been renamed to <tt>{commonfonts}</tt>.  The old name is still supported, but it is recommended to update your scripts to the new names and the compiler will issue a warning if you don't.</tt>
+  <li>Added new <tt>{userfonts}</tt> constant. Only Windows 10 Version 1803 and later supports <tt>{userfonts}</tt>. Same directory as <tt>{localappdata}\Microsoft\Windows\Fonts</tt>.</li>
+  <li>Added new <tt>{autofonts}</tt> constant which automatically maps to <tt>{commonfonts}</tt> unless the installation is running in non administrative install mode, in which case it maps to <tt>{userfonts}</tt>. It is recommended to update your scripts to use <tt>{autofonts}</tt> as much as possible to avoid mistakes.</li>
+  <li>Updated all examples to use <tt>{autofonts}</tt> instead of <tt>{fonts}</tt>.</li>
+  <li>Pascal Scripting change: The <tt>UnregisterFont</tt> support function now has an extra parameter.</li>
 </ul>
 <p><span class="head2">Compiler IDE updates</span></p>
-<p>The look and feel of the Compiler IDE has been updated:</p>
+<p>Various improvements have been made to the Compiler IDE:</p>
 <ul>
-    <li>Updated all toolbar icons and flattened the interface of the Compiler IDE for a more modern look.</li>
-    <li>The Compiler IDE now supports three themes: Light (<a href="https://i.imgur.com/NVhZ0ml.png">example</a>), Dark (<a href="https://i.imgur.com/J4LMPAa.png">example</a>) and Classic (<a href="https://i.imgur.com/x513SpW.png">example</a>). The Light theme is the new default theme, unless the system is running Windows 10 and dark mode is enabled in which case the Dark theme is the default theme. The active theme can be changed in the options.</li>
-    <li>The Compiler IDE now uses per-monitor DPI awareness mode and also allows the "Segoe UI" font for its interface elements.</li>
-    <li>The "Compiler Output" view is now colorized. This can be turned off in the options.</li>
-    <li>The "Debug Output" view now uses bold text for any entry lines such as '-- File entry --'.</li>
-    <li>Options button <i>Associate .iss files with this compiler</i> can now associate for the current user instead of displaying an error if administrative privileges are not available.</li>
-    <li>Options <i>Allow Undo after save</i> and <i>Show indentation guides</i> are now on by default for new installations.</li>
-    <li>The "Configure Sign Tools" window is now wider by default and also resizable.</li>
+  <li><a href="https://i.imgur.com/wHoJ3FG.png">Improved highlighting</a> for the [CustomMessages] and [Messages] sections.</li>
+  <li>Added buttons to the Welcome dialog to <a href="https://jrsoftware.org/isdonate.php">Donate</a> to support Inno Setup and to <a href="https://jrsoftware.org/ismail.php">Subscribe</a> to the Inno Setup Mailing List.</li>
 </ul>
-<p><span class="head2">Other changes</span></p>
+<p><span class="head2">Pascal Scripting ([Code] section) updates</span></p>
+<p>Pascal Scripting now supports SHA-256 hashes:</p>
 <ul>
-  <li><b>OS requirements change:</b> Windows 2000, XP, and Server 2003 are no longer supported. Windows Vista is now the minimum supported operating system.</li>
-  <li><b>Change in default behavior:</b> Starting with Inno Setup 6 there's only one version available: Unicode Inno Setup. Unicode Inno Setup has been available for 9 years but in case you have not yet updated to it: please see the <a href="https://jrsoftware.org/ishelp/index.php?topic=unicode">Unicode Inno Setup</a> topic in the help file for more information. Basically, unless you're using [Code] to make DLL calls with string parameters you shouldn't have to make any changes to your script.</li>
+  <li>Added new <tt>GetSHA256OfFile</tt>, <tt>GetSHA256OfString</tt>, and <tt>GetSHA256OfUnicodeString</tt> support functions.</li>
 </ul>
+<p><span class="head2">Inno Setup Preprocessor (ISPP) updates</span></p>
+<p>ISPP now uses 64-bit integers and has new functions to more easily compare version numbers:</p>
 <ul>
-  <li>Added support for 64-bit mode on Windows 10 on ARM which can be used to install ARM64 binaries. See the <i>64BitThreeArch.iss</i> example script for an example which demonstrates how to install a program built for three different architectures (x86, x64, ARM64) using a single installer.</li>
+  <li>ISPP's <tt>int</tt> type is now a signed 64-bit integer type.</tt>
+  <li>Support function <tt>FileSize</tt> now supports 64-bit file sizes.</li>
+  <li>Added new <tt>PackVersionComponents</tt>, <tt>UnpackVersionComponents</tt>, and <tt>ParseVersionPacked</tt> support functions.</li>
 </ul>
+<p>Similar Pascal Scripting changes have been done:</p>
 <ul>
-  <li>The Abort/Retry/Ignore dialogs shown by Setup now display task dialogs. These task dialogs are much more user friendly than the message boxes previously used (example: <a href="https://i.imgur.com/NfbJAsS.png">task dialog</a> versus <a href="https://i.imgur.com/n7wh2UC.png">message box</a>).</li>
-  <li>Added new [Setup] section directive: <tt>VersionInfoOriginalFileName</tt>, which sets the original filename version value.</li>
-  <li>The <tt>Permissions</tt> parameter supported by [Files], [Dirs] and [Registry] entries now also allows you to grant permission to the Guests group, the Local Service account, the Network Service account, and to the Creator Owner.</li>
-  <li>Added new special-purpose <i>HelpTextNote</i> message that can be used to specify one or more lines of text that are added to the list of parameters in the summary shown when passing /HELP on the command line. This message defaults to an empty string so make sure to provide a non-empty default for all languages from your main script if you want to use it.</li>
-  <li>The compiler now supports UTF-8 encoded .isl files without requiring a special extension. Translators should still always set <tt>LanguageCodePage</tt> when possible.</li>
-  <li>The compiler will now throw an error if the $f sequence is missing in a Sign Tool command instead of executing it anyway.</li>
-  <li>Fix: The compiler now checks <tt>OutputBaseFileName</tt> and <tt>OutputManifestFile</tt> for bad characters even if <tt>Output</tt> is set to <tt>no</tt>.</li>
-  <li>/LOG: Now logs some additional information about Restart Manager.</li>
-</ul>
-<ul>
-  <li>Pascal Scripting changes:
-  <ul>
-    <li>Using event attributes it is now possible to have multiple implementations of the same event function in your script. This is especially useful in included scripts implementing an event function to avoid conflicts with the main script. See the help file for more information and the <i>CodeExample1.iss</i> example script for an example.</li>
-    <li>Added new <tt>TaskDialogMsgBox</tt> and <tt>SuppressibleTaskDialogMsgBox</tt> support functions which display a message box using a task dialog (<a href="https://i.imgur.com/hU4RQP2.png">example</a>). See the help file for more information and the <i>CodeClasses.iss</i> example script for an example.</li>
-    <li>Added new <tt>CreateCallback</tt> support function which allows you to perform direct callbacks from DLL functions (like Windows API functions) to functions in your script. See the help file and the <i>CodeDll.iss</i> example script for an example.</li>
-    <li>[Setup] section directives <tt>ChangesAssociations</tt> and <tt>ChangesEnvironment</tt> may now be set to a boolean expression, which may contain calls to check functions.</li>
-    <li>Many properties which did not support mouseover evaluation from the Compiler IDE now do.</li>
-    <li>To enable mouseover evaluation of their properties from the Compiler IDE, support objects <tt>MainForm</tt>, <tt>WizardForm</tt>, and <tt>UninstallProgressForm</tt> no longer raise an internal error if you try to access them before the forms are created. To get the old behaviour use new support functions <tt>GetMainForm</tt>, <tt>GetWizardForm</tt>, and <tt>GetUninstallProgressForm</tt> instead.</li>
-    <li>Added new <tt>BevelKind</tt> property to the <tt>TPanel</tt> support class and new <tt>BevelKind</tt> and <tt>BorderStyle</tt> properties to the <tt>TRichEditViewer</tt> support class, allowing you to enable a flatter interface for a more modern look. See the <i>CodeClasses.iss</i> example script for an example.</li>
-    <li>Added new <tt>SameStr</tt> and <tt>SameText</tt> support functions.</li>
-    <li>Renamed the <tt>IsAdminLoggedOn</tt> support function to <tt>IsAdmin</tt>. The old name is still supported, but it is recommended to update your scripts to the new name and the compiler will issue a warning if you don't. Also consider using <tt>IsAdminInstallMode</tt> instead.</li>
-    <li>Removed the <tt>TAlphaBitmap</tt> support class. Its functionality is now provided directly by <tt>TBitmap</tt>.</li>
-    <li>Fix: On Windows 10 on ARM, the <tt>IsWin64</tt> support function now correctly returns <tt>True</tt>, and the <tt>ProcessorArchitecture</tt> support function now correctly returns <tt>paARM64</tt>.</li>
-  </ul>
-  </li>
+  <li>Added new <tt>FileSize64</tt> support function.</li>
+  <li>Added new <tt>PackVersionNumbers</tt>, <tt>PackVersionComponents</tt>, <tt>UnpackVersionNumbers</tt>, <tt>UnpackVersionComponents</tt>, and <tt>VersionToStr</tt> support functions.</li>
 </ul>
+<p><span class="head2">Other changes</span></p>
 <ul>
-  <li>Inno Setup Preprocessor (ISPP) changes:
+  <li>Added new [Run] and [UninstallRun] sections flag: <tt>dontlogparameters</tt>. If this flag is specified, the command line parameters for the program will not be included in the log file.</li>
+  <li>Setup's prompts to overwrite or keep existing files have been made more user friendly:
   <ul>
-     <li>Inno Setup Preprocessor is now always installed.</li>
-     <li>Added new predefined variable <tt>NewLine</tt>.</li>
-     <li>Added new <tt>IsWin64</tt>, <tt>SameStr</tt> and <tt>SameText</tt> support functions.</li>
+    <li>If the new FileExists2 message is set by a translation, Setup will use it to show <a href="https://i.imgur.com/AnF6qo8.png">more user friendly prompts</a> to overwrite or keep existing files if the <tt>confirmoverwrite</tt> flag is set.</li>
+    <li>If the ExistingFileNewer2 message is set by a translation, Setup will use it to show <a href="https://i.imgur.com/VBDuZ7U.png">more user friendly prompts</a> to keep or overwrite existing files if the <tt>promptifolder</tt> flag is set.</li>
+    <li>These new prompts also use other new messages: <a href="https://github.com/jrsoftware/issrc/commit/e5ccbc5e0b1e2327a3608b1c69d016613c88df7e">View differences in Default.isl</a> for a complete list.</li>
   </ul>
   </li>
-</ul>
-<ul>
-  <li>Added new <i>AllPagesExample.iss</i> example script which shows all the wizard pages Setup may potentially display.</li>
-  <li>All documentation referring to the Power Users group has been removed: this group is not special anymore in Windows.</li>
-  <li>Other documentation and examples improvements.</li>
-  <li>Added official Icelandic translation.</li>
-  <li>Delphi compiler updated from Delphi 2009 to Delphi 10.3 Rio. This change increases the size of Setup but decreases development, testing and deployment times. It also makes it easier to compile Inno Setup yourself using the free Delphi Community Edition.</li>
+  <li>Pascal Scripting change: <i>Fix:</i> Support function <tt>WizardSelectComponents</tt> now also updates component sizes and the current selection's required disk space.</li>
   <li>Minor tweaks.</li>
 </ul>
 
-<p>Contributions via <a href="https://github.com/jrsoftware/issrc" target="_blank">GitHub</a>: Thanks to jogo-, Martin Prikryl, dscharrer, Kleuter, Gavin Lambert, Stef&aacute;n &Ouml;rvar Sigmundsson, DRON, Kevin Puetz, and Sherlock Software for their contributions.</p>
-
-<p>Some messages have been added and changed in this version: (<a href="https://github.com/jrsoftware/issrc/commit/1d6d6869b225c73cde4d3e0541b87264c36f3954">View differences in Default.isl</a>).</p>
-<ul>
-  <li><b>New messages:</b> AbortRetryIgnoreSelectAction, AbortRetryIgnoreRetry, AbortRetryIgnoreIgnore, AbortRetryIgnoreCancel, ExistingFileReadOnly2, ExistingFileReadOnlyRetry, ExistingFileReadOnlyKeepExisting, FileAbortRetryIgnoreIgnoreNotRecommended, FileAbortRetryIgnoreSkipNotRecommended, PrivilegesRequiredOverrideTitle, PrivilegesRequiredOverrideInstruction, PrivilegesRequiredOverrideText1, PrivilegesRequiredOverrideText2, PrivilegesRequiredOverrideAllUsers, PrivilegesRequiredOverrideAllUsersRecommended, PrivilegesRequiredOverrideCurrentUser, PrivilegesRequiredOverrideCurrentUserRecommended, UninstallDisplayNameMark, UninstallDisplayNameMarks, UninstallDisplayNameMark32Bit, UninstallDisplayNameMark64Bit, UninstallDisplayNameMarkAllUsers, UninstallDisplayNameCurrentUser.</li>
-  <li><b>Changed message:</b> SelectLanguageLabel.</li>
-  <li><b>Removed messages:</b> EntryAbortRetryIgnore, ExistingFileReadOnly, ExistingFileReadOnlyAbortRetryIgnore, FileAbortRetryIgnore, FileAbortRetryIgnore2, MissingWOW64APIs.</li>
-</ul>
-
-<p>Note: Not all official translations have been updated for these changes at this moment. Demoted the official <a href="https://raw.github.com/jrsoftware/issrc/main/Files/Languages/Unofficial/German.isl">German</a>, <a href="https://raw.github.com/jrsoftware/issrc/main/Files/Languages/Unofficial/Nepali.islu">Nepali</a>, <a href="https://raw.github.com/jrsoftware/issrc/main/Files/Languages/Unofficial/SerbianCyrillic.isl">Serbian (Cyrillic)</a> and <a href="https://raw.github.com/jrsoftware/issrc/main/Files/Languages/Unofficial/SerbianLatin.isl">Serbian (Latin)</a> translations to unofficial because of a no longer available maintainer. To send updates yourself, use <a href="https://jrsoftware.org/files/istrans/send2.php">this form</a> to send updates (or use <a href="https://github.com/jrsoftware/issrc" target="_blank">GitHub</a>). See the <a href="https://jrsoftware.org/files/istrans/">Inno Setup Translations</a> page for more information.</li>
+<p>Contributions via <a href="https://github.com/jrsoftware/issrc" target="_blank">GitHub</a>: Thanks to Gavin Lambert for their contributions.</p>
 
-<p><a href="https://jrsoftware.org/files/is5-whatsnew.htm">Inno Setup 5.6 Revision History</a></p>
+<p><a href="https://jrsoftware.org/files/is6.0-whatsnew.htm">Inno Setup 6.0 Revision History</a></p >
 
 </body>
 </html>