<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://nsis.sourceforge.io/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Bnicer</id>
	<title>NSIS Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://nsis.sourceforge.io/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Bnicer"/>
	<link rel="alternate" type="text/html" href="https://nsis.sourceforge.io/Special:Contributions/Bnicer"/>
	<updated>2026-04-07T06:43:02Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.39.17</generator>
	<entry>
		<id>https://nsis.sourceforge.io/mediawiki/index.php?title=File:SOD_II_tool.zip&amp;diff=23403</id>
		<title>File:SOD II tool.zip</title>
		<link rel="alternate" type="text/html" href="https://nsis.sourceforge.io/mediawiki/index.php?title=File:SOD_II_tool.zip&amp;diff=23403"/>
		<updated>2013-05-25T01:05:02Z</updated>

		<summary type="html">&lt;p&gt;Bnicer: uploaded a new version of &amp;amp;quot;File:SOD II tool.zip&amp;amp;quot;: Re-Re-Compiled with NSIS 3 new release - corrected syntax. Updated May 25, 2013.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Size On Disk (SOD) utility, mark II. Supplemental file for the &#039;Size on disk&#039; NSIS wiki code example. Source files are included for compiling the utility. The purpose is to exemplify the use of ${GetSizeOnDisk}, an included macro that returns logical size (size on disk) of folders and files. The tool has an MUI 2 input page and an output page.&lt;/div&gt;</summary>
		<author><name>Bnicer</name></author>
	</entry>
	<entry>
		<id>https://nsis.sourceforge.io/mediawiki/index.php?title=File:SODTool.zip&amp;diff=23402</id>
		<title>File:SODTool.zip</title>
		<link rel="alternate" type="text/html" href="https://nsis.sourceforge.io/mediawiki/index.php?title=File:SODTool.zip&amp;diff=23402"/>
		<updated>2013-05-25T01:03:28Z</updated>

		<summary type="html">&lt;p&gt;Bnicer: uploaded a new version of &amp;amp;quot;File:SODTool.zip&amp;amp;quot;: Re-Re-Compiled with NSIS 3 new release - corrected syntax. Updated May 25, 2013.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;File attachment for Get size on disk code example. Includes icon, macros header file, nsissize executable, nsissize script. Created Feb. 15, 2013.&lt;/div&gt;</summary>
		<author><name>Bnicer</name></author>
	</entry>
	<entry>
		<id>https://nsis.sourceforge.io/mediawiki/index.php?title=File:SOD_II_tool.zip&amp;diff=23399</id>
		<title>File:SOD II tool.zip</title>
		<link rel="alternate" type="text/html" href="https://nsis.sourceforge.io/mediawiki/index.php?title=File:SOD_II_tool.zip&amp;diff=23399"/>
		<updated>2013-05-24T15:59:22Z</updated>

		<summary type="html">&lt;p&gt;Bnicer: uploaded a new version of &amp;amp;quot;File:SOD II tool.zip&amp;amp;quot;: Re-Compiled with NSIS 3 new release. Updated May 24, 2013.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Size On Disk (SOD) utility, mark II. Supplemental file for the &#039;Size on disk&#039; NSIS wiki code example. Source files are included for compiling the utility. The purpose is to exemplify the use of ${GetSizeOnDisk}, an included macro that returns logical size (size on disk) of folders and files. The tool has an MUI 2 input page and an output page.&lt;/div&gt;</summary>
		<author><name>Bnicer</name></author>
	</entry>
	<entry>
		<id>https://nsis.sourceforge.io/mediawiki/index.php?title=File:SODTool.zip&amp;diff=23398</id>
		<title>File:SODTool.zip</title>
		<link rel="alternate" type="text/html" href="https://nsis.sourceforge.io/mediawiki/index.php?title=File:SODTool.zip&amp;diff=23398"/>
		<updated>2013-05-24T15:58:28Z</updated>

		<summary type="html">&lt;p&gt;Bnicer: uploaded a new version of &amp;amp;quot;File:SODTool.zip&amp;amp;quot;: Re-Compiled with NSIS 3 new release. Updated May 24, 2013.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;File attachment for Get size on disk code example. Includes icon, macros header file, nsissize executable, nsissize script. Created Feb. 15, 2013.&lt;/div&gt;</summary>
		<author><name>Bnicer</name></author>
	</entry>
	<entry>
		<id>https://nsis.sourceforge.io/mediawiki/index.php?title=Get_size_on_disk&amp;diff=23397</id>
		<title>Get size on disk</title>
		<link rel="alternate" type="text/html" href="https://nsis.sourceforge.io/mediawiki/index.php?title=Get_size_on_disk&amp;diff=23397"/>
		<updated>2013-05-24T15:55:43Z</updated>

		<summary type="html">&lt;p&gt;Bnicer: Size On Disk (SOD) utility&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PageAuthor|Bnicer}}&lt;br /&gt;
This example code shows you how to get the space used by directories and files.&lt;br /&gt;
&amp;lt;highlight-nsis&amp;gt;&lt;br /&gt;
; A utility for computing the NSIS (or NSIS Unicode) install folder size and the size of&lt;br /&gt;
; the uninstaller&lt;br /&gt;
; nsissize.nsi&lt;br /&gt;
; Compile, then run the .exe&lt;br /&gt;
&lt;br /&gt;
Name &amp;quot;SOD Tool&amp;quot;&lt;br /&gt;
Unicode true&lt;br /&gt;
ManifestSupportedOS all&lt;br /&gt;
RequestExecutionLevel user&lt;br /&gt;
#RequestExecutionLevel admin ; More files may be found in system folders&lt;br /&gt;
!define LOCAL &amp;quot;&amp;quot; ; Path where local include files reside&lt;br /&gt;
OutFile &amp;quot;${LOCAL}nsissize.exe&amp;quot;&lt;br /&gt;
!include &amp;quot;${LOCAL}macros.nsh&amp;quot;&lt;br /&gt;
Icon &amp;quot;${LOCAL}arrows.ico&amp;quot;&lt;br /&gt;
ReserveFile &amp;quot;${NSISDIR}\Plugins\x86-unicode\Math.dll&amp;quot; ; Doesn&#039;t seem to like &amp;quot;!include&amp;quot;&lt;br /&gt;
!include &amp;quot;LogicLib.nsh&amp;quot;&lt;br /&gt;
ShowInstDetails show&lt;br /&gt;
&lt;br /&gt;
;--------------------------------&lt;br /&gt;
&lt;br /&gt;
; Variables&lt;br /&gt;
Var NSIS&lt;br /&gt;
Var COMPRESSED&lt;br /&gt;
Var COMPRESSED_UN&lt;br /&gt;
Var BLOCK&lt;br /&gt;
Var FILES&lt;br /&gt;
Var FOLDERS&lt;br /&gt;
Var SIZE_B&lt;br /&gt;
Var SIZE_M&lt;br /&gt;
Var SOD_B&lt;br /&gt;
Var SOD_K&lt;br /&gt;
Var SOD_M&lt;br /&gt;
Var SIZE_UN_B&lt;br /&gt;
Var SIZE_UN_K&lt;br /&gt;
Var SOD_UN_B&lt;br /&gt;
Var SOD_UN_K&lt;br /&gt;
&lt;br /&gt;
;--------------------------------&lt;br /&gt;
&lt;br /&gt;
; Functions&lt;br /&gt;
Function Separator ; comma&lt;br /&gt;
  Exch $R1 ; input string&lt;br /&gt;
  Push $R2&lt;br /&gt;
  Push $R3&lt;br /&gt;
  Push $R4&lt;br /&gt;
  Push $R5&lt;br /&gt;
  StrCpy $R2 $R1&lt;br /&gt;
  StrCpy $R5 &amp;quot;16&amp;quot; ; 1,000,000,000,000,000 limit&lt;br /&gt;
  StrLen $R4 $R1&lt;br /&gt;
loop:&lt;br /&gt;
  IntCmp $R5 3 endloop endloop 0&lt;br /&gt;
  IntCmp $R4 $R5 0 +7 0&lt;br /&gt;
  IntOp $R5 $R5 - 1&lt;br /&gt;
  StrCpy $R2 $R2 -$R5&lt;br /&gt;
  StrCpy $R3 $R1 &amp;quot;&amp;quot; -$R5&lt;br /&gt;
  StrCpy $R2 &amp;quot;$R2,$R3&amp;quot;&lt;br /&gt;
  IntOp $R5 $R5 - 2&lt;br /&gt;
  Goto loop&lt;br /&gt;
  IntOp $R5 $R5 - 3&lt;br /&gt;
  Goto loop&lt;br /&gt;
endloop:&lt;br /&gt;
  Pop $R5&lt;br /&gt;
  Pop $R4&lt;br /&gt;
  Pop $R3&lt;br /&gt;
  Exch $R2&lt;br /&gt;
  Pop $R1&lt;br /&gt;
  Exch $R1 ; output string&lt;br /&gt;
FunctionEnd&lt;br /&gt;
&lt;br /&gt;
;--------------------------------&lt;br /&gt;
&lt;br /&gt;
; Main Section (nothing will be installed)&lt;br /&gt;
Section&lt;br /&gt;
; registry&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS Unicode&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS ANSI&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  Goto done&lt;br /&gt;
  begin:&lt;br /&gt;
  IfFileExists &amp;quot;$NSIS&amp;quot; 0 done&lt;br /&gt;
  ${GetClusterSize} $NSIS $BLOCK&lt;br /&gt;
; directory&lt;br /&gt;
  ${GetSizeOnDisk} &amp;quot;$NSIS&amp;quot; &amp;quot;/S=0B&amp;quot; &amp;quot;&amp;quot; $0 $1 $2 $3&lt;br /&gt;
  StrCpy $SIZE_B $0&lt;br /&gt;
  StrCpy $FILES $1&lt;br /&gt;
  StrCpy $FOLDERS $2&lt;br /&gt;
  Math::Script &amp;quot;r4 = ff($0 / 1024 / 1024.0, 16 +2)&amp;quot;&lt;br /&gt;
  StrCpy $SIZE_M $4&lt;br /&gt;
  ${GetSizeOnDisk} &amp;quot;$NSIS&amp;quot; &amp;quot;/S=0B&amp;quot; &amp;quot;$BLOCK&amp;quot; $0 $1 $2 $3&lt;br /&gt;
  StrCpy $SOD_B $0&lt;br /&gt;
  StrCpy $COMPRESSED $3&lt;br /&gt;
  Math::Script &amp;quot;r4 = ff($0 / 1024.0, 16 +0); r5 = ff(r4 / 1024.0, 16 +2)&amp;quot;&lt;br /&gt;
  StrCpy $SOD_K $4&lt;br /&gt;
  StrCpy $SOD_M $5&lt;br /&gt;
; uninstaller&lt;br /&gt;
  IfFileExists &amp;quot;$NSIS\uninst-nsis.exe&amp;quot; 0 done&lt;br /&gt;
  ${GetSizeOnDisk} &amp;quot;$NSIS&amp;quot; &amp;quot;/M=uninst-nsis.exe /S=0B /G=0&amp;quot; &amp;quot;&amp;quot; $0 $1 $2 $3&lt;br /&gt;
  StrCpy $SIZE_UN_B $0&lt;br /&gt;
  Math::Script &amp;quot;r4 = ff($0 / 1024.0, 16 +1)&amp;quot;&lt;br /&gt;
  StrCpy $SIZE_UN_K $4&lt;br /&gt;
  ${GetSizeOnDisk} &amp;quot;$NSIS&amp;quot; &amp;quot;/M=uninst-nsis.exe /S=0B /G=0&amp;quot; &amp;quot;$BLOCK&amp;quot; $0 $1 $2 $3&lt;br /&gt;
  StrCpy $SOD_UN_B $0&lt;br /&gt;
  ${If} $3 &amp;gt; 0&lt;br /&gt;
    StrCpy $COMPRESSED_UN &amp;quot; (compressed or sparse)&amp;quot;&lt;br /&gt;
  ${Else}&lt;br /&gt;
    StrCpy $COMPRESSED_UN &amp;quot;&amp;quot;&lt;br /&gt;
  ${EndIf}&lt;br /&gt;
  Math::Script &amp;quot;r4 = ff($0 / 1024.0, 16 +1)&amp;quot;&lt;br /&gt;
  StrCpy $SOD_UN_K $4&lt;br /&gt;
; format&lt;br /&gt;
  Push $SIZE_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  Pop $SIZE_B&lt;br /&gt;
&lt;br /&gt;
  Push $SOD_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  Pop $SOD_B&lt;br /&gt;
&lt;br /&gt;
  Push $SOD_K&lt;br /&gt;
  Call Separator&lt;br /&gt;
  Pop $SOD_K&lt;br /&gt;
&lt;br /&gt;
  Push $SIZE_UN_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  Pop $SIZE_UN_B&lt;br /&gt;
&lt;br /&gt;
  Push $SOD_UN_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  Pop $SOD_UN_B&lt;br /&gt;
; output&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;$NSIS&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;Size: $SIZE_M MB ($SIZE_B bytes)&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;SOD: $SOD_M MB ($SOD_B bytes)&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;Uninstaller$COMPRESSED_UN&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;Size: $SIZE_UN_K KB ($SIZE_UN_B bytes)&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;SOD: $SOD_UN_K KB ($SOD_UN_B bytes)&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;$FILES files | $FOLDERS folders | $SOD_K Kb | $COMPRESSED compressed/sparse file(s)&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  Goto completed&lt;br /&gt;
done:&lt;br /&gt;
  DetailPrint &amp;quot;File not found.&amp;quot;&lt;br /&gt;
completed:&lt;br /&gt;
SectionEnd&lt;br /&gt;
&lt;br /&gt;
;--------------------------------&lt;br /&gt;
# EOF&lt;br /&gt;
&amp;lt;/highlight-nsis&amp;gt;&lt;br /&gt;
You should copy the next code into a separate file: &amp;lt;b&amp;gt;macros.nsh&amp;lt;/b&amp;gt;.&lt;br /&gt;
&amp;lt;highlight-nsis&amp;gt;&lt;br /&gt;
; Macros include (TN)&lt;br /&gt;
;--------------------------------&lt;br /&gt;
/*&lt;br /&gt;
&lt;br /&gt;
 FileFunction=[GetSizeOnDisk|GetClusterSize]&lt;br /&gt;
&lt;br /&gt;
*/&lt;br /&gt;
;_____________________________________________________________________________&lt;br /&gt;
;&lt;br /&gt;
;                         Macros&lt;br /&gt;
;_____________________________________________________________________________&lt;br /&gt;
;&lt;br /&gt;
; Change log window verbosity (default: 3=no script)&lt;br /&gt;
;&lt;br /&gt;
; Example:&lt;br /&gt;
; !include &amp;quot;macros.nsh&amp;quot;&lt;br /&gt;
; !insertmacro GetSizeOnDisk&lt;br /&gt;
; ${FILEFUNC_VERBOSE} 4   # all verbosity&lt;br /&gt;
; !insertmacro GetClusterSize&lt;br /&gt;
; ${FILEFUNC_VERBOSE} 3   # no script&lt;br /&gt;
&lt;br /&gt;
!include Util.nsh ; for &amp;quot;CallArtificialFunction&amp;quot;&lt;br /&gt;
&lt;br /&gt;
!verbose push&lt;br /&gt;
!verbose 3&lt;br /&gt;
!ifndef _FILEFUNC_VERBOSE&lt;br /&gt;
	!define _FILEFUNC_VERBOSE 3&lt;br /&gt;
!endif&lt;br /&gt;
!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
!define FILEFUNC_VERBOSE `!insertmacro FILEFUNC_VERBOSE`&lt;br /&gt;
!verbose pop&lt;br /&gt;
&lt;br /&gt;
!macro FILEFUNC_VERBOSE _VERBOSE&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose 3&lt;br /&gt;
	!undef _FILEFUNC_VERBOSE&lt;br /&gt;
	!define _FILEFUNC_VERBOSE ${_VERBOSE}&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetSizeOnDiskCall _PATH _OPTIONS _FILESYSTEM _RESULT1 _RESULT2 _RESULT3 _RESULT4&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
	Push `${_PATH}`&lt;br /&gt;
	Push `${_OPTIONS}`&lt;br /&gt;
	Push `${_FILESYSTEM}` ; volume block size&lt;br /&gt;
	${CallArtificialFunction} GetSizeOnDisk_&lt;br /&gt;
	Pop ${_RESULT1}&lt;br /&gt;
	Pop ${_RESULT2}&lt;br /&gt;
	Pop ${_RESULT3}&lt;br /&gt;
	Pop ${_RESULT4}&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetClusterSizeCall _PATH _RESULT&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
	Push `${_PATH}` &lt;br /&gt;
	${CallArtificialFunction} GetClusterSize_&lt;br /&gt;
	Pop ${_RESULT}&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
; ---------------&lt;br /&gt;
; GetSizeOnDisk (modified &amp;quot;GetSize&amp;quot; - FileFunc.nsh - KiCHiK - Function &amp;quot;FindFiles&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
!define GetSizeOnDisk `!insertmacro GetSizeOnDiskCall`&lt;br /&gt;
!define un.GetSizeOnDisk `!insertmacro GetSizeOnDiskCall`&lt;br /&gt;
&lt;br /&gt;
!macro GetSizeOnDisk&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro un.GetSizeOnDisk&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
; Usage: similar to &amp;quot;GetSize&amp;quot;&lt;br /&gt;
&lt;br /&gt;
; For documentation, see the NSIS user manual: E.1.3 GetSize&lt;br /&gt;
; Four (not three) values are returned&lt;br /&gt;
&lt;br /&gt;
; $var1		; Result1: Size/Size on disk&lt;br /&gt;
; $var2		; Result2: Sum of files&lt;br /&gt;
; $var3		; Result3: Sum of directories&lt;br /&gt;
; $var4		; Result4: Sum of compressed/sparse files&lt;br /&gt;
&lt;br /&gt;
; Example: ${GetSizeOnDisk} &amp;quot;$INSTDIR&amp;quot; &amp;quot;/S=0K&amp;quot; &amp;quot;SOD&amp;quot; $0 $1 $2 $3&lt;br /&gt;
; DetailPrint &amp;quot;$1 file(s) | $2 folder(s) | $0 Kb | $3 compressed or sparse file(s)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
; Specifying &#039;SOD&#039; (e.g. Size On Disk) toggles the $var1 result&lt;br /&gt;
; Output is logical size, if used, or physical size, if left empty &amp;quot;&amp;quot;&lt;br /&gt;
; The target volume&#039;s allocation unit size in bytes, the size of a&lt;br /&gt;
; cluster, for example &#039;4096&#039; bytes, if valid, can also be the input&lt;br /&gt;
; If neither &#039;SOD&#039; nor a cluster size is specified, $var4 returns 0&lt;br /&gt;
; even where compressed and/or sparse files exist&lt;br /&gt;
&lt;br /&gt;
; ${GetSizeOnDisk} can be used with Windows NT and Windows 2000&lt;br /&gt;
; When the volume is FAT32, FAT16 or an older file system, the result&lt;br /&gt;
; in $var1 reverts to physical size, although not incorrect&lt;br /&gt;
&lt;br /&gt;
!macro GetSizeOnDisk_&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
&lt;br /&gt;
	Exch $2&lt;br /&gt;
	Exch 2&lt;br /&gt;
	Exch $0&lt;br /&gt;
	Exch&lt;br /&gt;
	Exch $1&lt;br /&gt;
	Push $3&lt;br /&gt;
	Push $4&lt;br /&gt;
	Push $5&lt;br /&gt;
	Push $6&lt;br /&gt;
	Push $7&lt;br /&gt;
	Push $8&lt;br /&gt;
	Push $9&lt;br /&gt;
	Push $R0&lt;br /&gt;
	Push $R1&lt;br /&gt;
	Push $R2&lt;br /&gt;
	StrCpy $R1 $2&lt;br /&gt;
	Push $R3&lt;br /&gt;
	Push $R4&lt;br /&gt;
	Push $R5&lt;br /&gt;
	Push $R6&lt;br /&gt;
	Push $R7&lt;br /&gt;
	Push $R8&lt;br /&gt;
	Push $R9&lt;br /&gt;
	ClearErrors&lt;br /&gt;
&lt;br /&gt;
	StrCmp $R1 &#039;&#039; FileFunc_GetSize_path&lt;br /&gt;
&lt;br /&gt;
	StrCpy $5 $0&lt;br /&gt;
	StrCpy $2 $0 2&lt;br /&gt;
	StrCmp $2 &#039;\\&#039; FileFunc_GetSize_Root_UNC&lt;br /&gt;
	StrCpy $3 $2 1 1&lt;br /&gt;
	StrCmp $3 &#039;:&#039; 0 FileFunc_GetSize_Root_empty&lt;br /&gt;
	StrCpy $5 $2&lt;br /&gt;
	goto FileFunc_GetSize_FileSystem&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_Root_UNC:&lt;br /&gt;
	StrCpy $3 1&lt;br /&gt;
	StrCpy $4 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_Root_loop:&lt;br /&gt;
	IntOp $3 $3 + 1&lt;br /&gt;
	StrCpy $2 $5 1 $3&lt;br /&gt;
	StrCmp $2$4 &#039;&#039; FileFunc_GetSize_Root_empty&lt;br /&gt;
	StrCmp $2 &#039;&#039; +5&lt;br /&gt;
	StrCmp $2 &#039;\&#039; 0 FileFunc_GetSize_Root_loop&lt;br /&gt;
	StrCmp $4 &#039;1&#039; +3&lt;br /&gt;
	StrCpy $4 &#039;1&#039;&lt;br /&gt;
	goto FileFunc_GetSize_Root_loop&lt;br /&gt;
	StrCpy $5 $5 $3&lt;br /&gt;
	StrCpy $3 $5 1 -1&lt;br /&gt;
	StrCmp $3 &#039;\&#039; 0 FileFunc_GetSize_FileSystem&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_Root_empty:&lt;br /&gt;
	StrCpy $5 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_FileSystem:&lt;br /&gt;
	System::Call &#039;Kernel32::GetVolumeInformation\&lt;br /&gt;
	(t &amp;quot;$5\&amp;quot;,t,i ${NSIS_MAX_STRLEN},*i,*i,*i,t.r2,i ${NSIS_MAX_STRLEN})i.r3&#039;&lt;br /&gt;
	StrCmp $3 0 FileFunc_GetSize_FileSystem_error&lt;br /&gt;
	StrCpy $2 $2 3&lt;br /&gt;
	StrCmp $2 &#039;FAT&#039; FileFunc_GetSize_FileSystem_error&lt;br /&gt;
	StrCmp $R1 &#039;SOD&#039; 0 FileFunc_GetSize_path&lt;br /&gt;
	System::Call &#039;kernel32::GetDiskFreeSpace(t &amp;quot;$5\&amp;quot;,*i0r2,*i0r3,,)&#039;&lt;br /&gt;
	IntOp $R1 $2 * $3&lt;br /&gt;
	goto FileFunc_GetSize_path&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_FileSystem_error:&lt;br /&gt;
	StrCpy $R1 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_path:&lt;br /&gt;
	StrCpy $R9 $0 1 -1&lt;br /&gt;
	StrCmp $R9 &#039;\&#039; 0 +3&lt;br /&gt;
	StrCpy $0 $0 -1&lt;br /&gt;
	goto -3&lt;br /&gt;
	IfFileExists &#039;$0\*.*&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
&lt;br /&gt;
	StrCpy $3 0&lt;br /&gt;
	StrCpy $4 &#039;&#039;&lt;br /&gt;
	StrCpy $5 &#039;&#039;&lt;br /&gt;
	StrCpy $6 &#039;&#039;&lt;br /&gt;
	StrCpy $8 0&lt;br /&gt;
	StrCpy $R3 &#039;&#039;&lt;br /&gt;
	StrCpy $R4 &#039;&#039;&lt;br /&gt;
	StrCpy $R5 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_option:&lt;br /&gt;
	StrCpy $R9 $1 1&lt;br /&gt;
	StrCpy $1 $1 &#039;&#039; 1&lt;br /&gt;
	StrCmp $R9 &#039; &#039; -2&lt;br /&gt;
	StrCmp $R9 &#039;&#039; FileFunc_GetSize_sizeset&lt;br /&gt;
	StrCmp $R9 &#039;/&#039; 0 -4&lt;br /&gt;
&lt;br /&gt;
	StrCpy $9 -1&lt;br /&gt;
	IntOp $9 $9 + 1&lt;br /&gt;
	StrCpy $R9 $1 1 $9&lt;br /&gt;
	StrCmp $R9 &#039;&#039; +2&lt;br /&gt;
	StrCmp $R9 &#039;/&#039; 0 -3&lt;br /&gt;
	StrCpy $8 $1 $9&lt;br /&gt;
	StrCpy $8 $8 &#039;&#039; 2&lt;br /&gt;
	StrCpy $R9 $8 &#039;&#039; -1&lt;br /&gt;
	StrCmp $R9 &#039; &#039; 0 +3&lt;br /&gt;
	StrCpy $8 $8 -1&lt;br /&gt;
	goto -3&lt;br /&gt;
	StrCpy $R9 $1 2&lt;br /&gt;
	StrCpy $1 $1 &#039;&#039; $9&lt;br /&gt;
&lt;br /&gt;
	StrCmp $R9 &#039;M=&#039; 0 FileFunc_GetSize_size&lt;br /&gt;
	StrCpy $4 $8&lt;br /&gt;
	goto FileFunc_GetSize_option&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_size:&lt;br /&gt;
	StrCmp $R9 &#039;S=&#039; 0 FileFunc_GetSize_gotosubdir&lt;br /&gt;
	StrCpy $6 $8&lt;br /&gt;
	goto FileFunc_GetSize_option&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_gotosubdir:&lt;br /&gt;
	StrCmp $R9 &#039;G=&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
	StrCpy $7 $8&lt;br /&gt;
	StrCmp $7 &#039;&#039; +3&lt;br /&gt;
	StrCmp $7 &#039;1&#039; +2&lt;br /&gt;
	StrCmp $7 &#039;0&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
	goto FileFunc_GetSize_option&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_sizeset:&lt;br /&gt;
	StrCmp $6 &#039;&#039; FileFunc_GetSize_default&lt;br /&gt;
	StrCpy $9 0&lt;br /&gt;
	StrCpy $R9 $6 1 $9&lt;br /&gt;
	StrCmp $R9 &#039;&#039; +4&lt;br /&gt;
	StrCmp $R9 &#039;:&#039; +3&lt;br /&gt;
	IntOp $9 $9 + 1&lt;br /&gt;
	goto -4&lt;br /&gt;
	StrCpy $5 $6 $9&lt;br /&gt;
	IntOp $9 $9 + 1&lt;br /&gt;
	StrCpy $1 $6 1 -1&lt;br /&gt;
	StrCpy $6 $6 -1 $9&lt;br /&gt;
	StrCmp $5 &#039;&#039; +2&lt;br /&gt;
	IntOp $5 $5 + 0&lt;br /&gt;
	StrCmp $6 &#039;&#039; +2&lt;br /&gt;
	IntOp $6 $6 + 0&lt;br /&gt;
&lt;br /&gt;
	StrCmp $1 &#039;B&#039; 0 +4&lt;br /&gt;
	StrCpy $1 1&lt;br /&gt;
	StrCpy $2 bytes&lt;br /&gt;
	goto FileFunc_GetSize_default&lt;br /&gt;
	StrCmp $1 &#039;K&#039; 0 +4&lt;br /&gt;
	StrCpy $1 1024&lt;br /&gt;
	StrCpy $2 Kb&lt;br /&gt;
	goto FileFunc_GetSize_default&lt;br /&gt;
	StrCmp $1 &#039;M&#039; 0 +4&lt;br /&gt;
	StrCpy $1 1048576&lt;br /&gt;
	StrCpy $2 Mb&lt;br /&gt;
	goto FileFunc_GetSize_default&lt;br /&gt;
	StrCmp $1 &#039;G&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
	StrCpy $1 1073741824&lt;br /&gt;
	StrCpy $2 Gb&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_default:&lt;br /&gt;
	StrCmp $4 &#039;&#039; 0 +2&lt;br /&gt;
	StrCpy $4 &#039;*.*&#039;&lt;br /&gt;
	StrCmp $7 &#039;&#039; 0 +2&lt;br /&gt;
	StrCpy $7 &#039;1&#039;&lt;br /&gt;
&lt;br /&gt;
	StrCpy $8 1&lt;br /&gt;
	Push $0&lt;br /&gt;
	SetDetailsPrint textonly&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_nextdir:&lt;br /&gt;
	IntOp $8 $8 - 1&lt;br /&gt;
	Pop $R8&lt;br /&gt;
	FindFirst $0 $R7 &#039;$R8\$4&#039;&lt;br /&gt;
	IfErrors FileFunc_GetSize_show&lt;br /&gt;
	StrCmp $R7 &#039;.&#039; 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	StrCmp $R7 &#039;..&#039; 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
	goto FileFunc_GetSize_show&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_dir:&lt;br /&gt;
	IfFileExists &#039;$R8\$R7\*.*&#039; 0 FileFunc_GetSize_file&lt;br /&gt;
	IntOp $R5 $R5 + 1&lt;br /&gt;
	goto FileFunc_GetSize_findnext&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_file:&lt;br /&gt;
	StrCpy $R6 0&lt;br /&gt;
	StrCmp $5$6 &#039;&#039; 0 +3&lt;br /&gt;
	IntOp $R4 $R4 + 1&lt;br /&gt;
	goto FileFunc_GetSize_findnext&lt;br /&gt;
	StrCmp $R1 &#039;&#039; FileFunc_GetSize_fileopen&lt;br /&gt;
	StrCpy $R0 0&lt;br /&gt;
	System::Call &#039;kernel32::GetFileAttributes(t &amp;quot;$R8\$R7&amp;quot;)i .R2&#039;&lt;br /&gt;
	StrCmp $R2 -1 FileFunc_GetSize_fileopen&lt;br /&gt;
	IntOp $R0 $R2 &amp;amp; 0x0800 ; compressed&lt;br /&gt;
	IntCmp $R0 0 0 0 FileFunc_GetSize_GetCompressed&lt;br /&gt;
	IntOp $R0 $R2 &amp;amp; 0x0200 ; sparse file&lt;br /&gt;
	IntCmp $R0 0 FileFunc_GetSize_fileopen&lt;br /&gt;
	FileFunc_GetSize_GetCompressed:&lt;br /&gt;
	System::Call &#039;kernel32::GetCompressedFileSize(t &amp;quot;$R8\$R7&amp;quot;, i)i .R6&#039;&lt;br /&gt;
	IntCmp $R6 4096 +2 0 +2&lt;br /&gt;
	StrCpy $R6 4096&lt;br /&gt;
	IntOp $3 $3 + 1 ; location contains compressed or sparse files&lt;br /&gt;
	goto FileFunc_GetSize_fileclose&lt;br /&gt;
	FileFunc_GetSize_fileopen:&lt;br /&gt;
	FileOpen $9 &#039;$R8\$R7&#039; r&lt;br /&gt;
	IfErrors +3&lt;br /&gt;
	FileSeek $9 0 END $R6&lt;br /&gt;
	FileClose $9&lt;br /&gt;
	FileFunc_GetSize_fileclose:&lt;br /&gt;
	StrCmp $5 &#039;&#039; +2&lt;br /&gt;
	IntCmp $R6 $5 0 FileFunc_GetSize_findnext&lt;br /&gt;
	StrCmp $6 &#039;&#039; +2&lt;br /&gt;
	IntCmp $R6 $6 0 0 FileFunc_GetSize_findnext&lt;br /&gt;
	IntOp $R4 $R4 + 1&lt;br /&gt;
	StrCmp $R1 &#039;&#039; FileFunc_GetSize_file_add&lt;br /&gt;
	StrCmp $R0 0 0 FileFunc_GetSize_file_add&lt;br /&gt;
	StrCpy $R0 $R1&lt;br /&gt;
	IntOp $R6 $R6 + $R0&lt;br /&gt;
	IntOp $R1 $R6 % $R0&lt;br /&gt;
	StrCmp $R1 0 0 +2&lt;br /&gt;
	StrCpy $R1 $R0&lt;br /&gt;
	IntOp $R2 $R0 - $R1&lt;br /&gt;
	IntOp $R6 $R6 - $R0&lt;br /&gt;
	IntOp $R6 $R6 + $R2&lt;br /&gt;
	StrCpy $R1 $R0&lt;br /&gt;
	FileFunc_GetSize_file_add:&lt;br /&gt;
	System::Int64Op $R3 + $R6&lt;br /&gt;
	Pop $R3&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_findnext:&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_show:&lt;br /&gt;
	StrCmp $5$6 &#039;&#039; FileFunc_GetSize_nosize&lt;br /&gt;
	System::Int64Op $R3 / $1&lt;br /&gt;
	Pop $9&lt;br /&gt;
	DetailPrint &#039;Size:$9 $2  Files:$R4  Folders:$R5&#039;&lt;br /&gt;
	goto FileFunc_GetSize_subdir&lt;br /&gt;
	FileFunc_GetSize_nosize:&lt;br /&gt;
	DetailPrint &#039;Files:$R4  Folders:$R5&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_subdir:&lt;br /&gt;
	StrCmp $7 0 FileFunc_GetSize_preend&lt;br /&gt;
	FindFirst $0 $R7 &#039;$R8\*.*&#039;&lt;br /&gt;
	StrCmp $R7 &#039;.&#039; 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	StrCmp $R7 &#039;..&#039; 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
	StrCmp $8 0 FileFunc_GetSize_preend FileFunc_GetSize_nextdir&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_pushdir:&lt;br /&gt;
	IfFileExists &#039;$R8\$R7\*.*&#039; 0 +3&lt;br /&gt;
	Push &#039;$R8\$R7&#039;&lt;br /&gt;
	IntOp $8 $8 + 1&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
	StrCmp $8 0 FileFunc_GetSize_preend FileFunc_GetSize_nextdir&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_preend:&lt;br /&gt;
	StrCmp $R3 &#039;&#039; FileFunc_GetSize_nosizeend&lt;br /&gt;
	System::Int64Op $R3 / $1&lt;br /&gt;
	Pop $R3&lt;br /&gt;
	FileFunc_GetSize_nosizeend:&lt;br /&gt;
	StrCpy $2 $R4&lt;br /&gt;
	StrCpy $1 $R5&lt;br /&gt;
	StrCpy $0 $R3&lt;br /&gt;
	goto FileFunc_GetSize_noerror&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_error:&lt;br /&gt;
	SetErrors&lt;br /&gt;
	StrCpy $0 &#039;&#039;&lt;br /&gt;
	StrCpy $1 &#039;&#039;&lt;br /&gt;
	StrCpy $2 &#039;&#039;&lt;br /&gt;
	StrCpy $3 &#039;&#039;&lt;br /&gt;
	goto FileFunc_GetSize_end&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_noerror:&lt;br /&gt;
	StrCmp $0 &#039;&#039; 0 +2&lt;br /&gt;
	StrCpy $0 0&lt;br /&gt;
	StrCmp $1 &#039;&#039; 0 +2&lt;br /&gt;
	StrCpy $1 0&lt;br /&gt;
	StrCmp $2 &#039;&#039; 0 +2&lt;br /&gt;
	StrCpy $2 0&lt;br /&gt;
	StrCmp $3 &#039;&#039; 0 +2&lt;br /&gt;
	StrCpy $3 0&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_end:&lt;br /&gt;
	SetDetailsPrint both&lt;br /&gt;
	Pop $R9&lt;br /&gt;
	Pop $R8&lt;br /&gt;
	Pop $R7&lt;br /&gt;
	Pop $R6&lt;br /&gt;
	Pop $R5&lt;br /&gt;
	Pop $R4&lt;br /&gt;
	Pop $R3&lt;br /&gt;
	Pop $R2&lt;br /&gt;
	Pop $R1&lt;br /&gt;
	Pop $R0&lt;br /&gt;
	Pop $9&lt;br /&gt;
	Pop $8&lt;br /&gt;
	Pop $7&lt;br /&gt;
	Pop $6&lt;br /&gt;
	Pop $5&lt;br /&gt;
	Pop $4&lt;br /&gt;
	Exch $3&lt;br /&gt;
	Exch 3&lt;br /&gt;
	Exch $2&lt;br /&gt;
	Exch&lt;br /&gt;
	Exch $1&lt;br /&gt;
	Exch 2&lt;br /&gt;
	Exch $0&lt;br /&gt;
&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
; ---------------&lt;br /&gt;
; GetClusterSize&lt;br /&gt;
&lt;br /&gt;
; Allocation unit size on NTFS, exFAT and reFS formatted volumes&lt;br /&gt;
; Syntax: ${GetClusterSize} $inputpath $outputvariable&lt;br /&gt;
; Result: 512, 1024, ..., 4096, ..., 131072, ...&lt;br /&gt;
&lt;br /&gt;
!define GetClusterSize `!insertmacro GetClusterSizeCall`&lt;br /&gt;
!define un.GetClusterSize `!insertmacro GetClusterSizeCall`&lt;br /&gt;
&lt;br /&gt;
!macro GetClusterSize&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro un.GetClusterSize&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetClusterSize_&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
&lt;br /&gt;
	Exch $0&lt;br /&gt;
	Push $1&lt;br /&gt;
	Push $2&lt;br /&gt;
	Push $3&lt;br /&gt;
&lt;br /&gt;
	StrCpy $1 $0 2&lt;br /&gt;
	StrCmp $1 &#039;\\&#039; Root_UNC&lt;br /&gt;
	StrCpy $2 $1 1 1&lt;br /&gt;
	StrCmp $2 &#039;:&#039; 0 Root_empty&lt;br /&gt;
	StrCpy $0 $1&lt;br /&gt;
	goto Root_end&lt;br /&gt;
&lt;br /&gt;
	Root_UNC:&lt;br /&gt;
	StrCpy $2 1&lt;br /&gt;
	StrCpy $3 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	Root_loop:&lt;br /&gt;
	IntOp $2 $2 + 1&lt;br /&gt;
	StrCpy $1 $0 1 $2&lt;br /&gt;
	StrCmp $1$3 &#039;&#039; Root_empty&lt;br /&gt;
	StrCmp $1 &#039;&#039; +5&lt;br /&gt;
	StrCmp $1 &#039;\&#039; 0 Root_loop&lt;br /&gt;
	StrCmp $3 &#039;1&#039; +3&lt;br /&gt;
	StrCpy $3 &#039;1&#039;&lt;br /&gt;
	goto Root_loop&lt;br /&gt;
	StrCpy $0 $0 $2&lt;br /&gt;
	StrCpy $2 $0 1 -1&lt;br /&gt;
	StrCmp $2 &#039;\&#039; 0 Root_end&lt;br /&gt;
&lt;br /&gt;
	Root_empty:&lt;br /&gt;
	StrCpy $0 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	Root_end:&lt;br /&gt;
	System::Call &#039;kernel32::GetDiskFreeSpace(t &amp;quot;$0\&amp;quot;,*i0r1,*i0r2,,)&#039;&lt;br /&gt;
	IntOp $0 $1 * $2&lt;br /&gt;
	Pop $3&lt;br /&gt;
	Pop $2&lt;br /&gt;
	Pop $1&lt;br /&gt;
	Exch $0&lt;br /&gt;
&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/highlight-nsis&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-size: 110%&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Credits:&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;em&amp;gt;GetSizeOnDisk&amp;lt;/em&amp;gt; has been altered slightly and renamed. The original macro is called &amp;lt;em&amp;gt;GetSize&amp;lt;/em&amp;gt;. You will find it in the Users Manual under E.1.3.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-size: 110%&amp;quot;&amp;gt;&amp;lt;b&amp;gt;=== Download (example) ===&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is the same as the example code above.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;attach&amp;gt;SODTool.zip&amp;lt;/attach&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-size: 110%&amp;quot;&amp;gt;&amp;lt;b&amp;gt;=== Download (utility) ===&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is a Modern UI2 version that displays selection windows and goes to an output page. Script file is included.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;attach&amp;gt;SOD II tool.zip&amp;lt;/attach&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Both downloads are compiled in unicode, so SOD Tool can read Russian file names.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-size: 110%&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Errors:&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On failing to obtain the size of a file &amp;lt;em&amp;gt;GetSizeOnDisk&amp;lt;/em&amp;gt; does nothing much. You can edit the line that says,&lt;br /&gt;
&amp;lt;highlight-nsis&amp;gt;&lt;br /&gt;
FileOpen $9 &#039;$R8\$R7&#039; r&lt;br /&gt;
IfErrors +3&lt;br /&gt;
&amp;lt;/highlight-nsis&amp;gt;&lt;br /&gt;
changing the instruction to,&lt;br /&gt;
&amp;lt;highlight-nsis&amp;gt;&lt;br /&gt;
FileOpen $9 &#039;$R8\$R7&#039; r&lt;br /&gt;
IfErrors FileFunc_GetSize_error&lt;br /&gt;
&amp;lt;/highlight-nsis&amp;gt;&lt;br /&gt;
It sets an error flag and will abort the macro, if an error is encountered opening a file for reading.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-size: 110%&amp;quot;&amp;gt;&amp;lt;b&amp;gt;History:&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional parameter for counting compressed/sparse files added. (Feb. 18, 2013)&lt;br /&gt;
&lt;br /&gt;
Option to find without subdirectories &#039;/G=0&#039; switch was missing. (Well, not really missing.) Change to details view (string), showing &#039;compressed/sparse file(s)&#039;. (Feb. 19, 2013)&lt;br /&gt;
&lt;br /&gt;
Change to unicode, because ansi could not read Russian. (Feb. 20, 2013)&lt;br /&gt;
&lt;br /&gt;
Stack operations cleaned up. The &amp;lt;b&amp;gt;SOD II tool&amp;lt;/b&amp;gt; uploaded. (Feb. 22, 2013)&lt;br /&gt;
&lt;br /&gt;
String formatting improvements, functions simplified (SOD II) and small revisions in macros header made. (Feb. 23, 2013)&lt;br /&gt;
&lt;br /&gt;
Macros behavior modified in order to detect the file system to deal with FAT, FAT12, FAT16 and FAT32 volumes.  Also checking root path, possibly Win2K error. (March 8, 2013)&lt;br /&gt;
&lt;br /&gt;
Re-Compiled with NSIS 3 new release, ManifestSupportedOS all attribute added. (May 24, 2013)&lt;br /&gt;
[[Category:Code Examples]]&lt;/div&gt;</summary>
		<author><name>Bnicer</name></author>
	</entry>
	<entry>
		<id>https://nsis.sourceforge.io/mediawiki/index.php?title=Get_size_on_disk&amp;diff=23198</id>
		<title>Get size on disk</title>
		<link rel="alternate" type="text/html" href="https://nsis.sourceforge.io/mediawiki/index.php?title=Get_size_on_disk&amp;diff=23198"/>
		<updated>2013-04-28T21:03:24Z</updated>

		<summary type="html">&lt;p&gt;Bnicer: Size On Disk (SOD) utility&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PageAuthor|Bnicer}}&lt;br /&gt;
This example code shows you how to get the space used by directories and files.&lt;br /&gt;
&amp;lt;highlight-nsis&amp;gt;&lt;br /&gt;
; A utility for computing the NSIS (or NSIS Unicode) install folder size and the size of&lt;br /&gt;
; the uninstaller&lt;br /&gt;
; nsissize.nsi&lt;br /&gt;
; Compile, then run the .exe&lt;br /&gt;
&lt;br /&gt;
Name &amp;quot;SOD Tool&amp;quot;&lt;br /&gt;
RequestExecutionLevel user&lt;br /&gt;
#RequestExecutionLevel admin ; More files may be found in system folders&lt;br /&gt;
!define LOCAL &amp;quot;&amp;quot; ; Path where local include files reside&lt;br /&gt;
OutFile &amp;quot;${LOCAL}nsissize.exe&amp;quot;&lt;br /&gt;
!include &amp;quot;${LOCAL}macros.nsh&amp;quot;&lt;br /&gt;
Icon &amp;quot;${LOCAL}arrows.ico&amp;quot;&lt;br /&gt;
ReserveFile &amp;quot;${NSISDIR}\Plugins\Math.dll&amp;quot; ; Doesn&#039;t seem to like &amp;quot;!include&amp;quot;&lt;br /&gt;
!include &amp;quot;LogicLib.nsh&amp;quot;&lt;br /&gt;
ShowInstDetails show&lt;br /&gt;
&lt;br /&gt;
;--------------------------------&lt;br /&gt;
&lt;br /&gt;
; Variables&lt;br /&gt;
Var NSIS&lt;br /&gt;
Var COMPRESSED&lt;br /&gt;
Var COMPRESSED_UN&lt;br /&gt;
Var BLOCK&lt;br /&gt;
Var FILES&lt;br /&gt;
Var FOLDERS&lt;br /&gt;
Var SIZE_B&lt;br /&gt;
Var SIZE_M&lt;br /&gt;
Var SOD_B&lt;br /&gt;
Var SOD_K&lt;br /&gt;
Var SOD_M&lt;br /&gt;
Var SIZE_UN_B&lt;br /&gt;
Var SIZE_UN_K&lt;br /&gt;
Var SOD_UN_B&lt;br /&gt;
Var SOD_UN_K&lt;br /&gt;
&lt;br /&gt;
;--------------------------------&lt;br /&gt;
&lt;br /&gt;
; Functions&lt;br /&gt;
Function Separator ; comma&lt;br /&gt;
  Exch $R1 ; input string&lt;br /&gt;
  Push $R2&lt;br /&gt;
  Push $R3&lt;br /&gt;
  Push $R4&lt;br /&gt;
  Push $R5&lt;br /&gt;
  StrCpy $R2 $R1&lt;br /&gt;
  StrCpy $R5 &amp;quot;16&amp;quot; ; 1,000,000,000,000,000 limit&lt;br /&gt;
  StrLen $R4 $R1&lt;br /&gt;
loop:&lt;br /&gt;
  IntCmp $R5 3 endloop endloop 0&lt;br /&gt;
  IntCmp $R4 $R5 0 +7 0&lt;br /&gt;
  IntOp $R5 $R5 - 1&lt;br /&gt;
  StrCpy $R2 $R2 -$R5&lt;br /&gt;
  StrCpy $R3 $R1 &amp;quot;&amp;quot; -$R5&lt;br /&gt;
  StrCpy $R2 &amp;quot;$R2,$R3&amp;quot;&lt;br /&gt;
  IntOp $R5 $R5 - 2&lt;br /&gt;
  Goto loop&lt;br /&gt;
  IntOp $R5 $R5 - 3&lt;br /&gt;
  Goto loop&lt;br /&gt;
endloop:&lt;br /&gt;
  Pop $R5&lt;br /&gt;
  Pop $R4&lt;br /&gt;
  Pop $R3&lt;br /&gt;
  Exch $R2&lt;br /&gt;
  Pop $R1&lt;br /&gt;
  Exch $R1 ; output string&lt;br /&gt;
FunctionEnd&lt;br /&gt;
&lt;br /&gt;
;--------------------------------&lt;br /&gt;
&lt;br /&gt;
; Main Section (nothing will be installed)&lt;br /&gt;
Section&lt;br /&gt;
; registry&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS Unicode&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS ANSI&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  Goto done&lt;br /&gt;
  begin:&lt;br /&gt;
  IfFileExists &amp;quot;$NSIS&amp;quot; 0 done&lt;br /&gt;
  ${GetClusterSize} $NSIS $BLOCK&lt;br /&gt;
; directory&lt;br /&gt;
  ${GetSizeOnDisk} &amp;quot;$NSIS&amp;quot; &amp;quot;/S=0B&amp;quot; &amp;quot;&amp;quot; $0 $1 $2 $3&lt;br /&gt;
  StrCpy $SIZE_B $0&lt;br /&gt;
  StrCpy $FILES $1&lt;br /&gt;
  StrCpy $FOLDERS $2&lt;br /&gt;
  Math::Script &amp;quot;r4 = ff($0 / 1024 / 1024.0, 16 +2)&amp;quot;&lt;br /&gt;
  StrCpy $SIZE_M $4&lt;br /&gt;
  ${GetSizeOnDisk} &amp;quot;$NSIS&amp;quot; &amp;quot;/S=0B&amp;quot; &amp;quot;$BLOCK&amp;quot; $0 $1 $2 $3&lt;br /&gt;
  StrCpy $SOD_B $0&lt;br /&gt;
  StrCpy $COMPRESSED $3&lt;br /&gt;
  Math::Script &amp;quot;r4 = ff($0 / 1024.0, 16 +0); r5 = ff(r4 / 1024.0, 16 +2)&amp;quot;&lt;br /&gt;
  StrCpy $SOD_K $4&lt;br /&gt;
  StrCpy $SOD_M $5&lt;br /&gt;
; uninstaller&lt;br /&gt;
  IfFileExists &amp;quot;$NSIS\uninst-nsis.exe&amp;quot; 0 done&lt;br /&gt;
  ${GetSizeOnDisk} &amp;quot;$NSIS&amp;quot; &amp;quot;/M=uninst-nsis.exe /S=0B /G=0&amp;quot; &amp;quot;&amp;quot; $0 $1 $2 $3&lt;br /&gt;
  StrCpy $SIZE_UN_B $0&lt;br /&gt;
  Math::Script &amp;quot;r4 = ff($0 / 1024.0, 16 +1)&amp;quot;&lt;br /&gt;
  StrCpy $SIZE_UN_K $4&lt;br /&gt;
  ${GetSizeOnDisk} &amp;quot;$NSIS&amp;quot; &amp;quot;/M=uninst-nsis.exe /S=0B /G=0&amp;quot; &amp;quot;$BLOCK&amp;quot; $0 $1 $2 $3&lt;br /&gt;
  StrCpy $SOD_UN_B $0&lt;br /&gt;
  ${If} $3 &amp;gt; 0&lt;br /&gt;
    StrCpy $COMPRESSED_UN &amp;quot; (compressed or sparse)&amp;quot;&lt;br /&gt;
  ${Else}&lt;br /&gt;
    StrCpy $COMPRESSED_UN &amp;quot;&amp;quot;&lt;br /&gt;
  ${EndIf}&lt;br /&gt;
  Math::Script &amp;quot;r4 = ff($0 / 1024.0, 16 +1)&amp;quot;&lt;br /&gt;
  StrCpy $SOD_UN_K $4&lt;br /&gt;
; format&lt;br /&gt;
  Push $SIZE_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  Pop $SIZE_B&lt;br /&gt;
&lt;br /&gt;
  Push $SOD_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  Pop $SOD_B&lt;br /&gt;
&lt;br /&gt;
  Push $SOD_K&lt;br /&gt;
  Call Separator&lt;br /&gt;
  Pop $SOD_K&lt;br /&gt;
&lt;br /&gt;
  Push $SIZE_UN_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  Pop $SIZE_UN_B&lt;br /&gt;
&lt;br /&gt;
  Push $SOD_UN_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  Pop $SOD_UN_B&lt;br /&gt;
; output&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;$NSIS&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;Size: $SIZE_M MB ($SIZE_B bytes)&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;SOD: $SOD_M MB ($SOD_B bytes)&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;Uninstaller$COMPRESSED_UN&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;Size: $SIZE_UN_K KB ($SIZE_UN_B bytes)&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;SOD: $SOD_UN_K KB ($SOD_UN_B bytes)&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;$FILES files | $FOLDERS folders | $SOD_K Kb | $COMPRESSED compressed/sparse file(s)&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  Goto completed&lt;br /&gt;
done:&lt;br /&gt;
  DetailPrint &amp;quot;File not found.&amp;quot;&lt;br /&gt;
completed:&lt;br /&gt;
SectionEnd&lt;br /&gt;
&lt;br /&gt;
;--------------------------------&lt;br /&gt;
# EOF&lt;br /&gt;
&amp;lt;/highlight-nsis&amp;gt;&lt;br /&gt;
You should copy the next code into a separate file: &amp;lt;b&amp;gt;macros.nsh&amp;lt;/b&amp;gt;.&lt;br /&gt;
&amp;lt;highlight-nsis&amp;gt;&lt;br /&gt;
; Macros include (TN)&lt;br /&gt;
;--------------------------------&lt;br /&gt;
/*&lt;br /&gt;
&lt;br /&gt;
 FileFunction=[GetSizeOnDisk|GetClusterSize]&lt;br /&gt;
&lt;br /&gt;
*/&lt;br /&gt;
;_____________________________________________________________________________&lt;br /&gt;
;&lt;br /&gt;
;                         Macros&lt;br /&gt;
;_____________________________________________________________________________&lt;br /&gt;
;&lt;br /&gt;
; Change log window verbosity (default: 3=no script)&lt;br /&gt;
;&lt;br /&gt;
; Example:&lt;br /&gt;
; !include &amp;quot;macros.nsh&amp;quot;&lt;br /&gt;
; !insertmacro GetSizeOnDisk&lt;br /&gt;
; ${FILEFUNC_VERBOSE} 4   # all verbosity&lt;br /&gt;
; !insertmacro GetClusterSize&lt;br /&gt;
; ${FILEFUNC_VERBOSE} 3   # no script&lt;br /&gt;
&lt;br /&gt;
!include Util.nsh ; for &amp;quot;CallArtificialFunction&amp;quot;&lt;br /&gt;
&lt;br /&gt;
!verbose push&lt;br /&gt;
!verbose 3&lt;br /&gt;
!ifndef _FILEFUNC_VERBOSE&lt;br /&gt;
	!define _FILEFUNC_VERBOSE 3&lt;br /&gt;
!endif&lt;br /&gt;
!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
!define FILEFUNC_VERBOSE `!insertmacro FILEFUNC_VERBOSE`&lt;br /&gt;
!verbose pop&lt;br /&gt;
&lt;br /&gt;
!macro FILEFUNC_VERBOSE _VERBOSE&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose 3&lt;br /&gt;
	!undef _FILEFUNC_VERBOSE&lt;br /&gt;
	!define _FILEFUNC_VERBOSE ${_VERBOSE}&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetSizeOnDiskCall _PATH _OPTIONS _FILESYSTEM _RESULT1 _RESULT2 _RESULT3 _RESULT4&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
	Push `${_PATH}`&lt;br /&gt;
	Push `${_OPTIONS}`&lt;br /&gt;
	Push `${_FILESYSTEM}` ; volume block size&lt;br /&gt;
	${CallArtificialFunction} GetSizeOnDisk_&lt;br /&gt;
	Pop ${_RESULT1}&lt;br /&gt;
	Pop ${_RESULT2}&lt;br /&gt;
	Pop ${_RESULT3}&lt;br /&gt;
	Pop ${_RESULT4}&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetClusterSizeCall _PATH _RESULT&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
	Push `${_PATH}` &lt;br /&gt;
	${CallArtificialFunction} GetClusterSize_&lt;br /&gt;
	Pop ${_RESULT}&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
; ---------------&lt;br /&gt;
; GetSizeOnDisk (modified &amp;quot;GetSize&amp;quot; - FileFunc.nsh - KiCHiK - Function &amp;quot;FindFiles&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
!define GetSizeOnDisk `!insertmacro GetSizeOnDiskCall`&lt;br /&gt;
!define un.GetSizeOnDisk `!insertmacro GetSizeOnDiskCall`&lt;br /&gt;
&lt;br /&gt;
!macro GetSizeOnDisk&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro un.GetSizeOnDisk&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
; Usage: similar to &amp;quot;GetSize&amp;quot;&lt;br /&gt;
&lt;br /&gt;
; For documentation, see the NSIS user manual: E.1.3 GetSize&lt;br /&gt;
; Four (not three) values are returned&lt;br /&gt;
&lt;br /&gt;
; $var1		; Result1: Size/Size on disk&lt;br /&gt;
; $var2		; Result2: Sum of files&lt;br /&gt;
; $var3		; Result3: Sum of directories&lt;br /&gt;
; $var4		; Result4: Sum of compressed/sparse files&lt;br /&gt;
&lt;br /&gt;
; Example: ${GetSizeOnDisk} &amp;quot;$INSTDIR&amp;quot; &amp;quot;/S=0K&amp;quot; &amp;quot;SOD&amp;quot; $0 $1 $2 $3&lt;br /&gt;
; DetailPrint &amp;quot;$1 file(s) | $2 folder(s) | $0 Kb | $3 compressed or sparse file(s)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
; Specifying &#039;SOD&#039; (e.g. Size On Disk) toggles the $var1 result&lt;br /&gt;
; Output is logical size, if used, or physical size, if left empty &amp;quot;&amp;quot;&lt;br /&gt;
; The target volume&#039;s allocation unit size in bytes, the size of a&lt;br /&gt;
; cluster, for example &#039;4096&#039; bytes, if valid, can also be the input&lt;br /&gt;
; If neither &#039;SOD&#039; nor a cluster size is specified, $var4 returns 0&lt;br /&gt;
; even where compressed and/or sparse files exist&lt;br /&gt;
&lt;br /&gt;
; ${GetSizeOnDisk} can be used with Windows NT and Windows 2000&lt;br /&gt;
; When the volume is FAT32, FAT16 or an older file system, the result&lt;br /&gt;
; in $var1 reverts to physical size, although not incorrect&lt;br /&gt;
&lt;br /&gt;
!macro GetSizeOnDisk_&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
&lt;br /&gt;
	Exch $2&lt;br /&gt;
	Exch 2&lt;br /&gt;
	Exch $0&lt;br /&gt;
	Exch&lt;br /&gt;
	Exch $1&lt;br /&gt;
	Push $3&lt;br /&gt;
	Push $4&lt;br /&gt;
	Push $5&lt;br /&gt;
	Push $6&lt;br /&gt;
	Push $7&lt;br /&gt;
	Push $8&lt;br /&gt;
	Push $9&lt;br /&gt;
	Push $R0&lt;br /&gt;
	Push $R1&lt;br /&gt;
	Push $R2&lt;br /&gt;
	StrCpy $R1 $2&lt;br /&gt;
	Push $R3&lt;br /&gt;
	Push $R4&lt;br /&gt;
	Push $R5&lt;br /&gt;
	Push $R6&lt;br /&gt;
	Push $R7&lt;br /&gt;
	Push $R8&lt;br /&gt;
	Push $R9&lt;br /&gt;
	ClearErrors&lt;br /&gt;
&lt;br /&gt;
	StrCmp $R1 &#039;&#039; FileFunc_GetSize_path&lt;br /&gt;
&lt;br /&gt;
	StrCpy $5 $0&lt;br /&gt;
	StrCpy $2 $0 2&lt;br /&gt;
	StrCmp $2 &#039;\\&#039; FileFunc_GetSize_Root_UNC&lt;br /&gt;
	StrCpy $3 $2 1 1&lt;br /&gt;
	StrCmp $3 &#039;:&#039; 0 FileFunc_GetSize_Root_empty&lt;br /&gt;
	StrCpy $5 $2&lt;br /&gt;
	goto FileFunc_GetSize_FileSystem&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_Root_UNC:&lt;br /&gt;
	StrCpy $3 1&lt;br /&gt;
	StrCpy $4 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_Root_loop:&lt;br /&gt;
	IntOp $3 $3 + 1&lt;br /&gt;
	StrCpy $2 $5 1 $3&lt;br /&gt;
	StrCmp $2$4 &#039;&#039; FileFunc_GetSize_Root_empty&lt;br /&gt;
	StrCmp $2 &#039;&#039; +5&lt;br /&gt;
	StrCmp $2 &#039;\&#039; 0 FileFunc_GetSize_Root_loop&lt;br /&gt;
	StrCmp $4 &#039;1&#039; +3&lt;br /&gt;
	StrCpy $4 &#039;1&#039;&lt;br /&gt;
	goto FileFunc_GetSize_Root_loop&lt;br /&gt;
	StrCpy $5 $5 $3&lt;br /&gt;
	StrCpy $3 $5 1 -1&lt;br /&gt;
	StrCmp $3 &#039;\&#039; 0 FileFunc_GetSize_FileSystem&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_Root_empty:&lt;br /&gt;
	StrCpy $5 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_FileSystem:&lt;br /&gt;
	System::Call &#039;Kernel32::GetVolumeInformation\&lt;br /&gt;
	(t &amp;quot;$5\&amp;quot;,t,i ${NSIS_MAX_STRLEN},*i,*i,*i,t.r2,i ${NSIS_MAX_STRLEN})i.r3&#039;&lt;br /&gt;
	StrCmp $3 0 FileFunc_GetSize_FileSystem_error&lt;br /&gt;
	StrCpy $2 $2 3&lt;br /&gt;
	StrCmp $2 &#039;FAT&#039; FileFunc_GetSize_FileSystem_error&lt;br /&gt;
	StrCmp $R1 &#039;SOD&#039; 0 FileFunc_GetSize_path&lt;br /&gt;
	System::Call &#039;kernel32::GetDiskFreeSpace(t &amp;quot;$5\&amp;quot;,*i0r2,*i0r3,,)&#039;&lt;br /&gt;
	IntOp $R1 $2 * $3&lt;br /&gt;
	goto FileFunc_GetSize_path&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_FileSystem_error:&lt;br /&gt;
	StrCpy $R1 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_path:&lt;br /&gt;
	StrCpy $R9 $0 1 -1&lt;br /&gt;
	StrCmp $R9 &#039;\&#039; 0 +3&lt;br /&gt;
	StrCpy $0 $0 -1&lt;br /&gt;
	goto -3&lt;br /&gt;
	IfFileExists &#039;$0\*.*&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
&lt;br /&gt;
	StrCpy $3 0&lt;br /&gt;
	StrCpy $4 &#039;&#039;&lt;br /&gt;
	StrCpy $5 &#039;&#039;&lt;br /&gt;
	StrCpy $6 &#039;&#039;&lt;br /&gt;
	StrCpy $8 0&lt;br /&gt;
	StrCpy $R3 &#039;&#039;&lt;br /&gt;
	StrCpy $R4 &#039;&#039;&lt;br /&gt;
	StrCpy $R5 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_option:&lt;br /&gt;
	StrCpy $R9 $1 1&lt;br /&gt;
	StrCpy $1 $1 &#039;&#039; 1&lt;br /&gt;
	StrCmp $R9 &#039; &#039; -2&lt;br /&gt;
	StrCmp $R9 &#039;&#039; FileFunc_GetSize_sizeset&lt;br /&gt;
	StrCmp $R9 &#039;/&#039; 0 -4&lt;br /&gt;
&lt;br /&gt;
	StrCpy $9 -1&lt;br /&gt;
	IntOp $9 $9 + 1&lt;br /&gt;
	StrCpy $R9 $1 1 $9&lt;br /&gt;
	StrCmp $R9 &#039;&#039; +2&lt;br /&gt;
	StrCmp $R9 &#039;/&#039; 0 -3&lt;br /&gt;
	StrCpy $8 $1 $9&lt;br /&gt;
	StrCpy $8 $8 &#039;&#039; 2&lt;br /&gt;
	StrCpy $R9 $8 &#039;&#039; -1&lt;br /&gt;
	StrCmp $R9 &#039; &#039; 0 +3&lt;br /&gt;
	StrCpy $8 $8 -1&lt;br /&gt;
	goto -3&lt;br /&gt;
	StrCpy $R9 $1 2&lt;br /&gt;
	StrCpy $1 $1 &#039;&#039; $9&lt;br /&gt;
&lt;br /&gt;
	StrCmp $R9 &#039;M=&#039; 0 FileFunc_GetSize_size&lt;br /&gt;
	StrCpy $4 $8&lt;br /&gt;
	goto FileFunc_GetSize_option&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_size:&lt;br /&gt;
	StrCmp $R9 &#039;S=&#039; 0 FileFunc_GetSize_gotosubdir&lt;br /&gt;
	StrCpy $6 $8&lt;br /&gt;
	goto FileFunc_GetSize_option&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_gotosubdir:&lt;br /&gt;
	StrCmp $R9 &#039;G=&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
	StrCpy $7 $8&lt;br /&gt;
	StrCmp $7 &#039;&#039; +3&lt;br /&gt;
	StrCmp $7 &#039;1&#039; +2&lt;br /&gt;
	StrCmp $7 &#039;0&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
	goto FileFunc_GetSize_option&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_sizeset:&lt;br /&gt;
	StrCmp $6 &#039;&#039; FileFunc_GetSize_default&lt;br /&gt;
	StrCpy $9 0&lt;br /&gt;
	StrCpy $R9 $6 1 $9&lt;br /&gt;
	StrCmp $R9 &#039;&#039; +4&lt;br /&gt;
	StrCmp $R9 &#039;:&#039; +3&lt;br /&gt;
	IntOp $9 $9 + 1&lt;br /&gt;
	goto -4&lt;br /&gt;
	StrCpy $5 $6 $9&lt;br /&gt;
	IntOp $9 $9 + 1&lt;br /&gt;
	StrCpy $1 $6 1 -1&lt;br /&gt;
	StrCpy $6 $6 -1 $9&lt;br /&gt;
	StrCmp $5 &#039;&#039; +2&lt;br /&gt;
	IntOp $5 $5 + 0&lt;br /&gt;
	StrCmp $6 &#039;&#039; +2&lt;br /&gt;
	IntOp $6 $6 + 0&lt;br /&gt;
&lt;br /&gt;
	StrCmp $1 &#039;B&#039; 0 +4&lt;br /&gt;
	StrCpy $1 1&lt;br /&gt;
	StrCpy $2 bytes&lt;br /&gt;
	goto FileFunc_GetSize_default&lt;br /&gt;
	StrCmp $1 &#039;K&#039; 0 +4&lt;br /&gt;
	StrCpy $1 1024&lt;br /&gt;
	StrCpy $2 Kb&lt;br /&gt;
	goto FileFunc_GetSize_default&lt;br /&gt;
	StrCmp $1 &#039;M&#039; 0 +4&lt;br /&gt;
	StrCpy $1 1048576&lt;br /&gt;
	StrCpy $2 Mb&lt;br /&gt;
	goto FileFunc_GetSize_default&lt;br /&gt;
	StrCmp $1 &#039;G&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
	StrCpy $1 1073741824&lt;br /&gt;
	StrCpy $2 Gb&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_default:&lt;br /&gt;
	StrCmp $4 &#039;&#039; 0 +2&lt;br /&gt;
	StrCpy $4 &#039;*.*&#039;&lt;br /&gt;
	StrCmp $7 &#039;&#039; 0 +2&lt;br /&gt;
	StrCpy $7 &#039;1&#039;&lt;br /&gt;
&lt;br /&gt;
	StrCpy $8 1&lt;br /&gt;
	Push $0&lt;br /&gt;
	SetDetailsPrint textonly&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_nextdir:&lt;br /&gt;
	IntOp $8 $8 - 1&lt;br /&gt;
	Pop $R8&lt;br /&gt;
	FindFirst $0 $R7 &#039;$R8\$4&#039;&lt;br /&gt;
	IfErrors FileFunc_GetSize_show&lt;br /&gt;
	StrCmp $R7 &#039;.&#039; 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	StrCmp $R7 &#039;..&#039; 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
	goto FileFunc_GetSize_show&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_dir:&lt;br /&gt;
	IfFileExists &#039;$R8\$R7\*.*&#039; 0 FileFunc_GetSize_file&lt;br /&gt;
	IntOp $R5 $R5 + 1&lt;br /&gt;
	goto FileFunc_GetSize_findnext&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_file:&lt;br /&gt;
	StrCpy $R6 0&lt;br /&gt;
	StrCmp $5$6 &#039;&#039; 0 +3&lt;br /&gt;
	IntOp $R4 $R4 + 1&lt;br /&gt;
	goto FileFunc_GetSize_findnext&lt;br /&gt;
	StrCmp $R1 &#039;&#039; FileFunc_GetSize_fileopen&lt;br /&gt;
	StrCpy $R0 0&lt;br /&gt;
	System::Call &#039;kernel32::GetFileAttributes(t &amp;quot;$R8\$R7&amp;quot;)i .R2&#039;&lt;br /&gt;
	StrCmp $R2 -1 FileFunc_GetSize_fileopen&lt;br /&gt;
	IntOp $R0 $R2 &amp;amp; 0x0800 ; compressed&lt;br /&gt;
	IntCmp $R0 0 0 0 FileFunc_GetSize_GetCompressed&lt;br /&gt;
	IntOp $R0 $R2 &amp;amp; 0x0200 ; sparse file&lt;br /&gt;
	IntCmp $R0 0 FileFunc_GetSize_fileopen&lt;br /&gt;
	FileFunc_GetSize_GetCompressed:&lt;br /&gt;
	System::Call &#039;kernel32::GetCompressedFileSize(t &amp;quot;$R8\$R7&amp;quot;, i)i .R6&#039;&lt;br /&gt;
	IntCmp $R6 4096 +2 0 +2&lt;br /&gt;
	StrCpy $R6 4096&lt;br /&gt;
	IntOp $3 $3 + 1 ; location contains compressed or sparse files&lt;br /&gt;
	goto FileFunc_GetSize_fileclose&lt;br /&gt;
	FileFunc_GetSize_fileopen:&lt;br /&gt;
	FileOpen $9 &#039;$R8\$R7&#039; r&lt;br /&gt;
	IfErrors +3&lt;br /&gt;
	FileSeek $9 0 END $R6&lt;br /&gt;
	FileClose $9&lt;br /&gt;
	FileFunc_GetSize_fileclose:&lt;br /&gt;
	StrCmp $5 &#039;&#039; +2&lt;br /&gt;
	IntCmp $R6 $5 0 FileFunc_GetSize_findnext&lt;br /&gt;
	StrCmp $6 &#039;&#039; +2&lt;br /&gt;
	IntCmp $R6 $6 0 0 FileFunc_GetSize_findnext&lt;br /&gt;
	IntOp $R4 $R4 + 1&lt;br /&gt;
	StrCmp $R1 &#039;&#039; FileFunc_GetSize_file_add&lt;br /&gt;
	StrCmp $R0 0 0 FileFunc_GetSize_file_add&lt;br /&gt;
	StrCpy $R0 $R1&lt;br /&gt;
	IntOp $R6 $R6 + $R0&lt;br /&gt;
	IntOp $R1 $R6 % $R0&lt;br /&gt;
	StrCmp $R1 0 0 +2&lt;br /&gt;
	StrCpy $R1 $R0&lt;br /&gt;
	IntOp $R2 $R0 - $R1&lt;br /&gt;
	IntOp $R6 $R6 - $R0&lt;br /&gt;
	IntOp $R6 $R6 + $R2&lt;br /&gt;
	StrCpy $R1 $R0&lt;br /&gt;
	FileFunc_GetSize_file_add:&lt;br /&gt;
	System::Int64Op $R3 + $R6&lt;br /&gt;
	Pop $R3&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_findnext:&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_show:&lt;br /&gt;
	StrCmp $5$6 &#039;&#039; FileFunc_GetSize_nosize&lt;br /&gt;
	System::Int64Op $R3 / $1&lt;br /&gt;
	Pop $9&lt;br /&gt;
	DetailPrint &#039;Size:$9 $2  Files:$R4  Folders:$R5&#039;&lt;br /&gt;
	goto FileFunc_GetSize_subdir&lt;br /&gt;
	FileFunc_GetSize_nosize:&lt;br /&gt;
	DetailPrint &#039;Files:$R4  Folders:$R5&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_subdir:&lt;br /&gt;
	StrCmp $7 0 FileFunc_GetSize_preend&lt;br /&gt;
	FindFirst $0 $R7 &#039;$R8\*.*&#039;&lt;br /&gt;
	StrCmp $R7 &#039;.&#039; 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	StrCmp $R7 &#039;..&#039; 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
	StrCmp $8 0 FileFunc_GetSize_preend FileFunc_GetSize_nextdir&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_pushdir:&lt;br /&gt;
	IfFileExists &#039;$R8\$R7\*.*&#039; 0 +3&lt;br /&gt;
	Push &#039;$R8\$R7&#039;&lt;br /&gt;
	IntOp $8 $8 + 1&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
	StrCmp $8 0 FileFunc_GetSize_preend FileFunc_GetSize_nextdir&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_preend:&lt;br /&gt;
	StrCmp $R3 &#039;&#039; FileFunc_GetSize_nosizeend&lt;br /&gt;
	System::Int64Op $R3 / $1&lt;br /&gt;
	Pop $R3&lt;br /&gt;
	FileFunc_GetSize_nosizeend:&lt;br /&gt;
	StrCpy $2 $R4&lt;br /&gt;
	StrCpy $1 $R5&lt;br /&gt;
	StrCpy $0 $R3&lt;br /&gt;
	goto FileFunc_GetSize_noerror&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_error:&lt;br /&gt;
	SetErrors&lt;br /&gt;
	StrCpy $0 &#039;&#039;&lt;br /&gt;
	StrCpy $1 &#039;&#039;&lt;br /&gt;
	StrCpy $2 &#039;&#039;&lt;br /&gt;
	StrCpy $3 &#039;&#039;&lt;br /&gt;
	goto FileFunc_GetSize_end&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_noerror:&lt;br /&gt;
	StrCmp $0 &#039;&#039; 0 +2&lt;br /&gt;
	StrCpy $0 0&lt;br /&gt;
	StrCmp $1 &#039;&#039; 0 +2&lt;br /&gt;
	StrCpy $1 0&lt;br /&gt;
	StrCmp $2 &#039;&#039; 0 +2&lt;br /&gt;
	StrCpy $2 0&lt;br /&gt;
	StrCmp $3 &#039;&#039; 0 +2&lt;br /&gt;
	StrCpy $3 0&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_end:&lt;br /&gt;
	SetDetailsPrint both&lt;br /&gt;
	Pop $R9&lt;br /&gt;
	Pop $R8&lt;br /&gt;
	Pop $R7&lt;br /&gt;
	Pop $R6&lt;br /&gt;
	Pop $R5&lt;br /&gt;
	Pop $R4&lt;br /&gt;
	Pop $R3&lt;br /&gt;
	Pop $R2&lt;br /&gt;
	Pop $R1&lt;br /&gt;
	Pop $R0&lt;br /&gt;
	Pop $9&lt;br /&gt;
	Pop $8&lt;br /&gt;
	Pop $7&lt;br /&gt;
	Pop $6&lt;br /&gt;
	Pop $5&lt;br /&gt;
	Pop $4&lt;br /&gt;
	Exch $3&lt;br /&gt;
	Exch 3&lt;br /&gt;
	Exch $2&lt;br /&gt;
	Exch&lt;br /&gt;
	Exch $1&lt;br /&gt;
	Exch 2&lt;br /&gt;
	Exch $0&lt;br /&gt;
&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
; ---------------&lt;br /&gt;
; GetClusterSize&lt;br /&gt;
&lt;br /&gt;
; Allocation unit size on NTFS, exFAT and reFS formatted volumes&lt;br /&gt;
; Syntax: ${GetClusterSize} $inputpath $outputvariable&lt;br /&gt;
; Result: 512, 1024, ..., 4096, ..., 131072, ...&lt;br /&gt;
&lt;br /&gt;
!define GetClusterSize `!insertmacro GetClusterSizeCall`&lt;br /&gt;
!define un.GetClusterSize `!insertmacro GetClusterSizeCall`&lt;br /&gt;
&lt;br /&gt;
!macro GetClusterSize&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro un.GetClusterSize&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetClusterSize_&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
&lt;br /&gt;
	Exch $0&lt;br /&gt;
	Push $1&lt;br /&gt;
	Push $2&lt;br /&gt;
	Push $3&lt;br /&gt;
&lt;br /&gt;
	StrCpy $1 $0 2&lt;br /&gt;
	StrCmp $1 &#039;\\&#039; Root_UNC&lt;br /&gt;
	StrCpy $2 $1 1 1&lt;br /&gt;
	StrCmp $2 &#039;:&#039; 0 Root_empty&lt;br /&gt;
	StrCpy $0 $1&lt;br /&gt;
	goto Root_end&lt;br /&gt;
&lt;br /&gt;
	Root_UNC:&lt;br /&gt;
	StrCpy $2 1&lt;br /&gt;
	StrCpy $3 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	Root_loop:&lt;br /&gt;
	IntOp $2 $2 + 1&lt;br /&gt;
	StrCpy $1 $0 1 $2&lt;br /&gt;
	StrCmp $1$3 &#039;&#039; Root_empty&lt;br /&gt;
	StrCmp $1 &#039;&#039; +5&lt;br /&gt;
	StrCmp $1 &#039;\&#039; 0 Root_loop&lt;br /&gt;
	StrCmp $3 &#039;1&#039; +3&lt;br /&gt;
	StrCpy $3 &#039;1&#039;&lt;br /&gt;
	goto Root_loop&lt;br /&gt;
	StrCpy $0 $0 $2&lt;br /&gt;
	StrCpy $2 $0 1 -1&lt;br /&gt;
	StrCmp $2 &#039;\&#039; 0 Root_end&lt;br /&gt;
&lt;br /&gt;
	Root_empty:&lt;br /&gt;
	StrCpy $0 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	Root_end:&lt;br /&gt;
	System::Call &#039;kernel32::GetDiskFreeSpace(t &amp;quot;$0\&amp;quot;,*i0r1,*i0r2,,)&#039;&lt;br /&gt;
	IntOp $0 $1 * $2&lt;br /&gt;
	Pop $3&lt;br /&gt;
	Pop $2&lt;br /&gt;
	Pop $1&lt;br /&gt;
	Exch $0&lt;br /&gt;
&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/highlight-nsis&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-size: 110%&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Credits:&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;em&amp;gt;GetSizeOnDisk&amp;lt;/em&amp;gt; has been altered slightly and renamed. The original macro is called &amp;lt;em&amp;gt;GetSize&amp;lt;/em&amp;gt;. You will find it in the Users Manual under E.1.3.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-size: 110%&amp;quot;&amp;gt;&amp;lt;b&amp;gt;=== Download (example) ===&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is the same as the example code above.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;attach&amp;gt;SODTool.zip&amp;lt;/attach&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-size: 110%&amp;quot;&amp;gt;&amp;lt;b&amp;gt;=== Download (utility) ===&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is a Modern UI2 version that displays selection windows and goes to an output page. Script file is included.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;attach&amp;gt;SOD II tool.zip&amp;lt;/attach&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Both downloads are compiled in unicode, so SOD Tool can read Russian file names.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-size: 110%&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Errors:&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On failing to obtain the size of a file &amp;lt;em&amp;gt;GetSizeOnDisk&amp;lt;/em&amp;gt; does nothing much. You can edit the line that says,&lt;br /&gt;
&amp;lt;highlight-nsis&amp;gt;&lt;br /&gt;
FileOpen $9 &#039;$R8\$R7&#039; r&lt;br /&gt;
IfErrors +3&lt;br /&gt;
&amp;lt;/highlight-nsis&amp;gt;&lt;br /&gt;
changing the instruction to,&lt;br /&gt;
&amp;lt;highlight-nsis&amp;gt;&lt;br /&gt;
FileOpen $9 &#039;$R8\$R7&#039; r&lt;br /&gt;
IfErrors FileFunc_GetSize_error&lt;br /&gt;
&amp;lt;/highlight-nsis&amp;gt;&lt;br /&gt;
It sets an error flag and will abort the macro, if an error is encountered opening a file for reading.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-size: 110%&amp;quot;&amp;gt;&amp;lt;b&amp;gt;History:&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional parameter for counting compressed/sparse files added. (Feb. 18, 2013)&lt;br /&gt;
&lt;br /&gt;
Option to find without subdirectories &#039;/G=0&#039; switch was missing. (Well, not really missing.) Change to details view (string), showing &#039;compressed/sparse file(s)&#039;. (Feb. 19, 2013)&lt;br /&gt;
&lt;br /&gt;
Change to unicode, because ansi could not read Russian. (Feb. 20, 2013)&lt;br /&gt;
&lt;br /&gt;
Stack operations cleaned up. The &amp;lt;b&amp;gt;SOD II tool&amp;lt;/b&amp;gt; uploaded. (Feb. 22, 2013)&lt;br /&gt;
&lt;br /&gt;
String formatting improvements, functions simplified (SOD II) and small revisions in macros header made. (Feb. 23, 2013)&lt;br /&gt;
&lt;br /&gt;
Macros behavior modified in order to detect the file system to deal with FAT, FAT12, FAT16 and FAT32 volumes.  Also checking root path, possibly Win2K error. (March 8, 2013)&lt;br /&gt;
[[Category:Code Examples]]&lt;/div&gt;</summary>
		<author><name>Bnicer</name></author>
	</entry>
	<entry>
		<id>https://nsis.sourceforge.io/mediawiki/index.php?title=User:Bnicer&amp;diff=23108</id>
		<title>User:Bnicer</title>
		<link rel="alternate" type="text/html" href="https://nsis.sourceforge.io/mediawiki/index.php?title=User:Bnicer&amp;diff=23108"/>
		<updated>2013-03-16T01:14:12Z</updated>

		<summary type="html">&lt;p&gt;Bnicer: NSIS and I&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;My current NSIS-related activities include testing, testing and more testing ...&lt;br /&gt;
&amp;lt;highlight-nsis&amp;gt;&lt;br /&gt;
ExecWait &#039;&amp;quot;$UNINSTSTR&amp;quot; /U _?=$UNINST\bin&#039;&lt;br /&gt;
&amp;lt;/highlight-nsis&amp;gt;&lt;/div&gt;</summary>
		<author><name>Bnicer</name></author>
	</entry>
	<entry>
		<id>https://nsis.sourceforge.io/mediawiki/index.php?title=Get_size_on_disk&amp;diff=23092</id>
		<title>Get size on disk</title>
		<link rel="alternate" type="text/html" href="https://nsis.sourceforge.io/mediawiki/index.php?title=Get_size_on_disk&amp;diff=23092"/>
		<updated>2013-03-08T01:30:57Z</updated>

		<summary type="html">&lt;p&gt;Bnicer: Size On Disk (SOD) utility&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PageAuthor|Bnicer}}&lt;br /&gt;
This example code shows you how to get the space used by directories and files.&lt;br /&gt;
&amp;lt;highlight-nsis&amp;gt;&lt;br /&gt;
; A utility for computing the NSIS (or NSIS Unicode) install folder size and the size of&lt;br /&gt;
; the uninstaller&lt;br /&gt;
; nsissize.nsi&lt;br /&gt;
; Compile, then run the .exe&lt;br /&gt;
&lt;br /&gt;
Name &amp;quot;SOD Tool&amp;quot;&lt;br /&gt;
RequestExecutionLevel user&lt;br /&gt;
#RequestExecutionLevel admin ; More files may be found in system folders&lt;br /&gt;
!define LOCAL &amp;quot;&amp;quot; ; Path where local include files reside&lt;br /&gt;
OutFile &amp;quot;${LOCAL}nsissize.exe&amp;quot;&lt;br /&gt;
!include &amp;quot;${LOCAL}macros.nsh&amp;quot;&lt;br /&gt;
Icon &amp;quot;${LOCAL}arrows.ico&amp;quot;&lt;br /&gt;
ReserveFile &amp;quot;${NSISDIR}\Plugins\Math.dll&amp;quot; ; Doesn&#039;t seem to like &amp;quot;!include&amp;quot;&lt;br /&gt;
!include &amp;quot;LogicLib.nsh&amp;quot;&lt;br /&gt;
ShowInstDetails show&lt;br /&gt;
&lt;br /&gt;
;--------------------------------&lt;br /&gt;
&lt;br /&gt;
; Variables&lt;br /&gt;
Var NSIS&lt;br /&gt;
Var COMPRESSED&lt;br /&gt;
Var COMPRESSED_UN&lt;br /&gt;
Var BLOCK&lt;br /&gt;
Var FILES&lt;br /&gt;
Var FOLDERS&lt;br /&gt;
Var SIZE_B&lt;br /&gt;
Var SIZE_M&lt;br /&gt;
Var SOD_B&lt;br /&gt;
Var SOD_K&lt;br /&gt;
Var SOD_M&lt;br /&gt;
Var SIZE_UN_B&lt;br /&gt;
Var SIZE_UN_K&lt;br /&gt;
Var SOD_UN_B&lt;br /&gt;
Var SOD_UN_K&lt;br /&gt;
&lt;br /&gt;
;--------------------------------&lt;br /&gt;
&lt;br /&gt;
; Functions&lt;br /&gt;
Function Separator ; comma&lt;br /&gt;
  Exch $R1 ; input string&lt;br /&gt;
  Push $R2&lt;br /&gt;
  Push $R3&lt;br /&gt;
  Push $R4&lt;br /&gt;
  Push $R5&lt;br /&gt;
  StrCpy $R2 $R1&lt;br /&gt;
  StrCpy $R5 &amp;quot;16&amp;quot; ; 1,000,000,000,000,000 limit&lt;br /&gt;
  StrLen $R4 $R1&lt;br /&gt;
loop:&lt;br /&gt;
  IntCmp $R5 3 endloop endloop 0&lt;br /&gt;
  IntCmp $R4 $R5 0 +7 0&lt;br /&gt;
  IntOp $R5 $R5 - 1&lt;br /&gt;
  StrCpy $R2 $R2 -$R5&lt;br /&gt;
  StrCpy $R3 $R1 &amp;quot;&amp;quot; -$R5&lt;br /&gt;
  StrCpy $R2 &amp;quot;$R2,$R3&amp;quot;&lt;br /&gt;
  IntOp $R5 $R5 - 2&lt;br /&gt;
  Goto loop&lt;br /&gt;
  IntOp $R5 $R5 - 3&lt;br /&gt;
  Goto loop&lt;br /&gt;
endloop:&lt;br /&gt;
  Pop $R5&lt;br /&gt;
  Pop $R4&lt;br /&gt;
  Pop $R3&lt;br /&gt;
  Exch $R2&lt;br /&gt;
  Pop $R1&lt;br /&gt;
  Exch $R1 ; output string&lt;br /&gt;
FunctionEnd&lt;br /&gt;
&lt;br /&gt;
;--------------------------------&lt;br /&gt;
&lt;br /&gt;
; Main Section (nothing will be installed)&lt;br /&gt;
Section&lt;br /&gt;
; registry&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS Unicode&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS ANSI&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  Goto done&lt;br /&gt;
  begin:&lt;br /&gt;
  IfFileExists &amp;quot;$NSIS&amp;quot; 0 done&lt;br /&gt;
  ${GetClusterSize} $NSIS $BLOCK&lt;br /&gt;
; directory&lt;br /&gt;
  ${GetSizeOnDisk} &amp;quot;$NSIS&amp;quot; &amp;quot;/S=0B&amp;quot; &amp;quot;&amp;quot; $0 $1 $2 $3&lt;br /&gt;
  StrCpy $SIZE_B $0&lt;br /&gt;
  StrCpy $FILES $1&lt;br /&gt;
  StrCpy $FOLDERS $2&lt;br /&gt;
  Math::Script &amp;quot;r4 = ff($0 / 1024 / 1024.0, 16 +2)&amp;quot;&lt;br /&gt;
  StrCpy $SIZE_M $4&lt;br /&gt;
  ${GetSizeOnDisk} &amp;quot;$NSIS&amp;quot; &amp;quot;/S=0B&amp;quot; &amp;quot;$BLOCK&amp;quot; $0 $1 $2 $3&lt;br /&gt;
  StrCpy $SOD_B $0&lt;br /&gt;
  StrCpy $COMPRESSED $3&lt;br /&gt;
  Math::Script &amp;quot;r4 = ff($0 / 1024.0, 16 +0); r5 = ff(r4 / 1024.0, 16 +2)&amp;quot;&lt;br /&gt;
  StrCpy $SOD_K $4&lt;br /&gt;
  StrCpy $SOD_M $5&lt;br /&gt;
; uninstaller&lt;br /&gt;
  IfFileExists &amp;quot;$NSIS\uninst-nsis.exe&amp;quot; 0 done&lt;br /&gt;
  ${GetSizeOnDisk} &amp;quot;$NSIS&amp;quot; &amp;quot;/M=uninst-nsis.exe /S=0B /G=0&amp;quot; &amp;quot;&amp;quot; $0 $1 $2 $3&lt;br /&gt;
  StrCpy $SIZE_UN_B $0&lt;br /&gt;
  Math::Script &amp;quot;r4 = ff($0 / 1024.0, 16 +1)&amp;quot;&lt;br /&gt;
  StrCpy $SIZE_UN_K $4&lt;br /&gt;
  ${GetSizeOnDisk} &amp;quot;$NSIS&amp;quot; &amp;quot;/M=uninst-nsis.exe /S=0B /G=0&amp;quot; &amp;quot;$BLOCK&amp;quot; $0 $1 $2 $3&lt;br /&gt;
  StrCpy $SOD_UN_B $0&lt;br /&gt;
  ${If} $3 &amp;gt; 0&lt;br /&gt;
    StrCpy $COMPRESSED_UN &amp;quot; (compressed or sparse)&amp;quot;&lt;br /&gt;
  ${Else}&lt;br /&gt;
    StrCpy $COMPRESSED_UN &amp;quot;&amp;quot;&lt;br /&gt;
  ${EndIf}&lt;br /&gt;
  Math::Script &amp;quot;r4 = ff($0 / 1024.0, 16 +1)&amp;quot;&lt;br /&gt;
  StrCpy $SOD_UN_K $4&lt;br /&gt;
; format&lt;br /&gt;
  Push $SIZE_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  Pop $SIZE_B&lt;br /&gt;
&lt;br /&gt;
  Push $SOD_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  Pop $SOD_B&lt;br /&gt;
&lt;br /&gt;
  Push $SOD_K&lt;br /&gt;
  Call Separator&lt;br /&gt;
  Pop $SOD_K&lt;br /&gt;
&lt;br /&gt;
  Push $SIZE_UN_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  Pop $SIZE_UN_B&lt;br /&gt;
&lt;br /&gt;
  Push $SOD_UN_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  Pop $SOD_UN_B&lt;br /&gt;
; output&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;$NSIS&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;Size: $SIZE_M MB ($SIZE_B bytes)&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;SOD: $SOD_M MB ($SOD_B bytes)&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;Uninstaller$COMPRESSED_UN&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;Size: $SIZE_UN_K KB ($SIZE_UN_B bytes)&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;SOD: $SOD_UN_K KB ($SOD_UN_B bytes)&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;$FILES files | $FOLDERS folders | $SOD_K Kb | $COMPRESSED compressed/sparse file(s)&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  Goto completed&lt;br /&gt;
done:&lt;br /&gt;
  DetailPrint &amp;quot;File not found.&amp;quot;&lt;br /&gt;
completed:&lt;br /&gt;
SectionEnd&lt;br /&gt;
&lt;br /&gt;
;--------------------------------&lt;br /&gt;
# EOF&lt;br /&gt;
&amp;lt;/highlight-nsis&amp;gt;&lt;br /&gt;
You should copy the next code into a separate file: &amp;lt;b&amp;gt;macros.nsh&amp;lt;/b&amp;gt;.&lt;br /&gt;
&amp;lt;highlight-nsis&amp;gt;&lt;br /&gt;
; Macros include (TN)&lt;br /&gt;
;--------------------------------&lt;br /&gt;
/*&lt;br /&gt;
&lt;br /&gt;
 FileFunction=[GetSizeOnDisk|GetClusterSize]&lt;br /&gt;
&lt;br /&gt;
*/&lt;br /&gt;
;_____________________________________________________________________________&lt;br /&gt;
;&lt;br /&gt;
;                         Macros&lt;br /&gt;
;_____________________________________________________________________________&lt;br /&gt;
;&lt;br /&gt;
; Change log window verbosity (default: 3=no script)&lt;br /&gt;
;&lt;br /&gt;
; Example:&lt;br /&gt;
; !include &amp;quot;macros.nsh&amp;quot;&lt;br /&gt;
; !insertmacro GetSizeOnDisk&lt;br /&gt;
; ${FILEFUNC_VERBOSE} 4   # all verbosity&lt;br /&gt;
; !insertmacro GetClusterSize&lt;br /&gt;
; ${FILEFUNC_VERBOSE} 3   # no script&lt;br /&gt;
&lt;br /&gt;
!include Util.nsh ; for &amp;quot;CallArtificialFunction&amp;quot;&lt;br /&gt;
&lt;br /&gt;
!verbose push&lt;br /&gt;
!verbose 3&lt;br /&gt;
!ifndef _FILEFUNC_VERBOSE&lt;br /&gt;
	!define _FILEFUNC_VERBOSE 3&lt;br /&gt;
!endif&lt;br /&gt;
!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
!define FILEFUNC_VERBOSE `!insertmacro FILEFUNC_VERBOSE`&lt;br /&gt;
!verbose pop&lt;br /&gt;
&lt;br /&gt;
!macro FILEFUNC_VERBOSE _VERBOSE&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose 3&lt;br /&gt;
	!undef _FILEFUNC_VERBOSE&lt;br /&gt;
	!define _FILEFUNC_VERBOSE ${_VERBOSE}&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetSizeOnDiskCall _PATH _OPTIONS _FILESYSTEM _RESULT1 _RESULT2 _RESULT3 _RESULT4&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
	Push `${_PATH}`&lt;br /&gt;
	Push `${_OPTIONS}`&lt;br /&gt;
	Push `${_FILESYSTEM}` ; volume block size&lt;br /&gt;
	${CallArtificialFunction} GetSizeOnDisk_&lt;br /&gt;
	Pop ${_RESULT1}&lt;br /&gt;
	Pop ${_RESULT2}&lt;br /&gt;
	Pop ${_RESULT3}&lt;br /&gt;
	Pop ${_RESULT4}&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetClusterSizeCall _PATH _RESULT&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
	Push `${_PATH}` &lt;br /&gt;
	${CallArtificialFunction} GetClusterSize_&lt;br /&gt;
	Pop ${_RESULT}&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
; ---------------&lt;br /&gt;
; GetSizeOnDisk (modified &amp;quot;GetSize&amp;quot; - FileFunc.nsh - KiCHiK - Function &amp;quot;FindFiles&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
!define GetSizeOnDisk `!insertmacro GetSizeOnDiskCall`&lt;br /&gt;
!define un.GetSizeOnDisk `!insertmacro GetSizeOnDiskCall`&lt;br /&gt;
&lt;br /&gt;
!macro GetSizeOnDisk&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro un.GetSizeOnDisk&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
; Usage: similar to &amp;quot;GetSize&amp;quot;&lt;br /&gt;
&lt;br /&gt;
; For documentation, see the NSIS user manual: E.1.3 GetSize&lt;br /&gt;
; Four (not three) values are returned&lt;br /&gt;
&lt;br /&gt;
; $var1		; Result1: Size/Size on disk&lt;br /&gt;
; $var2		; Result2: Sum of files&lt;br /&gt;
; $var3		; Result3: Sum of directories&lt;br /&gt;
; $var4		; Result4: Sum of compressed/sparse files&lt;br /&gt;
&lt;br /&gt;
; Example: ${GetSizeOnDisk} &amp;quot;$INSTDIR&amp;quot; &amp;quot;/S=0K&amp;quot; &amp;quot;SOD&amp;quot; $0 $1 $2 $3&lt;br /&gt;
; DetailPrint &amp;quot;$1 file(s) | $2 folder(s) | $0 Kb | $3 compressed or sparse file(s)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
; Specifying &#039;SOD&#039; (e.g. Size On Disk) toggles the $var1 result&lt;br /&gt;
; Output is logical size, if used, or physical size, if left empty &amp;quot;&amp;quot;&lt;br /&gt;
; The target volume&#039;s allocation unit size in bytes, the size of a&lt;br /&gt;
; cluster, for example &#039;4096&#039; bytes, if valid, can also be the input&lt;br /&gt;
; If neither &#039;SOD&#039; nor a cluster size is specified, $var4 returns 0&lt;br /&gt;
; even where compressed and/or sparse files exist&lt;br /&gt;
&lt;br /&gt;
; ${GetSizeOnDisk} can be used with Windows NT and Windows 2000&lt;br /&gt;
; When the volume is FAT32, FAT16 or an older file system, the result&lt;br /&gt;
; in $var1 reverts to physical size, although not incorrect&lt;br /&gt;
&lt;br /&gt;
!macro GetSizeOnDisk_&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
&lt;br /&gt;
	Exch $2&lt;br /&gt;
	Exch 2&lt;br /&gt;
	Exch $0&lt;br /&gt;
	Exch&lt;br /&gt;
	Exch $1&lt;br /&gt;
	Push $3&lt;br /&gt;
	Push $4&lt;br /&gt;
	Push $5&lt;br /&gt;
	Push $6&lt;br /&gt;
	Push $7&lt;br /&gt;
	Push $8&lt;br /&gt;
	Push $9&lt;br /&gt;
	Push $R0&lt;br /&gt;
	Push $R1&lt;br /&gt;
	Push $R2&lt;br /&gt;
	StrCpy $R1 $2&lt;br /&gt;
	Push $R3&lt;br /&gt;
	Push $R4&lt;br /&gt;
	Push $R5&lt;br /&gt;
	Push $R6&lt;br /&gt;
	Push $R7&lt;br /&gt;
	Push $R8&lt;br /&gt;
	Push $R9&lt;br /&gt;
	ClearErrors&lt;br /&gt;
&lt;br /&gt;
	StrCmp $R1 &#039;&#039; FileFunc_GetSize_path&lt;br /&gt;
&lt;br /&gt;
	StrCpy $5 $0&lt;br /&gt;
	StrCpy $2 $0 2&lt;br /&gt;
	StrCmp $2 &#039;\\&#039; FileFunc_GetSize_Root_UNC&lt;br /&gt;
	StrCpy $3 $2 1 1&lt;br /&gt;
	StrCmp $3 &#039;:&#039; 0 FileFunc_GetSize_Root_empty&lt;br /&gt;
	StrCpy $5 $2&lt;br /&gt;
	goto FileFunc_GetSize_FileSystem&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_Root_UNC:&lt;br /&gt;
	StrCpy $3 1&lt;br /&gt;
	StrCpy $4 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_Root_loop:&lt;br /&gt;
	IntOp $3 $3 + 1&lt;br /&gt;
	StrCpy $2 $5 1 $3&lt;br /&gt;
	StrCmp $2$4 &#039;&#039; FileFunc_GetSize_Root_empty&lt;br /&gt;
	StrCmp $2 &#039;&#039; +5&lt;br /&gt;
	StrCmp $2 &#039;\&#039; 0 FileFunc_GetSize_Root_loop&lt;br /&gt;
	StrCmp $4 &#039;1&#039; +3&lt;br /&gt;
	StrCpy $4 &#039;1&#039;&lt;br /&gt;
	goto FileFunc_GetSize_Root_loop&lt;br /&gt;
	StrCpy $5 $5 $3&lt;br /&gt;
	StrCpy $3 $5 1 -1&lt;br /&gt;
	StrCmp $3 &#039;\&#039; 0 FileFunc_GetSize_FileSystem&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_Root_empty:&lt;br /&gt;
	StrCpy $5 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_FileSystem:&lt;br /&gt;
	System::Call &#039;Kernel32::GetVolumeInformation\&lt;br /&gt;
	(t &amp;quot;$5\&amp;quot;,t,i ${NSIS_MAX_STRLEN},*i,*i,*i,t.r2,i ${NSIS_MAX_STRLEN})i.r3&#039;&lt;br /&gt;
	StrCmp $3 0 FileFunc_GetSize_FileSystem_error&lt;br /&gt;
	StrCpy $2 $2 3&lt;br /&gt;
	StrCmp $2 &#039;FAT&#039; FileFunc_GetSize_FileSystem_error&lt;br /&gt;
	StrCmp $R1 &#039;SOD&#039; 0 FileFunc_GetSize_path&lt;br /&gt;
	System::Call &#039;kernel32::GetDiskFreeSpace(t &amp;quot;$5\&amp;quot;,*i0r2,*i0r3,,)&#039;&lt;br /&gt;
	IntOp $R1 $2 * $3&lt;br /&gt;
	goto FileFunc_GetSize_path&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_FileSystem_error:&lt;br /&gt;
	StrCpy $R1 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_path:&lt;br /&gt;
	StrCpy $R9 $0 1 -1&lt;br /&gt;
	StrCmp $R9 &#039;\&#039; 0 +3&lt;br /&gt;
	StrCpy $0 $0 -1&lt;br /&gt;
	goto -3&lt;br /&gt;
	IfFileExists &#039;$0\*.*&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
&lt;br /&gt;
	StrCpy $3 0&lt;br /&gt;
	StrCpy $4 &#039;&#039;&lt;br /&gt;
	StrCpy $5 &#039;&#039;&lt;br /&gt;
	StrCpy $6 &#039;&#039;&lt;br /&gt;
	StrCpy $8 0&lt;br /&gt;
	StrCpy $R3 &#039;&#039;&lt;br /&gt;
	StrCpy $R4 &#039;&#039;&lt;br /&gt;
	StrCpy $R5 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_option:&lt;br /&gt;
	StrCpy $R9 $1 1&lt;br /&gt;
	StrCpy $1 $1 &#039;&#039; 1&lt;br /&gt;
	StrCmp $R9 &#039; &#039; -2&lt;br /&gt;
	StrCmp $R9 &#039;&#039; FileFunc_GetSize_sizeset&lt;br /&gt;
	StrCmp $R9 &#039;/&#039; 0 -4&lt;br /&gt;
&lt;br /&gt;
	StrCpy $9 -1&lt;br /&gt;
	IntOp $9 $9 + 1&lt;br /&gt;
	StrCpy $R9 $1 1 $9&lt;br /&gt;
	StrCmp $R9 &#039;&#039; +2&lt;br /&gt;
	StrCmp $R9 &#039;/&#039; 0 -3&lt;br /&gt;
	StrCpy $8 $1 $9&lt;br /&gt;
	StrCpy $8 $8 &#039;&#039; 2&lt;br /&gt;
	StrCpy $R9 $8 &#039;&#039; -1&lt;br /&gt;
	StrCmp $R9 &#039; &#039; 0 +3&lt;br /&gt;
	StrCpy $8 $8 -1&lt;br /&gt;
	goto -3&lt;br /&gt;
	StrCpy $R9 $1 2&lt;br /&gt;
	StrCpy $1 $1 &#039;&#039; $9&lt;br /&gt;
&lt;br /&gt;
	StrCmp $R9 &#039;M=&#039; 0 FileFunc_GetSize_size&lt;br /&gt;
	StrCpy $4 $8&lt;br /&gt;
	goto FileFunc_GetSize_option&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_size:&lt;br /&gt;
	StrCmp $R9 &#039;S=&#039; 0 FileFunc_GetSize_gotosubdir&lt;br /&gt;
	StrCpy $6 $8&lt;br /&gt;
	goto FileFunc_GetSize_option&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_gotosubdir:&lt;br /&gt;
	StrCmp $R9 &#039;G=&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
	StrCpy $7 $8&lt;br /&gt;
	StrCmp $7 &#039;&#039; +3&lt;br /&gt;
	StrCmp $7 &#039;1&#039; +2&lt;br /&gt;
	StrCmp $7 &#039;0&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
	goto FileFunc_GetSize_option&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_sizeset:&lt;br /&gt;
	StrCmp $6 &#039;&#039; FileFunc_GetSize_default&lt;br /&gt;
	StrCpy $9 0&lt;br /&gt;
	StrCpy $R9 $6 1 $9&lt;br /&gt;
	StrCmp $R9 &#039;&#039; +4&lt;br /&gt;
	StrCmp $R9 &#039;:&#039; +3&lt;br /&gt;
	IntOp $9 $9 + 1&lt;br /&gt;
	goto -4&lt;br /&gt;
	StrCpy $5 $6 $9&lt;br /&gt;
	IntOp $9 $9 + 1&lt;br /&gt;
	StrCpy $1 $6 1 -1&lt;br /&gt;
	StrCpy $6 $6 -1 $9&lt;br /&gt;
	StrCmp $5 &#039;&#039; +2&lt;br /&gt;
	IntOp $5 $5 + 0&lt;br /&gt;
	StrCmp $6 &#039;&#039; +2&lt;br /&gt;
	IntOp $6 $6 + 0&lt;br /&gt;
&lt;br /&gt;
	StrCmp $1 &#039;B&#039; 0 +4&lt;br /&gt;
	StrCpy $1 1&lt;br /&gt;
	StrCpy $2 bytes&lt;br /&gt;
	goto FileFunc_GetSize_default&lt;br /&gt;
	StrCmp $1 &#039;K&#039; 0 +4&lt;br /&gt;
	StrCpy $1 1024&lt;br /&gt;
	StrCpy $2 Kb&lt;br /&gt;
	goto FileFunc_GetSize_default&lt;br /&gt;
	StrCmp $1 &#039;M&#039; 0 +4&lt;br /&gt;
	StrCpy $1 1048576&lt;br /&gt;
	StrCpy $2 Mb&lt;br /&gt;
	goto FileFunc_GetSize_default&lt;br /&gt;
	StrCmp $1 &#039;G&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
	StrCpy $1 1073741824&lt;br /&gt;
	StrCpy $2 Gb&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_default:&lt;br /&gt;
	StrCmp $4 &#039;&#039; 0 +2&lt;br /&gt;
	StrCpy $4 &#039;*.*&#039;&lt;br /&gt;
	StrCmp $7 &#039;&#039; 0 +2&lt;br /&gt;
	StrCpy $7 &#039;1&#039;&lt;br /&gt;
&lt;br /&gt;
	StrCpy $8 1&lt;br /&gt;
	Push $0&lt;br /&gt;
	SetDetailsPrint textonly&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_nextdir:&lt;br /&gt;
	IntOp $8 $8 - 1&lt;br /&gt;
	Pop $R8&lt;br /&gt;
	FindFirst $0 $R7 &#039;$R8\$4&#039;&lt;br /&gt;
	IfErrors FileFunc_GetSize_show&lt;br /&gt;
	StrCmp $R7 &#039;.&#039; 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	StrCmp $R7 &#039;..&#039; 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
	goto FileFunc_GetSize_show&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_dir:&lt;br /&gt;
	IfFileExists &#039;$R8\$R7\*.*&#039; 0 FileFunc_GetSize_file&lt;br /&gt;
	IntOp $R5 $R5 + 1&lt;br /&gt;
	goto FileFunc_GetSize_findnext&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_file:&lt;br /&gt;
	StrCpy $R6 0&lt;br /&gt;
	StrCmp $5$6 &#039;&#039; 0 +3&lt;br /&gt;
	IntOp $R4 $R4 + 1&lt;br /&gt;
	goto FileFunc_GetSize_findnext&lt;br /&gt;
	StrCmp $R1 &#039;&#039; FileFunc_GetSize_fileopen&lt;br /&gt;
	StrCpy $R0 0&lt;br /&gt;
	System::Call &#039;kernel32::GetFileAttributes(t &amp;quot;$R8\$R7&amp;quot;)i .R2&#039;&lt;br /&gt;
	StrCmp $R2 -1 FileFunc_GetSize_fileopen&lt;br /&gt;
	IntOp $R0 $R2 &amp;amp; 0x0800 ; compressed&lt;br /&gt;
	IntCmp $R0 0 0 0 FileFunc_GetSize_GetCompressed&lt;br /&gt;
	IntOp $R0 $R2 &amp;amp; 0x0200 ; sparse file&lt;br /&gt;
	IntCmp $R0 0 FileFunc_GetSize_fileopen&lt;br /&gt;
	FileFunc_GetSize_GetCompressed:&lt;br /&gt;
	System::Call &#039;kernel32::GetCompressedFileSize(t &amp;quot;$R8\$R7&amp;quot;, i)i .R6&#039;&lt;br /&gt;
	IntCmp $R6 4096 +2 0 +2&lt;br /&gt;
	StrCpy $R6 4096&lt;br /&gt;
	IntOp $3 $3 + 1 ; location contains compressed or sparse files&lt;br /&gt;
	goto FileFunc_GetSize_fileclose&lt;br /&gt;
	FileFunc_GetSize_fileopen:&lt;br /&gt;
	FileOpen $9 &#039;$R8\$R7&#039; r&lt;br /&gt;
	IfErrors +3&lt;br /&gt;
	FileSeek $9 0 END $R6&lt;br /&gt;
	FileClose $9&lt;br /&gt;
	FileFunc_GetSize_fileclose:&lt;br /&gt;
	StrCmp $5 &#039;&#039; +2&lt;br /&gt;
	IntCmp $R6 $5 0 FileFunc_GetSize_findnext&lt;br /&gt;
	StrCmp $6 &#039;&#039; +2&lt;br /&gt;
	IntCmp $R6 $6 0 0 FileFunc_GetSize_findnext&lt;br /&gt;
	IntOp $R4 $R4 + 1&lt;br /&gt;
	StrCmp $R1 &#039;&#039; FileFunc_GetSize_file_add&lt;br /&gt;
	StrCmp $R0 0 0 FileFunc_GetSize_file_add&lt;br /&gt;
	StrCpy $R0 $R1&lt;br /&gt;
	IntOp $R6 $R6 + $R0&lt;br /&gt;
	IntOp $R1 $R6 % $R0&lt;br /&gt;
	StrCmp $R1 0 0 +2&lt;br /&gt;
	StrCpy $R1 $R0&lt;br /&gt;
	IntOp $R2 $R0 - $R1&lt;br /&gt;
	IntOp $R6 $R6 - $R0&lt;br /&gt;
	IntOp $R6 $R6 + $R2&lt;br /&gt;
	StrCpy $R1 $R0&lt;br /&gt;
	FileFunc_GetSize_file_add:&lt;br /&gt;
	System::Int64Op $R3 + $R6&lt;br /&gt;
	Pop $R3&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_findnext:&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_show:&lt;br /&gt;
	StrCmp $5$6 &#039;&#039; FileFunc_GetSize_nosize&lt;br /&gt;
	System::Int64Op $R3 / $1&lt;br /&gt;
	Pop $9&lt;br /&gt;
	DetailPrint &#039;Size:$9 $2  Files:$R4  Folders:$R5&#039;&lt;br /&gt;
	goto FileFunc_GetSize_subdir&lt;br /&gt;
	FileFunc_GetSize_nosize:&lt;br /&gt;
	DetailPrint &#039;Files:$R4  Folders:$R5&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_subdir:&lt;br /&gt;
	StrCmp $7 0 FileFunc_GetSize_preend&lt;br /&gt;
	FindFirst $0 $R7 &#039;$R8\*.*&#039;&lt;br /&gt;
	StrCmp $R7 &#039;.&#039; 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	StrCmp $R7 &#039;..&#039; 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
	StrCmp $8 0 FileFunc_GetSize_preend FileFunc_GetSize_nextdir&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_pushdir:&lt;br /&gt;
	IfFileExists &#039;$R8\$R7\*.*&#039; 0 +3&lt;br /&gt;
	Push &#039;$R8\$R7&#039;&lt;br /&gt;
	IntOp $8 $8 + 1&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
	StrCmp $8 0 FileFunc_GetSize_preend FileFunc_GetSize_nextdir&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_preend:&lt;br /&gt;
	StrCmp $R3 &#039;&#039; FileFunc_GetSize_nosizeend&lt;br /&gt;
	System::Int64Op $R3 / $1&lt;br /&gt;
	Pop $R3&lt;br /&gt;
	FileFunc_GetSize_nosizeend:&lt;br /&gt;
	StrCpy $2 $R4&lt;br /&gt;
	StrCpy $1 $R5&lt;br /&gt;
	StrCpy $0 $R3&lt;br /&gt;
	goto FileFunc_GetSize_noerror&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_error:&lt;br /&gt;
	SetErrors&lt;br /&gt;
	StrCpy $0 &#039;&#039;&lt;br /&gt;
	StrCpy $1 &#039;&#039;&lt;br /&gt;
	StrCpy $2 &#039;&#039;&lt;br /&gt;
	StrCpy $3 &#039;&#039;&lt;br /&gt;
	goto FileFunc_GetSize_end&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_noerror:&lt;br /&gt;
	StrCmp $0 &#039;&#039; 0 +2&lt;br /&gt;
	StrCpy $0 0&lt;br /&gt;
	StrCmp $1 &#039;&#039; 0 +2&lt;br /&gt;
	StrCpy $1 0&lt;br /&gt;
	StrCmp $2 &#039;&#039; 0 +2&lt;br /&gt;
	StrCpy $2 0&lt;br /&gt;
	StrCmp $3 &#039;&#039; 0 +2&lt;br /&gt;
	StrCpy $3 0&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_end:&lt;br /&gt;
	SetDetailsPrint both&lt;br /&gt;
	Pop $R9&lt;br /&gt;
	Pop $R8&lt;br /&gt;
	Pop $R7&lt;br /&gt;
	Pop $R6&lt;br /&gt;
	Pop $R5&lt;br /&gt;
	Pop $R4&lt;br /&gt;
	Pop $R3&lt;br /&gt;
	Pop $R2&lt;br /&gt;
	Pop $R1&lt;br /&gt;
	Pop $R0&lt;br /&gt;
	Pop $9&lt;br /&gt;
	Pop $8&lt;br /&gt;
	Pop $7&lt;br /&gt;
	Pop $6&lt;br /&gt;
	Pop $5&lt;br /&gt;
	Pop $4&lt;br /&gt;
	Exch $3&lt;br /&gt;
	Exch 3&lt;br /&gt;
	Exch $2&lt;br /&gt;
	Exch&lt;br /&gt;
	Exch $1&lt;br /&gt;
	Exch 2&lt;br /&gt;
	Exch $0&lt;br /&gt;
&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
; ---------------&lt;br /&gt;
; GetClusterSize&lt;br /&gt;
&lt;br /&gt;
; Allocation unit size on NTFS, exFAT and reFS formatted volumes&lt;br /&gt;
; Syntax: ${GetClusterSize} $inputpath $outputvariable&lt;br /&gt;
; Result: 512, 1024, ..., 4096, ..., 131072, ...&lt;br /&gt;
&lt;br /&gt;
!define GetClusterSize `!insertmacro GetClusterSizeCall`&lt;br /&gt;
!define un.GetClusterSize `!insertmacro GetClusterSizeCall`&lt;br /&gt;
&lt;br /&gt;
!macro GetClusterSize&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro un.GetClusterSize&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetClusterSize_&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
&lt;br /&gt;
	Exch $0&lt;br /&gt;
	Push $1&lt;br /&gt;
	Push $2&lt;br /&gt;
	Push $3&lt;br /&gt;
&lt;br /&gt;
	StrCpy $1 $0 2&lt;br /&gt;
	StrCmp $1 &#039;\\&#039; Root_UNC&lt;br /&gt;
	StrCpy $2 $1 1 1&lt;br /&gt;
	StrCmp $2 &#039;:&#039; 0 Root_empty&lt;br /&gt;
	StrCpy $0 $1&lt;br /&gt;
	goto Root_end&lt;br /&gt;
&lt;br /&gt;
	Root_UNC:&lt;br /&gt;
	StrCpy $2 1&lt;br /&gt;
	StrCpy $3 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	Root_loop:&lt;br /&gt;
	IntOp $2 $2 + 1&lt;br /&gt;
	StrCpy $1 $0 1 $2&lt;br /&gt;
	StrCmp $1$3 &#039;&#039; Root_empty&lt;br /&gt;
	StrCmp $1 &#039;&#039; +5&lt;br /&gt;
	StrCmp $1 &#039;\&#039; 0 Root_loop&lt;br /&gt;
	StrCmp $3 &#039;1&#039; +3&lt;br /&gt;
	StrCpy $3 &#039;1&#039;&lt;br /&gt;
	goto Root_loop&lt;br /&gt;
	StrCpy $0 $0 $2&lt;br /&gt;
	StrCpy $2 $0 1 -1&lt;br /&gt;
	StrCmp $2 &#039;\&#039; 0 Root_end&lt;br /&gt;
&lt;br /&gt;
	Root_empty:&lt;br /&gt;
	StrCpy $0 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	Root_end:&lt;br /&gt;
	System::Call &#039;kernel32::GetDiskFreeSpace(t &amp;quot;$0\&amp;quot;,*i0r1,*i0r2,,)&#039;&lt;br /&gt;
	IntOp $0 $1 * $2&lt;br /&gt;
	Pop $3&lt;br /&gt;
	Pop $2&lt;br /&gt;
	Pop $1&lt;br /&gt;
	Exch $0&lt;br /&gt;
&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/highlight-nsis&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-size: 110%&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Credits:&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;em&amp;gt;GetSizeOnDisk&amp;lt;/em&amp;gt; has been altered slightly and renamed. The original macro is called &amp;lt;em&amp;gt;GetSize&amp;lt;/em&amp;gt;. You will find it in the Users Manual under E.1.3.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-size: 110%&amp;quot;&amp;gt;&amp;lt;b&amp;gt;=== Download (example) ===&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is the same as the example code above.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;attach&amp;gt;SODTool.zip&amp;lt;/attach&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-size: 110%&amp;quot;&amp;gt;&amp;lt;b&amp;gt;=== Download (utility) ===&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is a Modern UI2 version that displays selection windows and goes to an output page. Script file is included.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;attach&amp;gt;SOD II tool.zip&amp;lt;/attach&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Both downloads are compiled in unicode, so SOD Tool can read Russian file names.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-size: 110%&amp;quot;&amp;gt;&amp;lt;b&amp;gt;History:&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional parameter for counting compressed/sparse files added. (Feb. 18, 2013)&lt;br /&gt;
&lt;br /&gt;
Option to find without subdirectories &#039;/G=0&#039; switch was missing. (Well, not really missing.) Change to details view (string), showing &#039;compressed/sparse file(s)&#039;. (Feb. 19, 2013)&lt;br /&gt;
&lt;br /&gt;
Change to unicode, because ansi could not read Russian. (Feb. 20, 2013)&lt;br /&gt;
&lt;br /&gt;
Stack operations cleaned up. The &amp;lt;b&amp;gt;SOD II tool&amp;lt;/b&amp;gt; uploaded. (Feb. 22, 2013)&lt;br /&gt;
&lt;br /&gt;
String formatting improvements, functions simplified (SOD II) and small revisions in macros header made. (Feb. 23, 2013)&lt;br /&gt;
&lt;br /&gt;
Macros behavior modified in order to detect the file system to deal with FAT, FAT12, FAT16 and FAT32 volumes.  Also checking root path, possibly Win2K error. (March 8, 2013)&lt;br /&gt;
[[Category:Code Examples]]&lt;/div&gt;</summary>
		<author><name>Bnicer</name></author>
	</entry>
	<entry>
		<id>https://nsis.sourceforge.io/mediawiki/index.php?title=Get_size_on_disk&amp;diff=23091</id>
		<title>Get size on disk</title>
		<link rel="alternate" type="text/html" href="https://nsis.sourceforge.io/mediawiki/index.php?title=Get_size_on_disk&amp;diff=23091"/>
		<updated>2013-03-08T01:15:14Z</updated>

		<summary type="html">&lt;p&gt;Bnicer: Size On Disk (SOD) utility&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PageAuthor|Bnicer}}&lt;br /&gt;
This example code shows you how to get the space used by directories and files.&lt;br /&gt;
&amp;lt;highlight-nsis&amp;gt;&lt;br /&gt;
; A utility for computing the NSIS (or NSIS Unicode) install folder size and the size of&lt;br /&gt;
; the uninstaller&lt;br /&gt;
; nsissize.nsi&lt;br /&gt;
; Compile, then run the .exe&lt;br /&gt;
&lt;br /&gt;
Name &amp;quot;SOD Tool&amp;quot;&lt;br /&gt;
RequestExecutionLevel user&lt;br /&gt;
#RequestExecutionLevel admin ; More files may be found in system folders&lt;br /&gt;
!define LOCAL &amp;quot;&amp;quot; ; Path where local include files reside&lt;br /&gt;
OutFile &amp;quot;${LOCAL}nsissize.exe&amp;quot;&lt;br /&gt;
!include &amp;quot;${LOCAL}macros.nsh&amp;quot;&lt;br /&gt;
Icon &amp;quot;${LOCAL}arrows.ico&amp;quot;&lt;br /&gt;
ReserveFile &amp;quot;${NSISDIR}\Plugins\Math.dll&amp;quot; ; Doesn&#039;t seem to like &amp;quot;!include&amp;quot;&lt;br /&gt;
!include &amp;quot;LogicLib.nsh&amp;quot;&lt;br /&gt;
ShowInstDetails show&lt;br /&gt;
&lt;br /&gt;
;--------------------------------&lt;br /&gt;
&lt;br /&gt;
; Variables&lt;br /&gt;
Var NSIS&lt;br /&gt;
Var COMPRESSED&lt;br /&gt;
Var COMPRESSED_UN&lt;br /&gt;
Var BLOCK&lt;br /&gt;
Var FILES&lt;br /&gt;
Var FOLDERS&lt;br /&gt;
Var SIZE_B&lt;br /&gt;
Var SIZE_M&lt;br /&gt;
Var SOD_B&lt;br /&gt;
Var SOD_K&lt;br /&gt;
Var SOD_M&lt;br /&gt;
Var SIZE_UN_B&lt;br /&gt;
Var SIZE_UN_K&lt;br /&gt;
Var SOD_UN_B&lt;br /&gt;
Var SOD_UN_K&lt;br /&gt;
&lt;br /&gt;
;--------------------------------&lt;br /&gt;
&lt;br /&gt;
; Functions&lt;br /&gt;
Function Separator ; comma&lt;br /&gt;
  Exch $R1 ; input string&lt;br /&gt;
  Push $R2&lt;br /&gt;
  Push $R3&lt;br /&gt;
  Push $R4&lt;br /&gt;
  Push $R5&lt;br /&gt;
  StrCpy $R2 $R1&lt;br /&gt;
  StrCpy $R5 &amp;quot;16&amp;quot; ; 1,000,000,000,000,000 limit&lt;br /&gt;
  StrLen $R4 $R1&lt;br /&gt;
loop:&lt;br /&gt;
  IntCmp $R5 3 endloop endloop 0&lt;br /&gt;
  IntCmp $R4 $R5 0 +7 0&lt;br /&gt;
  IntOp $R5 $R5 - 1&lt;br /&gt;
  StrCpy $R2 $R2 -$R5&lt;br /&gt;
  StrCpy $R3 $R1 &amp;quot;&amp;quot; -$R5&lt;br /&gt;
  StrCpy $R2 &amp;quot;$R2,$R3&amp;quot;&lt;br /&gt;
  IntOp $R5 $R5 - 2&lt;br /&gt;
  Goto loop&lt;br /&gt;
  IntOp $R5 $R5 - 3&lt;br /&gt;
  Goto loop&lt;br /&gt;
endloop:&lt;br /&gt;
  Pop $R5&lt;br /&gt;
  Pop $R4&lt;br /&gt;
  Pop $R3&lt;br /&gt;
  Exch $R2&lt;br /&gt;
  Pop $R1&lt;br /&gt;
  Exch $R1 ; output string&lt;br /&gt;
FunctionEnd&lt;br /&gt;
&lt;br /&gt;
;--------------------------------&lt;br /&gt;
&lt;br /&gt;
; Main Section (nothing will be installed)&lt;br /&gt;
Section&lt;br /&gt;
; registry&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS Unicode&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS ANSI&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  Goto done&lt;br /&gt;
  begin:&lt;br /&gt;
  IfFileExists &amp;quot;$NSIS&amp;quot; 0 done&lt;br /&gt;
  ${GetClusterSize} $NSIS $BLOCK&lt;br /&gt;
; directory&lt;br /&gt;
  ${GetSizeOnDisk} &amp;quot;$NSIS&amp;quot; &amp;quot;/S=0B&amp;quot; &amp;quot;&amp;quot; $0 $1 $2 $3&lt;br /&gt;
  StrCpy $SIZE_B $0&lt;br /&gt;
  StrCpy $FILES $1&lt;br /&gt;
  StrCpy $FOLDERS $2&lt;br /&gt;
  Math::Script &amp;quot;r4 = ff($0 / 1024 / 1024.0, 16 +2)&amp;quot;&lt;br /&gt;
  StrCpy $SIZE_M $4&lt;br /&gt;
  ${GetSizeOnDisk} &amp;quot;$NSIS&amp;quot; &amp;quot;/S=0B&amp;quot; &amp;quot;$BLOCK&amp;quot; $0 $1 $2 $3&lt;br /&gt;
  StrCpy $SOD_B $0&lt;br /&gt;
  StrCpy $COMPRESSED $3&lt;br /&gt;
  Math::Script &amp;quot;r4 = ff($0 / 1024.0, 16 +0); r5 = ff(r4 / 1024.0, 16 +2)&amp;quot;&lt;br /&gt;
  StrCpy $SOD_K $4&lt;br /&gt;
  StrCpy $SOD_M $5&lt;br /&gt;
; uninstaller&lt;br /&gt;
  IfFileExists &amp;quot;$NSIS\uninst-nsis.exe&amp;quot; 0 done&lt;br /&gt;
  ${GetSizeOnDisk} &amp;quot;$NSIS&amp;quot; &amp;quot;/M=uninst-nsis.exe /S=0B /G=0&amp;quot; &amp;quot;&amp;quot; $0 $1 $2 $3&lt;br /&gt;
  StrCpy $SIZE_UN_B $0&lt;br /&gt;
  Math::Script &amp;quot;r4 = ff($0 / 1024.0, 16 +1)&amp;quot;&lt;br /&gt;
  StrCpy $SIZE_UN_K $4&lt;br /&gt;
  ${GetSizeOnDisk} &amp;quot;$NSIS&amp;quot; &amp;quot;/M=uninst-nsis.exe /S=0B /G=0&amp;quot; &amp;quot;$BLOCK&amp;quot; $0 $1 $2 $3&lt;br /&gt;
  StrCpy $SOD_UN_B $0&lt;br /&gt;
  ${If} $3 &amp;gt; 0&lt;br /&gt;
    StrCpy $COMPRESSED_UN &amp;quot; (compressed or sparse)&amp;quot;&lt;br /&gt;
  ${Else}&lt;br /&gt;
    StrCpy $COMPRESSED_UN &amp;quot;&amp;quot;&lt;br /&gt;
  ${EndIf}&lt;br /&gt;
  Math::Script &amp;quot;r4 = ff($0 / 1024.0, 16 +1)&amp;quot;&lt;br /&gt;
  StrCpy $SOD_UN_K $4&lt;br /&gt;
; format&lt;br /&gt;
  Push $SIZE_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  Pop $SIZE_B&lt;br /&gt;
&lt;br /&gt;
  Push $SOD_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  Pop $SOD_B&lt;br /&gt;
&lt;br /&gt;
  Push $SOD_K&lt;br /&gt;
  Call Separator&lt;br /&gt;
  Pop $SOD_K&lt;br /&gt;
&lt;br /&gt;
  Push $SIZE_UN_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  Pop $SIZE_UN_B&lt;br /&gt;
&lt;br /&gt;
  Push $SOD_UN_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  Pop $SOD_UN_B&lt;br /&gt;
; output&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;$NSIS&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;Size: $SIZE_M MB ($SIZE_B bytes)&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;SOD: $SOD_M MB ($SOD_B bytes)&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;Uninstaller$COMPRESSED_UN&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;Size: $SIZE_UN_K KB ($SIZE_UN_B bytes)&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;SOD: $SOD_UN_K KB ($SOD_UN_B bytes)&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;$FILES files | $FOLDERS folders | $SOD_K Kb | $COMPRESSED compressed/sparse file(s)&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  Goto completed&lt;br /&gt;
done:&lt;br /&gt;
  DetailPrint &amp;quot;File not found.&amp;quot;&lt;br /&gt;
completed:&lt;br /&gt;
SectionEnd&lt;br /&gt;
&lt;br /&gt;
;--------------------------------&lt;br /&gt;
# EOF&lt;br /&gt;
&amp;lt;/highlight-nsis&amp;gt;&lt;br /&gt;
You should copy the next code into a separate file: &amp;lt;b&amp;gt;macros.nsh&amp;lt;/b&amp;gt;.&lt;br /&gt;
&amp;lt;highlight-nsis&amp;gt;&lt;br /&gt;
; Macros include (TN)&lt;br /&gt;
;--------------------------------&lt;br /&gt;
/*&lt;br /&gt;
&lt;br /&gt;
 FileFunction=[GetSizeOnDisk|GetClusterSize]&lt;br /&gt;
&lt;br /&gt;
*/&lt;br /&gt;
;_____________________________________________________________________________&lt;br /&gt;
;&lt;br /&gt;
;                         Macros&lt;br /&gt;
;_____________________________________________________________________________&lt;br /&gt;
;&lt;br /&gt;
; Change log window verbosity (default: 3=no script)&lt;br /&gt;
;&lt;br /&gt;
; Example:&lt;br /&gt;
; !include &amp;quot;macros.nsh&amp;quot;&lt;br /&gt;
; !insertmacro GetSizeOnDisk&lt;br /&gt;
; ${FILEFUNC_VERBOSE} 4   # all verbosity&lt;br /&gt;
; !insertmacro GetClusterSize&lt;br /&gt;
; ${FILEFUNC_VERBOSE} 3   # no script&lt;br /&gt;
&lt;br /&gt;
!include Util.nsh ; for &amp;quot;CallArtificialFunction&amp;quot;&lt;br /&gt;
&lt;br /&gt;
!verbose push&lt;br /&gt;
!verbose 3&lt;br /&gt;
!ifndef _FILEFUNC_VERBOSE&lt;br /&gt;
	!define _FILEFUNC_VERBOSE 3&lt;br /&gt;
!endif&lt;br /&gt;
!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
!define FILEFUNC_VERBOSE `!insertmacro FILEFUNC_VERBOSE`&lt;br /&gt;
!verbose pop&lt;br /&gt;
&lt;br /&gt;
!macro FILEFUNC_VERBOSE _VERBOSE&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose 3&lt;br /&gt;
	!undef _FILEFUNC_VERBOSE&lt;br /&gt;
	!define _FILEFUNC_VERBOSE ${_VERBOSE}&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetSizeOnDiskCall _PATH _OPTIONS _FILESYSTEM _RESULT1 _RESULT2 _RESULT3 _RESULT4&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
	Push `${_PATH}`&lt;br /&gt;
	Push `${_OPTIONS}`&lt;br /&gt;
	Push `${_FILESYSTEM}` ; volume block size&lt;br /&gt;
	${CallArtificialFunction} GetSizeOnDisk_&lt;br /&gt;
	Pop ${_RESULT1}&lt;br /&gt;
	Pop ${_RESULT2}&lt;br /&gt;
	Pop ${_RESULT3}&lt;br /&gt;
	Pop ${_RESULT4}&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetClusterSizeCall _PATH _RESULT&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
	Push `${_PATH}` &lt;br /&gt;
	${CallArtificialFunction} GetClusterSize_&lt;br /&gt;
	Pop ${_RESULT}&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
; ---------------&lt;br /&gt;
; GetSizeOnDisk (modified &amp;quot;GetSize&amp;quot; - FileFunc.nsh - KiCHiK - Function &amp;quot;FindFiles&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
!define GetSizeOnDisk `!insertmacro GetSizeOnDiskCall`&lt;br /&gt;
!define un.GetSizeOnDisk `!insertmacro GetSizeOnDiskCall`&lt;br /&gt;
&lt;br /&gt;
!macro GetSizeOnDisk&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro un.GetSizeOnDisk&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
; Usage: similar to &amp;quot;GetSize&amp;quot;&lt;br /&gt;
&lt;br /&gt;
; For documentation, see the NSIS user manual: E.1.3 GetSize&lt;br /&gt;
; Four (not three) values are returned&lt;br /&gt;
&lt;br /&gt;
; $var1		; Result1: Size/Size on disk&lt;br /&gt;
; $var2		; Result2: Sum of files&lt;br /&gt;
; $var3		; Result3: Sum of directories&lt;br /&gt;
; $var4		; Result4: Sum of compressed/sparse files&lt;br /&gt;
&lt;br /&gt;
; Example: ${GetSizeOnDisk} &amp;quot;$INSTDIR&amp;quot; &amp;quot;/S=0K&amp;quot; &amp;quot;SOD&amp;quot; $0 $1 $2 $3&lt;br /&gt;
; DetailPrint &amp;quot;$1 file(s) | $2 folder(s) | $0 Kb | $3 compressed or sparse file(s)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
; Specifying &#039;SOD&#039; (e.g. Size On Disk) toggles the $var1 result&lt;br /&gt;
; Output is logical size, if used, or physical size, if left empty &amp;quot;&amp;quot;&lt;br /&gt;
; The target volume&#039;s allocation unit size in bytes, the size of a&lt;br /&gt;
; cluster, for example &#039;4096&#039; bytes, if valid, can also be the input&lt;br /&gt;
; If neither &#039;SOD&#039; nor a cluster size is specified, $var4 returns 0&lt;br /&gt;
; even where compressed and/or sparse files exist&lt;br /&gt;
&lt;br /&gt;
; ${GetSizeOnDisk} can be used with Windows NT and Windows 2000&lt;br /&gt;
; When the volume is FAT32, FAT16 or an older file system, the result&lt;br /&gt;
; in $var1 reverts to physical size, although not incorrect&lt;br /&gt;
&lt;br /&gt;
!macro GetSizeOnDisk_&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
&lt;br /&gt;
	Exch $2&lt;br /&gt;
	Exch 2&lt;br /&gt;
	Exch $0&lt;br /&gt;
	Exch&lt;br /&gt;
	Exch $1&lt;br /&gt;
	Push $3&lt;br /&gt;
	Push $4&lt;br /&gt;
	Push $5&lt;br /&gt;
	Push $6&lt;br /&gt;
	Push $7&lt;br /&gt;
	Push $8&lt;br /&gt;
	Push $9&lt;br /&gt;
	Push $R0&lt;br /&gt;
	Push $R1&lt;br /&gt;
	Push $R2&lt;br /&gt;
	StrCpy $R1 $2&lt;br /&gt;
	Push $R3&lt;br /&gt;
	Push $R4&lt;br /&gt;
	Push $R5&lt;br /&gt;
	Push $R6&lt;br /&gt;
	Push $R7&lt;br /&gt;
	Push $R8&lt;br /&gt;
	Push $R9&lt;br /&gt;
	ClearErrors&lt;br /&gt;
&lt;br /&gt;
	StrCmp $R1 &#039;&#039; FileFunc_GetSize_path&lt;br /&gt;
&lt;br /&gt;
	StrCpy $5 $0&lt;br /&gt;
	StrCpy $2 $0 2&lt;br /&gt;
	StrCmp $2 &#039;\\&#039; FileFunc_GetSize_Root_UNC&lt;br /&gt;
	StrCpy $3 $2 1 1&lt;br /&gt;
	StrCmp $3 &#039;:&#039; 0 FileFunc_GetSize_Root_empty&lt;br /&gt;
	StrCpy $5 $2&lt;br /&gt;
	goto FileFunc_GetSize_FileSystem&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_Root_UNC:&lt;br /&gt;
	StrCpy $3 1&lt;br /&gt;
	StrCpy $4 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_Root_loop:&lt;br /&gt;
	IntOp $3 $3 + 1&lt;br /&gt;
	StrCpy $2 $5 1 $3&lt;br /&gt;
	StrCmp $2$4 &#039;&#039; FileFunc_GetSize_Root_empty&lt;br /&gt;
	StrCmp $2 &#039;&#039; +5&lt;br /&gt;
	StrCmp $2 &#039;\&#039; 0 FileFunc_GetSize_Root_loop&lt;br /&gt;
	StrCmp $4 &#039;1&#039; +3&lt;br /&gt;
	StrCpy $4 &#039;1&#039;&lt;br /&gt;
	goto FileFunc_GetSize_Root_loop&lt;br /&gt;
	StrCpy $5 $5 $3&lt;br /&gt;
	StrCpy $3 $5 1 -1&lt;br /&gt;
	StrCmp $3 &#039;\&#039; 0 FileFunc_GetSize_FileSystem&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_Root_empty:&lt;br /&gt;
	StrCpy $5 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_FileSystem:&lt;br /&gt;
	System::Call &#039;Kernel32::GetVolumeInformation\&lt;br /&gt;
	(t &amp;quot;$5\&amp;quot;,t,i ${NSIS_MAX_STRLEN},*i,*i,*i,t.r2,i ${NSIS_MAX_STRLEN})i.r3&#039;&lt;br /&gt;
	StrCmp $3 0 FileFunc_GetSize_FileSystem_error&lt;br /&gt;
	StrCpy $2 $2 3&lt;br /&gt;
	StrCmp $2 &#039;FAT&#039; FileFunc_GetSize_FileSystem_error&lt;br /&gt;
	StrCmp $R1 &#039;SOD&#039; 0 FileFunc_GetSize_path&lt;br /&gt;
	System::Call &#039;kernel32::GetDiskFreeSpace(t &amp;quot;$5\&amp;quot;,*i0r2,*i0r3,,)&#039;&lt;br /&gt;
	IntOp $R1 $2 * $3&lt;br /&gt;
	goto FileFunc_GetSize_path&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_FileSystem_error:&lt;br /&gt;
	StrCpy $R1 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_path:&lt;br /&gt;
	StrCpy $R9 $0 1 -1&lt;br /&gt;
	StrCmp $R9 &#039;\&#039; 0 +3&lt;br /&gt;
	StrCpy $0 $0 -1&lt;br /&gt;
	goto -3&lt;br /&gt;
	IfFileExists &#039;$0\*.*&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
&lt;br /&gt;
	StrCpy $3 0&lt;br /&gt;
	StrCpy $4 &#039;&#039;&lt;br /&gt;
	StrCpy $5 &#039;&#039;&lt;br /&gt;
	StrCpy $6 &#039;&#039;&lt;br /&gt;
	StrCpy $8 0&lt;br /&gt;
	StrCpy $R3 &#039;&#039;&lt;br /&gt;
	StrCpy $R4 &#039;&#039;&lt;br /&gt;
	StrCpy $R5 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_option:&lt;br /&gt;
	StrCpy $R9 $1 1&lt;br /&gt;
	StrCpy $1 $1 &#039;&#039; 1&lt;br /&gt;
	StrCmp $R9 &#039; &#039; -2&lt;br /&gt;
	StrCmp $R9 &#039;&#039; FileFunc_GetSize_sizeset&lt;br /&gt;
	StrCmp $R9 &#039;/&#039; 0 -4&lt;br /&gt;
&lt;br /&gt;
	StrCpy $9 -1&lt;br /&gt;
	IntOp $9 $9 + 1&lt;br /&gt;
	StrCpy $R9 $1 1 $9&lt;br /&gt;
	StrCmp $R9 &#039;&#039; +2&lt;br /&gt;
	StrCmp $R9 &#039;/&#039; 0 -3&lt;br /&gt;
	StrCpy $8 $1 $9&lt;br /&gt;
	StrCpy $8 $8 &#039;&#039; 2&lt;br /&gt;
	StrCpy $R9 $8 &#039;&#039; -1&lt;br /&gt;
	StrCmp $R9 &#039; &#039; 0 +3&lt;br /&gt;
	StrCpy $8 $8 -1&lt;br /&gt;
	goto -3&lt;br /&gt;
	StrCpy $R9 $1 2&lt;br /&gt;
	StrCpy $1 $1 &#039;&#039; $9&lt;br /&gt;
&lt;br /&gt;
	StrCmp $R9 &#039;M=&#039; 0 FileFunc_GetSize_size&lt;br /&gt;
	StrCpy $4 $8&lt;br /&gt;
	goto FileFunc_GetSize_option&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_size:&lt;br /&gt;
	StrCmp $R9 &#039;S=&#039; 0 FileFunc_GetSize_gotosubdir&lt;br /&gt;
	StrCpy $6 $8&lt;br /&gt;
	goto FileFunc_GetSize_option&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_gotosubdir:&lt;br /&gt;
	StrCmp $R9 &#039;G=&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
	StrCpy $7 $8&lt;br /&gt;
	StrCmp $7 &#039;&#039; +3&lt;br /&gt;
	StrCmp $7 &#039;1&#039; +2&lt;br /&gt;
	StrCmp $7 &#039;0&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
	goto FileFunc_GetSize_option&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_sizeset:&lt;br /&gt;
	StrCmp $6 &#039;&#039; FileFunc_GetSize_default&lt;br /&gt;
	StrCpy $9 0&lt;br /&gt;
	StrCpy $R9 $6 1 $9&lt;br /&gt;
	StrCmp $R9 &#039;&#039; +4&lt;br /&gt;
	StrCmp $R9 &#039;:&#039; +3&lt;br /&gt;
	IntOp $9 $9 + 1&lt;br /&gt;
	goto -4&lt;br /&gt;
	StrCpy $5 $6 $9&lt;br /&gt;
	IntOp $9 $9 + 1&lt;br /&gt;
	StrCpy $1 $6 1 -1&lt;br /&gt;
	StrCpy $6 $6 -1 $9&lt;br /&gt;
	StrCmp $5 &#039;&#039; +2&lt;br /&gt;
	IntOp $5 $5 + 0&lt;br /&gt;
	StrCmp $6 &#039;&#039; +2&lt;br /&gt;
	IntOp $6 $6 + 0&lt;br /&gt;
&lt;br /&gt;
	StrCmp $1 &#039;B&#039; 0 +4&lt;br /&gt;
	StrCpy $1 1&lt;br /&gt;
	StrCpy $2 bytes&lt;br /&gt;
	goto FileFunc_GetSize_default&lt;br /&gt;
	StrCmp $1 &#039;K&#039; 0 +4&lt;br /&gt;
	StrCpy $1 1024&lt;br /&gt;
	StrCpy $2 Kb&lt;br /&gt;
	goto FileFunc_GetSize_default&lt;br /&gt;
	StrCmp $1 &#039;M&#039; 0 +4&lt;br /&gt;
	StrCpy $1 1048576&lt;br /&gt;
	StrCpy $2 Mb&lt;br /&gt;
	goto FileFunc_GetSize_default&lt;br /&gt;
	StrCmp $1 &#039;G&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
	StrCpy $1 1073741824&lt;br /&gt;
	StrCpy $2 Gb&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_default:&lt;br /&gt;
	StrCmp $4 &#039;&#039; 0 +2&lt;br /&gt;
	StrCpy $4 &#039;*.*&#039;&lt;br /&gt;
	StrCmp $7 &#039;&#039; 0 +2&lt;br /&gt;
	StrCpy $7 &#039;1&#039;&lt;br /&gt;
&lt;br /&gt;
	StrCpy $8 1&lt;br /&gt;
	Push $0&lt;br /&gt;
	SetDetailsPrint textonly&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_nextdir:&lt;br /&gt;
	IntOp $8 $8 - 1&lt;br /&gt;
	Pop $R8&lt;br /&gt;
	FindFirst $0 $R7 &#039;$R8\$4&#039;&lt;br /&gt;
	IfErrors FileFunc_GetSize_show&lt;br /&gt;
	StrCmp $R7 &#039;.&#039; 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	StrCmp $R7 &#039;..&#039; 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
	goto FileFunc_GetSize_show&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_dir:&lt;br /&gt;
	IfFileExists &#039;$R8\$R7\*.*&#039; 0 FileFunc_GetSize_file&lt;br /&gt;
	IntOp $R5 $R5 + 1&lt;br /&gt;
	goto FileFunc_GetSize_findnext&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_file:&lt;br /&gt;
	StrCpy $R6 0&lt;br /&gt;
	StrCmp $5$6 &#039;&#039; 0 +3&lt;br /&gt;
	IntOp $R4 $R4 + 1&lt;br /&gt;
	goto FileFunc_GetSize_findnext&lt;br /&gt;
	StrCmp $R1 &#039;&#039; FileFunc_GetSize_fileopen&lt;br /&gt;
	StrCpy $R0 0&lt;br /&gt;
	System::Call &#039;kernel32::GetFileAttributes(t &amp;quot;$R8\$R7&amp;quot;)i .R2&#039;&lt;br /&gt;
	StrCmp $R2 -1 FileFunc_GetSize_fileopen&lt;br /&gt;
	IntOp $R0 $R2 &amp;amp; 0x0800 ; compressed&lt;br /&gt;
	IntCmp $R0 0 0 0 FileFunc_GetSize_GetCompressed&lt;br /&gt;
	IntOp $R0 $R2 &amp;amp; 0x0200 ; sparse file&lt;br /&gt;
	IntCmp $R0 0 FileFunc_GetSize_fileopen&lt;br /&gt;
	FileFunc_GetSize_GetCompressed:&lt;br /&gt;
	System::Call &#039;kernel32::GetCompressedFileSize(t &amp;quot;$R8\$R7&amp;quot;, i)i .R6&#039;&lt;br /&gt;
	IntCmp $R6 4096 +2 0 +2&lt;br /&gt;
	StrCpy $R6 4096&lt;br /&gt;
	IntOp $3 $3 + 1 ; location contains compressed or sparse files&lt;br /&gt;
	goto FileFunc_GetSize_fileclose&lt;br /&gt;
	FileFunc_GetSize_fileopen:&lt;br /&gt;
	FileOpen $9 &#039;$R8\$R7&#039; r&lt;br /&gt;
	IfErrors +3&lt;br /&gt;
	FileSeek $9 0 END $R6&lt;br /&gt;
	FileClose $9&lt;br /&gt;
	FileFunc_GetSize_fileclose:&lt;br /&gt;
	StrCmp $5 &#039;&#039; +2&lt;br /&gt;
	IntCmp $R6 $5 0 FileFunc_GetSize_findnext&lt;br /&gt;
	StrCmp $6 &#039;&#039; +2&lt;br /&gt;
	IntCmp $R6 $6 0 0 FileFunc_GetSize_findnext&lt;br /&gt;
	IntOp $R4 $R4 + 1&lt;br /&gt;
	StrCmp $R1 &#039;&#039; FileFunc_GetSize_file_add&lt;br /&gt;
	StrCmp $R0 0 0 FileFunc_GetSize_file_add&lt;br /&gt;
	StrCpy $R0 $R1&lt;br /&gt;
	IntOp $R6 $R6 + $R0&lt;br /&gt;
	IntOp $R1 $R6 % $R0&lt;br /&gt;
	StrCmp $R1 0 0 +2&lt;br /&gt;
	StrCpy $R1 $R0&lt;br /&gt;
	IntOp $R2 $R0 - $R1&lt;br /&gt;
	IntOp $R6 $R6 - $R0&lt;br /&gt;
	IntOp $R6 $R6 + $R2&lt;br /&gt;
	StrCpy $R1 $R0&lt;br /&gt;
	FileFunc_GetSize_file_add:&lt;br /&gt;
	System::Int64Op $R3 + $R6&lt;br /&gt;
	Pop $R3&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_findnext:&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_show:&lt;br /&gt;
	StrCmp $5$6 &#039;&#039; FileFunc_GetSize_nosize&lt;br /&gt;
	System::Int64Op $R3 / $1&lt;br /&gt;
	Pop $9&lt;br /&gt;
	DetailPrint &#039;Size:$9 $2  Files:$R4  Folders:$R5&#039;&lt;br /&gt;
	goto FileFunc_GetSize_subdir&lt;br /&gt;
	FileFunc_GetSize_nosize:&lt;br /&gt;
	DetailPrint &#039;Files:$R4  Folders:$R5&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_subdir:&lt;br /&gt;
	StrCmp $7 0 FileFunc_GetSize_preend&lt;br /&gt;
	FindFirst $0 $R7 &#039;$R8\*.*&#039;&lt;br /&gt;
	StrCmp $R7 &#039;.&#039; 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	StrCmp $R7 &#039;..&#039; 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
	StrCmp $8 0 FileFunc_GetSize_preend FileFunc_GetSize_nextdir&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_pushdir:&lt;br /&gt;
	IfFileExists &#039;$R8\$R7\*.*&#039; 0 +3&lt;br /&gt;
	Push &#039;$R8\$R7&#039;&lt;br /&gt;
	IntOp $8 $8 + 1&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
	StrCmp $8 0 FileFunc_GetSize_preend FileFunc_GetSize_nextdir&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_preend:&lt;br /&gt;
	StrCmp $R3 &#039;&#039; FileFunc_GetSize_nosizeend&lt;br /&gt;
	System::Int64Op $R3 / $1&lt;br /&gt;
	Pop $R3&lt;br /&gt;
	FileFunc_GetSize_nosizeend:&lt;br /&gt;
	StrCpy $2 $R4&lt;br /&gt;
	StrCpy $1 $R5&lt;br /&gt;
	StrCpy $0 $R3&lt;br /&gt;
	goto FileFunc_GetSize_noerror&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_error:&lt;br /&gt;
	SetErrors&lt;br /&gt;
	StrCpy $0 &#039;&#039;&lt;br /&gt;
	StrCpy $1 &#039;&#039;&lt;br /&gt;
	StrCpy $2 &#039;&#039;&lt;br /&gt;
	StrCpy $3 &#039;&#039;&lt;br /&gt;
	goto FileFunc_GetSize_end&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_noerror:&lt;br /&gt;
	StrCmp $0 &#039;&#039; 0 +2&lt;br /&gt;
	StrCpy $0 0&lt;br /&gt;
	StrCmp $1 &#039;&#039; 0 +2&lt;br /&gt;
	StrCpy $1 0&lt;br /&gt;
	StrCmp $2 &#039;&#039; 0 +2&lt;br /&gt;
	StrCpy $2 0&lt;br /&gt;
	StrCmp $3 &#039;&#039; 0 +2&lt;br /&gt;
	StrCpy $3 0&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_end:&lt;br /&gt;
	SetDetailsPrint both&lt;br /&gt;
	Pop $R9&lt;br /&gt;
	Pop $R8&lt;br /&gt;
	Pop $R7&lt;br /&gt;
	Pop $R6&lt;br /&gt;
	Pop $R5&lt;br /&gt;
	Pop $R4&lt;br /&gt;
	Pop $R3&lt;br /&gt;
	Pop $R2&lt;br /&gt;
	Pop $R1&lt;br /&gt;
	Pop $R0&lt;br /&gt;
	Pop $9&lt;br /&gt;
	Pop $8&lt;br /&gt;
	Pop $7&lt;br /&gt;
	Pop $6&lt;br /&gt;
	Pop $5&lt;br /&gt;
	Pop $4&lt;br /&gt;
	Exch $3&lt;br /&gt;
	Exch 3&lt;br /&gt;
	Exch $2&lt;br /&gt;
	Exch&lt;br /&gt;
	Exch $1&lt;br /&gt;
	Exch 2&lt;br /&gt;
	Exch $0&lt;br /&gt;
&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
; ---------------&lt;br /&gt;
; GetClusterSize&lt;br /&gt;
&lt;br /&gt;
; Allocation unit size on NTFS, exFAT and reFS formatted volumes&lt;br /&gt;
; Syntax: ${GetClusterSize} $inputpath $outputvariable&lt;br /&gt;
; Result: 512, 1024, ..., 4096, ..., 131072, ...&lt;br /&gt;
&lt;br /&gt;
!define GetClusterSize `!insertmacro GetClusterSizeCall`&lt;br /&gt;
!define un.GetClusterSize `!insertmacro GetClusterSizeCall`&lt;br /&gt;
&lt;br /&gt;
!macro GetClusterSize&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro un.GetClusterSize&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetClusterSize_&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
&lt;br /&gt;
	Exch $0&lt;br /&gt;
	Push $1&lt;br /&gt;
	Push $2&lt;br /&gt;
	Push $3&lt;br /&gt;
&lt;br /&gt;
	StrCpy $1 $0 2&lt;br /&gt;
	StrCmp $1 &#039;\\&#039; Root_UNC&lt;br /&gt;
	StrCpy $2 $1 1 1&lt;br /&gt;
	StrCmp $2 &#039;:&#039; 0 Root_empty&lt;br /&gt;
	StrCpy $0 $1&lt;br /&gt;
	goto Root_end&lt;br /&gt;
&lt;br /&gt;
	Root_UNC:&lt;br /&gt;
	StrCpy $2 1&lt;br /&gt;
	StrCpy $3 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	Root_loop:&lt;br /&gt;
	IntOp $2 $2 + 1&lt;br /&gt;
	StrCpy $1 $0 1 $2&lt;br /&gt;
	StrCmp $1$3 &#039;&#039; Root_empty&lt;br /&gt;
	StrCmp $1 &#039;&#039; +5&lt;br /&gt;
	StrCmp $1 &#039;\&#039; 0 Root_loop&lt;br /&gt;
	StrCmp $3 &#039;1&#039; +3&lt;br /&gt;
	StrCpy $3 &#039;1&#039;&lt;br /&gt;
	goto Root_loop&lt;br /&gt;
	StrCpy $0 $0 $2&lt;br /&gt;
	StrCpy $2 $0 1 -1&lt;br /&gt;
	StrCmp $2 &#039;\&#039; 0 Root_end&lt;br /&gt;
&lt;br /&gt;
	Root_empty:&lt;br /&gt;
	StrCpy $0 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	Root_end:&lt;br /&gt;
	System::Call &#039;kernel32::GetDiskFreeSpace(t &amp;quot;$0\&amp;quot;,*i0r1,*i0r2,,)&#039;&lt;br /&gt;
	IntOp $0 $1 * $2&lt;br /&gt;
	Pop $3&lt;br /&gt;
	Pop $2&lt;br /&gt;
	Pop $1&lt;br /&gt;
	Exch $0&lt;br /&gt;
&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/highlight-nsis&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-size: 110%&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Credits:&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;em&amp;gt;GetSizeOnDisk&amp;lt;/em&amp;gt; has been altered slightly and renamed. The original macro is called &amp;lt;em&amp;gt;GetSize&amp;lt;/em&amp;gt;. You will find it in the Users Manual under E.1.3.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-size: 110%&amp;quot;&amp;gt;&amp;lt;b&amp;gt;=== Download (example) ===&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is the same as the example code above.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;attach&amp;gt;SODTool.zip&amp;lt;/attach&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-size: 110%&amp;quot;&amp;gt;&amp;lt;b&amp;gt;=== Download (utility) ===&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is a Modern UI2 version that displays selection windows and goes to an output page. Script file is included.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;attach&amp;gt;SOD II tool.zip&amp;lt;/attach&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Both downloads are compiled in unicode, so SOD Tool can read Russian file names.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-size: 110%&amp;quot;&amp;gt;&amp;lt;b&amp;gt;History:&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional parameter for counting compressed/sparse files added. (Feb. 18, 2013)&lt;br /&gt;
&lt;br /&gt;
Option to find without subdirectories &#039;/G=0&#039; switch was missing. (Well, not really missing.) Change to details view (string), showing &#039;compressed/sparse file(s)&#039;. (Feb. 19, 2013)&lt;br /&gt;
&lt;br /&gt;
Change to unicode, because ansi could not read Russian. (Feb. 20, 2013)&lt;br /&gt;
&lt;br /&gt;
Stack operations cleaned up. The &amp;lt;b&amp;gt;SOD II tool&amp;lt;/b&amp;gt; uploaded. (Feb. 22, 2013)&lt;br /&gt;
&lt;br /&gt;
String formatting improvements, functions simplified (SOD II) and small revisions in macros header made. (Feb. 23, 2013)&lt;br /&gt;
&lt;br /&gt;
Macros behavior modified in order to detect the file system to deal with FAT, FAT12, FAT16 and FAT32 volumes.  Also checking root path, possibly Win2K error. (March 8, 1213)&lt;br /&gt;
[[Category:Code Examples]]&lt;/div&gt;</summary>
		<author><name>Bnicer</name></author>
	</entry>
	<entry>
		<id>https://nsis.sourceforge.io/mediawiki/index.php?title=File:SOD_II_tool.zip&amp;diff=23090</id>
		<title>File:SOD II tool.zip</title>
		<link rel="alternate" type="text/html" href="https://nsis.sourceforge.io/mediawiki/index.php?title=File:SOD_II_tool.zip&amp;diff=23090"/>
		<updated>2013-03-08T00:52:50Z</updated>

		<summary type="html">&lt;p&gt;Bnicer: uploaded a new version of &amp;amp;quot;File:SOD II tool.zip&amp;amp;quot;: Macro behavior: Detecting file system to deal with FAT, FAT12, FAT16 and FAT32 volumes separately, and getting root path. Updated March 8, 2013.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Size On Disk (SOD) utility, mark II. Supplemental file for the &#039;Size on disk&#039; NSIS wiki code example. Source files are included for compiling the utility. The purpose is to exemplify the use of ${GetSizeOnDisk}, an included macro that returns logical size (size on disk) of folders and files. The tool has an MUI 2 input page and an output page.&lt;/div&gt;</summary>
		<author><name>Bnicer</name></author>
	</entry>
	<entry>
		<id>https://nsis.sourceforge.io/mediawiki/index.php?title=File:SODTool.zip&amp;diff=23089</id>
		<title>File:SODTool.zip</title>
		<link rel="alternate" type="text/html" href="https://nsis.sourceforge.io/mediawiki/index.php?title=File:SODTool.zip&amp;diff=23089"/>
		<updated>2013-03-08T00:51:26Z</updated>

		<summary type="html">&lt;p&gt;Bnicer: uploaded a new version of &amp;amp;quot;File:SODTool.zip&amp;amp;quot;: Macro behavior: Detecting file system to deal with FAT, FAT12, FAT16 and FAT32 volumes separately, and getting root path. Updated March 8, 2013.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;File attachment for Get size on disk code example. Includes icon, macros header file, nsissize executable, nsissize script. Created Feb. 15, 2013.&lt;/div&gt;</summary>
		<author><name>Bnicer</name></author>
	</entry>
	<entry>
		<id>https://nsis.sourceforge.io/mediawiki/index.php?title=Get_size_on_disk&amp;diff=23003</id>
		<title>Get size on disk</title>
		<link rel="alternate" type="text/html" href="https://nsis.sourceforge.io/mediawiki/index.php?title=Get_size_on_disk&amp;diff=23003"/>
		<updated>2013-02-23T23:44:29Z</updated>

		<summary type="html">&lt;p&gt;Bnicer: Size On Disk (SOD) utility&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PageAuthor|Bnicer}}&lt;br /&gt;
This example code shows you how to get the space used by directories and files.&lt;br /&gt;
&amp;lt;highlight-nsis&amp;gt;&lt;br /&gt;
; A utility for computing the NSIS (or NSIS Unicode) install folder size and the size of&lt;br /&gt;
; the uninstaller&lt;br /&gt;
; nsissize.nsi&lt;br /&gt;
; Compile, then run the .exe&lt;br /&gt;
&lt;br /&gt;
Name &amp;quot;SOD Tool&amp;quot;&lt;br /&gt;
RequestExecutionLevel user&lt;br /&gt;
#RequestExecutionLevel admin ; More files may be found in system folders&lt;br /&gt;
!define LOCAL &amp;quot;&amp;quot; ; Path where local include files reside&lt;br /&gt;
OutFile &amp;quot;${LOCAL}nsissize.exe&amp;quot;&lt;br /&gt;
!include &amp;quot;${LOCAL}macros.nsh&amp;quot;&lt;br /&gt;
Icon &amp;quot;${LOCAL}arrows.ico&amp;quot;&lt;br /&gt;
ReserveFile &amp;quot;${NSISDIR}\Plugins\Math.dll&amp;quot; ; Doesn&#039;t seem to like &amp;quot;!include&amp;quot;&lt;br /&gt;
!include &amp;quot;LogicLib.nsh&amp;quot;&lt;br /&gt;
ShowInstDetails show&lt;br /&gt;
&lt;br /&gt;
;--------------------------------&lt;br /&gt;
&lt;br /&gt;
; Variables&lt;br /&gt;
Var NSIS&lt;br /&gt;
Var COMPRESSED&lt;br /&gt;
Var COMPRESSED_UN&lt;br /&gt;
Var BLOCK&lt;br /&gt;
Var FILES&lt;br /&gt;
Var FOLDERS&lt;br /&gt;
Var SIZE_B&lt;br /&gt;
Var SIZE_M&lt;br /&gt;
Var SOD_B&lt;br /&gt;
Var SOD_K&lt;br /&gt;
Var SOD_M&lt;br /&gt;
Var SIZE_UN_B&lt;br /&gt;
Var SIZE_UN_K&lt;br /&gt;
Var SOD_UN_B&lt;br /&gt;
Var SOD_UN_K&lt;br /&gt;
&lt;br /&gt;
;--------------------------------&lt;br /&gt;
&lt;br /&gt;
; Functions&lt;br /&gt;
Function Separator ; comma&lt;br /&gt;
  Exch $R1 ; input string&lt;br /&gt;
  Push $R2&lt;br /&gt;
  Push $R3&lt;br /&gt;
  Push $R4&lt;br /&gt;
  Push $R5&lt;br /&gt;
  StrCpy $R2 $R1&lt;br /&gt;
  StrCpy $R5 &amp;quot;16&amp;quot; ; 1,000,000,000,000,000 limit&lt;br /&gt;
  StrLen $R4 $R1&lt;br /&gt;
loop:&lt;br /&gt;
  IntCmp $R5 3 endloop endloop 0&lt;br /&gt;
  IntCmp $R4 $R5 0 +7 0&lt;br /&gt;
  IntOp $R5 $R5 - 1&lt;br /&gt;
  StrCpy $R2 $R2 -$R5&lt;br /&gt;
  StrCpy $R3 $R1 &amp;quot;&amp;quot; -$R5&lt;br /&gt;
  StrCpy $R2 &amp;quot;$R2,$R3&amp;quot;&lt;br /&gt;
  IntOp $R5 $R5 - 2&lt;br /&gt;
  Goto loop&lt;br /&gt;
  IntOp $R5 $R5 - 3&lt;br /&gt;
  Goto loop&lt;br /&gt;
endloop:&lt;br /&gt;
  Pop $R5&lt;br /&gt;
  Pop $R4&lt;br /&gt;
  Pop $R3&lt;br /&gt;
  Exch $R2&lt;br /&gt;
  Pop $R1&lt;br /&gt;
  Exch $R1 ; output string&lt;br /&gt;
FunctionEnd&lt;br /&gt;
&lt;br /&gt;
;--------------------------------&lt;br /&gt;
&lt;br /&gt;
; Main Section (nothing will be installed)&lt;br /&gt;
Section&lt;br /&gt;
; registry&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS Unicode&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS ANSI&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  Goto done&lt;br /&gt;
  begin:&lt;br /&gt;
  IfFileExists &amp;quot;$NSIS&amp;quot; 0 done&lt;br /&gt;
  ${GetClusterSize} $NSIS $BLOCK&lt;br /&gt;
; directory&lt;br /&gt;
  ${GetSizeOnDisk} &amp;quot;$NSIS&amp;quot; &amp;quot;/S=0B&amp;quot; &amp;quot;&amp;quot; $0 $1 $2 $3&lt;br /&gt;
  StrCpy $SIZE_B $0&lt;br /&gt;
  StrCpy $FILES $1&lt;br /&gt;
  StrCpy $FOLDERS $2&lt;br /&gt;
  Math::Script &amp;quot;r4 = ff($0 / 1024 / 1024.0, 16 +2)&amp;quot;&lt;br /&gt;
  StrCpy $SIZE_M $4&lt;br /&gt;
  ${GetSizeOnDisk} &amp;quot;$NSIS&amp;quot; &amp;quot;/S=0B&amp;quot; &amp;quot;$BLOCK&amp;quot; $0 $1 $2 $3&lt;br /&gt;
  StrCpy $SOD_B $0&lt;br /&gt;
  StrCpy $COMPRESSED $3&lt;br /&gt;
  Math::Script &amp;quot;r4 = ff($0 / 1024.0, 16 +0); r5 = ff(r4 / 1024.0, 16 +2)&amp;quot;&lt;br /&gt;
  StrCpy $SOD_K $4&lt;br /&gt;
  StrCpy $SOD_M $5&lt;br /&gt;
; uninstaller&lt;br /&gt;
  IfFileExists &amp;quot;$NSIS\uninst-nsis.exe&amp;quot; 0 done&lt;br /&gt;
  ${GetSizeOnDisk} &amp;quot;$NSIS&amp;quot; &amp;quot;/M=uninst-nsis.exe /S=0B /G=0&amp;quot; &amp;quot;&amp;quot; $0 $1 $2 $3&lt;br /&gt;
  StrCpy $SIZE_UN_B $0&lt;br /&gt;
  Math::Script &amp;quot;r4 = ff($0 / 1024.0, 16 +1)&amp;quot;&lt;br /&gt;
  StrCpy $SIZE_UN_K $4&lt;br /&gt;
  ${GetSizeOnDisk} &amp;quot;$NSIS&amp;quot; &amp;quot;/M=uninst-nsis.exe /S=0B /G=0&amp;quot; &amp;quot;$BLOCK&amp;quot; $0 $1 $2 $3&lt;br /&gt;
  StrCpy $SOD_UN_B $0&lt;br /&gt;
  ${If} $3 &amp;gt; 0&lt;br /&gt;
    StrCpy $COMPRESSED_UN &amp;quot; (compressed or sparse)&amp;quot;&lt;br /&gt;
  ${Else}&lt;br /&gt;
    StrCpy $COMPRESSED_UN &amp;quot;&amp;quot;&lt;br /&gt;
  ${EndIf}&lt;br /&gt;
  Math::Script &amp;quot;r4 = ff($0 / 1024.0, 16 +1)&amp;quot;&lt;br /&gt;
  StrCpy $SOD_UN_K $4&lt;br /&gt;
; format&lt;br /&gt;
  Push $SIZE_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  Pop $SIZE_B&lt;br /&gt;
&lt;br /&gt;
  Push $SOD_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  Pop $SOD_B&lt;br /&gt;
&lt;br /&gt;
  Push $SOD_K&lt;br /&gt;
  Call Separator&lt;br /&gt;
  Pop $SOD_K&lt;br /&gt;
&lt;br /&gt;
  Push $SIZE_UN_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  Pop $SIZE_UN_B&lt;br /&gt;
&lt;br /&gt;
  Push $SOD_UN_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  Pop $SOD_UN_B&lt;br /&gt;
; output&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;$NSIS&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;Size: $SIZE_M MB ($SIZE_B bytes)&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;SOD: $SOD_M MB ($SOD_B bytes)&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;Uninstaller$COMPRESSED_UN&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;Size: $SIZE_UN_K KB ($SIZE_UN_B bytes)&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;SOD: $SOD_UN_K KB ($SOD_UN_B bytes)&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;$FILES files | $FOLDERS folders | $SOD_K Kb | $COMPRESSED compressed/sparse file(s)&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  Goto completed&lt;br /&gt;
done:&lt;br /&gt;
  DetailPrint &amp;quot;File not found.&amp;quot;&lt;br /&gt;
completed:&lt;br /&gt;
SectionEnd&lt;br /&gt;
&lt;br /&gt;
;--------------------------------&lt;br /&gt;
# EOF&lt;br /&gt;
&amp;lt;/highlight-nsis&amp;gt;&lt;br /&gt;
You should copy the next code into a separate file: &amp;lt;b&amp;gt;macros.nsh&amp;lt;/b&amp;gt;.&lt;br /&gt;
&amp;lt;highlight-nsis&amp;gt;&lt;br /&gt;
; Macros include (TN)&lt;br /&gt;
;--------------------------------&lt;br /&gt;
/*&lt;br /&gt;
&lt;br /&gt;
 FileFunction=[GetSizeOnDisk|GetClusterSize]&lt;br /&gt;
&lt;br /&gt;
*/&lt;br /&gt;
;_____________________________________________________________________________&lt;br /&gt;
;&lt;br /&gt;
;                         Macros&lt;br /&gt;
;_____________________________________________________________________________&lt;br /&gt;
;&lt;br /&gt;
; Change log window verbosity (default: 3=no script)&lt;br /&gt;
;&lt;br /&gt;
; Example:&lt;br /&gt;
; !include &amp;quot;macros.nsh&amp;quot;&lt;br /&gt;
; !insertmacro GetSizeOnDisk&lt;br /&gt;
; ${FILEFUNC_VERBOSE} 4   # all verbosity&lt;br /&gt;
; !insertmacro GetClusterSize&lt;br /&gt;
; ${FILEFUNC_VERBOSE} 3   # no script&lt;br /&gt;
&lt;br /&gt;
!include Util.nsh ; for &amp;quot;CallArtificialFunction&amp;quot;&lt;br /&gt;
&lt;br /&gt;
!verbose push&lt;br /&gt;
!verbose 3&lt;br /&gt;
!ifndef _FILEFUNC_VERBOSE&lt;br /&gt;
	!define _FILEFUNC_VERBOSE 3&lt;br /&gt;
!endif&lt;br /&gt;
!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
!define FILEFUNC_VERBOSE `!insertmacro FILEFUNC_VERBOSE`&lt;br /&gt;
!verbose pop&lt;br /&gt;
&lt;br /&gt;
!macro FILEFUNC_VERBOSE _VERBOSE&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose 3&lt;br /&gt;
	!undef _FILEFUNC_VERBOSE&lt;br /&gt;
	!define _FILEFUNC_VERBOSE ${_VERBOSE}&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetSizeOnDiskCall _PATH _OPTIONS _FILESYSTEM _RESULT1 _RESULT2 _RESULT3 _RESULT4&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
	Push `${_PATH}`&lt;br /&gt;
	Push `${_OPTIONS}`&lt;br /&gt;
	Push `${_FILESYSTEM}` ; volume block size&lt;br /&gt;
	${CallArtificialFunction} GetSizeOnDisk_&lt;br /&gt;
	Pop ${_RESULT1}&lt;br /&gt;
	Pop ${_RESULT2}&lt;br /&gt;
	Pop ${_RESULT3}&lt;br /&gt;
	Pop ${_RESULT4}&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetClusterSizeCall _PATH _RESULT&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
	Push `${_PATH}` &lt;br /&gt;
	${CallArtificialFunction} GetClusterSize_&lt;br /&gt;
	Pop ${_RESULT}&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
; ---------------&lt;br /&gt;
; GetSizeOnDisk (modified &amp;quot;GetSize&amp;quot; - FileFunc.nsh - KiCHiK - Function &amp;quot;FindFiles&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
!define GetSizeOnDisk `!insertmacro GetSizeOnDiskCall`&lt;br /&gt;
!define un.GetSizeOnDisk `!insertmacro GetSizeOnDiskCall`&lt;br /&gt;
&lt;br /&gt;
!macro GetSizeOnDisk&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro un.GetSizeOnDisk&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
; Usage: similar to &amp;quot;GetSize&amp;quot;&lt;br /&gt;
&lt;br /&gt;
; For documentation, see the NSIS user manual: E.1.3 GetSize&lt;br /&gt;
; Four (not three) values are returned&lt;br /&gt;
&lt;br /&gt;
; $var1		; Result1: Size/Size on disk&lt;br /&gt;
; $var2		; Result2: Sum of files&lt;br /&gt;
; $var3		; Result3: Sum of directories&lt;br /&gt;
; $var4		; Result4: Sum of compressed/sparse files&lt;br /&gt;
&lt;br /&gt;
; Example: ${GetSizeOnDisk} &amp;quot;$INSTDIR&amp;quot; &amp;quot;/S=0K&amp;quot; &amp;quot;SOD&amp;quot; $0 $1 $2 $3&lt;br /&gt;
; DetailPrint &amp;quot;$1 file(s) | $2 folder(s) | $0 Kb | $3 compressed or sparse file(s)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
; Specifying &#039;SOD&#039; (e.g. Size On Disk) toggles the $var1 result&lt;br /&gt;
; Output is logical size, if used, or physical size, if left empty &amp;quot;&amp;quot;&lt;br /&gt;
; The target volume&#039;s allocation unit size in bytes, the size of a&lt;br /&gt;
; cluster, for example &#039;4096&#039; bytes, if valid, can also be the input&lt;br /&gt;
; If neither &#039;SOD&#039; nor a cluster size is specified, $var4 returns 0&lt;br /&gt;
; even where compressed and/or sparse files exist&lt;br /&gt;
&lt;br /&gt;
!macro GetSizeOnDisk_&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
&lt;br /&gt;
	Exch $2&lt;br /&gt;
	Exch 2&lt;br /&gt;
	Exch $0&lt;br /&gt;
	Exch&lt;br /&gt;
	Exch $1&lt;br /&gt;
	Push $3&lt;br /&gt;
	Push $4&lt;br /&gt;
	Push $5&lt;br /&gt;
	Push $6&lt;br /&gt;
	Push $7&lt;br /&gt;
	Push $8&lt;br /&gt;
	Push $9&lt;br /&gt;
	Push $R0&lt;br /&gt;
	Push $R1&lt;br /&gt;
	Push $R2&lt;br /&gt;
	StrCpy $R1 $2&lt;br /&gt;
	Push $R3&lt;br /&gt;
	Push $R4&lt;br /&gt;
	Push $R5&lt;br /&gt;
	Push $R6&lt;br /&gt;
	Push $R7&lt;br /&gt;
	Push $R8&lt;br /&gt;
	Push $R9&lt;br /&gt;
	ClearErrors&lt;br /&gt;
&lt;br /&gt;
	StrCmp $R1 &#039;&#039; FileFunc_GetSize_path FileFunc_GetSize_sod&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_sod:&lt;br /&gt;
	StrCmp $R1 &#039;SOD&#039; 0 FileFunc_GetSize_path&lt;br /&gt;
	System::Call &#039;kernel32::GetDiskFreeSpace(tr0,*i0r2,*i0r3,,)&#039;&lt;br /&gt;
	IntOp $R1 $2 * $3&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_path:&lt;br /&gt;
	StrCpy $R9 $0 1 -1&lt;br /&gt;
	StrCmp $R9 &#039;\&#039; 0 +3&lt;br /&gt;
	StrCpy $0 $0 -1&lt;br /&gt;
	goto -3&lt;br /&gt;
	IfFileExists &#039;$0\*.*&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
&lt;br /&gt;
	StrCpy $3 0&lt;br /&gt;
	StrCpy $4 &#039;&#039;&lt;br /&gt;
	StrCpy $5 &#039;&#039;&lt;br /&gt;
	StrCpy $6 &#039;&#039;&lt;br /&gt;
	StrCpy $8 0&lt;br /&gt;
	StrCpy $R3 &#039;&#039;&lt;br /&gt;
	StrCpy $R4 &#039;&#039;&lt;br /&gt;
	StrCpy $R5 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_option:&lt;br /&gt;
	StrCpy $R9 $1 1&lt;br /&gt;
	StrCpy $1 $1 &#039;&#039; 1&lt;br /&gt;
	StrCmp $R9 &#039; &#039; -2&lt;br /&gt;
	StrCmp $R9 &#039;&#039; FileFunc_GetSize_sizeset&lt;br /&gt;
	StrCmp $R9 &#039;/&#039; 0 -4&lt;br /&gt;
&lt;br /&gt;
	StrCpy $9 -1&lt;br /&gt;
	IntOp $9 $9 + 1&lt;br /&gt;
	StrCpy $R9 $1 1 $9&lt;br /&gt;
	StrCmp $R9 &#039;&#039; +2&lt;br /&gt;
	StrCmp $R9 &#039;/&#039; 0 -3&lt;br /&gt;
	StrCpy $8 $1 $9&lt;br /&gt;
	StrCpy $8 $8 &#039;&#039; 2&lt;br /&gt;
	StrCpy $R9 $8 &#039;&#039; -1&lt;br /&gt;
	StrCmp $R9 &#039; &#039; 0 +3&lt;br /&gt;
	StrCpy $8 $8 -1&lt;br /&gt;
	goto -3&lt;br /&gt;
	StrCpy $R9 $1 2&lt;br /&gt;
	StrCpy $1 $1 &#039;&#039; $9&lt;br /&gt;
&lt;br /&gt;
	StrCmp $R9 &#039;M=&#039; 0 FileFunc_GetSize_size&lt;br /&gt;
	StrCpy $4 $8&lt;br /&gt;
	goto FileFunc_GetSize_option&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_size:&lt;br /&gt;
	StrCmp $R9 &#039;S=&#039; 0 FileFunc_GetSize_gotosubdir&lt;br /&gt;
	StrCpy $6 $8&lt;br /&gt;
	goto FileFunc_GetSize_option&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_gotosubdir:&lt;br /&gt;
	StrCmp $R9 &#039;G=&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
	StrCpy $7 $8&lt;br /&gt;
	StrCmp $7 &#039;&#039; +3&lt;br /&gt;
	StrCmp $7 &#039;1&#039; +2&lt;br /&gt;
	StrCmp $7 &#039;0&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
	goto FileFunc_GetSize_option&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_sizeset:&lt;br /&gt;
	StrCmp $6 &#039;&#039; FileFunc_GetSize_default&lt;br /&gt;
	StrCpy $9 0&lt;br /&gt;
	StrCpy $R9 $6 1 $9&lt;br /&gt;
	StrCmp $R9 &#039;&#039; +4&lt;br /&gt;
	StrCmp $R9 &#039;:&#039; +3&lt;br /&gt;
	IntOp $9 $9 + 1&lt;br /&gt;
	goto -4&lt;br /&gt;
	StrCpy $5 $6 $9&lt;br /&gt;
	IntOp $9 $9 + 1&lt;br /&gt;
	StrCpy $1 $6 1 -1&lt;br /&gt;
	StrCpy $6 $6 -1 $9&lt;br /&gt;
	StrCmp $5 &#039;&#039; +2&lt;br /&gt;
	IntOp $5 $5 + 0&lt;br /&gt;
	StrCmp $6 &#039;&#039; +2&lt;br /&gt;
	IntOp $6 $6 + 0&lt;br /&gt;
&lt;br /&gt;
	StrCmp $1 &#039;B&#039; 0 +4&lt;br /&gt;
	StrCpy $1 1&lt;br /&gt;
	StrCpy $2 bytes&lt;br /&gt;
	goto FileFunc_GetSize_default&lt;br /&gt;
	StrCmp $1 &#039;K&#039; 0 +4&lt;br /&gt;
	StrCpy $1 1024&lt;br /&gt;
	StrCpy $2 Kb&lt;br /&gt;
	goto FileFunc_GetSize_default&lt;br /&gt;
	StrCmp $1 &#039;M&#039; 0 +4&lt;br /&gt;
	StrCpy $1 1048576&lt;br /&gt;
	StrCpy $2 Mb&lt;br /&gt;
	goto FileFunc_GetSize_default&lt;br /&gt;
	StrCmp $1 &#039;G&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
	StrCpy $1 1073741824&lt;br /&gt;
	StrCpy $2 Gb&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_default:&lt;br /&gt;
	StrCmp $4 &#039;&#039; 0 +2&lt;br /&gt;
	StrCpy $4 &#039;*.*&#039;&lt;br /&gt;
	StrCmp $7 &#039;&#039; 0 +2&lt;br /&gt;
	StrCpy $7 &#039;1&#039;&lt;br /&gt;
&lt;br /&gt;
	StrCpy $8 1&lt;br /&gt;
	Push $0&lt;br /&gt;
	SetDetailsPrint textonly&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_nextdir:&lt;br /&gt;
	IntOp $8 $8 - 1&lt;br /&gt;
	Pop $R8&lt;br /&gt;
	FindFirst $0 $R7 &#039;$R8\$4&#039;&lt;br /&gt;
	IfErrors FileFunc_GetSize_show&lt;br /&gt;
	StrCmp $R7 &#039;.&#039; 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	StrCmp $R7 &#039;..&#039; 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
	goto FileFunc_GetSize_show&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_dir:&lt;br /&gt;
	IfFileExists &#039;$R8\$R7\*.*&#039; 0 FileFunc_GetSize_file&lt;br /&gt;
	IntOp $R5 $R5 + 1&lt;br /&gt;
	goto FileFunc_GetSize_findnext&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_file:&lt;br /&gt;
	StrCpy $R6 0&lt;br /&gt;
	StrCmp $5$6 &#039;&#039; 0 +3&lt;br /&gt;
	IntOp $R4 $R4 + 1&lt;br /&gt;
	goto FileFunc_GetSize_findnext&lt;br /&gt;
	StrCmp $R1 &#039;&#039; FileFunc_GetSize_fileopen&lt;br /&gt;
	StrCpy $R0 0&lt;br /&gt;
	System::Call &#039;kernel32::GetFileAttributes(t &amp;quot;$R8\$R7&amp;quot;)i .R2&#039;&lt;br /&gt;
	StrCmp $R2 -1 FileFunc_GetSize_fileopen&lt;br /&gt;
	IntOp $R0 $R2 &amp;amp; 0x0800 ; compressed&lt;br /&gt;
	IntCmp $R0 0 0 0 FileFunc_GetSize_GetCompressed&lt;br /&gt;
	IntOp $R0 $R2 &amp;amp; 0x0200 ; sparse file&lt;br /&gt;
	IntCmp $R0 0 FileFunc_GetSize_fileopen&lt;br /&gt;
	FileFunc_GetSize_GetCompressed:&lt;br /&gt;
	System::Call &#039;kernel32::GetCompressedFileSize(t &amp;quot;$R8\$R7&amp;quot;, i)i .R6&#039;&lt;br /&gt;
	IntCmp $R6 4096 +2 0 +2&lt;br /&gt;
	StrCpy $R6 4096&lt;br /&gt;
	IntOp $3 $3 + 1 ; location contains compressed or sparse files&lt;br /&gt;
	goto FileFunc_GetSize_fileclose&lt;br /&gt;
	FileFunc_GetSize_fileopen:&lt;br /&gt;
	FileOpen $9 &#039;$R8\$R7&#039; r&lt;br /&gt;
	IfErrors +3&lt;br /&gt;
	FileSeek $9 0 END $R6&lt;br /&gt;
	FileClose $9&lt;br /&gt;
	FileFunc_GetSize_fileclose:&lt;br /&gt;
	StrCmp $5 &#039;&#039; +2&lt;br /&gt;
	IntCmp $R6 $5 0 FileFunc_GetSize_findnext&lt;br /&gt;
	StrCmp $6 &#039;&#039; +2&lt;br /&gt;
	IntCmp $R6 $6 0 0 FileFunc_GetSize_findnext&lt;br /&gt;
	IntOp $R4 $R4 + 1&lt;br /&gt;
	StrCmp $R1 &#039;&#039; FileFunc_GetSize_file_add&lt;br /&gt;
	StrCmp $R0 0 0 FileFunc_GetSize_file_add&lt;br /&gt;
	StrCpy $R0 $R1&lt;br /&gt;
	IntOp $R6 $R6 + $R0&lt;br /&gt;
	IntOp $R1 $R6 % $R0&lt;br /&gt;
	StrCmp $R1 0 0 +2&lt;br /&gt;
	StrCpy $R1 $R0&lt;br /&gt;
	IntOp $R2 $R0 - $R1&lt;br /&gt;
	IntOp $R6 $R6 - $R0&lt;br /&gt;
	IntOp $R6 $R6 + $R2&lt;br /&gt;
	StrCpy $R1 $R0&lt;br /&gt;
	FileFunc_GetSize_file_add:&lt;br /&gt;
	System::Int64Op $R3 + $R6&lt;br /&gt;
	Pop $R3&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_findnext:&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_show:&lt;br /&gt;
	StrCmp $5$6 &#039;&#039; FileFunc_GetSize_nosize&lt;br /&gt;
	System::Int64Op $R3 / $1&lt;br /&gt;
	Pop $9&lt;br /&gt;
	DetailPrint &#039;Size:$9 $2  Files:$R4  Folders:$R5&#039;&lt;br /&gt;
	goto FileFunc_GetSize_subdir&lt;br /&gt;
	FileFunc_GetSize_nosize:&lt;br /&gt;
	DetailPrint &#039;Files:$R4  Folders:$R5&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_subdir:&lt;br /&gt;
	StrCmp $7 0 FileFunc_GetSize_preend&lt;br /&gt;
	FindFirst $0 $R7 &#039;$R8\*.*&#039;&lt;br /&gt;
	StrCmp $R7 &#039;.&#039; 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	StrCmp $R7 &#039;..&#039; 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
	StrCmp $8 0 FileFunc_GetSize_preend FileFunc_GetSize_nextdir&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_pushdir:&lt;br /&gt;
	IfFileExists &#039;$R8\$R7\*.*&#039; 0 +3&lt;br /&gt;
	Push &#039;$R8\$R7&#039;&lt;br /&gt;
	IntOp $8 $8 + 1&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
	StrCmp $8 0 FileFunc_GetSize_preend FileFunc_GetSize_nextdir&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_preend:&lt;br /&gt;
	StrCmp $R3 &#039;&#039; FileFunc_GetSize_nosizeend&lt;br /&gt;
	System::Int64Op $R3 / $1&lt;br /&gt;
	Pop $R3&lt;br /&gt;
	FileFunc_GetSize_nosizeend:&lt;br /&gt;
	StrCpy $2 $R4&lt;br /&gt;
	StrCpy $1 $R5&lt;br /&gt;
	StrCpy $0 $R3&lt;br /&gt;
	goto FileFunc_GetSize_noerror&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_error:&lt;br /&gt;
	SetErrors&lt;br /&gt;
	StrCpy $0 &#039;&#039;&lt;br /&gt;
	StrCpy $1 &#039;&#039;&lt;br /&gt;
	StrCpy $2 &#039;&#039;&lt;br /&gt;
	StrCpy $3 &#039;&#039;&lt;br /&gt;
	goto FileFunc_GetSize_end&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_noerror:&lt;br /&gt;
	StrCmp $0 &#039;&#039; 0 +2&lt;br /&gt;
	StrCpy $0 0&lt;br /&gt;
	StrCmp $1 &#039;&#039; 0 +2&lt;br /&gt;
	StrCpy $1 0&lt;br /&gt;
	StrCmp $2 &#039;&#039; 0 +2&lt;br /&gt;
	StrCpy $2 0&lt;br /&gt;
	StrCmp $3 &#039;&#039; 0 +2&lt;br /&gt;
	StrCpy $3 0&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_end:&lt;br /&gt;
	SetDetailsPrint both&lt;br /&gt;
	Pop $R9&lt;br /&gt;
	Pop $R8&lt;br /&gt;
	Pop $R7&lt;br /&gt;
	Pop $R6&lt;br /&gt;
	Pop $R5&lt;br /&gt;
	Pop $R4&lt;br /&gt;
	Pop $R3&lt;br /&gt;
	Pop $R2&lt;br /&gt;
	Pop $R1&lt;br /&gt;
	Pop $R0&lt;br /&gt;
	Pop $9&lt;br /&gt;
	Pop $8&lt;br /&gt;
	Pop $7&lt;br /&gt;
	Pop $6&lt;br /&gt;
	Pop $5&lt;br /&gt;
	Pop $4&lt;br /&gt;
	Exch $3&lt;br /&gt;
	Exch 3&lt;br /&gt;
	Exch $2&lt;br /&gt;
	Exch&lt;br /&gt;
	Exch $1&lt;br /&gt;
	Exch 2&lt;br /&gt;
	Exch $0&lt;br /&gt;
&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
; ---------------&lt;br /&gt;
; GetClusterSize&lt;br /&gt;
&lt;br /&gt;
; Syntax: ${GetClusterSize} $inputpath $outputvariable &lt;br /&gt;
; Result: 512, 1024, ..., 4096, ..., 131072, ...&lt;br /&gt;
&lt;br /&gt;
!define GetClusterSize `!insertmacro GetClusterSizeCall`&lt;br /&gt;
!define un.GetClusterSize `!insertmacro GetClusterSizeCall`&lt;br /&gt;
&lt;br /&gt;
!macro GetClusterSize&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro un.GetClusterSize&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetClusterSize_&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
&lt;br /&gt;
	Exch $0&lt;br /&gt;
	Push $1&lt;br /&gt;
	Push $2&lt;br /&gt;
	System::Call &#039;kernel32::GetDiskFreeSpace(tr0,*i0r1,*i0r2,,)&#039;&lt;br /&gt;
	IntOp $0 $1 * $2&lt;br /&gt;
	Pop $2&lt;br /&gt;
	Pop $1&lt;br /&gt;
	Exch $0&lt;br /&gt;
&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/highlight-nsis&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-size: 110%&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Credits:&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;em&amp;gt;GetSizeOnDisk&amp;lt;/em&amp;gt; has been altered slightly and renamed. The original macro is called &amp;lt;em&amp;gt;GetSize&amp;lt;/em&amp;gt;. You will find it in the Users Manual under E.1.3.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-size: 110%&amp;quot;&amp;gt;&amp;lt;b&amp;gt;=== Download (example) ===&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is the same as the example code above.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;attach&amp;gt;SODTool.zip&amp;lt;/attach&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-size: 110%&amp;quot;&amp;gt;&amp;lt;b&amp;gt;=== Download (utility) ===&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is a Modern UI2 version that displays selection windows and goes to an output page. Script file is included.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;attach&amp;gt;SOD II tool.zip&amp;lt;/attach&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Both downloads are compiled in unicode, so SOD Tool can read Russian file names.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-size: 110%&amp;quot;&amp;gt;&amp;lt;b&amp;gt;History:&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional parameter for counting compressed/sparse files added. (Feb. 18, 2013)&lt;br /&gt;
&lt;br /&gt;
Option to find without subdirectories &#039;/G=0&#039; switch was missing. (Well, not really missing.) Change to details view (string), showing &#039;compressed/sparse file(s)&#039;. (Feb. 19, 2013)&lt;br /&gt;
&lt;br /&gt;
Change to unicode, because ansi could not read Russian. (Feb. 20, 2013)&lt;br /&gt;
&lt;br /&gt;
Stack operations cleaned up. The &amp;lt;b&amp;gt;SOD II tool&amp;lt;/b&amp;gt; uploaded. (Feb. 22, 2013)&lt;br /&gt;
&lt;br /&gt;
String formatting improvements, functions simplified (SOD II) and small revisions in macros header made. (Feb. 23, 2013)&lt;br /&gt;
[[Category:Code Examples]]&lt;/div&gt;</summary>
		<author><name>Bnicer</name></author>
	</entry>
	<entry>
		<id>https://nsis.sourceforge.io/mediawiki/index.php?title=File:SODTool.zip&amp;diff=23002</id>
		<title>File:SODTool.zip</title>
		<link rel="alternate" type="text/html" href="https://nsis.sourceforge.io/mediawiki/index.php?title=File:SODTool.zip&amp;diff=23002"/>
		<updated>2013-02-23T23:39:08Z</updated>

		<summary type="html">&lt;p&gt;Bnicer: uploaded a new version of &amp;amp;quot;File:SODTool.zip&amp;amp;quot;: Small revisions in macros header made. Updated Feb. 23, 2013.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;File attachment for Get size on disk code example. Includes icon, macros header file, nsissize executable, nsissize script. Created Feb. 15, 2013.&lt;/div&gt;</summary>
		<author><name>Bnicer</name></author>
	</entry>
	<entry>
		<id>https://nsis.sourceforge.io/mediawiki/index.php?title=File:SOD_II_tool.zip&amp;diff=23001</id>
		<title>File:SOD II tool.zip</title>
		<link rel="alternate" type="text/html" href="https://nsis.sourceforge.io/mediawiki/index.php?title=File:SOD_II_tool.zip&amp;diff=23001"/>
		<updated>2013-02-23T23:37:46Z</updated>

		<summary type="html">&lt;p&gt;Bnicer: uploaded a new version of &amp;amp;quot;File:SOD II tool.zip&amp;amp;quot;: String formatting improvements, functions simplified and small revisions in macros header made. Updated Feb. 23, 2013.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Size On Disk (SOD) utility, mark II. Supplemental file for the &#039;Size on disk&#039; NSIS wiki code example. Source files are included for compiling the utility. The purpose is to exemplify the use of ${GetSizeOnDisk}, an included macro that returns logical size (size on disk) of folders and files. The tool has an MUI 2 input page and an output page.&lt;/div&gt;</summary>
		<author><name>Bnicer</name></author>
	</entry>
	<entry>
		<id>https://nsis.sourceforge.io/mediawiki/index.php?title=Get_size_on_disk&amp;diff=22986</id>
		<title>Get size on disk</title>
		<link rel="alternate" type="text/html" href="https://nsis.sourceforge.io/mediawiki/index.php?title=Get_size_on_disk&amp;diff=22986"/>
		<updated>2013-02-22T16:48:54Z</updated>

		<summary type="html">&lt;p&gt;Bnicer: Size On Disk (SOD) utility&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PageAuthor|Bnicer}}&lt;br /&gt;
This example code shows you how to get the space used by directories and files.&lt;br /&gt;
&amp;lt;highlight-nsis&amp;gt;&lt;br /&gt;
; A utility for computing the NSIS (or NSIS Unicode) install folder size and the size of&lt;br /&gt;
; the uninstaller&lt;br /&gt;
; nsissize.nsi&lt;br /&gt;
; Compile, then run the .exe&lt;br /&gt;
&lt;br /&gt;
Name &amp;quot;SOD Tool&amp;quot;&lt;br /&gt;
RequestExecutionLevel user&lt;br /&gt;
#RequestExecutionLevel admin ; More files may be found in system folders&lt;br /&gt;
!define LOCAL &amp;quot;&amp;quot; ; Path where local include files reside&lt;br /&gt;
OutFile &amp;quot;${LOCAL}nsissize.exe&amp;quot;&lt;br /&gt;
!include &amp;quot;${LOCAL}macros.nsh&amp;quot;&lt;br /&gt;
Icon &amp;quot;${LOCAL}arrows.ico&amp;quot;&lt;br /&gt;
ReserveFile &amp;quot;${NSISDIR}\Plugins\Math.dll&amp;quot; ; Doesn&#039;t seem to like &amp;quot;!include&amp;quot;&lt;br /&gt;
!include &amp;quot;LogicLib.nsh&amp;quot;&lt;br /&gt;
ShowInstDetails show&lt;br /&gt;
&lt;br /&gt;
;--------------------------------&lt;br /&gt;
&lt;br /&gt;
; Variables&lt;br /&gt;
Var NSIS&lt;br /&gt;
Var COMPRESSED&lt;br /&gt;
Var COMPRESSED_UN&lt;br /&gt;
Var BLOCK&lt;br /&gt;
Var FILES&lt;br /&gt;
Var FOLDERS&lt;br /&gt;
Var SIZE_B&lt;br /&gt;
Var SIZE_M&lt;br /&gt;
Var SOD_B&lt;br /&gt;
Var SOD_K&lt;br /&gt;
Var SOD_M&lt;br /&gt;
Var SIZE_UN_B&lt;br /&gt;
Var SIZE_UN_K&lt;br /&gt;
Var SOD_UN_B&lt;br /&gt;
Var SOD_UN_K&lt;br /&gt;
&lt;br /&gt;
;--------------------------------&lt;br /&gt;
&lt;br /&gt;
; Functions&lt;br /&gt;
Function Separator ; comma&lt;br /&gt;
  Exch $R1 ; input string&lt;br /&gt;
  Push $R2&lt;br /&gt;
  Push $R3&lt;br /&gt;
  Push $R4&lt;br /&gt;
  Push $R5&lt;br /&gt;
  StrCpy $R2 $R1&lt;br /&gt;
  StrCpy $R5 &amp;quot;16&amp;quot; ; 1,000,000,000,000,000 limit&lt;br /&gt;
  StrLen $R4 $R1&lt;br /&gt;
loop:&lt;br /&gt;
  IntCmp $R5 3 endloop endloop 0&lt;br /&gt;
  IntCmp $R4 $R5 0 +7 0&lt;br /&gt;
  IntOp $R5 $R5 - 1&lt;br /&gt;
  StrCpy $R2 $R2 -$R5&lt;br /&gt;
  StrCpy $R3 $R1 &amp;quot;&amp;quot; -$R5&lt;br /&gt;
  StrCpy $R2 &amp;quot;$R2,$R3&amp;quot;&lt;br /&gt;
  IntOp $R5 $R5 - 2&lt;br /&gt;
  Goto loop&lt;br /&gt;
  IntOp $R5 $R5 - 3&lt;br /&gt;
  Goto loop&lt;br /&gt;
endloop:&lt;br /&gt;
  Pop $R5&lt;br /&gt;
  Pop $R4&lt;br /&gt;
  Pop $R3&lt;br /&gt;
  Exch $R2&lt;br /&gt;
  Pop $R1&lt;br /&gt;
  Exch $R1 ; output string&lt;br /&gt;
FunctionEnd&lt;br /&gt;
&lt;br /&gt;
;--------------------------------&lt;br /&gt;
&lt;br /&gt;
; Main Section (nothing will be installed)&lt;br /&gt;
Section&lt;br /&gt;
; registry&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS Unicode&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS ANSI&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  Goto done&lt;br /&gt;
  begin:&lt;br /&gt;
  IfFileExists &amp;quot;$NSIS&amp;quot; 0 done&lt;br /&gt;
  ${GetClusterSize} $BLOCK&lt;br /&gt;
; directory&lt;br /&gt;
  ${GetSizeOnDisk} &amp;quot;$NSIS&amp;quot; &amp;quot;/S=0B&amp;quot; &amp;quot;&amp;quot; $0 $1 $2 $3&lt;br /&gt;
  StrCpy $SIZE_B $0&lt;br /&gt;
  StrCpy $FILES $1&lt;br /&gt;
  StrCpy $FOLDERS $2&lt;br /&gt;
  Math::Script &amp;quot;r4 = ff($0 / 1024 / 1024.0, 16 +2)&amp;quot;&lt;br /&gt;
  StrCpy $SIZE_M $4&lt;br /&gt;
  ${GetSizeOnDisk} &amp;quot;$NSIS&amp;quot; &amp;quot;/S=0B&amp;quot; &amp;quot;$BLOCK&amp;quot; $0 $1 $2 $3&lt;br /&gt;
  StrCpy $SOD_B $0&lt;br /&gt;
  StrCpy $COMPRESSED $3&lt;br /&gt;
  Math::Script &amp;quot;r4 = ff($0 / 1024.0, 16 +0); r5 = ff(r4 / 1024.0, 16 +2)&amp;quot;&lt;br /&gt;
  StrCpy $SOD_K $4&lt;br /&gt;
  StrCpy $SOD_M $5&lt;br /&gt;
; uninstaller&lt;br /&gt;
  IfFileExists &amp;quot;$NSIS\uninst-nsis.exe&amp;quot; 0 done&lt;br /&gt;
  ${GetSizeOnDisk} &amp;quot;$NSIS&amp;quot; &amp;quot;/M=uninst-nsis.exe /S=0B /G=0&amp;quot; &amp;quot;&amp;quot; $0 $1 $2 $3&lt;br /&gt;
  StrCpy $SIZE_UN_B $0&lt;br /&gt;
  Math::Script &amp;quot;r4 = ff($0 / 1024.0, 16 +1)&amp;quot;&lt;br /&gt;
  StrCpy $SIZE_UN_K $4&lt;br /&gt;
  ${GetSizeOnDisk} &amp;quot;$NSIS&amp;quot; &amp;quot;/M=uninst-nsis.exe /S=0B /G=0&amp;quot; &amp;quot;$BLOCK&amp;quot; $0 $1 $2 $3&lt;br /&gt;
  StrCpy $SOD_UN_B $0&lt;br /&gt;
  ${If} $3 &amp;gt; 0&lt;br /&gt;
    StrCpy $COMPRESSED_UN &amp;quot; (compressed or sparse)&amp;quot;&lt;br /&gt;
  ${Else}&lt;br /&gt;
    StrCpy $COMPRESSED_UN &amp;quot;&amp;quot;&lt;br /&gt;
  ${EndIf}&lt;br /&gt;
  Math::Script &amp;quot;r4 = ff($0 / 1024.0, 16 +1)&amp;quot;&lt;br /&gt;
  StrCpy $SOD_UN_K $4&lt;br /&gt;
; format&lt;br /&gt;
  Push $SIZE_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  Pop $SIZE_B&lt;br /&gt;
&lt;br /&gt;
  Push $SOD_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  Pop $SOD_B&lt;br /&gt;
&lt;br /&gt;
  Push $SOD_K&lt;br /&gt;
  Call Separator&lt;br /&gt;
  Pop $SOD_K&lt;br /&gt;
&lt;br /&gt;
  Push $SIZE_UN_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  Pop $SIZE_UN_B&lt;br /&gt;
&lt;br /&gt;
  Push $SOD_UN_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  Pop $SOD_UN_B&lt;br /&gt;
; output&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;$NSIS&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;Size: $SIZE_M MB ($SIZE_B bytes)&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;SOD: $SOD_M MB ($SOD_B bytes)&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;Uninstaller$COMPRESSED_UN&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;Size: $SIZE_UN_K KB ($SIZE_UN_B bytes)&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;SOD: $SOD_UN_K KB ($SOD_UN_B bytes)&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;$FILES files | $FOLDERS folders | $SOD_K Kb | $COMPRESSED compressed/sparse file(s)&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  Goto completed&lt;br /&gt;
done:&lt;br /&gt;
  DetailPrint &amp;quot;File not found.&amp;quot;&lt;br /&gt;
completed:&lt;br /&gt;
SectionEnd&lt;br /&gt;
&lt;br /&gt;
;--------------------------------&lt;br /&gt;
# EOF&lt;br /&gt;
&amp;lt;/highlight-nsis&amp;gt;&lt;br /&gt;
You should copy the next code into a separate file: &amp;lt;b&amp;gt;macros.nsh&amp;lt;/b&amp;gt;.&lt;br /&gt;
&amp;lt;highlight-nsis&amp;gt;&lt;br /&gt;
; Macros include (TN)&lt;br /&gt;
;--------------------------------&lt;br /&gt;
/*&lt;br /&gt;
&lt;br /&gt;
 FileFunction=[GetSizeOnDisk|GetClusterSize]&lt;br /&gt;
&lt;br /&gt;
*/&lt;br /&gt;
;_____________________________________________________________________________&lt;br /&gt;
;&lt;br /&gt;
;                         Macros&lt;br /&gt;
;_____________________________________________________________________________&lt;br /&gt;
;&lt;br /&gt;
; Change log window verbosity (default: 3=no script)&lt;br /&gt;
;&lt;br /&gt;
; Example:&lt;br /&gt;
; !include &amp;quot;macros.nsh&amp;quot;&lt;br /&gt;
; !insertmacro GetSizeOnDisk&lt;br /&gt;
; ${FILEFUNC_VERBOSE} 4   # all verbosity&lt;br /&gt;
; !insertmacro GetClusterSize&lt;br /&gt;
; ${FILEFUNC_VERBOSE} 3   # no script&lt;br /&gt;
&lt;br /&gt;
!include Util.nsh ; for &amp;quot;CallArtificialFunction&amp;quot;&lt;br /&gt;
&lt;br /&gt;
!verbose push&lt;br /&gt;
!verbose 3&lt;br /&gt;
!ifndef _FILEFUNC_VERBOSE&lt;br /&gt;
	!define _FILEFUNC_VERBOSE 3&lt;br /&gt;
!endif&lt;br /&gt;
!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
!define FILEFUNC_VERBOSE `!insertmacro FILEFUNC_VERBOSE`&lt;br /&gt;
!verbose pop&lt;br /&gt;
&lt;br /&gt;
!macro FILEFUNC_VERBOSE _VERBOSE&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose 3&lt;br /&gt;
	!undef _FILEFUNC_VERBOSE&lt;br /&gt;
	!define _FILEFUNC_VERBOSE ${_VERBOSE}&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetSizeOnDiskCall _PATH _OPTIONS _FILESYSTEM _RESULT1 _RESULT2 _RESULT3 _RESULT4&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
	Push `${_PATH}`&lt;br /&gt;
	Push `${_OPTIONS}`&lt;br /&gt;
	Push `${_FILESYSTEM}` ; volume block size&lt;br /&gt;
	${CallArtificialFunction} GetSizeOnDisk_&lt;br /&gt;
	Pop ${_RESULT1}&lt;br /&gt;
	Pop ${_RESULT2}&lt;br /&gt;
	Pop ${_RESULT3}&lt;br /&gt;
	Pop ${_RESULT4}&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetClusterSizeCall _RESULT&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
	${CallArtificialFunction} GetClusterSize_&lt;br /&gt;
	Pop ${_RESULT}&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
; ---------------&lt;br /&gt;
; GetSizeOnDisk (modified &amp;quot;GetSize&amp;quot; - FileFunc.nsh - KiCHiK - Function &amp;quot;FindFiles&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
!define GetSizeOnDisk `!insertmacro GetSizeOnDiskCall`&lt;br /&gt;
!define un.GetSizeOnDisk `!insertmacro GetSizeOnDiskCall`&lt;br /&gt;
&lt;br /&gt;
!macro GetSizeOnDisk&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro un.GetSizeOnDisk&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
; Usage: similar to &amp;quot;GetSize&amp;quot;&lt;br /&gt;
&lt;br /&gt;
; For documentation, see the NSIS user manual: E.1.3 GetSize&lt;br /&gt;
; Four (not three) values are returned&lt;br /&gt;
&lt;br /&gt;
; $var1		; Result1: Size/Size on disk&lt;br /&gt;
; $var2		; Result2: Sum of files&lt;br /&gt;
; $var3		; Result3: Sum of directories&lt;br /&gt;
; $var4		; Result4: Sum of compressed/sparse files&lt;br /&gt;
&lt;br /&gt;
; Example: ${GetSizeOnDisk} &amp;quot;$INSTDIR&amp;quot; &amp;quot;/S=0K&amp;quot; &amp;quot;4096&amp;quot; $0 $1 $2 $3&lt;br /&gt;
; DetailPrint &amp;quot;$1 files | $2 folders | $0 Kb | $3 compressed or sparse file(s)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
; Specifying 4096 (e.g. NTFS block size) toggles the result&lt;br /&gt;
; Output is size on disk, if used, or size, if left empty &amp;quot;&amp;quot;&lt;br /&gt;
; and $var4 (compressed/sparse files) returns 0&lt;br /&gt;
&lt;br /&gt;
!macro GetSizeOnDisk_&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
&lt;br /&gt;
	; replace&lt;br /&gt;
	Exch $2&lt;br /&gt;
	Exch 2&lt;br /&gt;
	Exch $0&lt;br /&gt;
	Exch&lt;br /&gt;
	Exch $1&lt;br /&gt;
	; end replace&lt;br /&gt;
	Push $3&lt;br /&gt;
	Push $4&lt;br /&gt;
	Push $5&lt;br /&gt;
	Push $6&lt;br /&gt;
	Push $7&lt;br /&gt;
	Push $8&lt;br /&gt;
	Push $9&lt;br /&gt;
	; insert code&lt;br /&gt;
	Push $R0&lt;br /&gt;
	Push $R1&lt;br /&gt;
	Push $R2&lt;br /&gt;
	StrCpy $R1 $2&lt;br /&gt;
	; end insert&lt;br /&gt;
	Push $R3&lt;br /&gt;
	Push $R4&lt;br /&gt;
	Push $R5&lt;br /&gt;
	Push $R6&lt;br /&gt;
	Push $R7&lt;br /&gt;
	Push $R8&lt;br /&gt;
	Push $R9&lt;br /&gt;
	ClearErrors&lt;br /&gt;
&lt;br /&gt;
	StrCpy $R9 $0 1 -1&lt;br /&gt;
	StrCmp $R9 &#039;\&#039; 0 +3&lt;br /&gt;
	StrCpy $0 $0 -1&lt;br /&gt;
	goto -3&lt;br /&gt;
	IfFileExists &#039;$0\*.*&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
&lt;br /&gt;
	; replace&lt;br /&gt;
	StrCpy $3 0&lt;br /&gt;
	; end replace&lt;br /&gt;
	StrCpy $4 &#039;&#039;&lt;br /&gt;
	StrCpy $5 &#039;&#039;&lt;br /&gt;
	StrCpy $6 &#039;&#039;&lt;br /&gt;
	StrCpy $8 0&lt;br /&gt;
	StrCpy $R3 &#039;&#039;&lt;br /&gt;
	StrCpy $R4 &#039;&#039;&lt;br /&gt;
	StrCpy $R5 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_option:&lt;br /&gt;
	StrCpy $R9 $1 1&lt;br /&gt;
	StrCpy $1 $1 &#039;&#039; 1&lt;br /&gt;
	StrCmp $R9 &#039; &#039; -2&lt;br /&gt;
	StrCmp $R9 &#039;&#039; FileFunc_GetSize_sizeset&lt;br /&gt;
	StrCmp $R9 &#039;/&#039; 0 -4&lt;br /&gt;
&lt;br /&gt;
	StrCpy $9 -1&lt;br /&gt;
	IntOp $9 $9 + 1&lt;br /&gt;
	StrCpy $R9 $1 1 $9&lt;br /&gt;
	StrCmp $R9 &#039;&#039; +2&lt;br /&gt;
	StrCmp $R9 &#039;/&#039; 0 -3&lt;br /&gt;
	StrCpy $8 $1 $9&lt;br /&gt;
	StrCpy $8 $8 &#039;&#039; 2&lt;br /&gt;
	StrCpy $R9 $8 &#039;&#039; -1&lt;br /&gt;
	StrCmp $R9 &#039; &#039; 0 +3&lt;br /&gt;
	StrCpy $8 $8 -1&lt;br /&gt;
	goto -3&lt;br /&gt;
	StrCpy $R9 $1 2&lt;br /&gt;
	StrCpy $1 $1 &#039;&#039; $9&lt;br /&gt;
&lt;br /&gt;
	StrCmp $R9 &#039;M=&#039; 0 FileFunc_GetSize_size&lt;br /&gt;
	StrCpy $4 $8&lt;br /&gt;
	goto FileFunc_GetSize_option&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_size:&lt;br /&gt;
	StrCmp $R9 &#039;S=&#039; 0 FileFunc_GetSize_gotosubdir&lt;br /&gt;
	StrCpy $6 $8&lt;br /&gt;
	goto FileFunc_GetSize_option&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_gotosubdir:&lt;br /&gt;
	StrCmp $R9 &#039;G=&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
	StrCpy $7 $8&lt;br /&gt;
	StrCmp $7 &#039;&#039; +3&lt;br /&gt;
	StrCmp $7 &#039;1&#039; +2&lt;br /&gt;
	StrCmp $7 &#039;0&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
	goto FileFunc_GetSize_option&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_sizeset:&lt;br /&gt;
	StrCmp $6 &#039;&#039; FileFunc_GetSize_default&lt;br /&gt;
	StrCpy $9 0&lt;br /&gt;
	StrCpy $R9 $6 1 $9&lt;br /&gt;
	StrCmp $R9 &#039;&#039; +4&lt;br /&gt;
	StrCmp $R9 &#039;:&#039; +3&lt;br /&gt;
	IntOp $9 $9 + 1&lt;br /&gt;
	goto -4&lt;br /&gt;
	StrCpy $5 $6 $9&lt;br /&gt;
	IntOp $9 $9 + 1&lt;br /&gt;
	StrCpy $1 $6 1 -1&lt;br /&gt;
	StrCpy $6 $6 -1 $9&lt;br /&gt;
	StrCmp $5 &#039;&#039; +2&lt;br /&gt;
	IntOp $5 $5 + 0&lt;br /&gt;
	StrCmp $6 &#039;&#039; +2&lt;br /&gt;
	IntOp $6 $6 + 0&lt;br /&gt;
&lt;br /&gt;
	StrCmp $1 &#039;B&#039; 0 +4&lt;br /&gt;
	StrCpy $1 1&lt;br /&gt;
	StrCpy $2 bytes&lt;br /&gt;
	goto FileFunc_GetSize_default&lt;br /&gt;
	StrCmp $1 &#039;K&#039; 0 +4&lt;br /&gt;
	StrCpy $1 1024&lt;br /&gt;
	StrCpy $2 Kb&lt;br /&gt;
	goto FileFunc_GetSize_default&lt;br /&gt;
	StrCmp $1 &#039;M&#039; 0 +4&lt;br /&gt;
	StrCpy $1 1048576&lt;br /&gt;
	StrCpy $2 Mb&lt;br /&gt;
	goto FileFunc_GetSize_default&lt;br /&gt;
	StrCmp $1 &#039;G&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
	StrCpy $1 1073741824&lt;br /&gt;
	StrCpy $2 Gb&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_default:&lt;br /&gt;
	StrCmp $4 &#039;&#039; 0 +2&lt;br /&gt;
	StrCpy $4 &#039;*.*&#039;&lt;br /&gt;
	StrCmp $7 &#039;&#039; 0 +2&lt;br /&gt;
	StrCpy $7 &#039;1&#039;&lt;br /&gt;
&lt;br /&gt;
	StrCpy $8 1&lt;br /&gt;
	Push $0&lt;br /&gt;
	SetDetailsPrint textonly&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_nextdir:&lt;br /&gt;
	IntOp $8 $8 - 1&lt;br /&gt;
	Pop $R8&lt;br /&gt;
	FindFirst $0 $R7 &#039;$R8\$4&#039;&lt;br /&gt;
	IfErrors FileFunc_GetSize_show&lt;br /&gt;
	StrCmp $R7 &#039;.&#039; 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	StrCmp $R7 &#039;..&#039; 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
	goto FileFunc_GetSize_show&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_dir:&lt;br /&gt;
	IfFileExists &#039;$R8\$R7\*.*&#039; 0 FileFunc_GetSize_file&lt;br /&gt;
	IntOp $R5 $R5 + 1&lt;br /&gt;
	goto FileFunc_GetSize_findnext&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_file:&lt;br /&gt;
	StrCpy $R6 0&lt;br /&gt;
	StrCmp $5$6 &#039;&#039; 0 +3&lt;br /&gt;
	IntOp $R4 $R4 + 1&lt;br /&gt;
	goto FileFunc_GetSize_findnext&lt;br /&gt;
	; insert code&lt;br /&gt;
	StrCmp $R1 &amp;quot;&amp;quot; FileFunc_GetSize_fileopen&lt;br /&gt;
	StrCpy $R0 0&lt;br /&gt;
	System::Call &#039;kernel32::GetFileAttributes(t &amp;quot;$R8\$R7&amp;quot;)i .R2&#039;&lt;br /&gt;
	StrCmp $R2 -1 FileFunc_GetSize_fileopen&lt;br /&gt;
	IntOp $R0 $R2 &amp;amp; 0x0800 ; compressed&lt;br /&gt;
	IntCmp $R0 0 0 0 FileFunc_GetSize_GetCompressed&lt;br /&gt;
	IntOp $R0 $R2 &amp;amp; 0x0200 ; sparse file&lt;br /&gt;
	IntCmp $R0 0 FileFunc_GetSize_fileopen&lt;br /&gt;
	FileFunc_GetSize_GetCompressed:&lt;br /&gt;
	System::Call &#039;kernel32::GetCompressedFileSize(t &amp;quot;$R8\$R7&amp;quot;, i)i .R6&#039;&lt;br /&gt;
	IntCmp $R6 4096 +2 0 +2&lt;br /&gt;
	StrCpy $R6 4096&lt;br /&gt;
	IntOp $3 $3 + 1 ; location contains compressed or sparse files&lt;br /&gt;
	goto FileFunc_GetSize_fileclose&lt;br /&gt;
	FileFunc_GetSize_fileopen:&lt;br /&gt;
	; end insert&lt;br /&gt;
	FileOpen $9 &#039;$R8\$R7&#039; r&lt;br /&gt;
	IfErrors +3&lt;br /&gt;
	FileSeek $9 0 END $R6&lt;br /&gt;
	FileClose $9&lt;br /&gt;
	; insert code&lt;br /&gt;
	FileFunc_GetSize_fileclose:&lt;br /&gt;
	; end insert&lt;br /&gt;
	StrCmp $5 &#039;&#039; +2&lt;br /&gt;
	IntCmp $R6 $5 0 FileFunc_GetSize_findnext&lt;br /&gt;
	StrCmp $6 &#039;&#039; +2&lt;br /&gt;
	IntCmp $R6 $6 0 0 FileFunc_GetSize_findnext&lt;br /&gt;
	IntOp $R4 $R4 + 1&lt;br /&gt;
	; insert code&lt;br /&gt;
	StrCmp $R1 &amp;quot;&amp;quot; FileFunc_GetSize_file_add&lt;br /&gt;
	StrCmp $R0 0 0 FileFunc_GetSize_file_add&lt;br /&gt;
	StrCpy $R0 $R1&lt;br /&gt;
	IntOp $R6 $R6 + $R0&lt;br /&gt;
	IntOp $R1 $R6 % $R0&lt;br /&gt;
	StrCmp $R1 0 0 +2&lt;br /&gt;
	StrCpy $R1 $R0&lt;br /&gt;
	IntOp $R2 $R0 - $R1&lt;br /&gt;
	IntOp $R6 $R6 - $R0&lt;br /&gt;
	IntOp $R6 $R6 + $R2&lt;br /&gt;
	StrCpy $R1 $R0&lt;br /&gt;
	FileFunc_GetSize_file_add:&lt;br /&gt;
	; end insert&lt;br /&gt;
	System::Int64Op $R3 + $R6&lt;br /&gt;
	Pop $R3&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_findnext:&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_show:&lt;br /&gt;
	StrCmp $5$6 &#039;&#039; FileFunc_GetSize_nosize&lt;br /&gt;
	System::Int64Op $R3 / $1&lt;br /&gt;
	Pop $9&lt;br /&gt;
	DetailPrint &#039;Size:$9 $2  Files:$R4  Folders:$R5&#039;&lt;br /&gt;
	goto FileFunc_GetSize_subdir&lt;br /&gt;
	FileFunc_GetSize_nosize:&lt;br /&gt;
	DetailPrint &#039;Files:$R4  Folders:$R5&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_subdir:&lt;br /&gt;
	StrCmp $7 0 FileFunc_GetSize_preend&lt;br /&gt;
	FindFirst $0 $R7 &#039;$R8\*.*&#039;&lt;br /&gt;
	StrCmp $R7 &#039;.&#039; 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	StrCmp $R7 &#039;..&#039; 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
	StrCmp $8 0 FileFunc_GetSize_preend FileFunc_GetSize_nextdir&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_pushdir:&lt;br /&gt;
	IfFileExists &#039;$R8\$R7\*.*&#039; 0 +3&lt;br /&gt;
	Push &#039;$R8\$R7&#039;&lt;br /&gt;
	IntOp $8 $8 + 1&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
	StrCmp $8 0 FileFunc_GetSize_preend FileFunc_GetSize_nextdir&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_preend:&lt;br /&gt;
	StrCmp $R3 &#039;&#039; FileFunc_GetSize_nosizeend&lt;br /&gt;
	System::Int64Op $R3 / $1&lt;br /&gt;
	Pop $R3&lt;br /&gt;
	FileFunc_GetSize_nosizeend:&lt;br /&gt;
	StrCpy $2 $R4&lt;br /&gt;
	StrCpy $1 $R5&lt;br /&gt;
	StrCpy $0 $R3&lt;br /&gt;
	goto FileFunc_GetSize_end&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_error:&lt;br /&gt;
	SetErrors&lt;br /&gt;
	StrCpy $0 &#039;&#039;&lt;br /&gt;
	StrCpy $1 &#039;&#039;&lt;br /&gt;
	StrCpy $2 &#039;&#039;&lt;br /&gt;
	; insert code&lt;br /&gt;
	StrCpy $3 &#039;&#039;&lt;br /&gt;
	; end insert&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_end:&lt;br /&gt;
	SetDetailsPrint both&lt;br /&gt;
	Pop $R9&lt;br /&gt;
	Pop $R8&lt;br /&gt;
	Pop $R7&lt;br /&gt;
	Pop $R6&lt;br /&gt;
	Pop $R5&lt;br /&gt;
	Pop $R4&lt;br /&gt;
	Pop $R3&lt;br /&gt;
	; insert code&lt;br /&gt;
	Pop $R2&lt;br /&gt;
	Pop $R1&lt;br /&gt;
	Pop $R0&lt;br /&gt;
	; end insert&lt;br /&gt;
	Pop $9&lt;br /&gt;
	Pop $8&lt;br /&gt;
	Pop $7&lt;br /&gt;
	Pop $6&lt;br /&gt;
	Pop $5&lt;br /&gt;
	Pop $4&lt;br /&gt;
	; replace&lt;br /&gt;
	Exch $3&lt;br /&gt;
	Exch 3&lt;br /&gt;
	; end replace&lt;br /&gt;
	Exch $2&lt;br /&gt;
	Exch&lt;br /&gt;
	Exch $1&lt;br /&gt;
	Exch 2&lt;br /&gt;
	Exch $0&lt;br /&gt;
&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
; ---------------&lt;br /&gt;
; GetClusterSize&lt;br /&gt;
&lt;br /&gt;
!define GetClusterSize `!insertmacro GetClusterSizeCall`&lt;br /&gt;
!define un.GetClusterSize `!insertmacro GetClusterSizeCall`&lt;br /&gt;
&lt;br /&gt;
!macro GetClusterSize&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro un.GetClusterSize&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetClusterSize_&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
&lt;br /&gt;
	Push $0&lt;br /&gt;
	Push $1&lt;br /&gt;
	Push $2&lt;br /&gt;
	System::Call &#039;kernel32::GetDiskFreeSpace(i0,*i0r0,*i0r1,*i0r2,*i)&#039;&lt;br /&gt;
	IntOp $0 $0 * $1&lt;br /&gt;
	Pop $2&lt;br /&gt;
	Pop $1&lt;br /&gt;
	Exch $0&lt;br /&gt;
&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/highlight-nsis&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-size: 110%&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Credits:&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;em&amp;gt;GetSizeOnDisk&amp;lt;/em&amp;gt; has been altered slightly and renamed. The original macro is called &amp;lt;em&amp;gt;GetSize&amp;lt;/em&amp;gt;. You will find it in the Users Manual under E.1.3.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-size: 110%&amp;quot;&amp;gt;&amp;lt;b&amp;gt;=== Download (example) ===&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is the same as the example code above.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;attach&amp;gt;SODTool.zip&amp;lt;/attach&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-size: 110%&amp;quot;&amp;gt;&amp;lt;b&amp;gt;=== Download (utility) ===&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is a Modern UI2 version that displays selection windows and goes to an output page. Script file is included.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;attach&amp;gt;SOD II tool.zip&amp;lt;/attach&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Both downloads are compiled in unicode, so SOD Tool can read Russian file names.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-size: 110%&amp;quot;&amp;gt;&amp;lt;b&amp;gt;History:&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional parameter for counting compressed/sparse files added. (Feb. 18, 2013)&lt;br /&gt;
&lt;br /&gt;
Option to find without subdirectories &#039;/G=0&#039; switch was missing. (Well, not really missing.) Change to details view (string), showing &#039;compressed/sparse file(s)&#039;. (Feb. 19, 2013)&lt;br /&gt;
&lt;br /&gt;
Change to unicode, because ansi could not read Russian. (Feb. 20, 2013)&lt;br /&gt;
&lt;br /&gt;
Stack operations cleaned up. The &amp;lt;b&amp;gt;SOD II tool&amp;lt;/b&amp;gt; uploaded. (Feb. 22, 2013)&lt;br /&gt;
[[Category:Code Examples]]&lt;/div&gt;</summary>
		<author><name>Bnicer</name></author>
	</entry>
	<entry>
		<id>https://nsis.sourceforge.io/mediawiki/index.php?title=File:SOD_II_tool.zip&amp;diff=22985</id>
		<title>File:SOD II tool.zip</title>
		<link rel="alternate" type="text/html" href="https://nsis.sourceforge.io/mediawiki/index.php?title=File:SOD_II_tool.zip&amp;diff=22985"/>
		<updated>2013-02-22T16:28:31Z</updated>

		<summary type="html">&lt;p&gt;Bnicer: Size On Disk (SOD) utility, mark II. Supplemental file for the &amp;#039;Size on disk&amp;#039; NSIS wiki code example. Source files are included for compiling the utility. The purpose is to exemplify the use of ${GetSizeOnDisk}, an included macro that returns logical size&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Size On Disk (SOD) utility, mark II. Supplemental file for the &#039;Size on disk&#039; NSIS wiki code example. Source files are included for compiling the utility. The purpose is to exemplify the use of ${GetSizeOnDisk}, an included macro that returns logical size (size on disk) of folders and files. The tool has an MUI 2 input page and an output page.&lt;/div&gt;</summary>
		<author><name>Bnicer</name></author>
	</entry>
	<entry>
		<id>https://nsis.sourceforge.io/mediawiki/index.php?title=File:SODTool.zip&amp;diff=22984</id>
		<title>File:SODTool.zip</title>
		<link rel="alternate" type="text/html" href="https://nsis.sourceforge.io/mediawiki/index.php?title=File:SODTool.zip&amp;diff=22984"/>
		<updated>2013-02-22T16:08:14Z</updated>

		<summary type="html">&lt;p&gt;Bnicer: uploaded a new version of &amp;amp;quot;File:SODTool.zip&amp;amp;quot;: Stack operations cleaned up. Updated Feb. 22, 2013.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;File attachment for Get size on disk code example. Includes icon, macros header file, nsissize executable, nsissize script. Created Feb. 15, 2013.&lt;/div&gt;</summary>
		<author><name>Bnicer</name></author>
	</entry>
	<entry>
		<id>https://nsis.sourceforge.io/mediawiki/index.php?title=Get_size_on_disk&amp;diff=22946</id>
		<title>Get size on disk</title>
		<link rel="alternate" type="text/html" href="https://nsis.sourceforge.io/mediawiki/index.php?title=Get_size_on_disk&amp;diff=22946"/>
		<updated>2013-02-20T01:55:44Z</updated>

		<summary type="html">&lt;p&gt;Bnicer: Size On Disk (SOD) utility&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PageAuthor|Bnicer}}&lt;br /&gt;
This example code shows you how to get the space used by directories and files.&lt;br /&gt;
&amp;lt;highlight-nsis&amp;gt;&lt;br /&gt;
; A utility for computing the NSIS (or NSIS Unicode) install folder size and the size of&lt;br /&gt;
; the uninstaller&lt;br /&gt;
; nsissize.nsi&lt;br /&gt;
; Compile &amp;amp; run the .exe&lt;br /&gt;
&lt;br /&gt;
Name &amp;quot;SOD Tool&amp;quot;&lt;br /&gt;
RequestExecutionLevel user&lt;br /&gt;
!define LOCAL &amp;quot;&amp;quot; ; Path where local include files reside&lt;br /&gt;
OutFile &amp;quot;${LOCAL}nsissize.exe&amp;quot;&lt;br /&gt;
!include &amp;quot;${LOCAL}macros.nsh&amp;quot;&lt;br /&gt;
ReserveFile &amp;quot;${NSISDIR}\Plugins\Math.dll&amp;quot;&lt;br /&gt;
Icon &amp;quot;${LOCAL}arrows.ico&amp;quot;&lt;br /&gt;
ShowInstDetails show&lt;br /&gt;
&lt;br /&gt;
; Variables&lt;br /&gt;
Var NSIS&lt;br /&gt;
Var COUNT&lt;br /&gt;
Var BLOCK&lt;br /&gt;
Var FILES&lt;br /&gt;
Var FOLDERS&lt;br /&gt;
Var SIZE_B&lt;br /&gt;
Var SIZE_M&lt;br /&gt;
Var SOD_B&lt;br /&gt;
Var SOD_K&lt;br /&gt;
Var SOD_M&lt;br /&gt;
Var SIZE_UN_B&lt;br /&gt;
Var SIZE_UN_K&lt;br /&gt;
Var SOD_UN_B&lt;br /&gt;
Var SOD_UN_K&lt;br /&gt;
&lt;br /&gt;
Function Separator ; comma&lt;br /&gt;
  StrCpy $R2 $R1&lt;br /&gt;
  StrCpy $COUNT &amp;quot;16&amp;quot; ; 1,000,000,000,000,000 limit&lt;br /&gt;
  StrLen $R4 $R1&lt;br /&gt;
  loop:&lt;br /&gt;
  IntCmp $COUNT 3 endloop endloop 0&lt;br /&gt;
  IntCmp $R4 $COUNT 0 +7 0&lt;br /&gt;
  IntOp $COUNT $COUNT - 1&lt;br /&gt;
  StrCpy $R2 $R2 -$COUNT&lt;br /&gt;
  StrCpy $R3 $R1 &amp;quot;&amp;quot; -$COUNT&lt;br /&gt;
  StrCpy $R2 &amp;quot;$R2,$R3&amp;quot;&lt;br /&gt;
  IntOp $COUNT $COUNT - 2&lt;br /&gt;
  Goto loop&lt;br /&gt;
  IntOp $COUNT $COUNT - 3&lt;br /&gt;
  Goto loop&lt;br /&gt;
  endloop:&lt;br /&gt;
FunctionEnd&lt;br /&gt;
&lt;br /&gt;
Section&lt;br /&gt;
; root&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS Unicode&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS ANSI&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  Goto done&lt;br /&gt;
  begin:&lt;br /&gt;
  IfFileExists &amp;quot;$NSIS&amp;quot; 0 done&lt;br /&gt;
  ${GetClusterSize} $BLOCK&lt;br /&gt;
  ${GetSizeOnDisk} &amp;quot;$NSIS&amp;quot; &amp;quot;/S=0B&amp;quot; &amp;quot;&amp;quot; $0 $1 $2 $3&lt;br /&gt;
  Math::Script &amp;quot;r3 = ff($0 / 1024 / 1024.0, 16 +2&amp;quot;&lt;br /&gt;
  StrCpy $SIZE_B $0&lt;br /&gt;
  StrCpy $FILES $1&lt;br /&gt;
  StrCpy $FOLDERS $2&lt;br /&gt;
  StrCpy $SIZE_M $3&lt;br /&gt;
  ${GetSizeOnDisk} &amp;quot;$NSIS&amp;quot; &amp;quot;/S=0B&amp;quot; &amp;quot;$BLOCK&amp;quot; $0 $1 $2 $9&lt;br /&gt;
  Math::Script &amp;quot;r4 = ff($0 / 1024.0, 16 +0); r5 = ff(r4 / 1024.0, 16 +2)&amp;quot;&lt;br /&gt;
  StrCpy $SOD_B $0&lt;br /&gt;
  StrCpy $SOD_K $4&lt;br /&gt;
  StrCpy $SOD_M $5&lt;br /&gt;
; uninstaller&lt;br /&gt;
  IfFileExists &amp;quot;$NSIS\uninst-nsis.exe&amp;quot; 0 done&lt;br /&gt;
  ${GetSizeOnDisk} &amp;quot;$NSIS&amp;quot; &amp;quot;/M=uninst-nsis.exe /S=0B /G=0&amp;quot; &amp;quot;&amp;quot; $0 $1 $2 $3&lt;br /&gt;
  Math::Script &amp;quot;r6 = ff($0 / 1024.0, 16 +1)&amp;quot;&lt;br /&gt;
  StrCpy $SIZE_UN_B $0&lt;br /&gt;
  StrCpy $SIZE_UN_K $6&lt;br /&gt;
  ${GetSizeOnDisk} &amp;quot;$NSIS&amp;quot; &amp;quot;/M=uninst-nsis.exe /S=0B /G=0&amp;quot; &amp;quot;$BLOCK&amp;quot; $0 $1 $2 $3&lt;br /&gt;
  Math::Script &amp;quot;r7 = ff($0 / 1024.0, 16 +1)&amp;quot;&lt;br /&gt;
  StrCpy $SOD_UN_B $0&lt;br /&gt;
  StrCpy $SOD_UN_K $7&lt;br /&gt;
; format&lt;br /&gt;
  StrCpy $R1 $SIZE_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SIZE_B $R2&lt;br /&gt;
&lt;br /&gt;
  StrCpy $R1 $SOD_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SOD_B $R2&lt;br /&gt;
&lt;br /&gt;
  StrCpy $R1 $SOD_K&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SOD_K $R2&lt;br /&gt;
&lt;br /&gt;
  StrCpy $R1 $SIZE_UN_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SIZE_UN_B $R2&lt;br /&gt;
  StrCpy $R1 $SOD_UN_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SOD_UN_B $R2&lt;br /&gt;
; output&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;$NSIS&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;Size: $SIZE_M MB ($SIZE_B bytes)&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;SOD: $SOD_M MB ($SOD_B bytes)&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;Uninstaller&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;Size: $SIZE_UN_K KB ($SIZE_UN_B bytes)&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;SOD: $SOD_UN_K KB ($SOD_UN_B bytes)&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;$FILES files | $FOLDERS folders | $SOD_K Kb | $9 compressed/sparse file(s)&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  Goto completed&lt;br /&gt;
  done:&lt;br /&gt;
  DetailPrint &amp;quot;File not found.&amp;quot;&lt;br /&gt;
  completed:&lt;br /&gt;
SectionEnd&lt;br /&gt;
&lt;br /&gt;
;--------------------------------&lt;br /&gt;
# EOF&lt;br /&gt;
&amp;lt;/highlight-nsis&amp;gt;&lt;br /&gt;
You should copy the next code into a separate file: &amp;lt;b&amp;gt;macros.nsh&amp;lt;/b&amp;gt;.&lt;br /&gt;
&amp;lt;highlight-nsis&amp;gt;&lt;br /&gt;
; Macros include (TN)&lt;br /&gt;
;--------------------------------&lt;br /&gt;
/*&lt;br /&gt;
&lt;br /&gt;
 FileFunction=[GetSizeOnDisk|GetClusterSize]&lt;br /&gt;
&lt;br /&gt;
*/&lt;br /&gt;
;_____________________________________________________________________________&lt;br /&gt;
;&lt;br /&gt;
;                         Macros&lt;br /&gt;
;_____________________________________________________________________________&lt;br /&gt;
;&lt;br /&gt;
; Change log window verbosity (default: 3=no script)&lt;br /&gt;
;&lt;br /&gt;
; Example:&lt;br /&gt;
; !include &amp;quot;macros.nsh&amp;quot;&lt;br /&gt;
; !insertmacro GetSizeOnDisk&lt;br /&gt;
; ${FILEFUNC_VERBOSE} 4   # all verbosity&lt;br /&gt;
; !insertmacro GetClusterSize&lt;br /&gt;
; ${FILEFUNC_VERBOSE} 3   # no script&lt;br /&gt;
&lt;br /&gt;
!include Util.nsh ; for &amp;quot;CallArtificialFunction&amp;quot;&lt;br /&gt;
&lt;br /&gt;
!verbose push&lt;br /&gt;
!verbose 3&lt;br /&gt;
!ifndef _FILEFUNC_VERBOSE&lt;br /&gt;
	!define _FILEFUNC_VERBOSE 3&lt;br /&gt;
!endif&lt;br /&gt;
!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
!define FILEFUNC_VERBOSE `!insertmacro FILEFUNC_VERBOSE`&lt;br /&gt;
!verbose pop&lt;br /&gt;
&lt;br /&gt;
!macro FILEFUNC_VERBOSE _VERBOSE&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose 3&lt;br /&gt;
	!undef _FILEFUNC_VERBOSE&lt;br /&gt;
	!define _FILEFUNC_VERBOSE ${_VERBOSE}&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetSizeOnDiskCall _PATH _OPTIONS _FILESYSTEM _RESULT1 _RESULT2 _RESULT3 _RESULT4&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
	Push `${_PATH}`&lt;br /&gt;
	Push `${_OPTIONS}`&lt;br /&gt;
	Push `${_FILESYSTEM}` ; volume block size&lt;br /&gt;
	${CallArtificialFunction} GetSizeOnDisk_&lt;br /&gt;
	Pop ${_RESULT1}&lt;br /&gt;
	Pop ${_RESULT2}&lt;br /&gt;
	Pop ${_RESULT3}&lt;br /&gt;
	Pop ${_RESULT4}&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetClusterSizeCall _RESULT&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
	${CallArtificialFunction} GetClusterSize_&lt;br /&gt;
	Pop ${_RESULT}&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
; ---------------&lt;br /&gt;
; GetSizeOnDisk (modified &amp;quot;GetSize&amp;quot; - FileFunc.nsh - KiCHiK - Function &amp;quot;FindFiles&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
!define GetSizeOnDisk `!insertmacro GetSizeOnDiskCall`&lt;br /&gt;
!define un.GetSizeOnDisk `!insertmacro GetSizeOnDiskCall`&lt;br /&gt;
&lt;br /&gt;
!macro GetSizeOnDisk&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro un.GetSizeOnDisk&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
; Usage: similar to &amp;quot;GetSize&amp;quot;&lt;br /&gt;
&lt;br /&gt;
; For documentation, see the NSIS user manual: E.1.3 GetSize&lt;br /&gt;
; Four (not three) values are returned&lt;br /&gt;
&lt;br /&gt;
; $var1		; Result1: Size/Size on disk&lt;br /&gt;
; $var2		; Result2: Sum of files&lt;br /&gt;
; $var3		; Result3: Sum of directories&lt;br /&gt;
; $var4		; Result4: Sum of compressed/sparse files&lt;br /&gt;
&lt;br /&gt;
; Example: ${GetSizeOnDisk} &amp;quot;$INSTDIR&amp;quot; &amp;quot;/S=0K&amp;quot; &amp;quot;4096&amp;quot; $0 $1 $2 $3&lt;br /&gt;
; DetailPrint &amp;quot;$1 files | $2 folders | $0 Kb | $3 compressed or sparse file(s)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
; Specifying 4096 (e.g. NTFS block size) toggles the result&lt;br /&gt;
; Output is size on disk, if used, or size, if left empty &amp;quot;&amp;quot;&lt;br /&gt;
; and $var4 (compressed/sparse files) returns 0&lt;br /&gt;
&lt;br /&gt;
!macro GetSizeOnDisk_&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
&lt;br /&gt;
	; replace&lt;br /&gt;
	Exch $R1&lt;br /&gt;
	Exch&lt;br /&gt;
	Exch $1&lt;br /&gt;
	Exch 2&lt;br /&gt;
	; end replace&lt;br /&gt;
	Exch $0&lt;br /&gt;
	Exch&lt;br /&gt;
	Push $2&lt;br /&gt;
	Push $3&lt;br /&gt;
	Push $4&lt;br /&gt;
	Push $5&lt;br /&gt;
	Push $6&lt;br /&gt;
	Push $7&lt;br /&gt;
	Push $8&lt;br /&gt;
	Push $9&lt;br /&gt;
	; insert code&lt;br /&gt;
	Push $R2&lt;br /&gt;
	; end insert&lt;br /&gt;
	Push $R3&lt;br /&gt;
	Push $R4&lt;br /&gt;
	Push $R5&lt;br /&gt;
	Push $R6&lt;br /&gt;
	Push $R7&lt;br /&gt;
	Push $R8&lt;br /&gt;
	Push $R9&lt;br /&gt;
	ClearErrors&lt;br /&gt;
&lt;br /&gt;
	StrCpy $R9 $0 1 -1&lt;br /&gt;
	StrCmp $R9 &#039;\&#039; 0 +3&lt;br /&gt;
	StrCpy $0 $0 -1&lt;br /&gt;
	goto -3&lt;br /&gt;
	IfFileExists &#039;$0\*.*&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
&lt;br /&gt;
	; replace&lt;br /&gt;
	StrCpy $3 0&lt;br /&gt;
	; end replace&lt;br /&gt;
	StrCpy $4 &#039;&#039;&lt;br /&gt;
	StrCpy $5 &#039;&#039;&lt;br /&gt;
	StrCpy $6 &#039;&#039;&lt;br /&gt;
	StrCpy $8 0&lt;br /&gt;
	StrCpy $R3 &#039;&#039;&lt;br /&gt;
	StrCpy $R4 &#039;&#039;&lt;br /&gt;
	StrCpy $R5 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_option:&lt;br /&gt;
	StrCpy $R9 $1 1&lt;br /&gt;
	StrCpy $1 $1 &#039;&#039; 1&lt;br /&gt;
	StrCmp $R9 &#039; &#039; -2&lt;br /&gt;
	StrCmp $R9 &#039;&#039; FileFunc_GetSize_sizeset&lt;br /&gt;
	StrCmp $R9 &#039;/&#039; 0 -4&lt;br /&gt;
&lt;br /&gt;
	StrCpy $9 -1&lt;br /&gt;
	IntOp $9 $9 + 1&lt;br /&gt;
	StrCpy $R9 $1 1 $9&lt;br /&gt;
	StrCmp $R9 &#039;&#039; +2&lt;br /&gt;
	StrCmp $R9 &#039;/&#039; 0 -3&lt;br /&gt;
	StrCpy $8 $1 $9&lt;br /&gt;
	StrCpy $8 $8 &#039;&#039; 2&lt;br /&gt;
	StrCpy $R9 $8 &#039;&#039; -1&lt;br /&gt;
	StrCmp $R9 &#039; &#039; 0 +3&lt;br /&gt;
	StrCpy $8 $8 -1&lt;br /&gt;
	goto -3&lt;br /&gt;
	StrCpy $R9 $1 2&lt;br /&gt;
	StrCpy $1 $1 &#039;&#039; $9&lt;br /&gt;
&lt;br /&gt;
	StrCmp $R9 &#039;M=&#039; 0 FileFunc_GetSize_size&lt;br /&gt;
	StrCpy $4 $8&lt;br /&gt;
	goto FileFunc_GetSize_option&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_size:&lt;br /&gt;
	StrCmp $R9 &#039;S=&#039; 0 FileFunc_GetSize_gotosubdir&lt;br /&gt;
	StrCpy $6 $8&lt;br /&gt;
	goto FileFunc_GetSize_option&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_gotosubdir:&lt;br /&gt;
	StrCmp $R9 &#039;G=&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
	StrCpy $7 $8&lt;br /&gt;
	StrCmp $7 &#039;&#039; +3&lt;br /&gt;
	StrCmp $7 &#039;1&#039; +2&lt;br /&gt;
	StrCmp $7 &#039;0&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
	goto FileFunc_GetSize_option&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_sizeset:&lt;br /&gt;
	StrCmp $6 &#039;&#039; FileFunc_GetSize_default&lt;br /&gt;
	StrCpy $9 0&lt;br /&gt;
	StrCpy $R9 $6 1 $9&lt;br /&gt;
	StrCmp $R9 &#039;&#039; +4&lt;br /&gt;
	StrCmp $R9 &#039;:&#039; +3&lt;br /&gt;
	IntOp $9 $9 + 1&lt;br /&gt;
	goto -4&lt;br /&gt;
	StrCpy $5 $6 $9&lt;br /&gt;
	IntOp $9 $9 + 1&lt;br /&gt;
	StrCpy $1 $6 1 -1&lt;br /&gt;
	StrCpy $6 $6 -1 $9&lt;br /&gt;
	StrCmp $5 &#039;&#039; +2&lt;br /&gt;
	IntOp $5 $5 + 0&lt;br /&gt;
	StrCmp $6 &#039;&#039; +2&lt;br /&gt;
	IntOp $6 $6 + 0&lt;br /&gt;
&lt;br /&gt;
	StrCmp $1 &#039;B&#039; 0 +4&lt;br /&gt;
	StrCpy $1 1&lt;br /&gt;
	StrCpy $2 bytes&lt;br /&gt;
	goto FileFunc_GetSize_default&lt;br /&gt;
	StrCmp $1 &#039;K&#039; 0 +4&lt;br /&gt;
	StrCpy $1 1024&lt;br /&gt;
	StrCpy $2 Kb&lt;br /&gt;
	goto FileFunc_GetSize_default&lt;br /&gt;
	StrCmp $1 &#039;M&#039; 0 +4&lt;br /&gt;
	StrCpy $1 1048576&lt;br /&gt;
	StrCpy $2 Mb&lt;br /&gt;
	goto FileFunc_GetSize_default&lt;br /&gt;
	StrCmp $1 &#039;G&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
	StrCpy $1 1073741824&lt;br /&gt;
	StrCpy $2 Gb&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_default:&lt;br /&gt;
	StrCmp $4 &#039;&#039; 0 +2&lt;br /&gt;
	StrCpy $4 &#039;*.*&#039;&lt;br /&gt;
	StrCmp $7 &#039;&#039; 0 +2&lt;br /&gt;
	StrCpy $7 &#039;1&#039;&lt;br /&gt;
&lt;br /&gt;
	StrCpy $8 1&lt;br /&gt;
	Push $0&lt;br /&gt;
	SetDetailsPrint textonly&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_nextdir:&lt;br /&gt;
	IntOp $8 $8 - 1&lt;br /&gt;
	Pop $R8&lt;br /&gt;
	FindFirst $0 $R7 &#039;$R8\$4&#039;&lt;br /&gt;
	IfErrors FileFunc_GetSize_show&lt;br /&gt;
	StrCmp $R7 &#039;.&#039; 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	StrCmp $R7 &#039;..&#039; 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
	goto FileFunc_GetSize_show&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_dir:&lt;br /&gt;
	IfFileExists &#039;$R8\$R7\*.*&#039; 0 FileFunc_GetSize_file&lt;br /&gt;
	IntOp $R5 $R5 + 1&lt;br /&gt;
	goto FileFunc_GetSize_findnext&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_file:&lt;br /&gt;
	StrCpy $R6 0&lt;br /&gt;
	StrCmp $5$6 &#039;&#039; 0 +3&lt;br /&gt;
	IntOp $R4 $R4 + 1&lt;br /&gt;
	goto FileFunc_GetSize_findnext&lt;br /&gt;
	; insert code&lt;br /&gt;
	StrCmp $R1 &amp;quot;&amp;quot; FileFunc_GetSize_fileopen&lt;br /&gt;
	StrCpy $R0 0&lt;br /&gt;
	System::Call &#039;kernel32::GetFileAttributes(t &amp;quot;$R8\$R7&amp;quot;)i .R2&#039;&lt;br /&gt;
	StrCmp $R2 -1 FileFunc_GetSize_fileopen&lt;br /&gt;
	IntOp $R0 $R2 &amp;amp; 0x0800 ; compressed&lt;br /&gt;
	IntCmp $R0 0 0 0 FileFunc_GetSize_GetCompressed&lt;br /&gt;
	IntOp $R0 $R2 &amp;amp; 0x0200 ; sparse file&lt;br /&gt;
	IntCmp $R0 0 FileFunc_GetSize_fileopen&lt;br /&gt;
	FileFunc_GetSize_GetCompressed:&lt;br /&gt;
	System::Call &#039;kernel32::GetCompressedFileSize(t &amp;quot;$R8\$R7&amp;quot;, i)i .R6&#039;&lt;br /&gt;
	IntCmp $R6 4096 +2 0 +2&lt;br /&gt;
	StrCpy $R6 4096&lt;br /&gt;
	IntOp $3 $3 + 1 ; location contains compressed or sparse files&lt;br /&gt;
	goto FileFunc_GetSize_fileclose&lt;br /&gt;
	FileFunc_GetSize_fileopen:&lt;br /&gt;
	; end insert&lt;br /&gt;
	FileOpen $9 &#039;$R8\$R7&#039; r&lt;br /&gt;
	IfErrors +3&lt;br /&gt;
	FileSeek $9 0 END $R6&lt;br /&gt;
	FileClose $9&lt;br /&gt;
	; insert code&lt;br /&gt;
	FileFunc_GetSize_fileclose:&lt;br /&gt;
	; end insert&lt;br /&gt;
	StrCmp $5 &#039;&#039; +2&lt;br /&gt;
	IntCmp $R6 $5 0 FileFunc_GetSize_findnext&lt;br /&gt;
	StrCmp $6 &#039;&#039; +2&lt;br /&gt;
	IntCmp $R6 $6 0 0 FileFunc_GetSize_findnext&lt;br /&gt;
	IntOp $R4 $R4 + 1&lt;br /&gt;
	; insert code&lt;br /&gt;
	StrCmp $R1 &amp;quot;&amp;quot; FileFunc_GetSize_file_add&lt;br /&gt;
	StrCmp $R0 0 0 FileFunc_GetSize_file_add&lt;br /&gt;
	StrCpy $R0 $R1&lt;br /&gt;
	IntOp $R6 $R6 + $R0&lt;br /&gt;
	IntOp $R1 $R6 % $R0&lt;br /&gt;
	StrCmp $R1 0 0 +2&lt;br /&gt;
	StrCpy $R1 $R0&lt;br /&gt;
	IntOp $R2 $R0 - $R1&lt;br /&gt;
	IntOp $R6 $R6 - $R0&lt;br /&gt;
	IntOp $R6 $R6 + $R2&lt;br /&gt;
	StrCpy $R1 $R0&lt;br /&gt;
	FileFunc_GetSize_file_add:&lt;br /&gt;
	; end insert&lt;br /&gt;
	System::Int64Op $R3 + $R6&lt;br /&gt;
	Pop $R3&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_findnext:&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_show:&lt;br /&gt;
	StrCmp $5$6 &#039;&#039; FileFunc_GetSize_nosize&lt;br /&gt;
	System::Int64Op $R3 / $1&lt;br /&gt;
	Pop $9&lt;br /&gt;
	DetailPrint &#039;Size:$9 $2  Files:$R4  Folders:$R5&#039;&lt;br /&gt;
	goto FileFunc_GetSize_subdir&lt;br /&gt;
	FileFunc_GetSize_nosize:&lt;br /&gt;
	DetailPrint &#039;Files:$R4  Folders:$R5&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_subdir:&lt;br /&gt;
	StrCmp $7 0 FileFunc_GetSize_preend&lt;br /&gt;
	FindFirst $0 $R7 &#039;$R8\*.*&#039;&lt;br /&gt;
	StrCmp $R7 &#039;.&#039; 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	StrCmp $R7 &#039;..&#039; 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
	StrCmp $8 0 FileFunc_GetSize_preend FileFunc_GetSize_nextdir&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_pushdir:&lt;br /&gt;
	IfFileExists &#039;$R8\$R7\*.*&#039; 0 +3&lt;br /&gt;
	Push &#039;$R8\$R7&#039;&lt;br /&gt;
	IntOp $8 $8 + 1&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
	StrCmp $8 0 FileFunc_GetSize_preend FileFunc_GetSize_nextdir&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_preend:&lt;br /&gt;
	StrCmp $R3 &#039;&#039; FileFunc_GetSize_nosizeend&lt;br /&gt;
	System::Int64Op $R3 / $1&lt;br /&gt;
	Pop $R3&lt;br /&gt;
	FileFunc_GetSize_nosizeend:&lt;br /&gt;
	StrCpy $2 $R4&lt;br /&gt;
	StrCpy $1 $R5&lt;br /&gt;
	StrCpy $0 $R3&lt;br /&gt;
	goto FileFunc_GetSize_end&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_error:&lt;br /&gt;
	SetErrors&lt;br /&gt;
	StrCpy $0 &#039;&#039;&lt;br /&gt;
	StrCpy $1 &#039;&#039;&lt;br /&gt;
	StrCpy $2 &#039;&#039;&lt;br /&gt;
	; insert code&lt;br /&gt;
	StrCpy $3 &#039;&#039;&lt;br /&gt;
	; end insert&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_end:&lt;br /&gt;
	SetDetailsPrint both&lt;br /&gt;
	Pop $R9&lt;br /&gt;
	Pop $R8&lt;br /&gt;
	Pop $R7&lt;br /&gt;
	Pop $R6&lt;br /&gt;
	Pop $R5&lt;br /&gt;
	Pop $R4&lt;br /&gt;
	Pop $R3&lt;br /&gt;
	; insert code&lt;br /&gt;
	Pop $R2&lt;br /&gt;
	; end insert&lt;br /&gt;
	Pop $9&lt;br /&gt;
	Pop $8&lt;br /&gt;
	Pop $7&lt;br /&gt;
	Pop $6&lt;br /&gt;
	Pop $5&lt;br /&gt;
	Pop $4&lt;br /&gt;
	; replace&lt;br /&gt;
	Exch $3&lt;br /&gt;
	Exch 3&lt;br /&gt;
	; end replace&lt;br /&gt;
	Exch $2&lt;br /&gt;
	Exch&lt;br /&gt;
	Exch $1&lt;br /&gt;
	Exch 2&lt;br /&gt;
	Exch $0&lt;br /&gt;
&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
; ---------------&lt;br /&gt;
; GetClusterSize&lt;br /&gt;
&lt;br /&gt;
!define GetClusterSize `!insertmacro GetClusterSizeCall`&lt;br /&gt;
!define un.GetClusterSize `!insertmacro GetClusterSizeCall`&lt;br /&gt;
&lt;br /&gt;
!macro GetClusterSize&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro un.GetClusterSize&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetClusterSize_&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
&lt;br /&gt;
	System::Call &#039;kernel32::GetDiskFreeSpace(i0,*i0r0,*i0r1,*i0r2,*i)&#039;&lt;br /&gt;
	IntOp $0 $0 * $1&lt;br /&gt;
	Push $0&lt;br /&gt;
&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/highlight-nsis&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-size: 110%&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Credits:&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;em&amp;gt;GetSizeOnDisk&amp;lt;/em&amp;gt; has been altered slightly and renamed. The original macro is called &amp;lt;em&amp;gt;GetSize&amp;lt;/em&amp;gt;. You will find it in the Users Manual under E.1.3.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-size: 110%&amp;quot;&amp;gt;&amp;lt;b&amp;gt;=== Download ===&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;attach&amp;gt;SODTool.zip&amp;lt;/attach&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Update: Source files are little-endian UCS-2 with BOM encoded and compiled in unicode. An ansi-compiled version didn&#039;t read Russian file names. (20. Feb, 2013)&lt;br /&gt;
[[Category:Code Examples]]&lt;/div&gt;</summary>
		<author><name>Bnicer</name></author>
	</entry>
	<entry>
		<id>https://nsis.sourceforge.io/mediawiki/index.php?title=File:SODTool.zip&amp;diff=22945</id>
		<title>File:SODTool.zip</title>
		<link rel="alternate" type="text/html" href="https://nsis.sourceforge.io/mediawiki/index.php?title=File:SODTool.zip&amp;diff=22945"/>
		<updated>2013-02-20T01:47:26Z</updated>

		<summary type="html">&lt;p&gt;Bnicer: uploaded a new version of &amp;amp;quot;File:SODTool.zip&amp;amp;quot;: Converted to unicode, because ansi couldn&amp;#039;t read some file names. Updated Feb. 20, 2013.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;File attachment for Get size on disk code example. Includes icon, macros header file, nsissize executable, nsissize script. Created Feb. 15, 2013.&lt;/div&gt;</summary>
		<author><name>Bnicer</name></author>
	</entry>
	<entry>
		<id>https://nsis.sourceforge.io/mediawiki/index.php?title=Get_size_on_disk&amp;diff=22942</id>
		<title>Get size on disk</title>
		<link rel="alternate" type="text/html" href="https://nsis.sourceforge.io/mediawiki/index.php?title=Get_size_on_disk&amp;diff=22942"/>
		<updated>2013-02-19T17:28:32Z</updated>

		<summary type="html">&lt;p&gt;Bnicer: Size On Disk (SOD) utility&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PageAuthor|Bnicer}}&lt;br /&gt;
This example code shows you how to get the space used by directories and files.&lt;br /&gt;
&amp;lt;highlight-nsis&amp;gt;&lt;br /&gt;
; A utility for computing the NSIS (or NSIS Unicode) install folder size and the size of&lt;br /&gt;
; the uninstaller&lt;br /&gt;
; nsissize.nsi&lt;br /&gt;
; Compile &amp;amp; run the .exe&lt;br /&gt;
&lt;br /&gt;
Name &amp;quot;SOD Tool&amp;quot;&lt;br /&gt;
RequestExecutionLevel user&lt;br /&gt;
!define LOCAL &amp;quot;&amp;quot; ; Path where local include files reside&lt;br /&gt;
OutFile &amp;quot;${LOCAL}nsissize.exe&amp;quot;&lt;br /&gt;
!include &amp;quot;${LOCAL}macros.nsh&amp;quot;&lt;br /&gt;
ReserveFile &amp;quot;${NSISDIR}\Plugins\Math.dll&amp;quot;&lt;br /&gt;
Icon &amp;quot;${LOCAL}arrows.ico&amp;quot;&lt;br /&gt;
ShowInstDetails show&lt;br /&gt;
&lt;br /&gt;
; Variables&lt;br /&gt;
Var NSIS&lt;br /&gt;
Var COUNT&lt;br /&gt;
Var BLOCK&lt;br /&gt;
Var FILES&lt;br /&gt;
Var FOLDERS&lt;br /&gt;
Var SIZE_B&lt;br /&gt;
Var SIZE_M&lt;br /&gt;
Var SOD_B&lt;br /&gt;
Var SOD_K&lt;br /&gt;
Var SOD_M&lt;br /&gt;
Var SIZE_UN_B&lt;br /&gt;
Var SIZE_UN_K&lt;br /&gt;
Var SOD_UN_B&lt;br /&gt;
Var SOD_UN_K&lt;br /&gt;
&lt;br /&gt;
Function Separator ; comma&lt;br /&gt;
  StrCpy $R2 $R1&lt;br /&gt;
  StrCpy $COUNT &amp;quot;16&amp;quot; ; 1,000,000,000,000,000 limit&lt;br /&gt;
  StrLen $R4 $R1&lt;br /&gt;
  loop:&lt;br /&gt;
  IntCmp $COUNT 3 endloop endloop 0&lt;br /&gt;
  IntCmp $R4 $COUNT 0 +7 0&lt;br /&gt;
  IntOp $COUNT $COUNT - 1&lt;br /&gt;
  StrCpy $R2 $R2 -$COUNT&lt;br /&gt;
  StrCpy $R3 $R1 &amp;quot;&amp;quot; -$COUNT&lt;br /&gt;
  StrCpy $R2 &amp;quot;$R2,$R3&amp;quot;&lt;br /&gt;
  IntOp $COUNT $COUNT - 2&lt;br /&gt;
  Goto loop&lt;br /&gt;
  IntOp $COUNT $COUNT - 3&lt;br /&gt;
  Goto loop&lt;br /&gt;
  endloop:&lt;br /&gt;
FunctionEnd&lt;br /&gt;
&lt;br /&gt;
Section&lt;br /&gt;
; root&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS Unicode&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS ANSI&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  Goto done&lt;br /&gt;
  begin:&lt;br /&gt;
  IfFileExists &amp;quot;$NSIS&amp;quot; 0 done&lt;br /&gt;
  ${GetClusterSize} $BLOCK&lt;br /&gt;
  ${GetSizeOnDisk} &amp;quot;$NSIS&amp;quot; &amp;quot;/S=0B&amp;quot; &amp;quot;&amp;quot; $0 $1 $2 $3&lt;br /&gt;
  Math::Script &amp;quot;r3 = ff($0 / 1024 / 1024.0, 16 +2&amp;quot;&lt;br /&gt;
  StrCpy $SIZE_B $0&lt;br /&gt;
  StrCpy $FILES $1&lt;br /&gt;
  StrCpy $FOLDERS $2&lt;br /&gt;
  StrCpy $SIZE_M $3&lt;br /&gt;
  ${GetSizeOnDisk} &amp;quot;$NSIS&amp;quot; &amp;quot;/S=0B&amp;quot; &amp;quot;$BLOCK&amp;quot; $0 $1 $2 $9&lt;br /&gt;
  Math::Script &amp;quot;r4 = ff($0 / 1024.0, 16 +0); r5 = ff(r4 / 1024.0, 16 +2)&amp;quot;&lt;br /&gt;
  StrCpy $SOD_B $0&lt;br /&gt;
  StrCpy $SOD_K $4&lt;br /&gt;
  StrCpy $SOD_M $5&lt;br /&gt;
; uninstaller&lt;br /&gt;
  IfFileExists &amp;quot;$NSIS\uninst-nsis.exe&amp;quot; 0 done&lt;br /&gt;
  ${GetSizeOnDisk} &amp;quot;$NSIS&amp;quot; &amp;quot;/M=uninst-nsis.exe /S=0B /G=0&amp;quot; &amp;quot;&amp;quot; $0 $1 $2 $3&lt;br /&gt;
  Math::Script &amp;quot;r6 = ff($0 / 1024.0, 16 +1)&amp;quot;&lt;br /&gt;
  StrCpy $SIZE_UN_B $0&lt;br /&gt;
  StrCpy $SIZE_UN_K $6&lt;br /&gt;
  ${GetSizeOnDisk} &amp;quot;$NSIS&amp;quot; &amp;quot;/M=uninst-nsis.exe /S=0B /G=0&amp;quot; &amp;quot;$BLOCK&amp;quot; $0 $1 $2 $3&lt;br /&gt;
  Math::Script &amp;quot;r7 = ff($0 / 1024.0, 16 +1)&amp;quot;&lt;br /&gt;
  StrCpy $SOD_UN_B $0&lt;br /&gt;
  StrCpy $SOD_UN_K $7&lt;br /&gt;
; format&lt;br /&gt;
  StrCpy $R1 $SIZE_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SIZE_B $R2&lt;br /&gt;
&lt;br /&gt;
  StrCpy $R1 $SOD_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SOD_B $R2&lt;br /&gt;
&lt;br /&gt;
  StrCpy $R1 $SOD_K&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SOD_K $R2&lt;br /&gt;
&lt;br /&gt;
  StrCpy $R1 $SIZE_UN_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SIZE_UN_B $R2&lt;br /&gt;
  StrCpy $R1 $SOD_UN_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SOD_UN_B $R2&lt;br /&gt;
; output&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;$NSIS&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;Size: $SIZE_M MB ($SIZE_B bytes)&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;SOD: $SOD_M MB ($SOD_B bytes)&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;Uninstaller&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;Size: $SIZE_UN_K KB ($SIZE_UN_B bytes)&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;SOD: $SOD_UN_K KB ($SOD_UN_B bytes)&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;$FILES files | $FOLDERS folders | $SOD_K Kb | $9 compressed/sparse file(s)&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  Goto completed&lt;br /&gt;
  done:&lt;br /&gt;
  DetailPrint &amp;quot;File not found.&amp;quot;&lt;br /&gt;
  completed:&lt;br /&gt;
SectionEnd&lt;br /&gt;
&lt;br /&gt;
;--------------------------------&lt;br /&gt;
# EOF&lt;br /&gt;
&amp;lt;/highlight-nsis&amp;gt;&lt;br /&gt;
You should copy the next code into a separate file: &amp;lt;b&amp;gt;macros.nsh&amp;lt;/b&amp;gt;.&lt;br /&gt;
&amp;lt;highlight-nsis&amp;gt;&lt;br /&gt;
; Macros include (TN)&lt;br /&gt;
;--------------------------------&lt;br /&gt;
/*&lt;br /&gt;
&lt;br /&gt;
 FileFunction=[GetSizeOnDisk|GetClusterSize]&lt;br /&gt;
&lt;br /&gt;
*/&lt;br /&gt;
;_____________________________________________________________________________&lt;br /&gt;
;&lt;br /&gt;
;                         Macros&lt;br /&gt;
;_____________________________________________________________________________&lt;br /&gt;
;&lt;br /&gt;
; Change log window verbosity (default: 3=no script)&lt;br /&gt;
;&lt;br /&gt;
; Example:&lt;br /&gt;
; !include &amp;quot;macros.nsh&amp;quot;&lt;br /&gt;
; !insertmacro GetSizeOnDisk&lt;br /&gt;
; ${FILEFUNC_VERBOSE} 4   # all verbosity&lt;br /&gt;
; !insertmacro GetClusterSize&lt;br /&gt;
; ${FILEFUNC_VERBOSE} 3   # no script&lt;br /&gt;
&lt;br /&gt;
!include Util.nsh ; for &amp;quot;CallArtificialFunction&amp;quot;&lt;br /&gt;
&lt;br /&gt;
!verbose push&lt;br /&gt;
!verbose 3&lt;br /&gt;
!ifndef _FILEFUNC_VERBOSE&lt;br /&gt;
	!define _FILEFUNC_VERBOSE 3&lt;br /&gt;
!endif&lt;br /&gt;
!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
!define FILEFUNC_VERBOSE `!insertmacro FILEFUNC_VERBOSE`&lt;br /&gt;
!verbose pop&lt;br /&gt;
&lt;br /&gt;
!macro FILEFUNC_VERBOSE _VERBOSE&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose 3&lt;br /&gt;
	!undef _FILEFUNC_VERBOSE&lt;br /&gt;
	!define _FILEFUNC_VERBOSE ${_VERBOSE}&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetSizeOnDiskCall _PATH _OPTIONS _FILESYSTEM _RESULT1 _RESULT2 _RESULT3 _RESULT4&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
	Push `${_PATH}`&lt;br /&gt;
	Push `${_OPTIONS}`&lt;br /&gt;
	Push `${_FILESYSTEM}` ; volume block size&lt;br /&gt;
	${CallArtificialFunction} GetSizeOnDisk_&lt;br /&gt;
	Pop ${_RESULT1}&lt;br /&gt;
	Pop ${_RESULT2}&lt;br /&gt;
	Pop ${_RESULT3}&lt;br /&gt;
	Pop ${_RESULT4}&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetClusterSizeCall _RESULT&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
	${CallArtificialFunction} GetClusterSize_&lt;br /&gt;
	Pop ${_RESULT}&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
; ---------------&lt;br /&gt;
; GetSizeOnDisk (modified &amp;quot;GetSize&amp;quot; - FileFunc.nsh - KiCHiK - Function &amp;quot;FindFiles&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
!define GetSizeOnDisk `!insertmacro GetSizeOnDiskCall`&lt;br /&gt;
!define un.GetSizeOnDisk `!insertmacro GetSizeOnDiskCall`&lt;br /&gt;
&lt;br /&gt;
!macro GetSizeOnDisk&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro un.GetSizeOnDisk&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
; Usage: similar to &amp;quot;GetSize&amp;quot;&lt;br /&gt;
&lt;br /&gt;
; For documentation, see the NSIS user manual: E.1.3 GetSize&lt;br /&gt;
; Four (not three) values are returned&lt;br /&gt;
&lt;br /&gt;
; $var1		; Result1: Size/Size on disk&lt;br /&gt;
; $var2		; Result2: Sum of files&lt;br /&gt;
; $var3		; Result3: Sum of directories&lt;br /&gt;
; $var4		; Result4: Sum of compressed/sparse files&lt;br /&gt;
&lt;br /&gt;
; Example: ${GetSizeOnDisk} &amp;quot;$INSTDIR&amp;quot; &amp;quot;/S=0K&amp;quot; &amp;quot;4096&amp;quot; $0 $1 $2 $3&lt;br /&gt;
; DetailPrint &amp;quot;$1 files | $2 folders | $0 Kb | $3 compressed or sparse file(s)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
; Specifying 4096 (e.g. NTFS block size) toggles the result&lt;br /&gt;
; Output is size on disk, if used, or size, if left empty &amp;quot;&amp;quot;&lt;br /&gt;
; and $var4 (compressed/sparse files) returns 0&lt;br /&gt;
&lt;br /&gt;
!macro GetSizeOnDisk_&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
&lt;br /&gt;
	; replace&lt;br /&gt;
	Exch $R1&lt;br /&gt;
	Exch&lt;br /&gt;
	Exch $1&lt;br /&gt;
	Exch 2&lt;br /&gt;
	; end replace&lt;br /&gt;
	Exch $0&lt;br /&gt;
	Exch&lt;br /&gt;
	Push $2&lt;br /&gt;
	Push $3&lt;br /&gt;
	Push $4&lt;br /&gt;
	Push $5&lt;br /&gt;
	Push $6&lt;br /&gt;
	Push $7&lt;br /&gt;
	Push $8&lt;br /&gt;
	Push $9&lt;br /&gt;
	; insert code&lt;br /&gt;
	Push $R2&lt;br /&gt;
	; end insert&lt;br /&gt;
	Push $R3&lt;br /&gt;
	Push $R4&lt;br /&gt;
	Push $R5&lt;br /&gt;
	Push $R6&lt;br /&gt;
	Push $R7&lt;br /&gt;
	Push $R8&lt;br /&gt;
	Push $R9&lt;br /&gt;
	ClearErrors&lt;br /&gt;
&lt;br /&gt;
	StrCpy $R9 $0 1 -1&lt;br /&gt;
	StrCmp $R9 &#039;\&#039; 0 +3&lt;br /&gt;
	StrCpy $0 $0 -1&lt;br /&gt;
	goto -3&lt;br /&gt;
	IfFileExists &#039;$0\*.*&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
&lt;br /&gt;
	; replace&lt;br /&gt;
	StrCpy $3 0&lt;br /&gt;
	; end replace&lt;br /&gt;
	StrCpy $4 &#039;&#039;&lt;br /&gt;
	StrCpy $5 &#039;&#039;&lt;br /&gt;
	StrCpy $6 &#039;&#039;&lt;br /&gt;
	StrCpy $8 0&lt;br /&gt;
	StrCpy $R3 &#039;&#039;&lt;br /&gt;
	StrCpy $R4 &#039;&#039;&lt;br /&gt;
	StrCpy $R5 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_option:&lt;br /&gt;
	StrCpy $R9 $1 1&lt;br /&gt;
	StrCpy $1 $1 &#039;&#039; 1&lt;br /&gt;
	StrCmp $R9 &#039; &#039; -2&lt;br /&gt;
	StrCmp $R9 &#039;&#039; FileFunc_GetSize_sizeset&lt;br /&gt;
	StrCmp $R9 &#039;/&#039; 0 -4&lt;br /&gt;
&lt;br /&gt;
	StrCpy $9 -1&lt;br /&gt;
	IntOp $9 $9 + 1&lt;br /&gt;
	StrCpy $R9 $1 1 $9&lt;br /&gt;
	StrCmp $R9 &#039;&#039; +2&lt;br /&gt;
	StrCmp $R9 &#039;/&#039; 0 -3&lt;br /&gt;
	StrCpy $8 $1 $9&lt;br /&gt;
	StrCpy $8 $8 &#039;&#039; 2&lt;br /&gt;
	StrCpy $R9 $8 &#039;&#039; -1&lt;br /&gt;
	StrCmp $R9 &#039; &#039; 0 +3&lt;br /&gt;
	StrCpy $8 $8 -1&lt;br /&gt;
	goto -3&lt;br /&gt;
	StrCpy $R9 $1 2&lt;br /&gt;
	StrCpy $1 $1 &#039;&#039; $9&lt;br /&gt;
&lt;br /&gt;
	StrCmp $R9 &#039;M=&#039; 0 FileFunc_GetSize_size&lt;br /&gt;
	StrCpy $4 $8&lt;br /&gt;
	goto FileFunc_GetSize_option&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_size:&lt;br /&gt;
	StrCmp $R9 &#039;S=&#039; 0 FileFunc_GetSize_gotosubdir&lt;br /&gt;
	StrCpy $6 $8&lt;br /&gt;
	goto FileFunc_GetSize_option&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_gotosubdir:&lt;br /&gt;
	StrCmp $R9 &#039;G=&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
	StrCpy $7 $8&lt;br /&gt;
	StrCmp $7 &#039;&#039; +3&lt;br /&gt;
	StrCmp $7 &#039;1&#039; +2&lt;br /&gt;
	StrCmp $7 &#039;0&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
	goto FileFunc_GetSize_option&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_sizeset:&lt;br /&gt;
	StrCmp $6 &#039;&#039; FileFunc_GetSize_default&lt;br /&gt;
	StrCpy $9 0&lt;br /&gt;
	StrCpy $R9 $6 1 $9&lt;br /&gt;
	StrCmp $R9 &#039;&#039; +4&lt;br /&gt;
	StrCmp $R9 &#039;:&#039; +3&lt;br /&gt;
	IntOp $9 $9 + 1&lt;br /&gt;
	goto -4&lt;br /&gt;
	StrCpy $5 $6 $9&lt;br /&gt;
	IntOp $9 $9 + 1&lt;br /&gt;
	StrCpy $1 $6 1 -1&lt;br /&gt;
	StrCpy $6 $6 -1 $9&lt;br /&gt;
	StrCmp $5 &#039;&#039; +2&lt;br /&gt;
	IntOp $5 $5 + 0&lt;br /&gt;
	StrCmp $6 &#039;&#039; +2&lt;br /&gt;
	IntOp $6 $6 + 0&lt;br /&gt;
&lt;br /&gt;
	StrCmp $1 &#039;B&#039; 0 +4&lt;br /&gt;
	StrCpy $1 1&lt;br /&gt;
	StrCpy $2 bytes&lt;br /&gt;
	goto FileFunc_GetSize_default&lt;br /&gt;
	StrCmp $1 &#039;K&#039; 0 +4&lt;br /&gt;
	StrCpy $1 1024&lt;br /&gt;
	StrCpy $2 Kb&lt;br /&gt;
	goto FileFunc_GetSize_default&lt;br /&gt;
	StrCmp $1 &#039;M&#039; 0 +4&lt;br /&gt;
	StrCpy $1 1048576&lt;br /&gt;
	StrCpy $2 Mb&lt;br /&gt;
	goto FileFunc_GetSize_default&lt;br /&gt;
	StrCmp $1 &#039;G&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
	StrCpy $1 1073741824&lt;br /&gt;
	StrCpy $2 Gb&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_default:&lt;br /&gt;
	StrCmp $4 &#039;&#039; 0 +2&lt;br /&gt;
	StrCpy $4 &#039;*.*&#039;&lt;br /&gt;
	StrCmp $7 &#039;&#039; 0 +2&lt;br /&gt;
	StrCpy $7 &#039;1&#039;&lt;br /&gt;
&lt;br /&gt;
	StrCpy $8 1&lt;br /&gt;
	Push $0&lt;br /&gt;
	SetDetailsPrint textonly&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_nextdir:&lt;br /&gt;
	IntOp $8 $8 - 1&lt;br /&gt;
	Pop $R8&lt;br /&gt;
	FindFirst $0 $R7 &#039;$R8\$4&#039;&lt;br /&gt;
	IfErrors FileFunc_GetSize_show&lt;br /&gt;
	StrCmp $R7 &#039;.&#039; 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	StrCmp $R7 &#039;..&#039; 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
	goto FileFunc_GetSize_show&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_dir:&lt;br /&gt;
	IfFileExists &#039;$R8\$R7\*.*&#039; 0 FileFunc_GetSize_file&lt;br /&gt;
	IntOp $R5 $R5 + 1&lt;br /&gt;
	goto FileFunc_GetSize_findnext&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_file:&lt;br /&gt;
	StrCpy $R6 0&lt;br /&gt;
	StrCmp $5$6 &#039;&#039; 0 +3&lt;br /&gt;
	IntOp $R4 $R4 + 1&lt;br /&gt;
	goto FileFunc_GetSize_findnext&lt;br /&gt;
	; insert code&lt;br /&gt;
	StrCmp $R1 &amp;quot;&amp;quot; FileFunc_GetSize_fileopen&lt;br /&gt;
	StrCpy $R0 0&lt;br /&gt;
	System::Call &#039;kernel32::GetFileAttributes(t &amp;quot;$R8\$R7&amp;quot;)i .R2&#039;&lt;br /&gt;
	StrCmp $R2 -1 FileFunc_GetSize_fileopen&lt;br /&gt;
	IntOp $R0 $R2 &amp;amp; 0x0800 ; compressed&lt;br /&gt;
	IntCmp $R0 0 0 0 FileFunc_GetSize_GetCompressed&lt;br /&gt;
	IntOp $R0 $R2 &amp;amp; 0x0200 ; sparse file&lt;br /&gt;
	IntCmp $R0 0 FileFunc_GetSize_fileopen&lt;br /&gt;
	FileFunc_GetSize_GetCompressed:&lt;br /&gt;
	System::Call &#039;kernel32::GetCompressedFileSize(t &amp;quot;$R8\$R7&amp;quot;, i)i .R6&#039;&lt;br /&gt;
	IntCmp $R6 4096 +2 0 +2&lt;br /&gt;
	StrCpy $R6 4096&lt;br /&gt;
	IntOp $3 $3 + 1 ; location contains compressed or sparse files&lt;br /&gt;
	goto FileFunc_GetSize_fileclose&lt;br /&gt;
	FileFunc_GetSize_fileopen:&lt;br /&gt;
	; end insert&lt;br /&gt;
	FileOpen $9 &#039;$R8\$R7&#039; r&lt;br /&gt;
	IfErrors +3&lt;br /&gt;
	FileSeek $9 0 END $R6&lt;br /&gt;
	FileClose $9&lt;br /&gt;
	; insert code&lt;br /&gt;
	FileFunc_GetSize_fileclose:&lt;br /&gt;
	; end insert&lt;br /&gt;
	StrCmp $5 &#039;&#039; +2&lt;br /&gt;
	IntCmp $R6 $5 0 FileFunc_GetSize_findnext&lt;br /&gt;
	StrCmp $6 &#039;&#039; +2&lt;br /&gt;
	IntCmp $R6 $6 0 0 FileFunc_GetSize_findnext&lt;br /&gt;
	IntOp $R4 $R4 + 1&lt;br /&gt;
	; insert code&lt;br /&gt;
	StrCmp $R1 &amp;quot;&amp;quot; FileFunc_GetSize_file_add&lt;br /&gt;
	StrCmp $R0 0 0 FileFunc_GetSize_file_add&lt;br /&gt;
	StrCpy $R0 $R1&lt;br /&gt;
	IntOp $R6 $R6 + $R0&lt;br /&gt;
	IntOp $R1 $R6 % $R0&lt;br /&gt;
	StrCmp $R1 0 0 +2&lt;br /&gt;
	StrCpy $R1 $R0&lt;br /&gt;
	IntOp $R2 $R0 - $R1&lt;br /&gt;
	IntOp $R6 $R6 - $R0&lt;br /&gt;
	IntOp $R6 $R6 + $R2&lt;br /&gt;
	StrCpy $R1 $R0&lt;br /&gt;
	FileFunc_GetSize_file_add:&lt;br /&gt;
	; end insert&lt;br /&gt;
	System::Int64Op $R3 + $R6&lt;br /&gt;
	Pop $R3&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_findnext:&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_show:&lt;br /&gt;
	StrCmp $5$6 &#039;&#039; FileFunc_GetSize_nosize&lt;br /&gt;
	System::Int64Op $R3 / $1&lt;br /&gt;
	Pop $9&lt;br /&gt;
	DetailPrint &#039;Size:$9 $2  Files:$R4  Folders:$R5&#039;&lt;br /&gt;
	goto FileFunc_GetSize_subdir&lt;br /&gt;
	FileFunc_GetSize_nosize:&lt;br /&gt;
	DetailPrint &#039;Files:$R4  Folders:$R5&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_subdir:&lt;br /&gt;
	StrCmp $7 0 FileFunc_GetSize_preend&lt;br /&gt;
	FindFirst $0 $R7 &#039;$R8\*.*&#039;&lt;br /&gt;
	StrCmp $R7 &#039;.&#039; 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	StrCmp $R7 &#039;..&#039; 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
	StrCmp $8 0 FileFunc_GetSize_preend FileFunc_GetSize_nextdir&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_pushdir:&lt;br /&gt;
	IfFileExists &#039;$R8\$R7\*.*&#039; 0 +3&lt;br /&gt;
	Push &#039;$R8\$R7&#039;&lt;br /&gt;
	IntOp $8 $8 + 1&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
	StrCmp $8 0 FileFunc_GetSize_preend FileFunc_GetSize_nextdir&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_preend:&lt;br /&gt;
	StrCmp $R3 &#039;&#039; FileFunc_GetSize_nosizeend&lt;br /&gt;
	System::Int64Op $R3 / $1&lt;br /&gt;
	Pop $R3&lt;br /&gt;
	FileFunc_GetSize_nosizeend:&lt;br /&gt;
	StrCpy $2 $R4&lt;br /&gt;
	StrCpy $1 $R5&lt;br /&gt;
	StrCpy $0 $R3&lt;br /&gt;
	goto FileFunc_GetSize_end&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_error:&lt;br /&gt;
	SetErrors&lt;br /&gt;
	StrCpy $0 &#039;&#039;&lt;br /&gt;
	StrCpy $1 &#039;&#039;&lt;br /&gt;
	StrCpy $2 &#039;&#039;&lt;br /&gt;
	; insert code&lt;br /&gt;
	StrCpy $3 &#039;&#039;&lt;br /&gt;
	; end insert&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_end:&lt;br /&gt;
	SetDetailsPrint both&lt;br /&gt;
	Pop $R9&lt;br /&gt;
	Pop $R8&lt;br /&gt;
	Pop $R7&lt;br /&gt;
	Pop $R6&lt;br /&gt;
	Pop $R5&lt;br /&gt;
	Pop $R4&lt;br /&gt;
	Pop $R3&lt;br /&gt;
	; insert code&lt;br /&gt;
	Pop $R2&lt;br /&gt;
	; end insert&lt;br /&gt;
	Pop $9&lt;br /&gt;
	Pop $8&lt;br /&gt;
	Pop $7&lt;br /&gt;
	Pop $6&lt;br /&gt;
	Pop $5&lt;br /&gt;
	Pop $4&lt;br /&gt;
	; replace&lt;br /&gt;
	Exch $3&lt;br /&gt;
	Exch 3&lt;br /&gt;
	; end replace&lt;br /&gt;
	Exch $2&lt;br /&gt;
	Exch&lt;br /&gt;
	Exch $1&lt;br /&gt;
	Exch 2&lt;br /&gt;
	Exch $0&lt;br /&gt;
&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
; ---------------&lt;br /&gt;
; GetClusterSize&lt;br /&gt;
&lt;br /&gt;
!define GetClusterSize `!insertmacro GetClusterSizeCall`&lt;br /&gt;
!define un.GetClusterSize `!insertmacro GetClusterSizeCall`&lt;br /&gt;
&lt;br /&gt;
!macro GetClusterSize&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro un.GetClusterSize&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetClusterSize_&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
&lt;br /&gt;
	System::Call &#039;kernel32::GetDiskFreeSpace(i0,*i0r0,*i0r1,*i0r2,*i)&#039;&lt;br /&gt;
	IntOp $0 $0 * $1&lt;br /&gt;
	Push $0&lt;br /&gt;
&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/highlight-nsis&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-size: 110%&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Credits:&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;em&amp;gt;GetSizeOnDisk&amp;lt;/em&amp;gt; has been altered slightly and renamed. The original macro is called &amp;lt;em&amp;gt;GetSize&amp;lt;/em&amp;gt;. You will find it in the Users Manual under E.1.3.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-size: 110%&amp;quot;&amp;gt;&amp;lt;b&amp;gt;=== Download ===&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;attach&amp;gt;SODTool.zip&amp;lt;/attach&amp;gt;&lt;br /&gt;
[[Category:Code Examples]]&lt;/div&gt;</summary>
		<author><name>Bnicer</name></author>
	</entry>
	<entry>
		<id>https://nsis.sourceforge.io/mediawiki/index.php?title=File:SODTool.zip&amp;diff=22941</id>
		<title>File:SODTool.zip</title>
		<link rel="alternate" type="text/html" href="https://nsis.sourceforge.io/mediawiki/index.php?title=File:SODTool.zip&amp;diff=22941"/>
		<updated>2013-02-19T17:21:19Z</updated>

		<summary type="html">&lt;p&gt;Bnicer: uploaded a new version of &amp;amp;quot;File:SODTool.zip&amp;amp;quot;: Option to find without subdirectories &amp;#039;/G=0&amp;#039; switch was missing. Change to details view (string), showing &amp;#039;compressed/sparse file(s)&amp;#039;. Updated Feb. 19, 2013.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;File attachment for Get size on disk code example. Includes icon, macros header file, nsissize executable, nsissize script. Created Feb. 15, 2013.&lt;/div&gt;</summary>
		<author><name>Bnicer</name></author>
	</entry>
	<entry>
		<id>https://nsis.sourceforge.io/mediawiki/index.php?title=Get_size_on_disk&amp;diff=22932</id>
		<title>Get size on disk</title>
		<link rel="alternate" type="text/html" href="https://nsis.sourceforge.io/mediawiki/index.php?title=Get_size_on_disk&amp;diff=22932"/>
		<updated>2013-02-18T02:29:19Z</updated>

		<summary type="html">&lt;p&gt;Bnicer: Size On Disk (SOD) utility&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PageAuthor|Bnicer}}&lt;br /&gt;
This example code shows you how to get the space used by directories and files.&lt;br /&gt;
&amp;lt;highlight-nsis&amp;gt;&lt;br /&gt;
; A utility for computing the NSIS (or NSIS Unicode) install folder size and the size of&lt;br /&gt;
; the uninstaller&lt;br /&gt;
; nsissize.nsi&lt;br /&gt;
; Compile &amp;amp; run the .exe&lt;br /&gt;
&lt;br /&gt;
Name &amp;quot;SOD Tool&amp;quot;&lt;br /&gt;
RequestExecutionLevel user&lt;br /&gt;
!define LOCAL &amp;quot;&amp;quot; ; Path where local include files reside&lt;br /&gt;
OutFile &amp;quot;${LOCAL}nsissize.exe&amp;quot;&lt;br /&gt;
!include &amp;quot;${LOCAL}macros.nsh&amp;quot;&lt;br /&gt;
ReserveFile &amp;quot;${NSISDIR}\Plugins\Math.dll&amp;quot;&lt;br /&gt;
Icon &amp;quot;${LOCAL}arrows.ico&amp;quot;&lt;br /&gt;
ShowInstDetails show&lt;br /&gt;
&lt;br /&gt;
; Variables&lt;br /&gt;
Var NSIS&lt;br /&gt;
Var COUNT&lt;br /&gt;
Var BLOCK&lt;br /&gt;
Var FILES&lt;br /&gt;
Var FOLDERS&lt;br /&gt;
Var SIZE_B&lt;br /&gt;
Var SIZE_M&lt;br /&gt;
Var SOD_B&lt;br /&gt;
Var SOD_K&lt;br /&gt;
Var SOD_M&lt;br /&gt;
Var SIZE_UN_B&lt;br /&gt;
Var SIZE_UN_K&lt;br /&gt;
Var SOD_UN_B&lt;br /&gt;
Var SOD_UN_K&lt;br /&gt;
&lt;br /&gt;
Function Separator ; comma&lt;br /&gt;
  StrCpy $R2 $R1&lt;br /&gt;
  StrCpy $COUNT &amp;quot;16&amp;quot; ; 1,000,000,000,000,000 limit&lt;br /&gt;
  StrLen $R4 $R1&lt;br /&gt;
  loop:&lt;br /&gt;
  IntCmp $COUNT 3 endloop endloop 0&lt;br /&gt;
  IntCmp $R4 $COUNT 0 +7 0&lt;br /&gt;
  IntOp $COUNT $COUNT - 1&lt;br /&gt;
  StrCpy $R2 $R2 -$COUNT&lt;br /&gt;
  StrCpy $R3 $R1 &amp;quot;&amp;quot; -$COUNT&lt;br /&gt;
  StrCpy $R2 &amp;quot;$R2,$R3&amp;quot;&lt;br /&gt;
  IntOp $COUNT $COUNT - 2&lt;br /&gt;
  Goto loop&lt;br /&gt;
  IntOp $COUNT $COUNT - 3&lt;br /&gt;
  Goto loop&lt;br /&gt;
  endloop:&lt;br /&gt;
FunctionEnd&lt;br /&gt;
&lt;br /&gt;
Section&lt;br /&gt;
; root&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS Unicode&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS ANSI&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  Goto done&lt;br /&gt;
  begin:&lt;br /&gt;
  IfFileExists &amp;quot;$NSIS&amp;quot; 0 done&lt;br /&gt;
  ${GetClusterSize} $BLOCK&lt;br /&gt;
  ${GetSizeOnDisk} &amp;quot;$NSIS&amp;quot; &amp;quot;/S=0B&amp;quot; &amp;quot;&amp;quot; $0 $1 $2 $3&lt;br /&gt;
  Math::Script &amp;quot;r3 = ff($0 / 1024 / 1024.0, 16 +2&amp;quot;&lt;br /&gt;
  StrCpy $SIZE_B $0&lt;br /&gt;
  StrCpy $FILES $1&lt;br /&gt;
  StrCpy $FOLDERS $2&lt;br /&gt;
  StrCpy $SIZE_M $3&lt;br /&gt;
  ${GetSizeOnDisk} &amp;quot;$NSIS&amp;quot; &amp;quot;/S=0B&amp;quot; &amp;quot;$BLOCK&amp;quot; $0 $1 $2 $3&lt;br /&gt;
  Math::Script &amp;quot;r4 = ff($0 / 1024.0, 16 +0); r5 = ff(r4 / 1024.0, 16 +2)&amp;quot;&lt;br /&gt;
  StrCpy $SOD_B $0&lt;br /&gt;
  StrCpy $SOD_K $4&lt;br /&gt;
  StrCpy $SOD_M $5&lt;br /&gt;
; uninstaller&lt;br /&gt;
  IfFileExists &amp;quot;$NSIS\uninst-nsis.exe&amp;quot; 0 done&lt;br /&gt;
  ${GetSizeOnDisk} &amp;quot;$NSIS&amp;quot; &amp;quot;/M=uninst-nsis.exe /S=0B&amp;quot; &amp;quot;&amp;quot; $0 $1 $2 $3&lt;br /&gt;
  Math::Script &amp;quot;r6 = ff($0 / 1024.0, 16 +1)&amp;quot;&lt;br /&gt;
  StrCpy $SIZE_UN_B $0&lt;br /&gt;
  StrCpy $SIZE_UN_K $6&lt;br /&gt;
  ${GetSizeOnDisk} &amp;quot;$NSIS&amp;quot; &amp;quot;/M=uninst-nsis.exe /S=0B&amp;quot; &amp;quot;$BLOCK&amp;quot; $0 $1 $2 $3&lt;br /&gt;
  Math::Script &amp;quot;r7 = ff($0 / 1024.0, 16 +1)&amp;quot;&lt;br /&gt;
  StrCpy $SOD_UN_B $0&lt;br /&gt;
  StrCpy $SOD_UN_K $7&lt;br /&gt;
; format&lt;br /&gt;
  StrCpy $R1 $SIZE_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SIZE_B $R2&lt;br /&gt;
&lt;br /&gt;
  StrCpy $R1 $SOD_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SOD_B $R2&lt;br /&gt;
&lt;br /&gt;
  StrCpy $R1 $SOD_K&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SOD_K $R2&lt;br /&gt;
&lt;br /&gt;
  StrCpy $R1 $SIZE_UN_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SIZE_UN_B $R2&lt;br /&gt;
  StrCpy $R1 $SOD_UN_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SOD_UN_B $R2&lt;br /&gt;
; output&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;$NSIS&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;Size: $SIZE_M MB ($SIZE_B bytes)&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;SOD: $SOD_M MB ($SOD_B bytes)&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;Uninstaller&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;Size: $SIZE_UN_K KB ($SIZE_UN_B bytes)&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;SOD: $SOD_UN_K KB ($SOD_UN_B bytes)&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;$FILES files $FOLDERS folders $SOD_K Kb&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  Goto completed&lt;br /&gt;
  done:&lt;br /&gt;
  DetailPrint &amp;quot;File not found.&amp;quot;&lt;br /&gt;
  completed:&lt;br /&gt;
SectionEnd&lt;br /&gt;
&lt;br /&gt;
;--------------------------------&lt;br /&gt;
# EOF&lt;br /&gt;
&amp;lt;/highlight-nsis&amp;gt;&lt;br /&gt;
You should copy the next code into a separate file: &amp;lt;b&amp;gt;macros.nsh&amp;lt;/b&amp;gt;.&lt;br /&gt;
&amp;lt;highlight-nsis&amp;gt;&lt;br /&gt;
; Macros include (TN)&lt;br /&gt;
;--------------------------------&lt;br /&gt;
/*&lt;br /&gt;
&lt;br /&gt;
 FileFunction=[GetSizeOnDisk|GetClusterSize]&lt;br /&gt;
&lt;br /&gt;
*/&lt;br /&gt;
;_____________________________________________________________________________&lt;br /&gt;
;&lt;br /&gt;
;                         Macros&lt;br /&gt;
;_____________________________________________________________________________&lt;br /&gt;
;&lt;br /&gt;
; Change log window verbosity (default: 3=no script)&lt;br /&gt;
;&lt;br /&gt;
; Example:&lt;br /&gt;
; !include &amp;quot;macros.nsh&amp;quot;&lt;br /&gt;
; !insertmacro GetSizeOnDisk&lt;br /&gt;
; ${FILEFUNC_VERBOSE} 4   # all verbosity&lt;br /&gt;
; !insertmacro GetClusterSize&lt;br /&gt;
; ${FILEFUNC_VERBOSE} 3   # no script&lt;br /&gt;
&lt;br /&gt;
!include Util.nsh ; for &amp;quot;CallArtificialFunction&amp;quot;&lt;br /&gt;
&lt;br /&gt;
!verbose push&lt;br /&gt;
!verbose 3&lt;br /&gt;
!ifndef _FILEFUNC_VERBOSE&lt;br /&gt;
	!define _FILEFUNC_VERBOSE 3&lt;br /&gt;
!endif&lt;br /&gt;
!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
!define FILEFUNC_VERBOSE `!insertmacro FILEFUNC_VERBOSE`&lt;br /&gt;
!verbose pop&lt;br /&gt;
&lt;br /&gt;
!macro FILEFUNC_VERBOSE _VERBOSE&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose 3&lt;br /&gt;
	!undef _FILEFUNC_VERBOSE&lt;br /&gt;
	!define _FILEFUNC_VERBOSE ${_VERBOSE}&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetSizeOnDiskCall _PATH _OPTIONS _FILESYSTEM _RESULT1 _RESULT2 _RESULT3 _RESULT4&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
	Push `${_PATH}`&lt;br /&gt;
	Push `${_OPTIONS}`&lt;br /&gt;
	Push `${_FILESYSTEM}` ; volume block size&lt;br /&gt;
	${CallArtificialFunction} GetSizeOnDisk_&lt;br /&gt;
	Pop ${_RESULT1}&lt;br /&gt;
	Pop ${_RESULT2}&lt;br /&gt;
	Pop ${_RESULT3}&lt;br /&gt;
	Pop ${_RESULT4}&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetClusterSizeCall _RESULT&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
	${CallArtificialFunction} GetClusterSize_&lt;br /&gt;
	Pop ${_RESULT}&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
; ---------------&lt;br /&gt;
; GetSizeOnDisk (modified &amp;quot;GetSize&amp;quot; - FileFunc.nsh - KiCHiK - Function &amp;quot;FindFiles&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
!define GetSizeOnDisk `!insertmacro GetSizeOnDiskCall`&lt;br /&gt;
!define un.GetSizeOnDisk `!insertmacro GetSizeOnDiskCall`&lt;br /&gt;
&lt;br /&gt;
!macro GetSizeOnDisk&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro un.GetSizeOnDisk&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
; Usage: similar to &amp;quot;GetSize&amp;quot;&lt;br /&gt;
&lt;br /&gt;
; For documentation, see the NSIS user manual: E.1.3 GetSize&lt;br /&gt;
; Four (not three) values are returned&lt;br /&gt;
&lt;br /&gt;
; $var1		; Result1: Size/Size on disk&lt;br /&gt;
; $var2		; Result2: Sum of files&lt;br /&gt;
; $var3		; Result3: Sum of directories&lt;br /&gt;
; $var4		; Result4: Sum of compressed/sparse files&lt;br /&gt;
&lt;br /&gt;
; Example: ${GetSizeOnDisk} &amp;quot;$INSTDIR&amp;quot; &amp;quot;/S=0K&amp;quot; &amp;quot;4096&amp;quot; $0 $1 $2 $3&lt;br /&gt;
; DetailPrint &amp;quot;$1 files | $2 folders | $0 Kb | $3 compressed or sparse file(s)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
; Specifying 4096 (e.g. NTFS block size) toggles the result&lt;br /&gt;
; Output is size on disk, if used, or size, if left empty &amp;quot;&amp;quot;&lt;br /&gt;
; and $var4 (compressed/sparse files) returns 0&lt;br /&gt;
&lt;br /&gt;
!macro GetSizeOnDisk_&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
&lt;br /&gt;
	; replace&lt;br /&gt;
	Exch $R1&lt;br /&gt;
	Exch&lt;br /&gt;
	Exch $1&lt;br /&gt;
	Exch 2&lt;br /&gt;
	; end replace&lt;br /&gt;
	Exch $0&lt;br /&gt;
	Exch&lt;br /&gt;
	Push $2&lt;br /&gt;
	Push $3&lt;br /&gt;
	Push $4&lt;br /&gt;
	Push $5&lt;br /&gt;
	Push $6&lt;br /&gt;
	Push $7&lt;br /&gt;
	Push $8&lt;br /&gt;
	Push $9&lt;br /&gt;
	; insert code&lt;br /&gt;
	Push $R2&lt;br /&gt;
	; end insert&lt;br /&gt;
	Push $R3&lt;br /&gt;
	Push $R4&lt;br /&gt;
	Push $R5&lt;br /&gt;
	Push $R6&lt;br /&gt;
	Push $R7&lt;br /&gt;
	Push $R8&lt;br /&gt;
	Push $R9&lt;br /&gt;
	ClearErrors&lt;br /&gt;
&lt;br /&gt;
	StrCpy $R9 $0 1 -1&lt;br /&gt;
	StrCmp $R9 &#039;\&#039; 0 +3&lt;br /&gt;
	StrCpy $0 $0 -1&lt;br /&gt;
	goto -3&lt;br /&gt;
	IfFileExists &#039;$0\*.*&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
&lt;br /&gt;
	; replace&lt;br /&gt;
	StrCpy $3 0&lt;br /&gt;
	; end replace&lt;br /&gt;
	StrCpy $4 &#039;&#039;&lt;br /&gt;
	StrCpy $5 &#039;&#039;&lt;br /&gt;
	StrCpy $6 &#039;&#039;&lt;br /&gt;
	StrCpy $8 0&lt;br /&gt;
	StrCpy $R3 &#039;&#039;&lt;br /&gt;
	StrCpy $R4 &#039;&#039;&lt;br /&gt;
	StrCpy $R5 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_option:&lt;br /&gt;
	StrCpy $R9 $1 1&lt;br /&gt;
	StrCpy $1 $1 &#039;&#039; 1&lt;br /&gt;
	StrCmp $R9 &#039; &#039; -2&lt;br /&gt;
	StrCmp $R9 &#039;&#039; FileFunc_GetSize_sizeset&lt;br /&gt;
	StrCmp $R9 &#039;/&#039; 0 -4&lt;br /&gt;
&lt;br /&gt;
	StrCpy $9 -1&lt;br /&gt;
	IntOp $9 $9 + 1&lt;br /&gt;
	StrCpy $R9 $1 1 $9&lt;br /&gt;
	StrCmp $R9 &#039;&#039; +2&lt;br /&gt;
	StrCmp $R9 &#039;/&#039; 0 -3&lt;br /&gt;
	StrCpy $8 $1 $9&lt;br /&gt;
	StrCpy $8 $8 &#039;&#039; 2&lt;br /&gt;
	StrCpy $R9 $8 &#039;&#039; -1&lt;br /&gt;
	StrCmp $R9 &#039; &#039; 0 +3&lt;br /&gt;
	StrCpy $8 $8 -1&lt;br /&gt;
	goto -3&lt;br /&gt;
	StrCpy $R9 $1 2&lt;br /&gt;
	StrCpy $1 $1 &#039;&#039; $9&lt;br /&gt;
&lt;br /&gt;
	StrCmp $R9 &#039;M=&#039; 0 FileFunc_GetSize_size&lt;br /&gt;
	StrCpy $4 $8&lt;br /&gt;
	goto FileFunc_GetSize_option&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_size:&lt;br /&gt;
	StrCmp $R9 &#039;S=&#039; 0 FileFunc_GetSize_gotosubdir&lt;br /&gt;
	StrCpy $6 $8&lt;br /&gt;
	goto FileFunc_GetSize_option&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_gotosubdir:&lt;br /&gt;
	StrCmp $R9 &#039;G=&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
	StrCpy $7 $8&lt;br /&gt;
	StrCmp $7 &#039;&#039; +3&lt;br /&gt;
	StrCmp $7 &#039;1&#039; +2&lt;br /&gt;
	StrCmp $7 &#039;0&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
	goto FileFunc_GetSize_option&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_sizeset:&lt;br /&gt;
	StrCmp $6 &#039;&#039; FileFunc_GetSize_default&lt;br /&gt;
	StrCpy $9 0&lt;br /&gt;
	StrCpy $R9 $6 1 $9&lt;br /&gt;
	StrCmp $R9 &#039;&#039; +4&lt;br /&gt;
	StrCmp $R9 &#039;:&#039; +3&lt;br /&gt;
	IntOp $9 $9 + 1&lt;br /&gt;
	goto -4&lt;br /&gt;
	StrCpy $5 $6 $9&lt;br /&gt;
	IntOp $9 $9 + 1&lt;br /&gt;
	StrCpy $1 $6 1 -1&lt;br /&gt;
	StrCpy $6 $6 -1 $9&lt;br /&gt;
	StrCmp $5 &#039;&#039; +2&lt;br /&gt;
	IntOp $5 $5 + 0&lt;br /&gt;
	StrCmp $6 &#039;&#039; +2&lt;br /&gt;
	IntOp $6 $6 + 0&lt;br /&gt;
&lt;br /&gt;
	StrCmp $1 &#039;B&#039; 0 +4&lt;br /&gt;
	StrCpy $1 1&lt;br /&gt;
	StrCpy $2 bytes&lt;br /&gt;
	goto FileFunc_GetSize_default&lt;br /&gt;
	StrCmp $1 &#039;K&#039; 0 +4&lt;br /&gt;
	StrCpy $1 1024&lt;br /&gt;
	StrCpy $2 Kb&lt;br /&gt;
	goto FileFunc_GetSize_default&lt;br /&gt;
	StrCmp $1 &#039;M&#039; 0 +4&lt;br /&gt;
	StrCpy $1 1048576&lt;br /&gt;
	StrCpy $2 Mb&lt;br /&gt;
	goto FileFunc_GetSize_default&lt;br /&gt;
	StrCmp $1 &#039;G&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
	StrCpy $1 1073741824&lt;br /&gt;
	StrCpy $2 Gb&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_default:&lt;br /&gt;
	StrCmp $4 &#039;&#039; 0 +2&lt;br /&gt;
	StrCpy $4 &#039;*.*&#039;&lt;br /&gt;
	StrCmp $7 &#039;&#039; 0 +2&lt;br /&gt;
	StrCpy $7 &#039;1&#039;&lt;br /&gt;
&lt;br /&gt;
	StrCpy $8 1&lt;br /&gt;
	Push $0&lt;br /&gt;
	SetDetailsPrint textonly&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_nextdir:&lt;br /&gt;
	IntOp $8 $8 - 1&lt;br /&gt;
	Pop $R8&lt;br /&gt;
	FindFirst $0 $R7 &#039;$R8\$4&#039;&lt;br /&gt;
	IfErrors FileFunc_GetSize_show&lt;br /&gt;
	StrCmp $R7 &#039;.&#039; 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	StrCmp $R7 &#039;..&#039; 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
	goto FileFunc_GetSize_show&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_dir:&lt;br /&gt;
	IfFileExists &#039;$R8\$R7\*.*&#039; 0 FileFunc_GetSize_file&lt;br /&gt;
	IntOp $R5 $R5 + 1&lt;br /&gt;
	goto FileFunc_GetSize_findnext&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_file:&lt;br /&gt;
	StrCpy $R6 0&lt;br /&gt;
	StrCmp $5$6 &#039;&#039; 0 +3&lt;br /&gt;
	IntOp $R4 $R4 + 1&lt;br /&gt;
	goto FileFunc_GetSize_findnext&lt;br /&gt;
	; insert code&lt;br /&gt;
	StrCmp $R1 &amp;quot;&amp;quot; FileFunc_GetSize_fileopen&lt;br /&gt;
	StrCpy $R0 0&lt;br /&gt;
	System::Call &#039;kernel32::GetFileAttributes(t &amp;quot;$R8\$R7&amp;quot;)i .R2&#039;&lt;br /&gt;
	StrCmp $R2 -1 FileFunc_GetSize_fileopen&lt;br /&gt;
	IntOp $R0 $R2 &amp;amp; 0x0800 ; compressed&lt;br /&gt;
	IntCmp $R0 0 0 0 FileFunc_GetSize_GetCompressed&lt;br /&gt;
	IntOp $R0 $R2 &amp;amp; 0x0200 ; sparse file&lt;br /&gt;
	IntCmp $R0 0 FileFunc_GetSize_fileopen&lt;br /&gt;
	FileFunc_GetSize_GetCompressed:&lt;br /&gt;
	System::Call &#039;kernel32::GetCompressedFileSize(t &amp;quot;$R8\$R7&amp;quot;, i)i .R6&#039;&lt;br /&gt;
	IntCmp $R6 4096 +2 0 +2&lt;br /&gt;
	StrCpy $R6 4096&lt;br /&gt;
	IntOp $3 $3 + 1 ; location contains compressed or sparse files&lt;br /&gt;
	goto FileFunc_GetSize_fileclose&lt;br /&gt;
	FileFunc_GetSize_fileopen:&lt;br /&gt;
	; end insert&lt;br /&gt;
	FileOpen $9 &#039;$R8\$R7&#039; r&lt;br /&gt;
	IfErrors +3&lt;br /&gt;
	FileSeek $9 0 END $R6&lt;br /&gt;
	FileClose $9&lt;br /&gt;
	; insert code&lt;br /&gt;
	FileFunc_GetSize_fileclose:&lt;br /&gt;
	; end insert&lt;br /&gt;
	StrCmp $5 &#039;&#039; +2&lt;br /&gt;
	IntCmp $R6 $5 0 FileFunc_GetSize_findnext&lt;br /&gt;
	StrCmp $6 &#039;&#039; +2&lt;br /&gt;
	IntCmp $R6 $6 0 0 FileFunc_GetSize_findnext&lt;br /&gt;
	IntOp $R4 $R4 + 1&lt;br /&gt;
	; insert code&lt;br /&gt;
	StrCmp $R1 &amp;quot;&amp;quot; FileFunc_GetSize_file_add&lt;br /&gt;
	StrCmp $R0 0 0 FileFunc_GetSize_file_add&lt;br /&gt;
	StrCpy $R0 $R1&lt;br /&gt;
	IntOp $R6 $R6 + $R0&lt;br /&gt;
	IntOp $R1 $R6 % $R0&lt;br /&gt;
	StrCmp $R1 0 0 +2&lt;br /&gt;
	StrCpy $R1 $R0&lt;br /&gt;
	IntOp $R2 $R0 - $R1&lt;br /&gt;
	IntOp $R6 $R6 - $R0&lt;br /&gt;
	IntOp $R6 $R6 + $R2&lt;br /&gt;
	StrCpy $R1 $R0&lt;br /&gt;
	FileFunc_GetSize_file_add:&lt;br /&gt;
	; end insert&lt;br /&gt;
	System::Int64Op $R3 + $R6&lt;br /&gt;
	Pop $R3&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_findnext:&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_show:&lt;br /&gt;
	StrCmp $5$6 &#039;&#039; FileFunc_GetSize_nosize&lt;br /&gt;
	System::Int64Op $R3 / $1&lt;br /&gt;
	Pop $9&lt;br /&gt;
	DetailPrint &#039;Size:$9 $2  Files:$R4  Folders:$R5&#039;&lt;br /&gt;
	goto FileFunc_GetSize_subdir&lt;br /&gt;
	FileFunc_GetSize_nosize:&lt;br /&gt;
	DetailPrint &#039;Files:$R4  Folders:$R5&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_subdir:&lt;br /&gt;
	StrCmp $7 0 FileFunc_GetSize_preend&lt;br /&gt;
	FindFirst $0 $R7 &#039;$R8\*.*&#039;&lt;br /&gt;
	StrCmp $R7 &#039;.&#039; 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	StrCmp $R7 &#039;..&#039; 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
	StrCmp $8 0 FileFunc_GetSize_preend FileFunc_GetSize_nextdir&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_pushdir:&lt;br /&gt;
	IfFileExists &#039;$R8\$R7\*.*&#039; 0 +3&lt;br /&gt;
	Push &#039;$R8\$R7&#039;&lt;br /&gt;
	IntOp $8 $8 + 1&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
	StrCmp $8 0 FileFunc_GetSize_preend FileFunc_GetSize_nextdir&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_preend:&lt;br /&gt;
	StrCmp $R3 &#039;&#039; FileFunc_GetSize_nosizeend&lt;br /&gt;
	System::Int64Op $R3 / $1&lt;br /&gt;
	Pop $R3&lt;br /&gt;
	FileFunc_GetSize_nosizeend:&lt;br /&gt;
	StrCpy $2 $R4&lt;br /&gt;
	StrCpy $1 $R5&lt;br /&gt;
	StrCpy $0 $R3&lt;br /&gt;
	goto FileFunc_GetSize_end&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_error:&lt;br /&gt;
	SetErrors&lt;br /&gt;
	StrCpy $0 &#039;&#039;&lt;br /&gt;
	StrCpy $1 &#039;&#039;&lt;br /&gt;
	StrCpy $2 &#039;&#039;&lt;br /&gt;
	; insert code&lt;br /&gt;
	StrCpy $3 &#039;&#039;&lt;br /&gt;
	; end insert&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_end:&lt;br /&gt;
	SetDetailsPrint both&lt;br /&gt;
	Pop $R9&lt;br /&gt;
	Pop $R8&lt;br /&gt;
	Pop $R7&lt;br /&gt;
	Pop $R6&lt;br /&gt;
	Pop $R5&lt;br /&gt;
	Pop $R4&lt;br /&gt;
	Pop $R3&lt;br /&gt;
	; insert code&lt;br /&gt;
	Pop $R2&lt;br /&gt;
	; end insert&lt;br /&gt;
	Pop $9&lt;br /&gt;
	Pop $8&lt;br /&gt;
	Pop $7&lt;br /&gt;
	Pop $6&lt;br /&gt;
	Pop $5&lt;br /&gt;
	Pop $4&lt;br /&gt;
	; replace&lt;br /&gt;
	Exch $3&lt;br /&gt;
	Exch 3&lt;br /&gt;
	; end replace&lt;br /&gt;
	Exch $2&lt;br /&gt;
	Exch&lt;br /&gt;
	Exch $1&lt;br /&gt;
	Exch 2&lt;br /&gt;
	Exch $0&lt;br /&gt;
&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
; ---------------&lt;br /&gt;
; GetClusterSize&lt;br /&gt;
&lt;br /&gt;
!define GetClusterSize `!insertmacro GetClusterSizeCall`&lt;br /&gt;
!define un.GetClusterSize `!insertmacro GetClusterSizeCall`&lt;br /&gt;
&lt;br /&gt;
!macro GetClusterSize&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro un.GetClusterSize&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetClusterSize_&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
&lt;br /&gt;
	System::Call &#039;kernel32::GetDiskFreeSpace(i0,*i0r0,*i0r1,*i0r2,*i)&#039;&lt;br /&gt;
	IntOp $0 $0 * $1&lt;br /&gt;
	Push $0&lt;br /&gt;
&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/highlight-nsis&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-size: 110%&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Credits:&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;em&amp;gt;GetSizeOnDisk&amp;lt;/em&amp;gt; has been altered slightly and renamed. The original macro is called &amp;lt;em&amp;gt;GetSize&amp;lt;/em&amp;gt;. You will find it in the Users Manual under E.1.3.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-size: 110%&amp;quot;&amp;gt;&amp;lt;b&amp;gt;=== Download ===&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;attach&amp;gt;SODTool.zip&amp;lt;/attach&amp;gt;&lt;br /&gt;
[[Category:Code Examples]]&lt;/div&gt;</summary>
		<author><name>Bnicer</name></author>
	</entry>
	<entry>
		<id>https://nsis.sourceforge.io/mediawiki/index.php?title=File:SODTool.zip&amp;diff=22931</id>
		<title>File:SODTool.zip</title>
		<link rel="alternate" type="text/html" href="https://nsis.sourceforge.io/mediawiki/index.php?title=File:SODTool.zip&amp;diff=22931"/>
		<updated>2013-02-18T02:15:00Z</updated>

		<summary type="html">&lt;p&gt;Bnicer: uploaded a new version of &amp;amp;quot;File:SODTool.zip&amp;amp;quot;: Optional parameter for counting compressed/sparse files added. Updated Feb. 18, 2013&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;File attachment for Get size on disk code example. Includes icon, macros header file, nsissize executable, nsissize script. Created Feb. 15, 2013.&lt;/div&gt;</summary>
		<author><name>Bnicer</name></author>
	</entry>
	<entry>
		<id>https://nsis.sourceforge.io/mediawiki/index.php?title=File:SODTool.zip&amp;diff=22928</id>
		<title>File:SODTool.zip</title>
		<link rel="alternate" type="text/html" href="https://nsis.sourceforge.io/mediawiki/index.php?title=File:SODTool.zip&amp;diff=22928"/>
		<updated>2013-02-17T13:24:05Z</updated>

		<summary type="html">&lt;p&gt;Bnicer: uploaded a new version of &amp;amp;quot;File:SODTool.zip&amp;amp;quot;: Unnecessary Wow6432Node registry searches taken out. Updated 17. Feb. 2013&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;File attachment for Get size on disk code example. Includes icon, macros header file, nsissize executable, nsissize script. Created Feb. 15, 2013.&lt;/div&gt;</summary>
		<author><name>Bnicer</name></author>
	</entry>
	<entry>
		<id>https://nsis.sourceforge.io/mediawiki/index.php?title=Get_size_on_disk&amp;diff=22927</id>
		<title>Get size on disk</title>
		<link rel="alternate" type="text/html" href="https://nsis.sourceforge.io/mediawiki/index.php?title=Get_size_on_disk&amp;diff=22927"/>
		<updated>2013-02-17T13:18:23Z</updated>

		<summary type="html">&lt;p&gt;Bnicer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PageAuthor|Bnicer}}&lt;br /&gt;
This example code shows you how to get the space used by directories and files.&lt;br /&gt;
&amp;lt;highlight-nsis&amp;gt;&lt;br /&gt;
; A utility for computing the NSIS (or NSIS Unicode) install folder size and the size of&lt;br /&gt;
; the uninstaller&lt;br /&gt;
; nsissize.nsi&lt;br /&gt;
; Compile &amp;amp; run the .exe&lt;br /&gt;
&lt;br /&gt;
Name &amp;quot;SOD Tool&amp;quot;&lt;br /&gt;
RequestExecutionLevel user&lt;br /&gt;
!define LOCAL &amp;quot;&amp;quot; ; Path where local include files reside&lt;br /&gt;
OutFile &amp;quot;${LOCAL}nsissize.exe&amp;quot;&lt;br /&gt;
!include &amp;quot;${LOCAL}macros.nsh&amp;quot;&lt;br /&gt;
ReserveFile &amp;quot;${NSISDIR}\Plugins\Math.dll&amp;quot;&lt;br /&gt;
Icon &amp;quot;${LOCAL}arrows.ico&amp;quot;&lt;br /&gt;
ShowInstDetails show&lt;br /&gt;
&lt;br /&gt;
; Variables&lt;br /&gt;
Var NSIS&lt;br /&gt;
Var COUNT&lt;br /&gt;
Var BLOCK&lt;br /&gt;
Var FILES&lt;br /&gt;
Var FOLDERS&lt;br /&gt;
Var SIZE_B&lt;br /&gt;
Var SIZE_M&lt;br /&gt;
Var SOD_B&lt;br /&gt;
Var SOD_K&lt;br /&gt;
Var SOD_M&lt;br /&gt;
Var SIZE_UN_B&lt;br /&gt;
Var SIZE_UN_K&lt;br /&gt;
Var SOD_UN_B&lt;br /&gt;
Var SOD_UN_K&lt;br /&gt;
&lt;br /&gt;
Function Separator ; comma&lt;br /&gt;
  StrCpy $R2 $R1&lt;br /&gt;
  StrCpy $COUNT &amp;quot;16&amp;quot; ; 1,000,000,000,000,000 limit&lt;br /&gt;
  StrLen $R4 $R1&lt;br /&gt;
  loop:&lt;br /&gt;
  IntCmp $COUNT 3 endloop endloop 0&lt;br /&gt;
  IntCmp $R4 $COUNT 0 +7 0&lt;br /&gt;
  IntOp $COUNT $COUNT - 1&lt;br /&gt;
  StrCpy $R2 $R2 -$COUNT&lt;br /&gt;
  StrCpy $R3 $R1 &amp;quot;&amp;quot; -$COUNT&lt;br /&gt;
  StrCpy $R2 &amp;quot;$R2,$R3&amp;quot;&lt;br /&gt;
  IntOp $COUNT $COUNT - 2&lt;br /&gt;
  Goto loop&lt;br /&gt;
  IntOp $COUNT $COUNT - 3&lt;br /&gt;
  Goto loop&lt;br /&gt;
  endloop:&lt;br /&gt;
FunctionEnd&lt;br /&gt;
&lt;br /&gt;
Section&lt;br /&gt;
; root&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS Unicode&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS ANSI&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  Goto done&lt;br /&gt;
  begin:&lt;br /&gt;
  IfFileExists &amp;quot;$NSIS&amp;quot; 0 done&lt;br /&gt;
  ${GetClusterSize} $BLOCK&lt;br /&gt;
  ${GetSizeOnDisk} &amp;quot;$NSIS&amp;quot; &amp;quot;/S=0B&amp;quot; &amp;quot;&amp;quot; $0 $1 $2&lt;br /&gt;
  Math::Script &amp;quot;r3 = ff($0 / 1024 / 1024.0, 16 +2&amp;quot;&lt;br /&gt;
  StrCpy $SIZE_B $0&lt;br /&gt;
  StrCpy $FILES $1&lt;br /&gt;
  StrCpy $FOLDERS $2&lt;br /&gt;
  StrCpy $SIZE_M $3&lt;br /&gt;
  ${GetSizeOnDisk} &amp;quot;$NSIS&amp;quot; &amp;quot;/S=0B&amp;quot; &amp;quot;$BLOCK&amp;quot; $0 $1 $2&lt;br /&gt;
  Math::Script &amp;quot;r4 = ff($0 / 1024.0, 16 +0); r5 = ff(r4 / 1024.0, 16 +2)&amp;quot;&lt;br /&gt;
  StrCpy $SOD_B $0&lt;br /&gt;
  StrCpy $SOD_K $4&lt;br /&gt;
  StrCpy $SOD_M $5&lt;br /&gt;
; uninstaller&lt;br /&gt;
  IfFileExists &amp;quot;$NSIS\uninst-nsis.exe&amp;quot; 0 done&lt;br /&gt;
  ${GetSizeOnDisk} &amp;quot;$NSIS&amp;quot; &amp;quot;/M=uninst-nsis.exe /S=0B&amp;quot; &amp;quot;&amp;quot; $0 $1 $2&lt;br /&gt;
  Math::Script &amp;quot;r6 = ff($0 / 1024.0, 16 +1)&amp;quot;&lt;br /&gt;
  StrCpy $SIZE_UN_B $0&lt;br /&gt;
  StrCpy $SIZE_UN_K $6&lt;br /&gt;
  ${GetSizeOnDisk} &amp;quot;$NSIS&amp;quot; &amp;quot;/M=uninst-nsis.exe /S=0B&amp;quot; &amp;quot;$BLOCK&amp;quot; $0 $1 $2&lt;br /&gt;
  Math::Script &amp;quot;r7 = ff($0 / 1024.0, 16 +1)&amp;quot;&lt;br /&gt;
  StrCpy $SOD_UN_B $0&lt;br /&gt;
  StrCpy $SOD_UN_K $7&lt;br /&gt;
; format&lt;br /&gt;
  StrCpy $R1 $SIZE_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SIZE_B $R2&lt;br /&gt;
&lt;br /&gt;
  StrCpy $R1 $SOD_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SOD_B $R2&lt;br /&gt;
&lt;br /&gt;
  StrCpy $R1 $SOD_K&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SOD_K $R2&lt;br /&gt;
&lt;br /&gt;
  StrCpy $R1 $SIZE_UN_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SIZE_UN_B $R2&lt;br /&gt;
  StrCpy $R1 $SOD_UN_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SOD_UN_B $R2&lt;br /&gt;
; output&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;$NSIS&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;Size: $SIZE_M MB ($SIZE_B bytes)&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;SOD: $SOD_M MB ($SOD_B bytes)&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;Uninstaller&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;Size: $SIZE_UN_K KB ($SIZE_UN_B bytes)&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;SOD: $SOD_UN_K KB ($SOD_UN_B bytes)&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;$FILES files $FOLDERS folders $SOD_K Kb&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  Goto completed&lt;br /&gt;
  done:&lt;br /&gt;
  DetailPrint &amp;quot;File not found.&amp;quot;&lt;br /&gt;
  completed:&lt;br /&gt;
SectionEnd&lt;br /&gt;
&lt;br /&gt;
;--------------------------------&lt;br /&gt;
# EOF&lt;br /&gt;
&amp;lt;/highlight-nsis&amp;gt;&lt;br /&gt;
You should copy the next code into a separate file: &amp;lt;b&amp;gt;macros.nsh&amp;lt;/b&amp;gt;.&lt;br /&gt;
&amp;lt;highlight-nsis&amp;gt;&lt;br /&gt;
; Macros include (TN)&lt;br /&gt;
;--------------------------------&lt;br /&gt;
/*&lt;br /&gt;
&lt;br /&gt;
 FileFunction=[GetSizeOnDisk|GetClusterSize]&lt;br /&gt;
&lt;br /&gt;
*/&lt;br /&gt;
;_____________________________________________________________________________&lt;br /&gt;
;&lt;br /&gt;
;                         Macros&lt;br /&gt;
;_____________________________________________________________________________&lt;br /&gt;
;&lt;br /&gt;
; Change log window verbosity (default: 3=no script)&lt;br /&gt;
;&lt;br /&gt;
; Example:&lt;br /&gt;
; !include &amp;quot;macros.nsh&amp;quot;&lt;br /&gt;
; !insertmacro GetSizeOnDisk&lt;br /&gt;
; ${FILEFUNC_VERBOSE} 4   # all verbosity&lt;br /&gt;
; !insertmacro GetClusterSize&lt;br /&gt;
; ${FILEFUNC_VERBOSE} 3   # no script&lt;br /&gt;
&lt;br /&gt;
!include Util.nsh ; for &amp;quot;CallArtificialFunction&amp;quot;&lt;br /&gt;
&lt;br /&gt;
!verbose push&lt;br /&gt;
!verbose 3&lt;br /&gt;
!ifndef _FILEFUNC_VERBOSE&lt;br /&gt;
	!define _FILEFUNC_VERBOSE 3&lt;br /&gt;
!endif&lt;br /&gt;
!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
!define FILEFUNC_VERBOSE `!insertmacro FILEFUNC_VERBOSE`&lt;br /&gt;
!verbose pop&lt;br /&gt;
&lt;br /&gt;
!macro FILEFUNC_VERBOSE _VERBOSE&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose 3&lt;br /&gt;
	!undef _FILEFUNC_VERBOSE&lt;br /&gt;
	!define _FILEFUNC_VERBOSE ${_VERBOSE}&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetSizeOnDiskCall _PATH _OPTIONS _FILESYSTEM _RESULT1 _RESULT2 _RESULT3&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
	Push `${_PATH}`&lt;br /&gt;
	Push `${_OPTIONS}`&lt;br /&gt;
	Push `${_FILESYSTEM}` ; block size&lt;br /&gt;
	${CallArtificialFunction} GetSizeOnDisk_&lt;br /&gt;
	Pop ${_RESULT1}&lt;br /&gt;
	Pop ${_RESULT2}&lt;br /&gt;
	Pop ${_RESULT3}&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetClusterSizeCall _RESULT&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
	${CallArtificialFunction} GetClusterSize_&lt;br /&gt;
	Pop ${_RESULT}&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
; ---------------&lt;br /&gt;
; GetSizeOnDisk (modified &amp;quot;GetSize&amp;quot; - FileFunc.nsh - KiCHiK - Function &amp;quot;FindFiles&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
!define GetSizeOnDisk `!insertmacro GetSizeOnDiskCall`&lt;br /&gt;
!define un.GetSizeOnDisk `!insertmacro GetSizeOnDiskCall`&lt;br /&gt;
&lt;br /&gt;
!macro GetSizeOnDisk&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro un.GetSizeOnDisk&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
; Usage: similar to &amp;quot;GetSize&amp;quot;&lt;br /&gt;
&lt;br /&gt;
; For documentation, see the NSIS user manual: E.1.3 GetSize&lt;br /&gt;
; Three values are returned&lt;br /&gt;
&lt;br /&gt;
; $var1		; Result1: Size/Size on disk&lt;br /&gt;
; $var2		; Result2: Sum of files&lt;br /&gt;
; $var3		; Result3: Sum of directories&lt;br /&gt;
&lt;br /&gt;
; Example: ${GetSizeOnDisk} &amp;quot;$INSTDIR&amp;quot; &amp;quot;/S=0K&amp;quot; &amp;quot;4096&amp;quot; $0 $1 $2&lt;br /&gt;
&lt;br /&gt;
; Specifying 4096 (logical size) toggles the result&lt;br /&gt;
; Output is size on disk, if used, or size in bytes, if left empty &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
!macro GetSizeOnDisk_&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
&lt;br /&gt;
	; replace&lt;br /&gt;
	Exch $R1&lt;br /&gt;
	Exch&lt;br /&gt;
	Exch $1&lt;br /&gt;
	Exch 2&lt;br /&gt;
	; end replace&lt;br /&gt;
	Exch $0&lt;br /&gt;
	Exch&lt;br /&gt;
	Push $2&lt;br /&gt;
	Push $3&lt;br /&gt;
	Push $4&lt;br /&gt;
	Push $5&lt;br /&gt;
	Push $6&lt;br /&gt;
	Push $7&lt;br /&gt;
	Push $8&lt;br /&gt;
	Push $9&lt;br /&gt;
	; insert code&lt;br /&gt;
	Push $R2&lt;br /&gt;
	; end insert&lt;br /&gt;
	Push $R3&lt;br /&gt;
	Push $R4&lt;br /&gt;
	Push $R5&lt;br /&gt;
	Push $R6&lt;br /&gt;
	Push $R7&lt;br /&gt;
	Push $R8&lt;br /&gt;
	Push $R9&lt;br /&gt;
	ClearErrors&lt;br /&gt;
&lt;br /&gt;
	StrCpy $R9 $0 1 -1&lt;br /&gt;
	StrCmp $R9 &#039;\&#039; 0 +3&lt;br /&gt;
	StrCpy $0 $0 -1&lt;br /&gt;
	goto -3&lt;br /&gt;
	IfFileExists &#039;$0\*.*&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
&lt;br /&gt;
	StrCpy $3 &#039;&#039;&lt;br /&gt;
	StrCpy $4 &#039;&#039;&lt;br /&gt;
	StrCpy $5 &#039;&#039;&lt;br /&gt;
	StrCpy $6 &#039;&#039;&lt;br /&gt;
	StrCpy $8 0&lt;br /&gt;
	StrCpy $R3 &#039;&#039;&lt;br /&gt;
	StrCpy $R4 &#039;&#039;&lt;br /&gt;
	StrCpy $R5 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_option:&lt;br /&gt;
	StrCpy $R9 $1 1&lt;br /&gt;
	StrCpy $1 $1 &#039;&#039; 1&lt;br /&gt;
	StrCmp $R9 &#039; &#039; -2&lt;br /&gt;
	StrCmp $R9 &#039;&#039; FileFunc_GetSize_sizeset&lt;br /&gt;
	StrCmp $R9 &#039;/&#039; 0 -4&lt;br /&gt;
&lt;br /&gt;
	StrCpy $9 -1&lt;br /&gt;
	IntOp $9 $9 + 1&lt;br /&gt;
	StrCpy $R9 $1 1 $9&lt;br /&gt;
	StrCmp $R9 &#039;&#039; +2&lt;br /&gt;
	StrCmp $R9 &#039;/&#039; 0 -3&lt;br /&gt;
	StrCpy $8 $1 $9&lt;br /&gt;
	StrCpy $8 $8 &#039;&#039; 2&lt;br /&gt;
	StrCpy $R9 $8 &#039;&#039; -1&lt;br /&gt;
	StrCmp $R9 &#039; &#039; 0 +3&lt;br /&gt;
	StrCpy $8 $8 -1&lt;br /&gt;
	goto -3&lt;br /&gt;
	StrCpy $R9 $1 2&lt;br /&gt;
	StrCpy $1 $1 &#039;&#039; $9&lt;br /&gt;
&lt;br /&gt;
	StrCmp $R9 &#039;M=&#039; 0 FileFunc_GetSize_size&lt;br /&gt;
	StrCpy $4 $8&lt;br /&gt;
	goto FileFunc_GetSize_option&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_size:&lt;br /&gt;
	StrCmp $R9 &#039;S=&#039; 0 FileFunc_GetSize_gotosubdir&lt;br /&gt;
	StrCpy $6 $8&lt;br /&gt;
	goto FileFunc_GetSize_option&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_gotosubdir:&lt;br /&gt;
	StrCmp $R9 &#039;G=&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
	StrCpy $7 $8&lt;br /&gt;
	StrCmp $7 &#039;&#039; +3&lt;br /&gt;
	StrCmp $7 &#039;1&#039; +2&lt;br /&gt;
	StrCmp $7 &#039;0&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
	goto FileFunc_GetSize_option&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_sizeset:&lt;br /&gt;
	StrCmp $6 &#039;&#039; FileFunc_GetSize_default&lt;br /&gt;
	StrCpy $9 0&lt;br /&gt;
	StrCpy $R9 $6 1 $9&lt;br /&gt;
	StrCmp $R9 &#039;&#039; +4&lt;br /&gt;
	StrCmp $R9 &#039;:&#039; +3&lt;br /&gt;
	IntOp $9 $9 + 1&lt;br /&gt;
	goto -4&lt;br /&gt;
	StrCpy $5 $6 $9&lt;br /&gt;
	IntOp $9 $9 + 1&lt;br /&gt;
	StrCpy $1 $6 1 -1&lt;br /&gt;
	StrCpy $6 $6 -1 $9&lt;br /&gt;
	StrCmp $5 &#039;&#039; +2&lt;br /&gt;
	IntOp $5 $5 + 0&lt;br /&gt;
	StrCmp $6 &#039;&#039; +2&lt;br /&gt;
	IntOp $6 $6 + 0&lt;br /&gt;
&lt;br /&gt;
	StrCmp $1 &#039;B&#039; 0 +4&lt;br /&gt;
	StrCpy $1 1&lt;br /&gt;
	StrCpy $2 bytes&lt;br /&gt;
	goto FileFunc_GetSize_default&lt;br /&gt;
	StrCmp $1 &#039;K&#039; 0 +4&lt;br /&gt;
	StrCpy $1 1024&lt;br /&gt;
	StrCpy $2 Kb&lt;br /&gt;
	goto FileFunc_GetSize_default&lt;br /&gt;
	StrCmp $1 &#039;M&#039; 0 +4&lt;br /&gt;
	StrCpy $1 1048576&lt;br /&gt;
	StrCpy $2 Mb&lt;br /&gt;
	goto FileFunc_GetSize_default&lt;br /&gt;
	StrCmp $1 &#039;G&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
	StrCpy $1 1073741824&lt;br /&gt;
	StrCpy $2 Gb&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_default:&lt;br /&gt;
	StrCmp $4 &#039;&#039; 0 +2&lt;br /&gt;
	StrCpy $4 &#039;*.*&#039;&lt;br /&gt;
	StrCmp $7 &#039;&#039; 0 +2&lt;br /&gt;
	StrCpy $7 &#039;1&#039;&lt;br /&gt;
&lt;br /&gt;
	StrCpy $8 1&lt;br /&gt;
	Push $0&lt;br /&gt;
	SetDetailsPrint textonly&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_nextdir:&lt;br /&gt;
	IntOp $8 $8 - 1&lt;br /&gt;
	Pop $R8&lt;br /&gt;
	FindFirst $0 $R7 &#039;$R8\$4&#039;&lt;br /&gt;
	IfErrors FileFunc_GetSize_show&lt;br /&gt;
	StrCmp $R7 &#039;.&#039; 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	StrCmp $R7 &#039;..&#039; 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
	goto FileFunc_GetSize_show&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_dir:&lt;br /&gt;
	IfFileExists &#039;$R8\$R7\*.*&#039; 0 FileFunc_GetSize_file&lt;br /&gt;
	IntOp $R5 $R5 + 1&lt;br /&gt;
	goto FileFunc_GetSize_findnext&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_file:&lt;br /&gt;
	StrCpy $R6 0&lt;br /&gt;
	StrCmp $5$6 &#039;&#039; 0 +3&lt;br /&gt;
	IntOp $R4 $R4 + 1&lt;br /&gt;
	goto FileFunc_GetSize_findnext&lt;br /&gt;
	; insert code&lt;br /&gt;
	StrCmp $R1 &amp;quot;&amp;quot; FileFunc_GetSize_fileopen&lt;br /&gt;
	StrCpy $R0 0&lt;br /&gt;
	System::Call &#039;kernel32::GetFileAttributes(t &amp;quot;$R8\$R7&amp;quot;)i .R2&#039;&lt;br /&gt;
	StrCmp $R2 -1 FileFunc_GetSize_fileopen&lt;br /&gt;
	IntOp $R0 $R2 &amp;amp; 0x0800&lt;br /&gt;
	IntCmp $R0 0 0 0 +3&lt;br /&gt;
	IntOp $R0 $R2 &amp;amp; 0x0200&lt;br /&gt;
	IntCmp $R0 0 FileFunc_GetSize_fileopen&lt;br /&gt;
	System::Call &#039;kernel32::GetCompressedFileSize(t &amp;quot;$R8\$R7&amp;quot;, i)i .R6&#039;&lt;br /&gt;
	IntCmp $R6 4096 +2 0 +2&lt;br /&gt;
	StrCpy $R6 4096&lt;br /&gt;
	goto FileFunc_GetSize_fileclose&lt;br /&gt;
	FileFunc_GetSize_fileopen:&lt;br /&gt;
	; end insert&lt;br /&gt;
	FileOpen $9 &#039;$R8\$R7&#039; r&lt;br /&gt;
	IfErrors +3&lt;br /&gt;
	FileSeek $9 0 END $R6&lt;br /&gt;
	FileClose $9&lt;br /&gt;
	; insert code&lt;br /&gt;
	FileFunc_GetSize_fileclose:&lt;br /&gt;
	; end insert&lt;br /&gt;
	StrCmp $5 &#039;&#039; +2&lt;br /&gt;
	IntCmp $R6 $5 0 FileFunc_GetSize_findnext&lt;br /&gt;
	StrCmp $6 &#039;&#039; +2&lt;br /&gt;
	IntCmp $R6 $6 0 0 FileFunc_GetSize_findnext&lt;br /&gt;
	IntOp $R4 $R4 + 1&lt;br /&gt;
	; insert code&lt;br /&gt;
	StrCmp $R1 &amp;quot;&amp;quot; FileFunc_GetSize_file_add&lt;br /&gt;
	StrCmp $R0 0 0 FileFunc_GetSize_file_add&lt;br /&gt;
	StrCpy $R0 $R1&lt;br /&gt;
	IntOp $R6 $R6 + $R0&lt;br /&gt;
	IntOp $R1 $R6 % $R0&lt;br /&gt;
	StrCmp $R1 0 0 +2&lt;br /&gt;
	StrCpy $R1 $R0&lt;br /&gt;
	IntOp $R2 $R0 - $R1&lt;br /&gt;
	IntOp $R6 $R6 - $R0&lt;br /&gt;
	IntOp $R6 $R6 + $R2&lt;br /&gt;
	StrCpy $R1 $R0&lt;br /&gt;
	FileFunc_GetSize_file_add:&lt;br /&gt;
	; end insert&lt;br /&gt;
	System::Int64Op $R3 + $R6&lt;br /&gt;
	Pop $R3&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_findnext:&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_show:&lt;br /&gt;
	StrCmp $5$6 &#039;&#039; FileFunc_GetSize_nosize&lt;br /&gt;
	System::Int64Op $R3 / $1&lt;br /&gt;
	Pop $9&lt;br /&gt;
	DetailPrint &#039;Size:$9 $2  Files:$R4  Folders:$R5&#039;&lt;br /&gt;
	goto FileFunc_GetSize_subdir&lt;br /&gt;
	FileFunc_GetSize_nosize:&lt;br /&gt;
	DetailPrint &#039;Files:$R4  Folders:$R5&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_subdir:&lt;br /&gt;
	StrCmp $7 0 FileFunc_GetSize_preend&lt;br /&gt;
	FindFirst $0 $R7 &#039;$R8\*.*&#039;&lt;br /&gt;
	StrCmp $R7 &#039;.&#039; 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	StrCmp $R7 &#039;..&#039; 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
	StrCmp $8 0 FileFunc_GetSize_preend FileFunc_GetSize_nextdir&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_pushdir:&lt;br /&gt;
	IfFileExists &#039;$R8\$R7\*.*&#039; 0 +3&lt;br /&gt;
	Push &#039;$R8\$R7&#039;&lt;br /&gt;
	IntOp $8 $8 + 1&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
	StrCmp $8 0 FileFunc_GetSize_preend FileFunc_GetSize_nextdir&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_preend:&lt;br /&gt;
	StrCmp $R3 &#039;&#039; FileFunc_GetSize_nosizeend&lt;br /&gt;
	System::Int64Op $R3 / $1&lt;br /&gt;
	Pop $R3&lt;br /&gt;
	FileFunc_GetSize_nosizeend:&lt;br /&gt;
	StrCpy $2 $R4&lt;br /&gt;
	StrCpy $1 $R5&lt;br /&gt;
	StrCpy $0 $R3&lt;br /&gt;
	goto FileFunc_GetSize_end&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_error:&lt;br /&gt;
	SetErrors&lt;br /&gt;
	StrCpy $0 &#039;&#039;&lt;br /&gt;
	StrCpy $1 &#039;&#039;&lt;br /&gt;
	StrCpy $2 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_end:&lt;br /&gt;
	SetDetailsPrint both&lt;br /&gt;
	Pop $R9&lt;br /&gt;
	Pop $R8&lt;br /&gt;
	Pop $R7&lt;br /&gt;
	Pop $R6&lt;br /&gt;
	Pop $R5&lt;br /&gt;
	Pop $R4&lt;br /&gt;
	Pop $R3&lt;br /&gt;
	; insert code&lt;br /&gt;
	Pop $R2&lt;br /&gt;
	; end insert&lt;br /&gt;
	Pop $9&lt;br /&gt;
	Pop $8&lt;br /&gt;
	Pop $7&lt;br /&gt;
	Pop $6&lt;br /&gt;
	Pop $5&lt;br /&gt;
	Pop $4&lt;br /&gt;
	Pop $3&lt;br /&gt;
	Exch $2&lt;br /&gt;
	Exch&lt;br /&gt;
	Exch $1&lt;br /&gt;
	Exch 2&lt;br /&gt;
	Exch $0&lt;br /&gt;
&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
; ---------------&lt;br /&gt;
; GetClusterSize&lt;br /&gt;
&lt;br /&gt;
!define GetClusterSize `!insertmacro GetClusterSizeCall`&lt;br /&gt;
!define un.GetClusterSize `!insertmacro GetClusterSizeCall`&lt;br /&gt;
&lt;br /&gt;
!macro GetClusterSize&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro un.GetClusterSize&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetClusterSize_&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
&lt;br /&gt;
	System::Call &#039;kernel32::GetDiskFreeSpace(i0,*i0r0,*i0r1,*i0r2,*i)&#039;&lt;br /&gt;
	IntOp $0 $0 * $1&lt;br /&gt;
	Push $0&lt;br /&gt;
&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/highlight-nsis&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-size: 110%&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Credits:&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;em&amp;gt;GetSizeOnDisk&amp;lt;/em&amp;gt; has been altered slightly and renamed. The original macro is called &amp;lt;em&amp;gt;GetSize&amp;lt;/em&amp;gt;. You will find it in the Users Manual under E.1.3.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-size: 110%&amp;quot;&amp;gt;&amp;lt;b&amp;gt;=== Download ===&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;attach&amp;gt;SODTool.zip&amp;lt;/attach&amp;gt;&lt;br /&gt;
[[Category:Code Examples]]&lt;/div&gt;</summary>
		<author><name>Bnicer</name></author>
	</entry>
	<entry>
		<id>https://nsis.sourceforge.io/mediawiki/index.php?title=Get_size_on_disk&amp;diff=22910</id>
		<title>Get size on disk</title>
		<link rel="alternate" type="text/html" href="https://nsis.sourceforge.io/mediawiki/index.php?title=Get_size_on_disk&amp;diff=22910"/>
		<updated>2013-02-15T03:05:04Z</updated>

		<summary type="html">&lt;p&gt;Bnicer: Size On Disk (SOD) utility&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PageAuthor|Bnicer}}&lt;br /&gt;
This example code shows you how to get the space used by directories and files.&lt;br /&gt;
&amp;lt;highlight-nsis&amp;gt;&lt;br /&gt;
; A utility for computing the NSIS (or NSIS Unicode) install folder size and the size of&lt;br /&gt;
; the uninstaller&lt;br /&gt;
; nsissize.nsi&lt;br /&gt;
; Compile &amp;amp; run the .exe&lt;br /&gt;
&lt;br /&gt;
Name &amp;quot;SOD Tool&amp;quot;&lt;br /&gt;
RequestExecutionLevel user&lt;br /&gt;
!define LOCAL &amp;quot;&amp;quot; ; Path where local include files reside&lt;br /&gt;
OutFile &amp;quot;${LOCAL}nsissize.exe&amp;quot;&lt;br /&gt;
!include &amp;quot;${LOCAL}macros.nsh&amp;quot;&lt;br /&gt;
ReserveFile &amp;quot;${NSISDIR}\Plugins\Math.dll&amp;quot;&lt;br /&gt;
Icon &amp;quot;${LOCAL}arrows.ico&amp;quot;&lt;br /&gt;
ShowInstDetails show&lt;br /&gt;
&lt;br /&gt;
; Variables&lt;br /&gt;
Var NSIS&lt;br /&gt;
Var COUNT&lt;br /&gt;
Var BLOCK&lt;br /&gt;
Var FILES&lt;br /&gt;
Var FOLDERS&lt;br /&gt;
Var SIZE_B&lt;br /&gt;
Var SIZE_M&lt;br /&gt;
Var SOD_B&lt;br /&gt;
Var SOD_K&lt;br /&gt;
Var SOD_M&lt;br /&gt;
Var SIZE_UN_B&lt;br /&gt;
Var SIZE_UN_K&lt;br /&gt;
Var SOD_UN_B&lt;br /&gt;
Var SOD_UN_K&lt;br /&gt;
&lt;br /&gt;
Function Separator ; comma&lt;br /&gt;
  StrCpy $R2 $R1&lt;br /&gt;
  StrCpy $COUNT &amp;quot;16&amp;quot; ; 1,000,000,000,000,000 limit&lt;br /&gt;
  StrLen $R4 $R1&lt;br /&gt;
  loop:&lt;br /&gt;
  IntCmp $COUNT 3 endloop endloop 0&lt;br /&gt;
  IntCmp $R4 $COUNT 0 +7 0&lt;br /&gt;
  IntOp $COUNT $COUNT - 1&lt;br /&gt;
  StrCpy $R2 $R2 -$COUNT&lt;br /&gt;
  StrCpy $R3 $R1 &amp;quot;&amp;quot; -$COUNT&lt;br /&gt;
  StrCpy $R2 &amp;quot;$R2,$R3&amp;quot;&lt;br /&gt;
  IntOp $COUNT $COUNT - 2&lt;br /&gt;
  Goto loop&lt;br /&gt;
  IntOp $COUNT $COUNT - 3&lt;br /&gt;
  Goto loop&lt;br /&gt;
  endloop:&lt;br /&gt;
FunctionEnd&lt;br /&gt;
&lt;br /&gt;
Section&lt;br /&gt;
; root&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS Unicode&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS Unicode&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS ANSI&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS ANSI&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  Goto done&lt;br /&gt;
  begin:&lt;br /&gt;
  IfFileExists &amp;quot;$NSIS&amp;quot; 0 done&lt;br /&gt;
  ${GetClusterSize} $BLOCK&lt;br /&gt;
  ${GetSizeOnDisk} &amp;quot;$NSIS&amp;quot; &amp;quot;/S=0B&amp;quot; &amp;quot;&amp;quot; $0 $1 $2&lt;br /&gt;
  Math::Script &amp;quot;r3 = ff($0 / 1024 / 1024.0, 16 +2&amp;quot;&lt;br /&gt;
  StrCpy $SIZE_B $0&lt;br /&gt;
  StrCpy $FILES $1&lt;br /&gt;
  StrCpy $FOLDERS $2&lt;br /&gt;
  StrCpy $SIZE_M $3&lt;br /&gt;
  ${GetSizeOnDisk} &amp;quot;$NSIS&amp;quot; &amp;quot;/S=0B&amp;quot; &amp;quot;$BLOCK&amp;quot; $0 $1 $2&lt;br /&gt;
  Math::Script &amp;quot;r4 = ff($0 / 1024.0, 16 +0); r5 = ff(r4 / 1024.0, 16 +2)&amp;quot;&lt;br /&gt;
  StrCpy $SOD_B $0&lt;br /&gt;
  StrCpy $SOD_K $4&lt;br /&gt;
  StrCpy $SOD_M $5&lt;br /&gt;
; uninstaller&lt;br /&gt;
  IfFileExists &amp;quot;$NSIS\uninst-nsis.exe&amp;quot; 0 done&lt;br /&gt;
  ${GetSizeOnDisk} &amp;quot;$NSIS&amp;quot; &amp;quot;/M=uninst-nsis.exe /S=0B&amp;quot; &amp;quot;&amp;quot; $0 $1 $2&lt;br /&gt;
  Math::Script &amp;quot;r6 = ff($0 / 1024.0, 16 +1)&amp;quot;&lt;br /&gt;
  StrCpy $SIZE_UN_B $0&lt;br /&gt;
  StrCpy $SIZE_UN_K $6&lt;br /&gt;
  ${GetSizeOnDisk} &amp;quot;$NSIS&amp;quot; &amp;quot;/M=uninst-nsis.exe /S=0B&amp;quot; &amp;quot;$BLOCK&amp;quot; $0 $1 $2&lt;br /&gt;
  Math::Script &amp;quot;r7 = ff($0 / 1024.0, 16 +1)&amp;quot;&lt;br /&gt;
  StrCpy $SOD_UN_B $0&lt;br /&gt;
  StrCpy $SOD_UN_K $7&lt;br /&gt;
; format&lt;br /&gt;
  StrCpy $R1 $SIZE_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SIZE_B $R2&lt;br /&gt;
&lt;br /&gt;
  StrCpy $R1 $SOD_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SOD_B $R2&lt;br /&gt;
&lt;br /&gt;
  StrCpy $R1 $SOD_K&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SOD_K $R2&lt;br /&gt;
&lt;br /&gt;
  StrCpy $R1 $SIZE_UN_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SIZE_UN_B $R2&lt;br /&gt;
  StrCpy $R1 $SOD_UN_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SOD_UN_B $R2&lt;br /&gt;
; output&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;$NSIS&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;Size: $SIZE_M MB ($SIZE_B bytes)&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;SOD: $SOD_M MB ($SOD_B bytes)&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;Uninstaller&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;Size: $SIZE_UN_K KB ($SIZE_UN_B bytes)&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;SOD: $SOD_UN_K KB ($SOD_UN_B bytes)&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;$FILES files $FOLDERS folders $SOD_K Kb&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  Goto completed&lt;br /&gt;
  done:&lt;br /&gt;
  DetailPrint &amp;quot;File not found.&amp;quot;&lt;br /&gt;
  completed:&lt;br /&gt;
SectionEnd&lt;br /&gt;
&lt;br /&gt;
;--------------------------------&lt;br /&gt;
# EOF&lt;br /&gt;
&amp;lt;/highlight-nsis&amp;gt;&lt;br /&gt;
You should copy the next code into a separate file: &amp;lt;b&amp;gt;macros.nsh&amp;lt;/b&amp;gt;.&lt;br /&gt;
&amp;lt;highlight-nsis&amp;gt;&lt;br /&gt;
; Macros include (TN)&lt;br /&gt;
;--------------------------------&lt;br /&gt;
/*&lt;br /&gt;
&lt;br /&gt;
 FileFunction=[GetSizeOnDisk|GetClusterSize]&lt;br /&gt;
&lt;br /&gt;
*/&lt;br /&gt;
;_____________________________________________________________________________&lt;br /&gt;
;&lt;br /&gt;
;                         Macros&lt;br /&gt;
;_____________________________________________________________________________&lt;br /&gt;
;&lt;br /&gt;
; Change log window verbosity (default: 3=no script)&lt;br /&gt;
;&lt;br /&gt;
; Example:&lt;br /&gt;
; !include &amp;quot;macros.nsh&amp;quot;&lt;br /&gt;
; !insertmacro GetSizeOnDisk&lt;br /&gt;
; ${FILEFUNC_VERBOSE} 4   # all verbosity&lt;br /&gt;
; !insertmacro GetClusterSize&lt;br /&gt;
; ${FILEFUNC_VERBOSE} 3   # no script&lt;br /&gt;
&lt;br /&gt;
!include Util.nsh ; for &amp;quot;CallArtificialFunction&amp;quot;&lt;br /&gt;
&lt;br /&gt;
!verbose push&lt;br /&gt;
!verbose 3&lt;br /&gt;
!ifndef _FILEFUNC_VERBOSE&lt;br /&gt;
	!define _FILEFUNC_VERBOSE 3&lt;br /&gt;
!endif&lt;br /&gt;
!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
!define FILEFUNC_VERBOSE `!insertmacro FILEFUNC_VERBOSE`&lt;br /&gt;
!verbose pop&lt;br /&gt;
&lt;br /&gt;
!macro FILEFUNC_VERBOSE _VERBOSE&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose 3&lt;br /&gt;
	!undef _FILEFUNC_VERBOSE&lt;br /&gt;
	!define _FILEFUNC_VERBOSE ${_VERBOSE}&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetSizeOnDiskCall _PATH _OPTIONS _FILESYSTEM _RESULT1 _RESULT2 _RESULT3&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
	Push `${_PATH}`&lt;br /&gt;
	Push `${_OPTIONS}`&lt;br /&gt;
	Push `${_FILESYSTEM}` ; block size&lt;br /&gt;
	${CallArtificialFunction} GetSizeOnDisk_&lt;br /&gt;
	Pop ${_RESULT1}&lt;br /&gt;
	Pop ${_RESULT2}&lt;br /&gt;
	Pop ${_RESULT3}&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetClusterSizeCall _RESULT&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
	${CallArtificialFunction} GetClusterSize_&lt;br /&gt;
	Pop ${_RESULT}&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
; ---------------&lt;br /&gt;
; GetSizeOnDisk (modified &amp;quot;GetSize&amp;quot; - FileFunc.nsh - KiCHiK - Function &amp;quot;FindFiles&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
!define GetSizeOnDisk `!insertmacro GetSizeOnDiskCall`&lt;br /&gt;
!define un.GetSizeOnDisk `!insertmacro GetSizeOnDiskCall`&lt;br /&gt;
&lt;br /&gt;
!macro GetSizeOnDisk&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro un.GetSizeOnDisk&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
; Usage: similar to &amp;quot;GetSize&amp;quot;&lt;br /&gt;
&lt;br /&gt;
; For documentation, see the NSIS user manual: E.1.3 GetSize&lt;br /&gt;
; Three values are returned&lt;br /&gt;
&lt;br /&gt;
; $var1		; Result1: Size/Size on disk&lt;br /&gt;
; $var2		; Result2: Sum of files&lt;br /&gt;
; $var3		; Result3: Sum of directories&lt;br /&gt;
&lt;br /&gt;
; Example: ${GetSizeOnDisk} &amp;quot;$INSTDIR&amp;quot; &amp;quot;/S=0K&amp;quot; &amp;quot;4096&amp;quot; $0 $1 $2&lt;br /&gt;
&lt;br /&gt;
; Specifying 4096 (logical size) toggles the result&lt;br /&gt;
; Output is size on disk, if used, or size in bytes, if left empty &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
!macro GetSizeOnDisk_&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
&lt;br /&gt;
	; replace&lt;br /&gt;
	Exch $R1&lt;br /&gt;
	Exch&lt;br /&gt;
	Exch $1&lt;br /&gt;
	Exch 2&lt;br /&gt;
	; end replace&lt;br /&gt;
	Exch $0&lt;br /&gt;
	Exch&lt;br /&gt;
	Push $2&lt;br /&gt;
	Push $3&lt;br /&gt;
	Push $4&lt;br /&gt;
	Push $5&lt;br /&gt;
	Push $6&lt;br /&gt;
	Push $7&lt;br /&gt;
	Push $8&lt;br /&gt;
	Push $9&lt;br /&gt;
	; insert code&lt;br /&gt;
	Push $R2&lt;br /&gt;
	; end insert&lt;br /&gt;
	Push $R3&lt;br /&gt;
	Push $R4&lt;br /&gt;
	Push $R5&lt;br /&gt;
	Push $R6&lt;br /&gt;
	Push $R7&lt;br /&gt;
	Push $R8&lt;br /&gt;
	Push $R9&lt;br /&gt;
	ClearErrors&lt;br /&gt;
&lt;br /&gt;
	StrCpy $R9 $0 1 -1&lt;br /&gt;
	StrCmp $R9 &#039;\&#039; 0 +3&lt;br /&gt;
	StrCpy $0 $0 -1&lt;br /&gt;
	goto -3&lt;br /&gt;
	IfFileExists &#039;$0\*.*&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
&lt;br /&gt;
	StrCpy $3 &#039;&#039;&lt;br /&gt;
	StrCpy $4 &#039;&#039;&lt;br /&gt;
	StrCpy $5 &#039;&#039;&lt;br /&gt;
	StrCpy $6 &#039;&#039;&lt;br /&gt;
	StrCpy $8 0&lt;br /&gt;
	StrCpy $R3 &#039;&#039;&lt;br /&gt;
	StrCpy $R4 &#039;&#039;&lt;br /&gt;
	StrCpy $R5 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_option:&lt;br /&gt;
	StrCpy $R9 $1 1&lt;br /&gt;
	StrCpy $1 $1 &#039;&#039; 1&lt;br /&gt;
	StrCmp $R9 &#039; &#039; -2&lt;br /&gt;
	StrCmp $R9 &#039;&#039; FileFunc_GetSize_sizeset&lt;br /&gt;
	StrCmp $R9 &#039;/&#039; 0 -4&lt;br /&gt;
&lt;br /&gt;
	StrCpy $9 -1&lt;br /&gt;
	IntOp $9 $9 + 1&lt;br /&gt;
	StrCpy $R9 $1 1 $9&lt;br /&gt;
	StrCmp $R9 &#039;&#039; +2&lt;br /&gt;
	StrCmp $R9 &#039;/&#039; 0 -3&lt;br /&gt;
	StrCpy $8 $1 $9&lt;br /&gt;
	StrCpy $8 $8 &#039;&#039; 2&lt;br /&gt;
	StrCpy $R9 $8 &#039;&#039; -1&lt;br /&gt;
	StrCmp $R9 &#039; &#039; 0 +3&lt;br /&gt;
	StrCpy $8 $8 -1&lt;br /&gt;
	goto -3&lt;br /&gt;
	StrCpy $R9 $1 2&lt;br /&gt;
	StrCpy $1 $1 &#039;&#039; $9&lt;br /&gt;
&lt;br /&gt;
	StrCmp $R9 &#039;M=&#039; 0 FileFunc_GetSize_size&lt;br /&gt;
	StrCpy $4 $8&lt;br /&gt;
	goto FileFunc_GetSize_option&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_size:&lt;br /&gt;
	StrCmp $R9 &#039;S=&#039; 0 FileFunc_GetSize_gotosubdir&lt;br /&gt;
	StrCpy $6 $8&lt;br /&gt;
	goto FileFunc_GetSize_option&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_gotosubdir:&lt;br /&gt;
	StrCmp $R9 &#039;G=&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
	StrCpy $7 $8&lt;br /&gt;
	StrCmp $7 &#039;&#039; +3&lt;br /&gt;
	StrCmp $7 &#039;1&#039; +2&lt;br /&gt;
	StrCmp $7 &#039;0&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
	goto FileFunc_GetSize_option&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_sizeset:&lt;br /&gt;
	StrCmp $6 &#039;&#039; FileFunc_GetSize_default&lt;br /&gt;
	StrCpy $9 0&lt;br /&gt;
	StrCpy $R9 $6 1 $9&lt;br /&gt;
	StrCmp $R9 &#039;&#039; +4&lt;br /&gt;
	StrCmp $R9 &#039;:&#039; +3&lt;br /&gt;
	IntOp $9 $9 + 1&lt;br /&gt;
	goto -4&lt;br /&gt;
	StrCpy $5 $6 $9&lt;br /&gt;
	IntOp $9 $9 + 1&lt;br /&gt;
	StrCpy $1 $6 1 -1&lt;br /&gt;
	StrCpy $6 $6 -1 $9&lt;br /&gt;
	StrCmp $5 &#039;&#039; +2&lt;br /&gt;
	IntOp $5 $5 + 0&lt;br /&gt;
	StrCmp $6 &#039;&#039; +2&lt;br /&gt;
	IntOp $6 $6 + 0&lt;br /&gt;
&lt;br /&gt;
	StrCmp $1 &#039;B&#039; 0 +4&lt;br /&gt;
	StrCpy $1 1&lt;br /&gt;
	StrCpy $2 bytes&lt;br /&gt;
	goto FileFunc_GetSize_default&lt;br /&gt;
	StrCmp $1 &#039;K&#039; 0 +4&lt;br /&gt;
	StrCpy $1 1024&lt;br /&gt;
	StrCpy $2 Kb&lt;br /&gt;
	goto FileFunc_GetSize_default&lt;br /&gt;
	StrCmp $1 &#039;M&#039; 0 +4&lt;br /&gt;
	StrCpy $1 1048576&lt;br /&gt;
	StrCpy $2 Mb&lt;br /&gt;
	goto FileFunc_GetSize_default&lt;br /&gt;
	StrCmp $1 &#039;G&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
	StrCpy $1 1073741824&lt;br /&gt;
	StrCpy $2 Gb&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_default:&lt;br /&gt;
	StrCmp $4 &#039;&#039; 0 +2&lt;br /&gt;
	StrCpy $4 &#039;*.*&#039;&lt;br /&gt;
	StrCmp $7 &#039;&#039; 0 +2&lt;br /&gt;
	StrCpy $7 &#039;1&#039;&lt;br /&gt;
&lt;br /&gt;
	StrCpy $8 1&lt;br /&gt;
	Push $0&lt;br /&gt;
	SetDetailsPrint textonly&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_nextdir:&lt;br /&gt;
	IntOp $8 $8 - 1&lt;br /&gt;
	Pop $R8&lt;br /&gt;
	FindFirst $0 $R7 &#039;$R8\$4&#039;&lt;br /&gt;
	IfErrors FileFunc_GetSize_show&lt;br /&gt;
	StrCmp $R7 &#039;.&#039; 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	StrCmp $R7 &#039;..&#039; 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
	goto FileFunc_GetSize_show&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_dir:&lt;br /&gt;
	IfFileExists &#039;$R8\$R7\*.*&#039; 0 FileFunc_GetSize_file&lt;br /&gt;
	IntOp $R5 $R5 + 1&lt;br /&gt;
	goto FileFunc_GetSize_findnext&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_file:&lt;br /&gt;
	StrCpy $R6 0&lt;br /&gt;
	StrCmp $5$6 &#039;&#039; 0 +3&lt;br /&gt;
	IntOp $R4 $R4 + 1&lt;br /&gt;
	goto FileFunc_GetSize_findnext&lt;br /&gt;
	; insert code&lt;br /&gt;
	StrCmp $R1 &amp;quot;&amp;quot; FileFunc_GetSize_fileopen&lt;br /&gt;
	StrCpy $R0 0&lt;br /&gt;
	System::Call &#039;kernel32::GetFileAttributes(t &amp;quot;$R8\$R7&amp;quot;)i .R2&#039;&lt;br /&gt;
	StrCmp $R2 -1 FileFunc_GetSize_fileopen&lt;br /&gt;
	IntOp $R0 $R2 &amp;amp; 0x0800&lt;br /&gt;
	IntCmp $R0 0 0 0 +3&lt;br /&gt;
	IntOp $R0 $R2 &amp;amp; 0x0200&lt;br /&gt;
	IntCmp $R0 0 FileFunc_GetSize_fileopen&lt;br /&gt;
	System::Call &#039;kernel32::GetCompressedFileSize(t &amp;quot;$R8\$R7&amp;quot;, i)i .R6&#039;&lt;br /&gt;
	IntCmp $R6 4096 +2 0 +2&lt;br /&gt;
	StrCpy $R6 4096&lt;br /&gt;
	goto FileFunc_GetSize_fileclose&lt;br /&gt;
	FileFunc_GetSize_fileopen:&lt;br /&gt;
	; end insert&lt;br /&gt;
	FileOpen $9 &#039;$R8\$R7&#039; r&lt;br /&gt;
	IfErrors +3&lt;br /&gt;
	FileSeek $9 0 END $R6&lt;br /&gt;
	FileClose $9&lt;br /&gt;
	; insert code&lt;br /&gt;
	FileFunc_GetSize_fileclose:&lt;br /&gt;
	; end insert&lt;br /&gt;
	StrCmp $5 &#039;&#039; +2&lt;br /&gt;
	IntCmp $R6 $5 0 FileFunc_GetSize_findnext&lt;br /&gt;
	StrCmp $6 &#039;&#039; +2&lt;br /&gt;
	IntCmp $R6 $6 0 0 FileFunc_GetSize_findnext&lt;br /&gt;
	IntOp $R4 $R4 + 1&lt;br /&gt;
	; insert code&lt;br /&gt;
	StrCmp $R1 &amp;quot;&amp;quot; FileFunc_GetSize_file_add&lt;br /&gt;
	StrCmp $R0 0 0 FileFunc_GetSize_file_add&lt;br /&gt;
	StrCpy $R0 $R1&lt;br /&gt;
	IntOp $R6 $R6 + $R0&lt;br /&gt;
	IntOp $R1 $R6 % $R0&lt;br /&gt;
	StrCmp $R1 0 0 +2&lt;br /&gt;
	StrCpy $R1 $R0&lt;br /&gt;
	IntOp $R2 $R0 - $R1&lt;br /&gt;
	IntOp $R6 $R6 - $R0&lt;br /&gt;
	IntOp $R6 $R6 + $R2&lt;br /&gt;
	StrCpy $R1 $R0&lt;br /&gt;
	FileFunc_GetSize_file_add:&lt;br /&gt;
	; end insert&lt;br /&gt;
	System::Int64Op $R3 + $R6&lt;br /&gt;
	Pop $R3&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_findnext:&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_show:&lt;br /&gt;
	StrCmp $5$6 &#039;&#039; FileFunc_GetSize_nosize&lt;br /&gt;
	System::Int64Op $R3 / $1&lt;br /&gt;
	Pop $9&lt;br /&gt;
	DetailPrint &#039;Size:$9 $2  Files:$R4  Folders:$R5&#039;&lt;br /&gt;
	goto FileFunc_GetSize_subdir&lt;br /&gt;
	FileFunc_GetSize_nosize:&lt;br /&gt;
	DetailPrint &#039;Files:$R4  Folders:$R5&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_subdir:&lt;br /&gt;
	StrCmp $7 0 FileFunc_GetSize_preend&lt;br /&gt;
	FindFirst $0 $R7 &#039;$R8\*.*&#039;&lt;br /&gt;
	StrCmp $R7 &#039;.&#039; 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	StrCmp $R7 &#039;..&#039; 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
	StrCmp $8 0 FileFunc_GetSize_preend FileFunc_GetSize_nextdir&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_pushdir:&lt;br /&gt;
	IfFileExists &#039;$R8\$R7\*.*&#039; 0 +3&lt;br /&gt;
	Push &#039;$R8\$R7&#039;&lt;br /&gt;
	IntOp $8 $8 + 1&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
	StrCmp $8 0 FileFunc_GetSize_preend FileFunc_GetSize_nextdir&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_preend:&lt;br /&gt;
	StrCmp $R3 &#039;&#039; FileFunc_GetSize_nosizeend&lt;br /&gt;
	System::Int64Op $R3 / $1&lt;br /&gt;
	Pop $R3&lt;br /&gt;
	FileFunc_GetSize_nosizeend:&lt;br /&gt;
	StrCpy $2 $R4&lt;br /&gt;
	StrCpy $1 $R5&lt;br /&gt;
	StrCpy $0 $R3&lt;br /&gt;
	goto FileFunc_GetSize_end&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_error:&lt;br /&gt;
	SetErrors&lt;br /&gt;
	StrCpy $0 &#039;&#039;&lt;br /&gt;
	StrCpy $1 &#039;&#039;&lt;br /&gt;
	StrCpy $2 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_end:&lt;br /&gt;
	SetDetailsPrint both&lt;br /&gt;
	Pop $R9&lt;br /&gt;
	Pop $R8&lt;br /&gt;
	Pop $R7&lt;br /&gt;
	Pop $R6&lt;br /&gt;
	Pop $R5&lt;br /&gt;
	Pop $R4&lt;br /&gt;
	Pop $R3&lt;br /&gt;
	; insert code&lt;br /&gt;
	Pop $R2&lt;br /&gt;
	; end insert&lt;br /&gt;
	Pop $9&lt;br /&gt;
	Pop $8&lt;br /&gt;
	Pop $7&lt;br /&gt;
	Pop $6&lt;br /&gt;
	Pop $5&lt;br /&gt;
	Pop $4&lt;br /&gt;
	Pop $3&lt;br /&gt;
	Exch $2&lt;br /&gt;
	Exch&lt;br /&gt;
	Exch $1&lt;br /&gt;
	Exch 2&lt;br /&gt;
	Exch $0&lt;br /&gt;
&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
; ---------------&lt;br /&gt;
; GetClusterSize&lt;br /&gt;
&lt;br /&gt;
!define GetClusterSize `!insertmacro GetClusterSizeCall`&lt;br /&gt;
!define un.GetClusterSize `!insertmacro GetClusterSizeCall`&lt;br /&gt;
&lt;br /&gt;
!macro GetClusterSize&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro un.GetClusterSize&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetClusterSize_&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
&lt;br /&gt;
	System::Call &#039;kernel32::GetDiskFreeSpace(i0,*i0r0,*i0r1,*i0r2,*i)&#039;&lt;br /&gt;
	IntOp $0 $0 * $1&lt;br /&gt;
	Push $0&lt;br /&gt;
&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/highlight-nsis&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-size: 110%&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Credits:&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;em&amp;gt;GetSizeOnDisk&amp;lt;/em&amp;gt; has been altered slightly and renamed. The original macro is called &amp;lt;em&amp;gt;GetSize&amp;lt;/em&amp;gt;. You will find it in the Users Manual under E.1.3.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-size: 110%&amp;quot;&amp;gt;&amp;lt;b&amp;gt;=== Download ===&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;attach&amp;gt;SODTool.zip&amp;lt;/attach&amp;gt;&lt;br /&gt;
[[Category:Code Examples]]&lt;/div&gt;</summary>
		<author><name>Bnicer</name></author>
	</entry>
	<entry>
		<id>https://nsis.sourceforge.io/mediawiki/index.php?title=File:SODTool.zip&amp;diff=22909</id>
		<title>File:SODTool.zip</title>
		<link rel="alternate" type="text/html" href="https://nsis.sourceforge.io/mediawiki/index.php?title=File:SODTool.zip&amp;diff=22909"/>
		<updated>2013-02-15T02:54:37Z</updated>

		<summary type="html">&lt;p&gt;Bnicer: File attachment for Get size on disk code example. Includes icon, macros header file, nsissize executable, nsissize script. Created Feb. 15, 2013.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;File attachment for Get size on disk code example. Includes icon, macros header file, nsissize executable, nsissize script. Created Feb. 15, 2013.&lt;/div&gt;</summary>
		<author><name>Bnicer</name></author>
	</entry>
	<entry>
		<id>https://nsis.sourceforge.io/mediawiki/index.php?title=Get_size_on_disk&amp;diff=22908</id>
		<title>Get size on disk</title>
		<link rel="alternate" type="text/html" href="https://nsis.sourceforge.io/mediawiki/index.php?title=Get_size_on_disk&amp;diff=22908"/>
		<updated>2013-02-14T11:54:47Z</updated>

		<summary type="html">&lt;p&gt;Bnicer: Size On Disk (SOD) utility&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PageAuthor|Bnicer}}&lt;br /&gt;
This example code shows you how to get the space used by directories and files.&lt;br /&gt;
&amp;lt;highlight-nsis&amp;gt;&lt;br /&gt;
; A utility for computing the NSIS (or NSIS Unicode) install folder size and the size of&lt;br /&gt;
; the uninstaller&lt;br /&gt;
; nsissize.nsi&lt;br /&gt;
; Compile &amp;amp; run the .exe&lt;br /&gt;
&lt;br /&gt;
Name &amp;quot;SOD Tool&amp;quot;&lt;br /&gt;
RequestExecutionLevel user&lt;br /&gt;
!define LOCAL &amp;quot;&amp;quot; ; Path where local include files reside&lt;br /&gt;
OutFile &amp;quot;${LOCAL}nsissize.exe&amp;quot;&lt;br /&gt;
!include &amp;quot;${LOCAL}macros.nsh&amp;quot;&lt;br /&gt;
ReserveFile &amp;quot;${NSISDIR}\Plugins\Math.dll&amp;quot;&lt;br /&gt;
Icon &amp;quot;${LOCAL}arrows.ico&amp;quot;&lt;br /&gt;
ShowInstDetails show&lt;br /&gt;
&lt;br /&gt;
; Variables&lt;br /&gt;
Var NSIS&lt;br /&gt;
Var COUNT&lt;br /&gt;
Var BLOCK&lt;br /&gt;
Var FILES&lt;br /&gt;
Var FOLDERS&lt;br /&gt;
Var SIZE_B&lt;br /&gt;
Var SIZE_M&lt;br /&gt;
Var SOD_B&lt;br /&gt;
Var SOD_K&lt;br /&gt;
Var SOD_M&lt;br /&gt;
Var SIZE_UN_B&lt;br /&gt;
Var SIZE_UN_K&lt;br /&gt;
Var SOD_UN_B&lt;br /&gt;
Var SOD_UN_K&lt;br /&gt;
&lt;br /&gt;
Function Separator ; comma&lt;br /&gt;
  StrCpy $R2 $R1&lt;br /&gt;
  StrCpy $COUNT &amp;quot;16&amp;quot; ; 1,000,000,000,000,000 limit&lt;br /&gt;
  StrLen $R4 $R1&lt;br /&gt;
  loop:&lt;br /&gt;
  IntCmp $COUNT 3 endloop endloop 0&lt;br /&gt;
  IntCmp $R4 $COUNT 0 +7 0&lt;br /&gt;
  IntOp $COUNT $COUNT - 1&lt;br /&gt;
  StrCpy $R2 $R2 -$COUNT&lt;br /&gt;
  StrCpy $R3 $R1 &amp;quot;&amp;quot; -$COUNT&lt;br /&gt;
  StrCpy $R2 &amp;quot;$R2,$R3&amp;quot;&lt;br /&gt;
  IntOp $COUNT $COUNT - 2&lt;br /&gt;
  Goto loop&lt;br /&gt;
  IntOp $COUNT $COUNT - 3&lt;br /&gt;
  Goto loop&lt;br /&gt;
  endloop:&lt;br /&gt;
FunctionEnd&lt;br /&gt;
&lt;br /&gt;
Section&lt;br /&gt;
; root&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS Unicode&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS Unicode&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS ANSI&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS ANSI&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  Goto done&lt;br /&gt;
  begin:&lt;br /&gt;
  IfFileExists &amp;quot;$NSIS&amp;quot; 0 done&lt;br /&gt;
  ${GetClusterSize} $BLOCK&lt;br /&gt;
  ${GetSizeOnDisk} &amp;quot;$NSIS&amp;quot; &amp;quot;/S=0B&amp;quot; &amp;quot;&amp;quot; $0 $1 $2&lt;br /&gt;
  Math::Script &amp;quot;r3 = ff($0 / 1024 / 1024.0, 16 +2&amp;quot;&lt;br /&gt;
  StrCpy $SIZE_B $0&lt;br /&gt;
  StrCpy $FILES $1&lt;br /&gt;
  StrCpy $FOLDERS $2&lt;br /&gt;
  StrCpy $SIZE_M $3&lt;br /&gt;
  ${GetSizeOnDisk} &amp;quot;$NSIS&amp;quot; &amp;quot;/S=0B&amp;quot; &amp;quot;$BLOCK&amp;quot; $0 $1 $2&lt;br /&gt;
  Math::Script &amp;quot;r4 = ff($0 / 1024.0, 16 +0); r5 = ff(r4 / 1024.0, 16 +2)&amp;quot;&lt;br /&gt;
  StrCpy $SOD_B $0&lt;br /&gt;
  StrCpy $SOD_K $4&lt;br /&gt;
  StrCpy $SOD_M $5&lt;br /&gt;
; uninstaller&lt;br /&gt;
  IfFileExists &amp;quot;$NSIS\uninst-nsis.exe&amp;quot; 0 done&lt;br /&gt;
  ${GetSizeOnDisk} &amp;quot;$NSIS&amp;quot; &amp;quot;/M=uninst-nsis.exe /S=0B&amp;quot; &amp;quot;&amp;quot; $0 $1 $2&lt;br /&gt;
  Math::Script &amp;quot;r6 = ff($0 / 1024.0, 16 +1)&amp;quot;&lt;br /&gt;
  StrCpy $SIZE_UN_B $0&lt;br /&gt;
  StrCpy $SIZE_UN_K $6&lt;br /&gt;
  ${GetSizeOnDisk} &amp;quot;$NSIS&amp;quot; &amp;quot;/M=uninst-nsis.exe /S=0B&amp;quot; &amp;quot;$BLOCK&amp;quot; $0 $1 $2&lt;br /&gt;
  Math::Script &amp;quot;r7 = ff($0 / 1024.0, 16 +1)&amp;quot;&lt;br /&gt;
  StrCpy $SOD_UN_B $0&lt;br /&gt;
  StrCpy $SOD_UN_K $7&lt;br /&gt;
; format&lt;br /&gt;
  StrCpy $R1 $SIZE_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SIZE_B $R2&lt;br /&gt;
&lt;br /&gt;
  StrCpy $R1 $SOD_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SOD_B $R2&lt;br /&gt;
&lt;br /&gt;
  StrCpy $R1 $SOD_K&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SOD_K $R2&lt;br /&gt;
&lt;br /&gt;
  StrCpy $R1 $SIZE_UN_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SIZE_UN_B $R2&lt;br /&gt;
  StrCpy $R1 $SOD_UN_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SOD_UN_B $R2&lt;br /&gt;
; output&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;$NSIS&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;Size: $SIZE_M MB ($SIZE_B bytes)&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;SOD: $SOD_M MB ($SOD_B bytes)&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;Uninstaller&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;Size: $SIZE_UN_K KB ($SIZE_UN_B bytes)&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;SOD: $SOD_UN_K KB ($SOD_UN_B bytes)&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;$FILES files $FOLDERS folders $SOD_K Kb&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  Goto completed&lt;br /&gt;
  done:&lt;br /&gt;
  DetailPrint &amp;quot;File not found.&amp;quot;&lt;br /&gt;
  completed:&lt;br /&gt;
SectionEnd&lt;br /&gt;
&lt;br /&gt;
;--------------------------------&lt;br /&gt;
# EOF&lt;br /&gt;
&amp;lt;/highlight-nsis&amp;gt;&lt;br /&gt;
You should copy the next code into a separate file: &amp;lt;b&amp;gt;macros.nsh&amp;lt;/b&amp;gt;.&lt;br /&gt;
&amp;lt;highlight-nsis&amp;gt;&lt;br /&gt;
; Macros include (TN)&lt;br /&gt;
;--------------------------------&lt;br /&gt;
/*&lt;br /&gt;
&lt;br /&gt;
 FileFunction=[GetSizeOnDisk|GetClusterSize]&lt;br /&gt;
&lt;br /&gt;
*/&lt;br /&gt;
;_____________________________________________________________________________&lt;br /&gt;
;&lt;br /&gt;
;                         Macros&lt;br /&gt;
;_____________________________________________________________________________&lt;br /&gt;
;&lt;br /&gt;
; Change log window verbosity (default: 3=no script)&lt;br /&gt;
;&lt;br /&gt;
; Example:&lt;br /&gt;
; !include &amp;quot;macros.nsh&amp;quot;&lt;br /&gt;
; !insertmacro GetSizeOnDisk&lt;br /&gt;
; ${FILEFUNC_VERBOSE} 4   # all verbosity&lt;br /&gt;
; !insertmacro GetClusterSize&lt;br /&gt;
; ${FILEFUNC_VERBOSE} 3   # no script&lt;br /&gt;
&lt;br /&gt;
!include Util.nsh ; for &amp;quot;CallArtificialFunction&amp;quot;&lt;br /&gt;
&lt;br /&gt;
!verbose push&lt;br /&gt;
!verbose 3&lt;br /&gt;
!ifndef _FILEFUNC_VERBOSE&lt;br /&gt;
	!define _FILEFUNC_VERBOSE 3&lt;br /&gt;
!endif&lt;br /&gt;
!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
!define FILEFUNC_VERBOSE `!insertmacro FILEFUNC_VERBOSE`&lt;br /&gt;
!verbose pop&lt;br /&gt;
&lt;br /&gt;
!macro FILEFUNC_VERBOSE _VERBOSE&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose 3&lt;br /&gt;
	!undef _FILEFUNC_VERBOSE&lt;br /&gt;
	!define _FILEFUNC_VERBOSE ${_VERBOSE}&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetSizeOnDiskCall _PATH _OPTIONS _FILESYSTEM _RESULT1 _RESULT2 _RESULT3&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
	Push `${_PATH}`&lt;br /&gt;
	Push `${_OPTIONS}`&lt;br /&gt;
	Push `${_FILESYSTEM}` ; block size&lt;br /&gt;
	${CallArtificialFunction} GetSizeOnDisk_&lt;br /&gt;
	Pop ${_RESULT1}&lt;br /&gt;
	Pop ${_RESULT2}&lt;br /&gt;
	Pop ${_RESULT3}&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetClusterSizeCall _RESULT&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
	${CallArtificialFunction} GetClusterSize_&lt;br /&gt;
	Pop ${_RESULT}&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
; ---------------&lt;br /&gt;
; GetSizeOnDisk (modified &amp;quot;GetSize&amp;quot; - FileFunc.nsh - KiCHiK - Function &amp;quot;FindFiles&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
!define GetSizeOnDisk `!insertmacro GetSizeOnDiskCall`&lt;br /&gt;
!define un.GetSizeOnDisk `!insertmacro GetSizeOnDiskCall`&lt;br /&gt;
&lt;br /&gt;
!macro GetSizeOnDisk&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro un.GetSizeOnDisk&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
; Usage: similar to &amp;quot;GetSize&amp;quot;&lt;br /&gt;
&lt;br /&gt;
; For documentation, see the NSIS user manual: E.1.3 GetSize&lt;br /&gt;
; Three values are returned&lt;br /&gt;
&lt;br /&gt;
; $var1		; Result1: Size/Size on disk&lt;br /&gt;
; $var2		; Result2: Sum of files&lt;br /&gt;
; $var3		; Result3: Sum of directories&lt;br /&gt;
&lt;br /&gt;
; Example: ${GetSizeOnDisk} &amp;quot;$INSTDIR&amp;quot; &amp;quot;/S=0K&amp;quot; &amp;quot;4096&amp;quot; $0 $1 $2&lt;br /&gt;
&lt;br /&gt;
; Specifying 4096 (logical size) toggles the result&lt;br /&gt;
; Output is size on disk, if used, or size in bytes, if left empty &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
!macro GetSizeOnDisk_&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
&lt;br /&gt;
	; replace&lt;br /&gt;
	Exch $R1&lt;br /&gt;
	Exch&lt;br /&gt;
	Exch $1&lt;br /&gt;
	Exch 2&lt;br /&gt;
	; end replace&lt;br /&gt;
	Exch $0&lt;br /&gt;
	Exch&lt;br /&gt;
	Push $2&lt;br /&gt;
	Push $3&lt;br /&gt;
	Push $4&lt;br /&gt;
	Push $5&lt;br /&gt;
	Push $6&lt;br /&gt;
	Push $7&lt;br /&gt;
	Push $8&lt;br /&gt;
	Push $9&lt;br /&gt;
	; insert code&lt;br /&gt;
	Push $R2&lt;br /&gt;
	; end insert&lt;br /&gt;
	Push $R3&lt;br /&gt;
	Push $R4&lt;br /&gt;
	Push $R5&lt;br /&gt;
	Push $R6&lt;br /&gt;
	Push $R7&lt;br /&gt;
	Push $R8&lt;br /&gt;
	Push $R9&lt;br /&gt;
	ClearErrors&lt;br /&gt;
&lt;br /&gt;
	StrCpy $R9 $0 1 -1&lt;br /&gt;
	StrCmp $R9 &#039;\&#039; 0 +3&lt;br /&gt;
	StrCpy $0 $0 -1&lt;br /&gt;
	goto -3&lt;br /&gt;
	IfFileExists &#039;$0\*.*&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
&lt;br /&gt;
	StrCpy $3 &#039;&#039;&lt;br /&gt;
	StrCpy $4 &#039;&#039;&lt;br /&gt;
	StrCpy $5 &#039;&#039;&lt;br /&gt;
	StrCpy $6 &#039;&#039;&lt;br /&gt;
	StrCpy $8 0&lt;br /&gt;
	StrCpy $R3 &#039;&#039;&lt;br /&gt;
	StrCpy $R4 &#039;&#039;&lt;br /&gt;
	StrCpy $R5 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_option:&lt;br /&gt;
	StrCpy $R9 $1 1&lt;br /&gt;
	StrCpy $1 $1 &#039;&#039; 1&lt;br /&gt;
	StrCmp $R9 &#039; &#039; -2&lt;br /&gt;
	StrCmp $R9 &#039;&#039; FileFunc_GetSize_sizeset&lt;br /&gt;
	StrCmp $R9 &#039;/&#039; 0 -4&lt;br /&gt;
&lt;br /&gt;
	StrCpy $9 -1&lt;br /&gt;
	IntOp $9 $9 + 1&lt;br /&gt;
	StrCpy $R9 $1 1 $9&lt;br /&gt;
	StrCmp $R9 &#039;&#039; +2&lt;br /&gt;
	StrCmp $R9 &#039;/&#039; 0 -3&lt;br /&gt;
	StrCpy $8 $1 $9&lt;br /&gt;
	StrCpy $8 $8 &#039;&#039; 2&lt;br /&gt;
	StrCpy $R9 $8 &#039;&#039; -1&lt;br /&gt;
	StrCmp $R9 &#039; &#039; 0 +3&lt;br /&gt;
	StrCpy $8 $8 -1&lt;br /&gt;
	goto -3&lt;br /&gt;
	StrCpy $R9 $1 2&lt;br /&gt;
	StrCpy $1 $1 &#039;&#039; $9&lt;br /&gt;
&lt;br /&gt;
	StrCmp $R9 &#039;M=&#039; 0 FileFunc_GetSize_size&lt;br /&gt;
	StrCpy $4 $8&lt;br /&gt;
	goto FileFunc_GetSize_option&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_size:&lt;br /&gt;
	StrCmp $R9 &#039;S=&#039; 0 FileFunc_GetSize_gotosubdir&lt;br /&gt;
	StrCpy $6 $8&lt;br /&gt;
	goto FileFunc_GetSize_option&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_gotosubdir:&lt;br /&gt;
	StrCmp $R9 &#039;G=&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
	StrCpy $7 $8&lt;br /&gt;
	StrCmp $7 &#039;&#039; +3&lt;br /&gt;
	StrCmp $7 &#039;1&#039; +2&lt;br /&gt;
	StrCmp $7 &#039;0&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
	goto FileFunc_GetSize_option&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_sizeset:&lt;br /&gt;
	StrCmp $6 &#039;&#039; FileFunc_GetSize_default&lt;br /&gt;
	StrCpy $9 0&lt;br /&gt;
	StrCpy $R9 $6 1 $9&lt;br /&gt;
	StrCmp $R9 &#039;&#039; +4&lt;br /&gt;
	StrCmp $R9 &#039;:&#039; +3&lt;br /&gt;
	IntOp $9 $9 + 1&lt;br /&gt;
	goto -4&lt;br /&gt;
	StrCpy $5 $6 $9&lt;br /&gt;
	IntOp $9 $9 + 1&lt;br /&gt;
	StrCpy $1 $6 1 -1&lt;br /&gt;
	StrCpy $6 $6 -1 $9&lt;br /&gt;
	StrCmp $5 &#039;&#039; +2&lt;br /&gt;
	IntOp $5 $5 + 0&lt;br /&gt;
	StrCmp $6 &#039;&#039; +2&lt;br /&gt;
	IntOp $6 $6 + 0&lt;br /&gt;
&lt;br /&gt;
	StrCmp $1 &#039;B&#039; 0 +4&lt;br /&gt;
	StrCpy $1 1&lt;br /&gt;
	StrCpy $2 bytes&lt;br /&gt;
	goto FileFunc_GetSize_default&lt;br /&gt;
	StrCmp $1 &#039;K&#039; 0 +4&lt;br /&gt;
	StrCpy $1 1024&lt;br /&gt;
	StrCpy $2 Kb&lt;br /&gt;
	goto FileFunc_GetSize_default&lt;br /&gt;
	StrCmp $1 &#039;M&#039; 0 +4&lt;br /&gt;
	StrCpy $1 1048576&lt;br /&gt;
	StrCpy $2 Mb&lt;br /&gt;
	goto FileFunc_GetSize_default&lt;br /&gt;
	StrCmp $1 &#039;G&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
	StrCpy $1 1073741824&lt;br /&gt;
	StrCpy $2 Gb&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_default:&lt;br /&gt;
	StrCmp $4 &#039;&#039; 0 +2&lt;br /&gt;
	StrCpy $4 &#039;*.*&#039;&lt;br /&gt;
	StrCmp $7 &#039;&#039; 0 +2&lt;br /&gt;
	StrCpy $7 &#039;1&#039;&lt;br /&gt;
&lt;br /&gt;
	StrCpy $8 1&lt;br /&gt;
	Push $0&lt;br /&gt;
	SetDetailsPrint textonly&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_nextdir:&lt;br /&gt;
	IntOp $8 $8 - 1&lt;br /&gt;
	Pop $R8&lt;br /&gt;
	FindFirst $0 $R7 &#039;$R8\$4&#039;&lt;br /&gt;
	IfErrors FileFunc_GetSize_show&lt;br /&gt;
	StrCmp $R7 &#039;.&#039; 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	StrCmp $R7 &#039;..&#039; 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
	goto FileFunc_GetSize_show&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_dir:&lt;br /&gt;
	IfFileExists &#039;$R8\$R7\*.*&#039; 0 FileFunc_GetSize_file&lt;br /&gt;
	IntOp $R5 $R5 + 1&lt;br /&gt;
	goto FileFunc_GetSize_findnext&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_file:&lt;br /&gt;
	StrCpy $R6 0&lt;br /&gt;
	StrCmp $5$6 &#039;&#039; 0 +3&lt;br /&gt;
	IntOp $R4 $R4 + 1&lt;br /&gt;
	goto FileFunc_GetSize_findnext&lt;br /&gt;
	; insert code&lt;br /&gt;
	StrCmp $R1 &amp;quot;&amp;quot; FileFunc_GetSize_fileopen&lt;br /&gt;
	StrCpy $R0 0&lt;br /&gt;
	System::Call &#039;kernel32::GetFileAttributes(t &amp;quot;$R8\$R7&amp;quot;)i .R2&#039;&lt;br /&gt;
	StrCmp $R2 -1 FileFunc_GetSize_fileopen&lt;br /&gt;
	IntOp $R0 $R2 &amp;amp; 0x0800&lt;br /&gt;
	IntCmp $R0 0 0 0 +3&lt;br /&gt;
	IntOp $R0 $R2 &amp;amp; 0x0200&lt;br /&gt;
	IntCmp $R0 0 FileFunc_GetSize_fileopen&lt;br /&gt;
	System::Call &#039;kernel32::GetCompressedFileSize(t &amp;quot;$R8\$R7&amp;quot;, i)i .R6&#039;&lt;br /&gt;
	IntCmp $R6 4096 +2 0 +2&lt;br /&gt;
	StrCpy $R6 4096&lt;br /&gt;
	goto FileFunc_GetSize_fileclose&lt;br /&gt;
	FileFunc_GetSize_fileopen:&lt;br /&gt;
	; end insert&lt;br /&gt;
	FileOpen $9 &#039;$R8\$R7&#039; r&lt;br /&gt;
	IfErrors +3&lt;br /&gt;
	FileSeek $9 0 END $R6&lt;br /&gt;
	FileClose $9&lt;br /&gt;
	; insert code&lt;br /&gt;
	FileFunc_GetSize_fileclose:&lt;br /&gt;
	; end insert&lt;br /&gt;
	StrCmp $5 &#039;&#039; +2&lt;br /&gt;
	IntCmp $R6 $5 0 FileFunc_GetSize_findnext&lt;br /&gt;
	StrCmp $6 &#039;&#039; +2&lt;br /&gt;
	IntCmp $R6 $6 0 0 FileFunc_GetSize_findnext&lt;br /&gt;
	IntOp $R4 $R4 + 1&lt;br /&gt;
	; insert code&lt;br /&gt;
	StrCmp $R1 &amp;quot;&amp;quot; FileFunc_GetSize_file_add&lt;br /&gt;
	StrCmp $R0 0 0 FileFunc_GetSize_file_add&lt;br /&gt;
	StrCpy $R0 $R1&lt;br /&gt;
	IntOp $R6 $R6 + $R0&lt;br /&gt;
	IntOp $R1 $R6 % $R0&lt;br /&gt;
	StrCmp $R1 0 0 +2&lt;br /&gt;
	StrCpy $R1 $R0&lt;br /&gt;
	IntOp $R2 $R0 - $R1&lt;br /&gt;
	IntOp $R6 $R6 - $R0&lt;br /&gt;
	IntOp $R6 $R6 + $R2&lt;br /&gt;
	StrCpy $R1 $R0&lt;br /&gt;
	FileFunc_GetSize_file_add:&lt;br /&gt;
	; end insert&lt;br /&gt;
	System::Int64Op $R3 + $R6&lt;br /&gt;
	Pop $R3&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_findnext:&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_show:&lt;br /&gt;
	StrCmp $5$6 &#039;&#039; FileFunc_GetSize_nosize&lt;br /&gt;
	System::Int64Op $R3 / $1&lt;br /&gt;
	Pop $9&lt;br /&gt;
	DetailPrint &#039;Size:$9 $2  Files:$R4  Folders:$R5&#039;&lt;br /&gt;
	goto FileFunc_GetSize_subdir&lt;br /&gt;
	FileFunc_GetSize_nosize:&lt;br /&gt;
	DetailPrint &#039;Files:$R4  Folders:$R5&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_subdir:&lt;br /&gt;
	StrCmp $7 0 FileFunc_GetSize_preend&lt;br /&gt;
	FindFirst $0 $R7 &#039;$R8\*.*&#039;&lt;br /&gt;
	StrCmp $R7 &#039;.&#039; 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	StrCmp $R7 &#039;..&#039; 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
	StrCmp $8 0 FileFunc_GetSize_preend FileFunc_GetSize_nextdir&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_pushdir:&lt;br /&gt;
	IfFileExists &#039;$R8\$R7\*.*&#039; 0 +3&lt;br /&gt;
	Push &#039;$R8\$R7&#039;&lt;br /&gt;
	IntOp $8 $8 + 1&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
	StrCmp $8 0 FileFunc_GetSize_preend FileFunc_GetSize_nextdir&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_preend:&lt;br /&gt;
	StrCmp $R3 &#039;&#039; FileFunc_GetSize_nosizeend&lt;br /&gt;
	System::Int64Op $R3 / $1&lt;br /&gt;
	Pop $R3&lt;br /&gt;
	FileFunc_GetSize_nosizeend:&lt;br /&gt;
	StrCpy $2 $R4&lt;br /&gt;
	StrCpy $1 $R5&lt;br /&gt;
	StrCpy $0 $R3&lt;br /&gt;
	goto FileFunc_GetSize_end&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_error:&lt;br /&gt;
	SetErrors&lt;br /&gt;
	StrCpy $0 &#039;&#039;&lt;br /&gt;
	StrCpy $1 &#039;&#039;&lt;br /&gt;
	StrCpy $2 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_end:&lt;br /&gt;
	SetDetailsPrint both&lt;br /&gt;
	Pop $R9&lt;br /&gt;
	Pop $R8&lt;br /&gt;
	Pop $R7&lt;br /&gt;
	Pop $R6&lt;br /&gt;
	Pop $R5&lt;br /&gt;
	Pop $R4&lt;br /&gt;
	Pop $R3&lt;br /&gt;
	; insert code&lt;br /&gt;
	Pop $R2&lt;br /&gt;
	; end insert&lt;br /&gt;
	Pop $9&lt;br /&gt;
	Pop $8&lt;br /&gt;
	Pop $7&lt;br /&gt;
	Pop $6&lt;br /&gt;
	Pop $5&lt;br /&gt;
	Pop $4&lt;br /&gt;
	Pop $3&lt;br /&gt;
	Exch $2&lt;br /&gt;
	Exch&lt;br /&gt;
	Exch $1&lt;br /&gt;
	Exch 2&lt;br /&gt;
	Exch $0&lt;br /&gt;
&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
; ---------------&lt;br /&gt;
; GetClusterSize&lt;br /&gt;
&lt;br /&gt;
!define GetClusterSize `!insertmacro GetClusterSizeCall`&lt;br /&gt;
!define un.GetClusterSize `!insertmacro GetClusterSizeCall`&lt;br /&gt;
&lt;br /&gt;
!macro GetClusterSize&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro un.GetClusterSize&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetClusterSize_&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
&lt;br /&gt;
	System::Call &#039;kernel32::GetDiskFreeSpace(i0,*i0r0,*i0r1,*i0r2,*i)&#039;&lt;br /&gt;
	IntOp $0 $0 * $1&lt;br /&gt;
	Push $0&lt;br /&gt;
&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/highlight-nsis&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-size: 110%&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Credits:&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;em&amp;gt;GetSizeOnDisk&amp;lt;/em&amp;gt; has been altered slightly and renamed. The original macro is called &amp;lt;em&amp;gt;GetSize&amp;lt;/em&amp;gt;. You will find it in the Users Manual under E.1.3.&lt;br /&gt;
[[Category:Code Examples]]&lt;/div&gt;</summary>
		<author><name>Bnicer</name></author>
	</entry>
	<entry>
		<id>https://nsis.sourceforge.io/mediawiki/index.php?title=Get_size_on_disk&amp;diff=22901</id>
		<title>Get size on disk</title>
		<link rel="alternate" type="text/html" href="https://nsis.sourceforge.io/mediawiki/index.php?title=Get_size_on_disk&amp;diff=22901"/>
		<updated>2013-02-13T08:46:13Z</updated>

		<summary type="html">&lt;p&gt;Bnicer: Size On Disk (SOD) utility&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PageAuthor|Bnicer}}&lt;br /&gt;
This example code shows you how to get the space used by directories and files.&lt;br /&gt;
&amp;lt;highlight-nsis&amp;gt;&lt;br /&gt;
; A utility for computing the NSIS (or NSIS Unicode) install folder size and the size of&lt;br /&gt;
; the uninstaller&lt;br /&gt;
; nsissize.nsi&lt;br /&gt;
; Compile &amp;amp; run the .exe&lt;br /&gt;
&lt;br /&gt;
Name &amp;quot;SOD Tool&amp;quot;&lt;br /&gt;
RequestExecutionLevel user&lt;br /&gt;
!define LOCAL &amp;quot;&amp;quot; ; Path where local include files reside&lt;br /&gt;
OutFile &amp;quot;${LOCAL}nsissize.exe&amp;quot;&lt;br /&gt;
!include &amp;quot;${LOCAL}macros.nsh&amp;quot;&lt;br /&gt;
ReserveFile &amp;quot;${NSISDIR}\Plugins\Math.dll&amp;quot;&lt;br /&gt;
Icon &amp;quot;${LOCAL}arrows.ico&amp;quot;&lt;br /&gt;
ShowInstDetails show&lt;br /&gt;
&lt;br /&gt;
; Variables&lt;br /&gt;
Var NSIS&lt;br /&gt;
Var COUNT&lt;br /&gt;
Var BLOCK&lt;br /&gt;
Var FILES&lt;br /&gt;
Var FOLDERS&lt;br /&gt;
Var SIZE_B&lt;br /&gt;
Var SIZE_M&lt;br /&gt;
Var SOD_B&lt;br /&gt;
Var SOD_K&lt;br /&gt;
Var SOD_M&lt;br /&gt;
Var SIZE_UN_B&lt;br /&gt;
Var SIZE_UN_K&lt;br /&gt;
Var SOD_UN_B&lt;br /&gt;
Var SOD_UN_K&lt;br /&gt;
&lt;br /&gt;
Function Separator ; comma&lt;br /&gt;
  StrCpy $R2 $R1&lt;br /&gt;
  StrCpy $COUNT &amp;quot;16&amp;quot; ; 1,000,000,000,000,000 limit&lt;br /&gt;
  StrLen $R4 $R1&lt;br /&gt;
  loop:&lt;br /&gt;
  IntCmp $COUNT 3 endloop endloop 0&lt;br /&gt;
  IntCmp $R4 $COUNT 0 +7 0&lt;br /&gt;
  IntOp $COUNT $COUNT - 1&lt;br /&gt;
  StrCpy $R2 $R2 -$COUNT&lt;br /&gt;
  StrCpy $R3 $R1 &amp;quot;&amp;quot; -$COUNT&lt;br /&gt;
  StrCpy $R2 &amp;quot;$R2,$R3&amp;quot;&lt;br /&gt;
  IntOp $COUNT $COUNT - 2&lt;br /&gt;
  Goto loop&lt;br /&gt;
  IntOp $COUNT $COUNT - 3&lt;br /&gt;
  Goto loop&lt;br /&gt;
  endloop:&lt;br /&gt;
FunctionEnd&lt;br /&gt;
&lt;br /&gt;
Section&lt;br /&gt;
; root&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS Unicode&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS Unicode&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS ANSI&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS ANSI&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  Goto done&lt;br /&gt;
  begin:&lt;br /&gt;
  IfFileExists &amp;quot;$NSIS&amp;quot; 0 done&lt;br /&gt;
  ${GetClusterSize} $BLOCK&lt;br /&gt;
  ${GetSizeOnDisk} &amp;quot;$NSIS&amp;quot; &amp;quot;/S=0B&amp;quot; &amp;quot;&amp;quot; $0 $1 $2&lt;br /&gt;
  Math::Script &amp;quot;r3 = ff($0 / 1024 / 1024.0, 16 +2&amp;quot;&lt;br /&gt;
  StrCpy $SIZE_B $0&lt;br /&gt;
  StrCpy $FILES $1&lt;br /&gt;
  StrCpy $FOLDERS $2&lt;br /&gt;
  StrCpy $SIZE_M $3&lt;br /&gt;
  ${GetSizeOnDisk} &amp;quot;$NSIS&amp;quot; &amp;quot;/S=0B&amp;quot; &amp;quot;$BLOCK&amp;quot; $0 $1 $2&lt;br /&gt;
  Math::Script &amp;quot;r4 = ff($0 / 1024.0, 16 +0); r5 = ff(r4 / 1024.0, 16 +2)&amp;quot;&lt;br /&gt;
  StrCpy $SOD_B $0&lt;br /&gt;
  StrCpy $SOD_K $4&lt;br /&gt;
  StrCpy $SOD_M $5&lt;br /&gt;
; uninstaller&lt;br /&gt;
  IfFileExists &amp;quot;$NSIS\uninst-nsis.exe&amp;quot; 0 done&lt;br /&gt;
  ${GetSizeOnDisk} &amp;quot;$NSIS&amp;quot; &amp;quot;/M=uninst-nsis.exe /S=0B&amp;quot; &amp;quot;&amp;quot; $0 $1 $2&lt;br /&gt;
  Math::Script &amp;quot;r6 = ff($0 / 1024.0, 16 +1)&amp;quot;&lt;br /&gt;
  StrCpy $SIZE_UN_B $0&lt;br /&gt;
  StrCpy $SIZE_UN_K $6&lt;br /&gt;
  ${GetSizeOnDisk} &amp;quot;$NSIS&amp;quot; &amp;quot;/M=uninst-nsis.exe /S=0B&amp;quot; &amp;quot;$BLOCK&amp;quot; $0 $1 $2&lt;br /&gt;
  Math::Script &amp;quot;r7 = ff($0 / 1024.0, 16 +1)&amp;quot;&lt;br /&gt;
  StrCpy $SOD_UN_B $0&lt;br /&gt;
  StrCpy $SOD_UN_K $7&lt;br /&gt;
; format&lt;br /&gt;
  StrCpy $R1 $SIZE_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SIZE_B $R2&lt;br /&gt;
&lt;br /&gt;
  StrCpy $R1 $SOD_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SOD_B $R2&lt;br /&gt;
&lt;br /&gt;
  StrCpy $R1 $SOD_K&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SOD_K $R2&lt;br /&gt;
&lt;br /&gt;
  StrCpy $R1 $SIZE_UN_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SIZE_UN_B $R2&lt;br /&gt;
  StrCpy $R1 $SOD_UN_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SOD_UN_B $R2&lt;br /&gt;
; output&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;$NSIS&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;Size: $SIZE_M MB ($SIZE_B bytes)&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;SOD: $SOD_M MB ($SOD_B bytes)&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;Uninstaller&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;Size: $SIZE_UN_K KB ($SIZE_UN_B bytes)&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;SOD: $SOD_UN_K KB ($SOD_UN_B bytes)&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;$FILES files $FOLDERS folders $SOD_K Kb&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  Goto completed&lt;br /&gt;
  done:&lt;br /&gt;
  DetailPrint &amp;quot;File not found.&amp;quot;&lt;br /&gt;
  completed:&lt;br /&gt;
SectionEnd&lt;br /&gt;
&lt;br /&gt;
;--------------------------------&lt;br /&gt;
# EOF&lt;br /&gt;
&amp;lt;/highlight-nsis&amp;gt;&lt;br /&gt;
You should copy the next code into a separate file: &amp;lt;b&amp;gt;macros.nsh&amp;lt;/b&amp;gt;.&lt;br /&gt;
&amp;lt;highlight-nsis&amp;gt;&lt;br /&gt;
; Macros include (TN)&lt;br /&gt;
;--------------------------------&lt;br /&gt;
/*&lt;br /&gt;
&lt;br /&gt;
 FileFunction=[GetSizeOnDisk|GetClusterSize]&lt;br /&gt;
&lt;br /&gt;
*/&lt;br /&gt;
;_____________________________________________________________________________&lt;br /&gt;
;&lt;br /&gt;
;                         Macros&lt;br /&gt;
;_____________________________________________________________________________&lt;br /&gt;
;&lt;br /&gt;
; Change log window verbosity (default: 3=no script)&lt;br /&gt;
;&lt;br /&gt;
; Example:&lt;br /&gt;
; !include &amp;quot;sizemacros.nsh&amp;quot;&lt;br /&gt;
; !insertmacro GetSizeOnDisk&lt;br /&gt;
; ${FILEFUNC_VERBOSE} 4   # all verbosity&lt;br /&gt;
; !insertmacro GetClusterSize&lt;br /&gt;
; ${FILEFUNC_VERBOSE} 3   # no script&lt;br /&gt;
&lt;br /&gt;
!include Util.nsh ; for &amp;quot;CallArtificialFunction&amp;quot;&lt;br /&gt;
&lt;br /&gt;
!verbose push&lt;br /&gt;
!verbose 3&lt;br /&gt;
!ifndef _FILEFUNC_VERBOSE&lt;br /&gt;
	!define _FILEFUNC_VERBOSE 3&lt;br /&gt;
!endif&lt;br /&gt;
!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
!define FILEFUNC_VERBOSE `!insertmacro FILEFUNC_VERBOSE`&lt;br /&gt;
!verbose pop&lt;br /&gt;
&lt;br /&gt;
!macro FILEFUNC_VERBOSE _VERBOSE&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose 3&lt;br /&gt;
	!undef _FILEFUNC_VERBOSE&lt;br /&gt;
	!define _FILEFUNC_VERBOSE ${_VERBOSE}&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetSizeOnDiskCall _PATH _OPTIONS _FILESYSTEM _RESULT1 _RESULT2 _RESULT3&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
	Push `${_PATH}`&lt;br /&gt;
	Push `${_OPTIONS}`&lt;br /&gt;
	Push `${_FILESYSTEM}` ; block size&lt;br /&gt;
	${CallArtificialFunction} GetSizeOnDisk_&lt;br /&gt;
	Pop ${_RESULT1}&lt;br /&gt;
	Pop ${_RESULT2}&lt;br /&gt;
	Pop ${_RESULT3}&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetClusterSizeCall _RESULT&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
	${CallArtificialFunction} GetClusterSize_&lt;br /&gt;
	Pop ${_RESULT}&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
; ---------------&lt;br /&gt;
; GetSizeOnDisk (modified &amp;quot;GetSize&amp;quot; - FileFunc.nsh - KiCHiK - Function &amp;quot;FindFiles&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
!define GetSizeOnDisk `!insertmacro GetSizeOnDiskCall`&lt;br /&gt;
!define un.GetSizeOnDisk `!insertmacro GetSizeOnDiskCall`&lt;br /&gt;
&lt;br /&gt;
!macro GetSizeOnDisk&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro un.GetSizeOnDisk&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
; Usage: similar to &amp;quot;GetSize&amp;quot;&lt;br /&gt;
&lt;br /&gt;
; For documentation, see the NSIS user manual: E.1.3 GetSize&lt;br /&gt;
; Three values are returned&lt;br /&gt;
&lt;br /&gt;
; $var1		; Result1: Size/Size on disk&lt;br /&gt;
; $var2		; Result2: Sum of files&lt;br /&gt;
; $var3		; Result3: Sum of directories&lt;br /&gt;
&lt;br /&gt;
; Example: ${GetSizeOnDisk} &amp;quot;$INSTDIR&amp;quot; &amp;quot;/S=0K&amp;quot; &amp;quot;4096&amp;quot; $0 $1 $2&lt;br /&gt;
&lt;br /&gt;
; Specifying 4096 (logical size) toggles the result&lt;br /&gt;
; Output is size on disk, if used, or size in bytes, if left empty &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
!macro GetSizeOnDisk_&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
&lt;br /&gt;
	; replace&lt;br /&gt;
	Exch $R1&lt;br /&gt;
	Exch&lt;br /&gt;
	Exch $1&lt;br /&gt;
	Exch 2&lt;br /&gt;
	; end replace&lt;br /&gt;
	Exch $0&lt;br /&gt;
	Exch&lt;br /&gt;
	Push $2&lt;br /&gt;
	Push $3&lt;br /&gt;
	Push $4&lt;br /&gt;
	Push $5&lt;br /&gt;
	Push $6&lt;br /&gt;
	Push $7&lt;br /&gt;
	Push $8&lt;br /&gt;
	Push $9&lt;br /&gt;
	; insert code&lt;br /&gt;
	Push $R2&lt;br /&gt;
	; end insert&lt;br /&gt;
	Push $R3&lt;br /&gt;
	Push $R4&lt;br /&gt;
	Push $R5&lt;br /&gt;
	Push $R6&lt;br /&gt;
	Push $R7&lt;br /&gt;
	Push $R8&lt;br /&gt;
	Push $R9&lt;br /&gt;
	ClearErrors&lt;br /&gt;
&lt;br /&gt;
	StrCpy $R9 $0 1 -1&lt;br /&gt;
	StrCmp $R9 &#039;\&#039; 0 +3&lt;br /&gt;
	StrCpy $0 $0 -1&lt;br /&gt;
	goto -3&lt;br /&gt;
	IfFileExists &#039;$0\*.*&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
&lt;br /&gt;
	StrCpy $3 &#039;&#039;&lt;br /&gt;
	StrCpy $4 &#039;&#039;&lt;br /&gt;
	StrCpy $5 &#039;&#039;&lt;br /&gt;
	StrCpy $6 &#039;&#039;&lt;br /&gt;
	StrCpy $8 0&lt;br /&gt;
	StrCpy $R3 &#039;&#039;&lt;br /&gt;
	StrCpy $R4 &#039;&#039;&lt;br /&gt;
	StrCpy $R5 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_option:&lt;br /&gt;
	StrCpy $R9 $1 1&lt;br /&gt;
	StrCpy $1 $1 &#039;&#039; 1&lt;br /&gt;
	StrCmp $R9 &#039; &#039; -2&lt;br /&gt;
	StrCmp $R9 &#039;&#039; FileFunc_GetSize_sizeset&lt;br /&gt;
	StrCmp $R9 &#039;/&#039; 0 -4&lt;br /&gt;
&lt;br /&gt;
	StrCpy $9 -1&lt;br /&gt;
	IntOp $9 $9 + 1&lt;br /&gt;
	StrCpy $R9 $1 1 $9&lt;br /&gt;
	StrCmp $R9 &#039;&#039; +2&lt;br /&gt;
	StrCmp $R9 &#039;/&#039; 0 -3&lt;br /&gt;
	StrCpy $8 $1 $9&lt;br /&gt;
	StrCpy $8 $8 &#039;&#039; 2&lt;br /&gt;
	StrCpy $R9 $8 &#039;&#039; -1&lt;br /&gt;
	StrCmp $R9 &#039; &#039; 0 +3&lt;br /&gt;
	StrCpy $8 $8 -1&lt;br /&gt;
	goto -3&lt;br /&gt;
	StrCpy $R9 $1 2&lt;br /&gt;
	StrCpy $1 $1 &#039;&#039; $9&lt;br /&gt;
&lt;br /&gt;
	StrCmp $R9 &#039;M=&#039; 0 FileFunc_GetSize_size&lt;br /&gt;
	StrCpy $4 $8&lt;br /&gt;
	goto FileFunc_GetSize_option&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_size:&lt;br /&gt;
	StrCmp $R9 &#039;S=&#039; 0 FileFunc_GetSize_gotosubdir&lt;br /&gt;
	StrCpy $6 $8&lt;br /&gt;
	goto FileFunc_GetSize_option&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_gotosubdir:&lt;br /&gt;
	StrCmp $R9 &#039;G=&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
	StrCpy $7 $8&lt;br /&gt;
	StrCmp $7 &#039;&#039; +3&lt;br /&gt;
	StrCmp $7 &#039;1&#039; +2&lt;br /&gt;
	StrCmp $7 &#039;0&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
	goto FileFunc_GetSize_option&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_sizeset:&lt;br /&gt;
	StrCmp $6 &#039;&#039; FileFunc_GetSize_default&lt;br /&gt;
	StrCpy $9 0&lt;br /&gt;
	StrCpy $R9 $6 1 $9&lt;br /&gt;
	StrCmp $R9 &#039;&#039; +4&lt;br /&gt;
	StrCmp $R9 &#039;:&#039; +3&lt;br /&gt;
	IntOp $9 $9 + 1&lt;br /&gt;
	goto -4&lt;br /&gt;
	StrCpy $5 $6 $9&lt;br /&gt;
	IntOp $9 $9 + 1&lt;br /&gt;
	StrCpy $1 $6 1 -1&lt;br /&gt;
	StrCpy $6 $6 -1 $9&lt;br /&gt;
	StrCmp $5 &#039;&#039; +2&lt;br /&gt;
	IntOp $5 $5 + 0&lt;br /&gt;
	StrCmp $6 &#039;&#039; +2&lt;br /&gt;
	IntOp $6 $6 + 0&lt;br /&gt;
&lt;br /&gt;
	StrCmp $1 &#039;B&#039; 0 +4&lt;br /&gt;
	StrCpy $1 1&lt;br /&gt;
	StrCpy $2 bytes&lt;br /&gt;
	goto FileFunc_GetSize_default&lt;br /&gt;
	StrCmp $1 &#039;K&#039; 0 +4&lt;br /&gt;
	StrCpy $1 1024&lt;br /&gt;
	StrCpy $2 Kb&lt;br /&gt;
	goto FileFunc_GetSize_default&lt;br /&gt;
	StrCmp $1 &#039;M&#039; 0 +4&lt;br /&gt;
	StrCpy $1 1048576&lt;br /&gt;
	StrCpy $2 Mb&lt;br /&gt;
	goto FileFunc_GetSize_default&lt;br /&gt;
	StrCmp $1 &#039;G&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
	StrCpy $1 1073741824&lt;br /&gt;
	StrCpy $2 Gb&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_default:&lt;br /&gt;
	StrCmp $4 &#039;&#039; 0 +2&lt;br /&gt;
	StrCpy $4 &#039;*.*&#039;&lt;br /&gt;
	StrCmp $7 &#039;&#039; 0 +2&lt;br /&gt;
	StrCpy $7 &#039;1&#039;&lt;br /&gt;
&lt;br /&gt;
	StrCpy $8 1&lt;br /&gt;
	Push $0&lt;br /&gt;
	SetDetailsPrint textonly&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_nextdir:&lt;br /&gt;
	IntOp $8 $8 - 1&lt;br /&gt;
	Pop $R8&lt;br /&gt;
	FindFirst $0 $R7 &#039;$R8\$4&#039;&lt;br /&gt;
	IfErrors FileFunc_GetSize_show&lt;br /&gt;
	StrCmp $R7 &#039;.&#039; 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	StrCmp $R7 &#039;..&#039; 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
	goto FileFunc_GetSize_show&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_dir:&lt;br /&gt;
	IfFileExists &#039;$R8\$R7\*.*&#039; 0 FileFunc_GetSize_file&lt;br /&gt;
	IntOp $R5 $R5 + 1&lt;br /&gt;
	goto FileFunc_GetSize_findnext&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_file:&lt;br /&gt;
	StrCpy $R6 0&lt;br /&gt;
	StrCmp $5$6 &#039;&#039; 0 +3&lt;br /&gt;
	IntOp $R4 $R4 + 1&lt;br /&gt;
	goto FileFunc_GetSize_findnext&lt;br /&gt;
	; insert code&lt;br /&gt;
	StrCmp $R1 &amp;quot;&amp;quot; FileFunc_GetSize_fileopen&lt;br /&gt;
	StrCpy $R0 0&lt;br /&gt;
	System::Call &#039;kernel32::GetFileAttributes(t &amp;quot;$R8\$R7&amp;quot;)i .R2&#039;&lt;br /&gt;
	StrCmp $R2 -1 FileFunc_GetSize_fileopen&lt;br /&gt;
	IntOp $R0 $R2 &amp;amp; 0x0800&lt;br /&gt;
	IntCmp $R0 0 0 0 +3&lt;br /&gt;
	IntOp $R0 $R2 &amp;amp; 0x0200&lt;br /&gt;
	IntCmp $R0 0 FileFunc_GetSize_fileopen&lt;br /&gt;
	System::Call &#039;kernel32::GetCompressedFileSize(t &amp;quot;$R8\$R7&amp;quot;, i)i .R6&#039;&lt;br /&gt;
	IntCmp $R6 4096 +2 0 +2&lt;br /&gt;
	StrCpy $R6 4096&lt;br /&gt;
	goto FileFunc_GetSize_fileclose&lt;br /&gt;
	FileFunc_GetSize_fileopen:&lt;br /&gt;
	; end insert&lt;br /&gt;
	FileOpen $9 &#039;$R8\$R7&#039; r&lt;br /&gt;
	IfErrors +3&lt;br /&gt;
	FileSeek $9 0 END $R6&lt;br /&gt;
	FileClose $9&lt;br /&gt;
	; insert code&lt;br /&gt;
	FileFunc_GetSize_fileclose:&lt;br /&gt;
	; end insert&lt;br /&gt;
	StrCmp $5 &#039;&#039; +2&lt;br /&gt;
	IntCmp $R6 $5 0 FileFunc_GetSize_findnext&lt;br /&gt;
	StrCmp $6 &#039;&#039; +2&lt;br /&gt;
	IntCmp $R6 $6 0 0 FileFunc_GetSize_findnext&lt;br /&gt;
	IntOp $R4 $R4 + 1&lt;br /&gt;
	; insert code&lt;br /&gt;
	StrCmp $R1 &amp;quot;&amp;quot; FileFunc_GetSize_file_add&lt;br /&gt;
	StrCmp $R0 0 0 FileFunc_GetSize_file_add&lt;br /&gt;
	StrCpy $R0 $R1&lt;br /&gt;
	IntOp $R6 $R6 + $R0&lt;br /&gt;
	IntOp $R1 $R6 % $R0&lt;br /&gt;
	StrCmp $R1 0 0 +2&lt;br /&gt;
	StrCpy $R1 $R0&lt;br /&gt;
	IntOp $R2 $R0 - $R1&lt;br /&gt;
	IntOp $R6 $R6 - $R0&lt;br /&gt;
	IntOp $R6 $R6 + $R2&lt;br /&gt;
	StrCpy $R1 $R0&lt;br /&gt;
	FileFunc_GetSize_file_add:&lt;br /&gt;
	; end insert&lt;br /&gt;
	System::Int64Op $R3 + $R6&lt;br /&gt;
	Pop $R3&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_findnext:&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_show:&lt;br /&gt;
	StrCmp $5$6 &#039;&#039; FileFunc_GetSize_nosize&lt;br /&gt;
	System::Int64Op $R3 / $1&lt;br /&gt;
	Pop $9&lt;br /&gt;
	DetailPrint &#039;Size:$9 $2  Files:$R4  Folders:$R5&#039;&lt;br /&gt;
	goto FileFunc_GetSize_subdir&lt;br /&gt;
	FileFunc_GetSize_nosize:&lt;br /&gt;
	DetailPrint &#039;Files:$R4  Folders:$R5&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_subdir:&lt;br /&gt;
	StrCmp $7 0 FileFunc_GetSize_preend&lt;br /&gt;
	FindFirst $0 $R7 &#039;$R8\*.*&#039;&lt;br /&gt;
	StrCmp $R7 &#039;.&#039; 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	StrCmp $R7 &#039;..&#039; 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
	StrCmp $8 0 FileFunc_GetSize_preend FileFunc_GetSize_nextdir&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_pushdir:&lt;br /&gt;
	IfFileExists &#039;$R8\$R7\*.*&#039; 0 +3&lt;br /&gt;
	Push &#039;$R8\$R7&#039;&lt;br /&gt;
	IntOp $8 $8 + 1&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
	StrCmp $8 0 FileFunc_GetSize_preend FileFunc_GetSize_nextdir&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_preend:&lt;br /&gt;
	StrCmp $R3 &#039;&#039; FileFunc_GetSize_nosizeend&lt;br /&gt;
	System::Int64Op $R3 / $1&lt;br /&gt;
	Pop $R3&lt;br /&gt;
	FileFunc_GetSize_nosizeend:&lt;br /&gt;
	StrCpy $2 $R4&lt;br /&gt;
	StrCpy $1 $R5&lt;br /&gt;
	StrCpy $0 $R3&lt;br /&gt;
	goto FileFunc_GetSize_end&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_error:&lt;br /&gt;
	SetErrors&lt;br /&gt;
	StrCpy $0 &#039;&#039;&lt;br /&gt;
	StrCpy $1 &#039;&#039;&lt;br /&gt;
	StrCpy $2 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_end:&lt;br /&gt;
	SetDetailsPrint both&lt;br /&gt;
	Pop $R9&lt;br /&gt;
	Pop $R8&lt;br /&gt;
	Pop $R7&lt;br /&gt;
	Pop $R6&lt;br /&gt;
	Pop $R5&lt;br /&gt;
	Pop $R4&lt;br /&gt;
	Pop $R3&lt;br /&gt;
	; insert code&lt;br /&gt;
	Pop $R2&lt;br /&gt;
	; end insert&lt;br /&gt;
	Pop $9&lt;br /&gt;
	Pop $8&lt;br /&gt;
	Pop $7&lt;br /&gt;
	Pop $6&lt;br /&gt;
	Pop $5&lt;br /&gt;
	Pop $4&lt;br /&gt;
	Pop $3&lt;br /&gt;
	Exch $2&lt;br /&gt;
	Exch&lt;br /&gt;
	Exch $1&lt;br /&gt;
	Exch 2&lt;br /&gt;
	Exch $0&lt;br /&gt;
&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
; ---------------&lt;br /&gt;
; GetClusterSize&lt;br /&gt;
&lt;br /&gt;
!define GetClusterSize `!insertmacro GetClusterSizeCall`&lt;br /&gt;
!define un.GetClusterSize `!insertmacro GetClusterSizeCall`&lt;br /&gt;
&lt;br /&gt;
!macro GetClusterSize&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro un.GetClusterSize&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetClusterSize_&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
&lt;br /&gt;
	System::Call &#039;kernel32::GetDiskFreeSpace(i0,*i0r0,*i0r1,*i0r2,*i)&#039;&lt;br /&gt;
	IntOp $0 $0 * $1&lt;br /&gt;
	Push $0&lt;br /&gt;
&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/highlight-nsis&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-size: 110%&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Credits:&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;em&amp;gt;GetSizeOnDisk&amp;lt;/em&amp;gt; has been altered slightly and renamed. The original macro is called &amp;lt;em&amp;gt;GetSize&amp;lt;/em&amp;gt;. You will find it in the Users Manual under E.1.3.&lt;br /&gt;
[[Category:Code Examples]]&lt;/div&gt;</summary>
		<author><name>Bnicer</name></author>
	</entry>
	<entry>
		<id>https://nsis.sourceforge.io/mediawiki/index.php?title=Get_size_on_disk&amp;diff=22899</id>
		<title>Get size on disk</title>
		<link rel="alternate" type="text/html" href="https://nsis.sourceforge.io/mediawiki/index.php?title=Get_size_on_disk&amp;diff=22899"/>
		<updated>2013-02-13T00:08:53Z</updated>

		<summary type="html">&lt;p&gt;Bnicer: Size On Disk (SOD) utility to get the space used by directories and files&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PageAuthor|Bnicer}}&lt;br /&gt;
This example code shows you how to get the space used by directories and files.&lt;br /&gt;
&amp;lt;highlight-nsis&amp;gt;&lt;br /&gt;
; A utility for computing the NSIS (or NSIS Unicode) install folder size and the size of&lt;br /&gt;
; the uninstaller&lt;br /&gt;
; nsissize.nsi&lt;br /&gt;
; Compile &amp;amp; run the .exe&lt;br /&gt;
&lt;br /&gt;
Name &amp;quot;SOD Tool&amp;quot;&lt;br /&gt;
RequestExecutionLevel user&lt;br /&gt;
!define LOCAL &amp;quot;&amp;quot; ; Path where local include files reside&lt;br /&gt;
OutFile &amp;quot;${LOCAL}nsissize.exe&amp;quot;&lt;br /&gt;
!include &amp;quot;${LOCAL}macros.nsh&amp;quot;&lt;br /&gt;
ReserveFile &amp;quot;${NSISDIR}\Plugins\Math.dll&amp;quot;&lt;br /&gt;
Icon &amp;quot;${LOCAL}arrows.ico&amp;quot;&lt;br /&gt;
ShowInstDetails show&lt;br /&gt;
&lt;br /&gt;
; Variables&lt;br /&gt;
Var NSIS&lt;br /&gt;
Var COUNT&lt;br /&gt;
Var BLOCK&lt;br /&gt;
Var FILES&lt;br /&gt;
Var FOLDERS&lt;br /&gt;
Var SIZE_B&lt;br /&gt;
Var SIZE_M&lt;br /&gt;
Var SOD_B&lt;br /&gt;
Var SOD_K&lt;br /&gt;
Var SOD_M&lt;br /&gt;
Var SIZE_UN_B&lt;br /&gt;
Var SIZE_UN_K&lt;br /&gt;
Var SOD_UN_B&lt;br /&gt;
Var SOD_UN_K&lt;br /&gt;
&lt;br /&gt;
Function Separator ; comma&lt;br /&gt;
  StrCpy $R2 $R1&lt;br /&gt;
  StrCpy $COUNT &amp;quot;16&amp;quot; ; 1,000,000,000,000,000 limit&lt;br /&gt;
  StrLen $R4 $R1&lt;br /&gt;
  loop:&lt;br /&gt;
  IntCmp $COUNT 3 endloop endloop 0&lt;br /&gt;
  IntCmp $R4 $COUNT 0 +7 0&lt;br /&gt;
  IntOp $COUNT $COUNT - 1&lt;br /&gt;
  StrCpy $R2 $R2 -$COUNT&lt;br /&gt;
  StrCpy $R3 $R1 &amp;quot;&amp;quot; -$COUNT&lt;br /&gt;
  StrCpy $R2 &amp;quot;$R2,$R3&amp;quot;&lt;br /&gt;
  IntOp $COUNT $COUNT - 2&lt;br /&gt;
  Goto loop&lt;br /&gt;
  IntOp $COUNT $COUNT - 3&lt;br /&gt;
  Goto loop&lt;br /&gt;
  endloop:&lt;br /&gt;
FunctionEnd&lt;br /&gt;
&lt;br /&gt;
Section&lt;br /&gt;
; root&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS Unicode&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS Unicode&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS ANSI&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS ANSI&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  Goto done&lt;br /&gt;
  begin:&lt;br /&gt;
  IfFileExists &amp;quot;$NSIS&amp;quot; 0 done&lt;br /&gt;
  ${GetClusterSize} $BLOCK&lt;br /&gt;
  ${GetSizeOnDisk} &amp;quot;$NSIS&amp;quot; &amp;quot;/S=0B&amp;quot; &amp;quot;&amp;quot; $0 $1 $2&lt;br /&gt;
  Math::Script &amp;quot;r3 = ff($0 / 1024 / 1024.0, 16 +2&amp;quot;&lt;br /&gt;
  StrCpy $SIZE_B $0&lt;br /&gt;
  StrCpy $FILES $1&lt;br /&gt;
  StrCpy $FOLDERS $2&lt;br /&gt;
  StrCpy $SIZE_M $3&lt;br /&gt;
  ${GetSizeOnDisk} &amp;quot;$NSIS&amp;quot; &amp;quot;/S=0B&amp;quot; &amp;quot;$BLOCK&amp;quot; $0 $1 $2&lt;br /&gt;
  Math::Script &amp;quot;r4 = ff($0 / 1024.0, 16 +0); r5 = ff(r4 / 1024.0, 16 +2)&amp;quot;&lt;br /&gt;
  StrCpy $SOD_B $0&lt;br /&gt;
  StrCpy $SOD_K $4&lt;br /&gt;
  StrCpy $SOD_M $5&lt;br /&gt;
; uninstaller&lt;br /&gt;
  IfFileExists &amp;quot;$NSIS\uninst-nsis.exe&amp;quot; 0 done&lt;br /&gt;
  ${GetSizeOnDisk} &amp;quot;$NSIS&amp;quot; &amp;quot;/M=uninst-nsis.exe /S=0B&amp;quot; &amp;quot;&amp;quot; $0 $1 $2&lt;br /&gt;
  Math::Script &amp;quot;r6 = ff($0 / 1024.0, 16 +1)&amp;quot;&lt;br /&gt;
  StrCpy $SIZE_UN_B $0&lt;br /&gt;
  StrCpy $SIZE_UN_K $6&lt;br /&gt;
  ${GetSizeOnDisk} &amp;quot;$NSIS&amp;quot; &amp;quot;/M=uninst-nsis.exe /S=0B&amp;quot; &amp;quot;$BLOCK&amp;quot; $0 $1 $2&lt;br /&gt;
  Math::Script &amp;quot;r7 = ff($0 / 1024.0, 16 +1)&amp;quot;&lt;br /&gt;
  StrCpy $SOD_UN_B $0&lt;br /&gt;
  StrCpy $SOD_UN_K $7&lt;br /&gt;
; format&lt;br /&gt;
  StrCpy $R1 $SIZE_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SIZE_B $R2&lt;br /&gt;
&lt;br /&gt;
  StrCpy $R1 $SOD_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SOD_B $R2&lt;br /&gt;
&lt;br /&gt;
  StrCpy $R1 $SOD_K&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SOD_K $R2&lt;br /&gt;
&lt;br /&gt;
  StrCpy $R1 $SIZE_UN_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SIZE_UN_B $R2&lt;br /&gt;
  StrCpy $R1 $SOD_UN_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SOD_UN_B $R2&lt;br /&gt;
; output&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;$NSIS&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;Size: $SIZE_M MB ($SIZE_B bytes)&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;SOD: $SOD_M MB ($SOD_B bytes)&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;Uninstaller&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;Size: $SIZE_UN_K KB ($SIZE_UN_B bytes)&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;SOD: $SOD_UN_K KB ($SOD_UN_B bytes)&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;$FILES files $FOLDERS folders $SOD_K Kb&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  Goto completed&lt;br /&gt;
  done:&lt;br /&gt;
  DetailPrint &amp;quot;File not found.&amp;quot;&lt;br /&gt;
  completed:&lt;br /&gt;
SectionEnd&lt;br /&gt;
&lt;br /&gt;
;--------------------------------&lt;br /&gt;
# EOF&lt;br /&gt;
&amp;lt;/highlight-nsis&amp;gt;&lt;br /&gt;
You should copy the next code into a separate file: &amp;lt;b&amp;gt;macros.nsh&amp;lt;/b&amp;gt;.&lt;br /&gt;
&amp;lt;highlight-nsis&amp;gt;&lt;br /&gt;
; Macros include (TN)&lt;br /&gt;
;--------------------------------&lt;br /&gt;
/*&lt;br /&gt;
&lt;br /&gt;
 FileFunction=[GetSizeOnDisk|GetClusterSize]&lt;br /&gt;
&lt;br /&gt;
*/&lt;br /&gt;
;_____________________________________________________________________________&lt;br /&gt;
;&lt;br /&gt;
;                         Macros&lt;br /&gt;
;_____________________________________________________________________________&lt;br /&gt;
;&lt;br /&gt;
; Change log window verbosity (default: 3=no script)&lt;br /&gt;
;&lt;br /&gt;
; Example:&lt;br /&gt;
; !include &amp;quot;sizemacros.nsh&amp;quot;&lt;br /&gt;
; !insertmacro GetSizeOnDisk&lt;br /&gt;
; ${FILEFUNC_VERBOSE} 4   # all verbosity&lt;br /&gt;
; !insertmacro GetClusterSize&lt;br /&gt;
; ${FILEFUNC_VERBOSE} 3   # no script&lt;br /&gt;
&lt;br /&gt;
!include Util.nsh ; for &amp;quot;CallArtificialFunction&amp;quot;&lt;br /&gt;
&lt;br /&gt;
!verbose push&lt;br /&gt;
!verbose 3&lt;br /&gt;
!ifndef _FILEFUNC_VERBOSE&lt;br /&gt;
	!define _FILEFUNC_VERBOSE 3&lt;br /&gt;
!endif&lt;br /&gt;
!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
!define FILEFUNC_VERBOSE `!insertmacro FILEFUNC_VERBOSE`&lt;br /&gt;
!verbose pop&lt;br /&gt;
&lt;br /&gt;
!macro FILEFUNC_VERBOSE _VERBOSE&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose 3&lt;br /&gt;
	!undef _FILEFUNC_VERBOSE&lt;br /&gt;
	!define _FILEFUNC_VERBOSE ${_VERBOSE}&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetSizeOnDiskCall _PATH _OPTIONS _FILESYSTEM _RESULT1 _RESULT2 _RESULT3&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
	Push `${_PATH}`&lt;br /&gt;
	Push `${_OPTIONS}`&lt;br /&gt;
	Push `${_FILESYSTEM}` ; block size&lt;br /&gt;
	${CallArtificialFunction} GetSizeOnDisk_&lt;br /&gt;
	Pop ${_RESULT1}&lt;br /&gt;
	Pop ${_RESULT2}&lt;br /&gt;
	Pop ${_RESULT3}&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetClusterSizeCall _RESULT&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
	${CallArtificialFunction} GetClusterSize_&lt;br /&gt;
	Pop ${_RESULT}&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
; ---------------&lt;br /&gt;
; GetSizeOnDisk (modified &amp;quot;GetSize&amp;quot; - FileFunc.nsh - KiCHiK - Function &amp;quot;FindFiles&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
!define GetSizeOnDisk `!insertmacro GetSizeOnDiskCall`&lt;br /&gt;
!define un.GetSizeOnDisk `!insertmacro GetSizeOnDiskCall`&lt;br /&gt;
&lt;br /&gt;
!macro GetSizeOnDisk&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro un.GetSizeOnDisk&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
; Usage: similar to &amp;quot;GetSize&amp;quot;&lt;br /&gt;
&lt;br /&gt;
; For documentation, see the NSIS user manual: E.1.3 GetSize&lt;br /&gt;
; Three values are returned&lt;br /&gt;
&lt;br /&gt;
; $var1		; Result1: Size/Size on disk&lt;br /&gt;
; $var2		; Result2: Sum of files&lt;br /&gt;
; $var3		; Result3: Sum of directories&lt;br /&gt;
&lt;br /&gt;
; Example: ${GetSizeOnDisk} &amp;quot;$INSTDIR&amp;quot; &amp;quot;/S=0K&amp;quot; &amp;quot;4096&amp;quot; $0 $1 $2&lt;br /&gt;
&lt;br /&gt;
; Specifying 4096 (logical size) toggles the result&lt;br /&gt;
; Output is size on disk, if used, or size in bytes, if left empty &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
!macro GetSizeOnDisk_&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
&lt;br /&gt;
	; replace&lt;br /&gt;
	Exch $R1&lt;br /&gt;
	Exch&lt;br /&gt;
	Exch $1&lt;br /&gt;
	Exch 2&lt;br /&gt;
	; end replace&lt;br /&gt;
	Exch $0&lt;br /&gt;
	Exch&lt;br /&gt;
	Push $2&lt;br /&gt;
	Push $3&lt;br /&gt;
	Push $4&lt;br /&gt;
	Push $5&lt;br /&gt;
	Push $6&lt;br /&gt;
	Push $7&lt;br /&gt;
	Push $8&lt;br /&gt;
	Push $9&lt;br /&gt;
	; insert code&lt;br /&gt;
	Push $R2&lt;br /&gt;
	; end insert&lt;br /&gt;
	Push $R3&lt;br /&gt;
	Push $R4&lt;br /&gt;
	Push $R5&lt;br /&gt;
	Push $R6&lt;br /&gt;
	Push $R7&lt;br /&gt;
	Push $R8&lt;br /&gt;
	Push $R9&lt;br /&gt;
	ClearErrors&lt;br /&gt;
&lt;br /&gt;
	StrCpy $R9 $0 1 -1&lt;br /&gt;
	StrCmp $R9 &#039;\&#039; 0 +3&lt;br /&gt;
	StrCpy $0 $0 -1&lt;br /&gt;
	goto -3&lt;br /&gt;
	IfFileExists &#039;$0\*.*&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
&lt;br /&gt;
	StrCpy $3 &#039;&#039;&lt;br /&gt;
	StrCpy $4 &#039;&#039;&lt;br /&gt;
	StrCpy $5 &#039;&#039;&lt;br /&gt;
	StrCpy $6 &#039;&#039;&lt;br /&gt;
	StrCpy $8 0&lt;br /&gt;
	StrCpy $R3 &#039;&#039;&lt;br /&gt;
	StrCpy $R4 &#039;&#039;&lt;br /&gt;
	StrCpy $R5 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_option:&lt;br /&gt;
	StrCpy $R9 $1 1&lt;br /&gt;
	StrCpy $1 $1 &#039;&#039; 1&lt;br /&gt;
	StrCmp $R9 &#039; &#039; -2&lt;br /&gt;
	StrCmp $R9 &#039;&#039; FileFunc_GetSize_sizeset&lt;br /&gt;
	StrCmp $R9 &#039;/&#039; 0 -4&lt;br /&gt;
&lt;br /&gt;
	StrCpy $9 -1&lt;br /&gt;
	IntOp $9 $9 + 1&lt;br /&gt;
	StrCpy $R9 $1 1 $9&lt;br /&gt;
	StrCmp $R9 &#039;&#039; +2&lt;br /&gt;
	StrCmp $R9 &#039;/&#039; 0 -3&lt;br /&gt;
	StrCpy $8 $1 $9&lt;br /&gt;
	StrCpy $8 $8 &#039;&#039; 2&lt;br /&gt;
	StrCpy $R9 $8 &#039;&#039; -1&lt;br /&gt;
	StrCmp $R9 &#039; &#039; 0 +3&lt;br /&gt;
	StrCpy $8 $8 -1&lt;br /&gt;
	goto -3&lt;br /&gt;
	StrCpy $R9 $1 2&lt;br /&gt;
	StrCpy $1 $1 &#039;&#039; $9&lt;br /&gt;
&lt;br /&gt;
	StrCmp $R9 &#039;M=&#039; 0 FileFunc_GetSize_size&lt;br /&gt;
	StrCpy $4 $8&lt;br /&gt;
	goto FileFunc_GetSize_option&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_size:&lt;br /&gt;
	StrCmp $R9 &#039;S=&#039; 0 FileFunc_GetSize_gotosubdir&lt;br /&gt;
	StrCpy $6 $8&lt;br /&gt;
	goto FileFunc_GetSize_option&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_gotosubdir:&lt;br /&gt;
	StrCmp $R9 &#039;G=&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
	StrCpy $7 $8&lt;br /&gt;
	StrCmp $7 &#039;&#039; +3&lt;br /&gt;
	StrCmp $7 &#039;1&#039; +2&lt;br /&gt;
	StrCmp $7 &#039;0&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
	goto FileFunc_GetSize_option&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_sizeset:&lt;br /&gt;
	StrCmp $6 &#039;&#039; FileFunc_GetSize_default&lt;br /&gt;
	StrCpy $9 0&lt;br /&gt;
	StrCpy $R9 $6 1 $9&lt;br /&gt;
	StrCmp $R9 &#039;&#039; +4&lt;br /&gt;
	StrCmp $R9 &#039;:&#039; +3&lt;br /&gt;
	IntOp $9 $9 + 1&lt;br /&gt;
	goto -4&lt;br /&gt;
	StrCpy $5 $6 $9&lt;br /&gt;
	IntOp $9 $9 + 1&lt;br /&gt;
	StrCpy $1 $6 1 -1&lt;br /&gt;
	StrCpy $6 $6 -1 $9&lt;br /&gt;
	StrCmp $5 &#039;&#039; +2&lt;br /&gt;
	IntOp $5 $5 + 0&lt;br /&gt;
	StrCmp $6 &#039;&#039; +2&lt;br /&gt;
	IntOp $6 $6 + 0&lt;br /&gt;
&lt;br /&gt;
	StrCmp $1 &#039;B&#039; 0 +4&lt;br /&gt;
	StrCpy $1 1&lt;br /&gt;
	StrCpy $2 bytes&lt;br /&gt;
	goto FileFunc_GetSize_default&lt;br /&gt;
	StrCmp $1 &#039;K&#039; 0 +4&lt;br /&gt;
	StrCpy $1 1024&lt;br /&gt;
	StrCpy $2 Kb&lt;br /&gt;
	goto FileFunc_GetSize_default&lt;br /&gt;
	StrCmp $1 &#039;M&#039; 0 +4&lt;br /&gt;
	StrCpy $1 1048576&lt;br /&gt;
	StrCpy $2 Mb&lt;br /&gt;
	goto FileFunc_GetSize_default&lt;br /&gt;
	StrCmp $1 &#039;G&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
	StrCpy $1 1073741824&lt;br /&gt;
	StrCpy $2 Gb&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_default:&lt;br /&gt;
	StrCmp $4 &#039;&#039; 0 +2&lt;br /&gt;
	StrCpy $4 &#039;*.*&#039;&lt;br /&gt;
	StrCmp $7 &#039;&#039; 0 +2&lt;br /&gt;
	StrCpy $7 &#039;1&#039;&lt;br /&gt;
&lt;br /&gt;
	StrCpy $8 1&lt;br /&gt;
	Push $0&lt;br /&gt;
	SetDetailsPrint textonly&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_nextdir:&lt;br /&gt;
	IntOp $8 $8 - 1&lt;br /&gt;
	Pop $R8&lt;br /&gt;
	FindFirst $0 $R7 &#039;$R8\$4&#039;&lt;br /&gt;
	IfErrors FileFunc_GetSize_show&lt;br /&gt;
	StrCmp $R7 &#039;.&#039; 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	StrCmp $R7 &#039;..&#039; 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
	goto FileFunc_GetSize_show&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_dir:&lt;br /&gt;
	IfFileExists &#039;$R8\$R7\*.*&#039; 0 FileFunc_GetSize_file&lt;br /&gt;
	IntOp $R5 $R5 + 1&lt;br /&gt;
	goto FileFunc_GetSize_findnext&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_file:&lt;br /&gt;
	StrCpy $R6 0&lt;br /&gt;
	StrCmp $5$6 &#039;&#039; 0 +3&lt;br /&gt;
	IntOp $R4 $R4 + 1&lt;br /&gt;
	goto FileFunc_GetSize_findnext&lt;br /&gt;
	FileOpen $9 &#039;$R8\$R7&#039; r&lt;br /&gt;
	IfErrors +3&lt;br /&gt;
	FileSeek $9 0 END $R6&lt;br /&gt;
	FileClose $9&lt;br /&gt;
	StrCmp $5 &#039;&#039; +2&lt;br /&gt;
	IntCmp $R6 $5 0 FileFunc_GetSize_findnext&lt;br /&gt;
	StrCmp $6 &#039;&#039; +2&lt;br /&gt;
	IntCmp $R6 $6 0 0 FileFunc_GetSize_findnext&lt;br /&gt;
	IntOp $R4 $R4 + 1&lt;br /&gt;
	; insert code&lt;br /&gt;
	StrCmp $R1 &amp;quot;&amp;quot; FileFunc_GetSize_file_add&lt;br /&gt;
	System::Call &#039;kernel32::GetFileAttributes(t &amp;quot;$R8\$R7&amp;quot;)i .R2&#039;&lt;br /&gt;
	StrCmp $R2 -1 FileFunc_GetSize_file_logical&lt;br /&gt;
	IntOp $R0 $R2 &amp;amp; 0x0800&lt;br /&gt;
	IntCmp $R0 0 0 0 +3&lt;br /&gt;
	IntOp $R0 $R2 &amp;amp; 0x0200&lt;br /&gt;
	IntCmp $R0 0 FileFunc_GetSize_file_logical&lt;br /&gt;
	System::Call &#039;kernel32::GetCompressedFileSize(t &amp;quot;$R8\$R7&amp;quot;, i)i .R6&#039;&lt;br /&gt;
	IntCmp $R6 4096 FileFunc_GetSize_file_add 0 FileFunc_GetSize_file_add&lt;br /&gt;
	StrCpy $R6 4096&lt;br /&gt;
	goto FileFunc_GetSize_file_add&lt;br /&gt;
	FileFunc_GetSize_file_logical:&lt;br /&gt;
	StrCpy $R0 $R1&lt;br /&gt;
	IntOp $R6 $R6 + $R0&lt;br /&gt;
	IntOp $R1 $R6 % $R0&lt;br /&gt;
	StrCmp $R1 0 0 +2&lt;br /&gt;
	StrCpy $R1 $R0&lt;br /&gt;
	IntOp $R2 $R0 - $R1&lt;br /&gt;
	IntOp $R6 $R6 - $R0&lt;br /&gt;
	IntOp $R6 $R6 + $R2&lt;br /&gt;
	StrCpy $R1 $R0&lt;br /&gt;
	FileFunc_GetSize_file_add:&lt;br /&gt;
	; end insert&lt;br /&gt;
	System::Int64Op $R3 + $R6&lt;br /&gt;
	Pop $R3&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_findnext:&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_show:&lt;br /&gt;
	StrCmp $5$6 &#039;&#039; FileFunc_GetSize_nosize&lt;br /&gt;
	System::Int64Op $R3 / $1&lt;br /&gt;
	Pop $9&lt;br /&gt;
	DetailPrint &#039;Size:$9 $2  Files:$R4  Folders:$R5&#039;&lt;br /&gt;
	goto FileFunc_GetSize_subdir&lt;br /&gt;
	FileFunc_GetSize_nosize:&lt;br /&gt;
	DetailPrint &#039;Files:$R4  Folders:$R5&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_subdir:&lt;br /&gt;
	StrCmp $7 0 FileFunc_GetSize_preend&lt;br /&gt;
	FindFirst $0 $R7 &#039;$R8\*.*&#039;&lt;br /&gt;
	StrCmp $R7 &#039;.&#039; 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	StrCmp $R7 &#039;..&#039; 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
	StrCmp $8 0 FileFunc_GetSize_preend FileFunc_GetSize_nextdir&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_pushdir:&lt;br /&gt;
	IfFileExists &#039;$R8\$R7\*.*&#039; 0 +3&lt;br /&gt;
	Push &#039;$R8\$R7&#039;&lt;br /&gt;
	IntOp $8 $8 + 1&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
	StrCmp $8 0 FileFunc_GetSize_preend FileFunc_GetSize_nextdir&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_preend:&lt;br /&gt;
	StrCmp $R3 &#039;&#039; FileFunc_GetSize_nosizeend&lt;br /&gt;
	System::Int64Op $R3 / $1&lt;br /&gt;
	Pop $R3&lt;br /&gt;
	FileFunc_GetSize_nosizeend:&lt;br /&gt;
	StrCpy $2 $R4&lt;br /&gt;
	StrCpy $1 $R5&lt;br /&gt;
	StrCpy $0 $R3&lt;br /&gt;
	goto FileFunc_GetSize_end&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_error:&lt;br /&gt;
	SetErrors&lt;br /&gt;
	StrCpy $0 &#039;&#039;&lt;br /&gt;
	StrCpy $1 &#039;&#039;&lt;br /&gt;
	StrCpy $2 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_end:&lt;br /&gt;
	SetDetailsPrint both&lt;br /&gt;
	Pop $R9&lt;br /&gt;
	Pop $R8&lt;br /&gt;
	Pop $R7&lt;br /&gt;
	Pop $R6&lt;br /&gt;
	Pop $R5&lt;br /&gt;
	Pop $R4&lt;br /&gt;
	Pop $R3&lt;br /&gt;
	; insert code&lt;br /&gt;
	Pop $R2&lt;br /&gt;
	; end insert&lt;br /&gt;
	Pop $9&lt;br /&gt;
	Pop $8&lt;br /&gt;
	Pop $7&lt;br /&gt;
	Pop $6&lt;br /&gt;
	Pop $5&lt;br /&gt;
	Pop $4&lt;br /&gt;
	Pop $3&lt;br /&gt;
	Exch $2&lt;br /&gt;
	Exch&lt;br /&gt;
	Exch $1&lt;br /&gt;
	Exch 2&lt;br /&gt;
	Exch $0&lt;br /&gt;
&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
; ---------------&lt;br /&gt;
; GetClusterSize&lt;br /&gt;
&lt;br /&gt;
!define GetClusterSize `!insertmacro GetClusterSizeCall`&lt;br /&gt;
!define un.GetClusterSize `!insertmacro GetClusterSizeCall`&lt;br /&gt;
&lt;br /&gt;
!macro GetClusterSize&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro un.GetClusterSize&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetClusterSize_&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
&lt;br /&gt;
	System::Call &#039;kernel32::GetDiskFreeSpace(i0,*i0r0,*i0r1,*i0r2,*i)&#039;&lt;br /&gt;
	IntOp $0 $0 * $1&lt;br /&gt;
	Push $0&lt;br /&gt;
&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/highlight-nsis&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-size: 110%&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Credits:&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;em&amp;gt;GetSizeOnDisk&amp;lt;/em&amp;gt; has been altered slightly and renamed. The original macro is called &amp;lt;em&amp;gt;GetSize&amp;lt;/em&amp;gt;. You will find it in the Users Manual under E.1.3.&lt;br /&gt;
[[Category:Code Examples]]&lt;/div&gt;</summary>
		<author><name>Bnicer</name></author>
	</entry>
	<entry>
		<id>https://nsis.sourceforge.io/mediawiki/index.php?title=User:Bnicer&amp;diff=22895</id>
		<title>User:Bnicer</title>
		<link rel="alternate" type="text/html" href="https://nsis.sourceforge.io/mediawiki/index.php?title=User:Bnicer&amp;diff=22895"/>
		<updated>2013-02-12T10:41:26Z</updated>

		<summary type="html">&lt;p&gt;Bnicer: Blanked the page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Bnicer</name></author>
	</entry>
	<entry>
		<id>https://nsis.sourceforge.io/mediawiki/index.php?title=Get_size_on_disk&amp;diff=22894</id>
		<title>Get size on disk</title>
		<link rel="alternate" type="text/html" href="https://nsis.sourceforge.io/mediawiki/index.php?title=Get_size_on_disk&amp;diff=22894"/>
		<updated>2013-02-12T10:25:19Z</updated>

		<summary type="html">&lt;p&gt;Bnicer: Size On Disk (SOD) utility to get the space used by directories and files&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PageAuthor|Bnicer}}&lt;br /&gt;
This example code shows you how to get the space used by directories and files.&lt;br /&gt;
&amp;lt;highlight-nsis&amp;gt;&lt;br /&gt;
; A utility for computing the NSIS (or NSIS Unicode) install folder size and the size of&lt;br /&gt;
; the uninstaller&lt;br /&gt;
; nsissize.nsi&lt;br /&gt;
; Compile &amp;amp; run the .exe&lt;br /&gt;
&lt;br /&gt;
Name &amp;quot;SOD Tool&amp;quot;&lt;br /&gt;
RequestExecutionLevel user&lt;br /&gt;
!define LOCAL &amp;quot;&amp;quot; ; Path where local include files reside&lt;br /&gt;
OutFile &amp;quot;${LOCAL}nsissize.exe&amp;quot;&lt;br /&gt;
!include &amp;quot;${LOCAL}macros.nsh&amp;quot;&lt;br /&gt;
ReserveFile &amp;quot;${NSISDIR}\Plugins\Math.dll&amp;quot;&lt;br /&gt;
#Icon &amp;quot;${LOCAL}arrows.ico&amp;quot;&lt;br /&gt;
ShowInstDetails show&lt;br /&gt;
&lt;br /&gt;
; Variables&lt;br /&gt;
Var NSIS&lt;br /&gt;
Var ZIP&lt;br /&gt;
Var ZIP_UN&lt;br /&gt;
Var COUNT&lt;br /&gt;
Var BLOCK&lt;br /&gt;
Var FILES&lt;br /&gt;
Var FOLDERS&lt;br /&gt;
Var SIZE_B&lt;br /&gt;
Var SIZE_M&lt;br /&gt;
Var SOD_B&lt;br /&gt;
Var SOD_K&lt;br /&gt;
Var SOD_M&lt;br /&gt;
Var SIZE_UN_B&lt;br /&gt;
Var SIZE_UN_K&lt;br /&gt;
Var SOD_UN_B&lt;br /&gt;
Var SOD_UN_K&lt;br /&gt;
&lt;br /&gt;
Function Separator ; comma&lt;br /&gt;
  StrCpy $R2 $R1&lt;br /&gt;
  StrCpy $COUNT &amp;quot;16&amp;quot; ; 1,000,000,000,000,000 limit&lt;br /&gt;
  StrLen $R4 $R1&lt;br /&gt;
  loop:&lt;br /&gt;
  IntCmp $COUNT 3 endloop endloop 0&lt;br /&gt;
  IntCmp $R4 $COUNT 0 +7 0&lt;br /&gt;
  IntOp $COUNT $COUNT - 1&lt;br /&gt;
  StrCpy $R2 $R2 -$COUNT&lt;br /&gt;
  StrCpy $R3 $R1 &amp;quot;&amp;quot; -$COUNT&lt;br /&gt;
  StrCpy $R2 &amp;quot;$R2,$R3&amp;quot;&lt;br /&gt;
  IntOp $COUNT $COUNT - 2&lt;br /&gt;
  Goto loop&lt;br /&gt;
  IntOp $COUNT $COUNT - 3&lt;br /&gt;
  Goto loop&lt;br /&gt;
  endloop:&lt;br /&gt;
FunctionEnd&lt;br /&gt;
&lt;br /&gt;
Section&lt;br /&gt;
; root&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS Unicode&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS Unicode&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS ANSI&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS ANSI&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  Goto done&lt;br /&gt;
  begin:&lt;br /&gt;
  IfFileExists &amp;quot;$NSIS&amp;quot; 0 done&lt;br /&gt;
  ${GetFileAttributes} &amp;quot;$NSIS&amp;quot; &amp;quot;COMPRESSED&amp;quot; $ZIP&lt;br /&gt;
  ${GetClusterSize} $BLOCK&lt;br /&gt;
  ${GetSizeOnDisk} &amp;quot;$NSIS&amp;quot; &amp;quot;/S=0B&amp;quot; &amp;quot;&amp;quot; $0 $1 $2&lt;br /&gt;
  Math::Script &amp;quot;r3 = ff($0 / 1024 / 1024.0, 16 +2&amp;quot;&lt;br /&gt;
  StrCpy $SIZE_B $0&lt;br /&gt;
  StrCpy $FILES $1&lt;br /&gt;
  StrCpy $FOLDERS $2&lt;br /&gt;
  StrCpy $SIZE_M $3&lt;br /&gt;
  ${GetSizeOnDisk} &amp;quot;$NSIS&amp;quot; &amp;quot;/S=0B&amp;quot; &amp;quot;$BLOCK&amp;quot; $0 $1 $2&lt;br /&gt;
  Math::Script &amp;quot;r4 = ff($0 / 1024.0, 16 +0); r5 = ff(r4 / 1024.0, 16 +2)&amp;quot;&lt;br /&gt;
  StrCpy $SOD_B $0&lt;br /&gt;
  StrCpy $SOD_K $4&lt;br /&gt;
  StrCpy $SOD_M $5&lt;br /&gt;
; uninstaller&lt;br /&gt;
  IfFileExists &amp;quot;$NSIS\uninst-nsis.exe&amp;quot; 0 done&lt;br /&gt;
  ${GetFileAttributes} &amp;quot;$NSIS\uninst-nsis.exe&amp;quot; &amp;quot;COMPRESSED&amp;quot; $ZIP_UN&lt;br /&gt;
  ${GetSizeOnDisk} &amp;quot;$NSIS&amp;quot; &amp;quot;/M=uninst-nsis.exe /S=0B&amp;quot; &amp;quot;&amp;quot; $0 $1 $2&lt;br /&gt;
  Math::Script &amp;quot;r6 = ff($0 / 1024.0, 16 +1); \&lt;br /&gt;
  a = $0; b = $BLOCK; c = a % b; #[c == 0, c = $BLOCK]; r7 = (b - c + a); \&lt;br /&gt;
  r8 = ff(r7 / 1024.0, 16 +1)&amp;quot;&lt;br /&gt;
  StrCpy $SIZE_UN_B $0&lt;br /&gt;
  StrCpy $SIZE_UN_K $6&lt;br /&gt;
  StrCpy $SOD_UN_B $7&lt;br /&gt;
  StrCpy $SOD_UN_K $8&lt;br /&gt;
; format&lt;br /&gt;
  StrCpy $R1 $SIZE_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SIZE_B $R2&lt;br /&gt;
&lt;br /&gt;
  StrCpy $R1 $SOD_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SOD_B $R2&lt;br /&gt;
&lt;br /&gt;
  StrCpy $R1 $SOD_K&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SOD_K $R2&lt;br /&gt;
&lt;br /&gt;
  StrCpy $R1 $SIZE_UN_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SIZE_UN_B $R2&lt;br /&gt;
  StrCpy $R1 $SOD_UN_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SOD_UN_B $R2&lt;br /&gt;
; output&lt;br /&gt;
  ; note: with compression SOD lines are incorrect&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;$NSIS&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;Size: $SIZE_M MB ($SIZE_B bytes)&amp;quot;&lt;br /&gt;
  StrCmp $ZIP &amp;quot;1&amp;quot; +3&lt;br /&gt;
  StrCmp $ZIP_UN &amp;quot;1&amp;quot; +2&lt;br /&gt;
  DetailPrint &amp;quot;SOD: $SOD_M MB ($SOD_B bytes)&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;Uninstaller&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;Size: $SIZE_UN_K KB ($SIZE_UN_B bytes)&amp;quot;&lt;br /&gt;
  StrCmp $ZIP &amp;quot;1&amp;quot; +3&lt;br /&gt;
  StrCmp $ZIP_UN &amp;quot;1&amp;quot; +2&lt;br /&gt;
  DetailPrint &amp;quot;SOD: $SOD_UN_K KB ($SOD_UN_B bytes)&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;$FILES files $FOLDERS folders $SOD_K Kb&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  Goto completed&lt;br /&gt;
  done:&lt;br /&gt;
  DetailPrint &amp;quot;File not found.&amp;quot;&lt;br /&gt;
  completed:&lt;br /&gt;
SectionEnd&lt;br /&gt;
&lt;br /&gt;
;--------------------------------&lt;br /&gt;
# EOF&lt;br /&gt;
&amp;lt;/highlight-nsis&amp;gt;&lt;br /&gt;
You should copy the next code into a separate file: &amp;lt;b&amp;gt;macros.nsh&amp;lt;/b&amp;gt;.&lt;br /&gt;
&amp;lt;highlight-nsis&amp;gt;&lt;br /&gt;
; Macros include file&lt;br /&gt;
;--------------------------------&lt;br /&gt;
/*&lt;br /&gt;
&lt;br /&gt;
 FileFunction=[GetSizeOnDisk|GetClusterSize|GetFileAttributes]&lt;br /&gt;
&lt;br /&gt;
*/&lt;br /&gt;
;_____________________________________________________________________________&lt;br /&gt;
;&lt;br /&gt;
;                         Macros&lt;br /&gt;
;_____________________________________________________________________________&lt;br /&gt;
;&lt;br /&gt;
; Change log window verbosity (default: 3=no script)&lt;br /&gt;
;&lt;br /&gt;
; Example:&lt;br /&gt;
; !include &amp;quot;sizemacros.nsh&amp;quot;&lt;br /&gt;
; !insertmacro GetSizeOnDisk&lt;br /&gt;
; ${FILEFUNC_VERBOSE} 4   # all verbosity&lt;br /&gt;
; !insertmacro GetClusterSize&lt;br /&gt;
; ${FILEFUNC_VERBOSE} 3   # no script&lt;br /&gt;
&lt;br /&gt;
!include Util.nsh ; for &amp;quot;CallArtificialFunction&amp;quot;&lt;br /&gt;
&lt;br /&gt;
!verbose push&lt;br /&gt;
!verbose 3&lt;br /&gt;
!ifndef _FILEFUNC_VERBOSE&lt;br /&gt;
	!define _FILEFUNC_VERBOSE 3&lt;br /&gt;
!endif&lt;br /&gt;
!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
!define FILEFUNC_VERBOSE `!insertmacro FILEFUNC_VERBOSE`&lt;br /&gt;
!verbose pop&lt;br /&gt;
&lt;br /&gt;
!macro FILEFUNC_VERBOSE _VERBOSE&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose 3&lt;br /&gt;
	!undef _FILEFUNC_VERBOSE&lt;br /&gt;
	!define _FILEFUNC_VERBOSE ${_VERBOSE}&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetSizeOnDiskCall _PATH _OPTIONS _FILESYSTEM _RESULT1 _RESULT2 _RESULT3&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
	Push `${_PATH}`&lt;br /&gt;
	Push `${_OPTIONS}`&lt;br /&gt;
	Push `${_FILESYSTEM}` ; block size&lt;br /&gt;
	${CallArtificialFunction} GetSizeOnDisk_&lt;br /&gt;
	Pop ${_RESULT1}&lt;br /&gt;
	Pop ${_RESULT2}&lt;br /&gt;
	Pop ${_RESULT3}&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetClusterSizeCall _RESULT&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
	${CallArtificialFunction} GetClusterSize_&lt;br /&gt;
	Pop ${_RESULT}&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetFileAttributesCall _PATH _ATTR _RESULT&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
	Push `${_PATH}`&lt;br /&gt;
	Push `${_ATTR}`&lt;br /&gt;
	${CallArtificialFunction} GetFileAttributes_&lt;br /&gt;
	Pop ${_RESULT}&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
; ---------------&lt;br /&gt;
; GetSizeOnDisk (modified &amp;quot;GetSize&amp;quot; - FileFunc.nsh - KiCHiK - Function &amp;quot;FindFiles&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
!define GetSizeOnDisk `!insertmacro GetSizeOnDiskCall`&lt;br /&gt;
!define un.GetSizeOnDisk `!insertmacro GetSizeOnDiskCall`&lt;br /&gt;
&lt;br /&gt;
!macro GetSizeOnDisk&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro un.GetSizeOnDisk&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
; Usage: similar to &amp;quot;GetSize&amp;quot;&lt;br /&gt;
&lt;br /&gt;
; For documentation, see the NSIS user manual: E.1.3 GetSize&lt;br /&gt;
; Three values are returned&lt;br /&gt;
&lt;br /&gt;
; $var1		; Result1: Size/Size on disk&lt;br /&gt;
; $var2		; Result2: Sum of files&lt;br /&gt;
; $var3		; Result3: Sum of directories&lt;br /&gt;
&lt;br /&gt;
; Example: ${GetSizeOnDisk} &amp;quot;$INSTDIR&amp;quot; &amp;quot;/S=0K&amp;quot; &amp;quot;4096&amp;quot; $0 $1 $2&lt;br /&gt;
&lt;br /&gt;
; Specifying 4096 (logical size) toggles the result&lt;br /&gt;
; Output is size on disk, if used, or size in bytes, if left empty &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
!macro GetSizeOnDisk_&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
&lt;br /&gt;
	; replace&lt;br /&gt;
	Exch $R1&lt;br /&gt;
	Exch&lt;br /&gt;
	Exch $1&lt;br /&gt;
	Exch 2&lt;br /&gt;
	; end replace&lt;br /&gt;
	Exch $0&lt;br /&gt;
	Exch&lt;br /&gt;
	Push $2&lt;br /&gt;
	Push $3&lt;br /&gt;
	Push $4&lt;br /&gt;
	Push $5&lt;br /&gt;
	Push $6&lt;br /&gt;
	Push $7&lt;br /&gt;
	Push $8&lt;br /&gt;
	Push $9&lt;br /&gt;
	; insert code&lt;br /&gt;
	Push $R2&lt;br /&gt;
	; end insert&lt;br /&gt;
	Push $R3&lt;br /&gt;
	Push $R4&lt;br /&gt;
	Push $R5&lt;br /&gt;
	Push $R6&lt;br /&gt;
	Push $R7&lt;br /&gt;
	Push $R8&lt;br /&gt;
	Push $R9&lt;br /&gt;
	ClearErrors&lt;br /&gt;
&lt;br /&gt;
	StrCpy $R9 $0 1 -1&lt;br /&gt;
	StrCmp $R9 &#039;\&#039; 0 +3&lt;br /&gt;
	StrCpy $0 $0 -1&lt;br /&gt;
	goto -3&lt;br /&gt;
	IfFileExists &#039;$0\*.*&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
&lt;br /&gt;
	StrCpy $3 &#039;&#039;&lt;br /&gt;
	StrCpy $4 &#039;&#039;&lt;br /&gt;
	StrCpy $5 &#039;&#039;&lt;br /&gt;
	StrCpy $6 &#039;&#039;&lt;br /&gt;
	StrCpy $8 0&lt;br /&gt;
	StrCpy $R3 &#039;&#039;&lt;br /&gt;
	StrCpy $R4 &#039;&#039;&lt;br /&gt;
	StrCpy $R5 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_option:&lt;br /&gt;
	StrCpy $R9 $1 1&lt;br /&gt;
	StrCpy $1 $1 &#039;&#039; 1&lt;br /&gt;
	StrCmp $R9 &#039; &#039; -2&lt;br /&gt;
	StrCmp $R9 &#039;&#039; FileFunc_GetSize_sizeset&lt;br /&gt;
	StrCmp $R9 &#039;/&#039; 0 -4&lt;br /&gt;
&lt;br /&gt;
	StrCpy $9 -1&lt;br /&gt;
	IntOp $9 $9 + 1&lt;br /&gt;
	StrCpy $R9 $1 1 $9&lt;br /&gt;
	StrCmp $R9 &#039;&#039; +2&lt;br /&gt;
	StrCmp $R9 &#039;/&#039; 0 -3&lt;br /&gt;
	StrCpy $8 $1 $9&lt;br /&gt;
	StrCpy $8 $8 &#039;&#039; 2&lt;br /&gt;
	StrCpy $R9 $8 &#039;&#039; -1&lt;br /&gt;
	StrCmp $R9 &#039; &#039; 0 +3&lt;br /&gt;
	StrCpy $8 $8 -1&lt;br /&gt;
	goto -3&lt;br /&gt;
	StrCpy $R9 $1 2&lt;br /&gt;
	StrCpy $1 $1 &#039;&#039; $9&lt;br /&gt;
&lt;br /&gt;
	StrCmp $R9 &#039;M=&#039; 0 FileFunc_GetSize_size&lt;br /&gt;
	StrCpy $4 $8&lt;br /&gt;
	goto FileFunc_GetSize_option&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_size:&lt;br /&gt;
	StrCmp $R9 &#039;S=&#039; 0 FileFunc_GetSize_gotosubdir&lt;br /&gt;
	StrCpy $6 $8&lt;br /&gt;
	goto FileFunc_GetSize_option&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_gotosubdir:&lt;br /&gt;
	StrCmp $R9 &#039;G=&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
	StrCpy $7 $8&lt;br /&gt;
	StrCmp $7 &#039;&#039; +3&lt;br /&gt;
	StrCmp $7 &#039;1&#039; +2&lt;br /&gt;
	StrCmp $7 &#039;0&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
	goto FileFunc_GetSize_option&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_sizeset:&lt;br /&gt;
	StrCmp $6 &#039;&#039; FileFunc_GetSize_default&lt;br /&gt;
	StrCpy $9 0&lt;br /&gt;
	StrCpy $R9 $6 1 $9&lt;br /&gt;
	StrCmp $R9 &#039;&#039; +4&lt;br /&gt;
	StrCmp $R9 &#039;:&#039; +3&lt;br /&gt;
	IntOp $9 $9 + 1&lt;br /&gt;
	goto -4&lt;br /&gt;
	StrCpy $5 $6 $9&lt;br /&gt;
	IntOp $9 $9 + 1&lt;br /&gt;
	StrCpy $1 $6 1 -1&lt;br /&gt;
	StrCpy $6 $6 -1 $9&lt;br /&gt;
	StrCmp $5 &#039;&#039; +2&lt;br /&gt;
	IntOp $5 $5 + 0&lt;br /&gt;
	StrCmp $6 &#039;&#039; +2&lt;br /&gt;
	IntOp $6 $6 + 0&lt;br /&gt;
&lt;br /&gt;
	StrCmp $1 &#039;B&#039; 0 +4&lt;br /&gt;
	StrCpy $1 1&lt;br /&gt;
	StrCpy $2 bytes&lt;br /&gt;
	goto FileFunc_GetSize_default&lt;br /&gt;
	StrCmp $1 &#039;K&#039; 0 +4&lt;br /&gt;
	StrCpy $1 1024&lt;br /&gt;
	StrCpy $2 Kb&lt;br /&gt;
	goto FileFunc_GetSize_default&lt;br /&gt;
	StrCmp $1 &#039;M&#039; 0 +4&lt;br /&gt;
	StrCpy $1 1048576&lt;br /&gt;
	StrCpy $2 Mb&lt;br /&gt;
	goto FileFunc_GetSize_default&lt;br /&gt;
	StrCmp $1 &#039;G&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
	StrCpy $1 1073741824&lt;br /&gt;
	StrCpy $2 Gb&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_default:&lt;br /&gt;
	StrCmp $4 &#039;&#039; 0 +2&lt;br /&gt;
	StrCpy $4 &#039;*.*&#039;&lt;br /&gt;
	StrCmp $7 &#039;&#039; 0 +2&lt;br /&gt;
	StrCpy $7 &#039;1&#039;&lt;br /&gt;
&lt;br /&gt;
	StrCpy $8 1&lt;br /&gt;
	Push $0&lt;br /&gt;
	SetDetailsPrint textonly&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_nextdir:&lt;br /&gt;
	IntOp $8 $8 - 1&lt;br /&gt;
	Pop $R8&lt;br /&gt;
	FindFirst $0 $R7 &#039;$R8\$4&#039;&lt;br /&gt;
	IfErrors FileFunc_GetSize_show&lt;br /&gt;
	StrCmp $R7 &#039;.&#039; 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	StrCmp $R7 &#039;..&#039; 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
	goto FileFunc_GetSize_show&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_dir:&lt;br /&gt;
	IfFileExists &#039;$R8\$R7\*.*&#039; 0 FileFunc_GetSize_file&lt;br /&gt;
	IntOp $R5 $R5 + 1&lt;br /&gt;
	goto FileFunc_GetSize_findnext&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_file:&lt;br /&gt;
	StrCpy $R6 0&lt;br /&gt;
	StrCmp $5$6 &#039;&#039; 0 +3&lt;br /&gt;
	IntOp $R4 $R4 + 1&lt;br /&gt;
	goto FileFunc_GetSize_findnext&lt;br /&gt;
	FileOpen $9 &#039;$R8\$R7&#039; r&lt;br /&gt;
	IfErrors +3&lt;br /&gt;
	FileSeek $9 0 END $R6&lt;br /&gt;
	FileClose $9&lt;br /&gt;
	StrCmp $5 &#039;&#039; +2&lt;br /&gt;
	IntCmp $R6 $5 0 FileFunc_GetSize_findnext&lt;br /&gt;
	StrCmp $6 &#039;&#039; +2&lt;br /&gt;
	IntCmp $R6 $6 0 0 FileFunc_GetSize_findnext&lt;br /&gt;
	IntOp $R4 $R4 + 1&lt;br /&gt;
	; insert code&lt;br /&gt;
	StrCmp $R1 &amp;quot;&amp;quot; +10 0&lt;br /&gt;
	StrCpy $R0 $R1&lt;br /&gt;
	IntOp $R6 $R6 + $R0&lt;br /&gt;
	IntOp $R1 $R6 % $R0&lt;br /&gt;
	StrCmp $R1 0 0 +2&lt;br /&gt;
	StrCpy $R1 $R0&lt;br /&gt;
	IntOp $R2 $R0 - $R1&lt;br /&gt;
	IntOp $R6 $R6 - $R0&lt;br /&gt;
	IntOp $R6 $R6 + $R2&lt;br /&gt;
	StrCpy $R1 $R0&lt;br /&gt;
	; end insert&lt;br /&gt;
	System::Int64Op $R3 + $R6&lt;br /&gt;
	Pop $R3&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_findnext:&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_show:&lt;br /&gt;
	StrCmp $5$6 &#039;&#039; FileFunc_GetSize_nosize&lt;br /&gt;
	System::Int64Op $R3 / $1&lt;br /&gt;
	Pop $9&lt;br /&gt;
	DetailPrint &#039;Size:$9 $2  Files:$R4  Folders:$R5&#039;&lt;br /&gt;
	goto FileFunc_GetSize_subdir&lt;br /&gt;
	FileFunc_GetSize_nosize:&lt;br /&gt;
	DetailPrint &#039;Files:$R4  Folders:$R5&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_subdir:&lt;br /&gt;
	StrCmp $7 0 FileFunc_GetSize_preend&lt;br /&gt;
	FindFirst $0 $R7 &#039;$R8\*.*&#039;&lt;br /&gt;
	StrCmp $R7 &#039;.&#039; 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	StrCmp $R7 &#039;..&#039; 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
	StrCmp $8 0 FileFunc_GetSize_preend FileFunc_GetSize_nextdir&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_pushdir:&lt;br /&gt;
	IfFileExists &#039;$R8\$R7\*.*&#039; 0 +3&lt;br /&gt;
	Push &#039;$R8\$R7&#039;&lt;br /&gt;
	IntOp $8 $8 + 1&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
	StrCmp $8 0 FileFunc_GetSize_preend FileFunc_GetSize_nextdir&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_preend:&lt;br /&gt;
	StrCmp $R3 &#039;&#039; FileFunc_GetSize_nosizeend&lt;br /&gt;
	System::Int64Op $R3 / $1&lt;br /&gt;
	Pop $R3&lt;br /&gt;
	FileFunc_GetSize_nosizeend:&lt;br /&gt;
	StrCpy $2 $R4&lt;br /&gt;
	StrCpy $1 $R5&lt;br /&gt;
	StrCpy $0 $R3&lt;br /&gt;
	goto FileFunc_GetSize_end&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_error:&lt;br /&gt;
	SetErrors&lt;br /&gt;
	StrCpy $0 &#039;&#039;&lt;br /&gt;
	StrCpy $1 &#039;&#039;&lt;br /&gt;
	StrCpy $2 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_end:&lt;br /&gt;
	SetDetailsPrint both&lt;br /&gt;
	Pop $R9&lt;br /&gt;
	Pop $R8&lt;br /&gt;
	Pop $R7&lt;br /&gt;
	Pop $R6&lt;br /&gt;
	Pop $R5&lt;br /&gt;
	Pop $R4&lt;br /&gt;
	Pop $R3&lt;br /&gt;
	; insert code&lt;br /&gt;
	Pop $R2&lt;br /&gt;
	; end insert&lt;br /&gt;
	Pop $9&lt;br /&gt;
	Pop $8&lt;br /&gt;
	Pop $7&lt;br /&gt;
	Pop $6&lt;br /&gt;
	Pop $5&lt;br /&gt;
	Pop $4&lt;br /&gt;
	Pop $3&lt;br /&gt;
	Exch $2&lt;br /&gt;
	Exch&lt;br /&gt;
	Exch $1&lt;br /&gt;
	Exch 2&lt;br /&gt;
	Exch $0&lt;br /&gt;
&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
; ---------------&lt;br /&gt;
; GetFileAttributes (FileFunc.nsh)&lt;br /&gt;
&lt;br /&gt;
!define GetFileAttributes `!insertmacro GetFileAttributesCall`&lt;br /&gt;
!define un.GetFileAttributes `!insertmacro GetFileAttributesCall`&lt;br /&gt;
&lt;br /&gt;
!macro GetFileAttributes&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro un.GetFileAttributes&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetFileAttributes_&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
	&lt;br /&gt;
	Exch $1&lt;br /&gt;
	Exch&lt;br /&gt;
	Exch $0&lt;br /&gt;
	Exch&lt;br /&gt;
	Push $2&lt;br /&gt;
	Push $3&lt;br /&gt;
	Push $4&lt;br /&gt;
	Push $5&lt;br /&gt;
&lt;br /&gt;
	System::Call &#039;kernel32::GetFileAttributes(t r0)i .r2&#039;&lt;br /&gt;
	StrCmp $2 -1 FileFunc_GetFileAttributes_error&lt;br /&gt;
	StrCpy $3 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x4000&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;ENCRYPTED|&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x2000&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;NOT_CONTENT_INDEXED|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x1000&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;OFFLINE|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0800&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;COMPRESSED|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0400&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;REPARSE_POINT|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0200&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;SPARSE_FILE|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0100&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;TEMPORARY|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0080&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;NORMAL|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0040&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;DEVICE|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0020&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;ARCHIVE|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0010&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;DIRECTORY|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0004&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;SYSTEM|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0002&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;HIDDEN|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0001&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;READONLY|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	StrCpy $0 $3 -1&lt;br /&gt;
	StrCmp $1 &#039;&#039; FileFunc_GetFileAttributes_end&lt;br /&gt;
	StrCmp $1 &#039;ALL&#039; FileFunc_GetFileAttributes_end&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetFileAttributes_attrcmp:&lt;br /&gt;
	StrCpy $5 0&lt;br /&gt;
	IntOp $5 $5 + 1&lt;br /&gt;
	StrCpy $4 $1 1 $5&lt;br /&gt;
	StrCmp $4 &#039;&#039; +2&lt;br /&gt;
	StrCmp $4 &#039;|&#039;  0 -3&lt;br /&gt;
	StrCpy $2 $1 $5&lt;br /&gt;
	IntOp $5 $5 + 1&lt;br /&gt;
	StrCpy $1 $1 &#039;&#039; $5&lt;br /&gt;
	StrLen $3 $2&lt;br /&gt;
	StrCpy $5 -1&lt;br /&gt;
	IntOp $5 $5 + 1&lt;br /&gt;
	StrCpy $4 $0 $3 $5&lt;br /&gt;
	StrCmp $4 &#039;&#039; FileFunc_GetFileAttributes_notfound&lt;br /&gt;
	StrCmp $4 $2 0 -3&lt;br /&gt;
	StrCmp $1 &#039;&#039; 0 FileFunc_GetFileAttributes_attrcmp&lt;br /&gt;
	StrCpy $0 1&lt;br /&gt;
	goto FileFunc_GetFileAttributes_end&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetFileAttributes_notfound:&lt;br /&gt;
	StrCpy $0 0&lt;br /&gt;
	goto FileFunc_GetFileAttributes_end&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetFileAttributes_error:&lt;br /&gt;
	SetErrors&lt;br /&gt;
	StrCpy $0 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetFileAttributes_end:&lt;br /&gt;
	Pop $5&lt;br /&gt;
	Pop $4&lt;br /&gt;
	Pop $3&lt;br /&gt;
	Pop $2&lt;br /&gt;
	Pop $1&lt;br /&gt;
	Exch $0&lt;br /&gt;
		&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!define GetFileVersion `!insertmacro GetFileVersionCall`&lt;br /&gt;
!define un.GetFileVersion `!insertmacro GetFileVersionCall`&lt;br /&gt;
&lt;br /&gt;
!macro GetFileVersion&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro un.GetFileVersion&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetFileVersion_&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
	&lt;br /&gt;
	Exch $0&lt;br /&gt;
	Push $1&lt;br /&gt;
	Push $2&lt;br /&gt;
	Push $3&lt;br /&gt;
	Push $4&lt;br /&gt;
	Push $5&lt;br /&gt;
	Push $6&lt;br /&gt;
	ClearErrors&lt;br /&gt;
&lt;br /&gt;
	GetDllVersion &#039;$0&#039; $1 $2&lt;br /&gt;
	IfErrors FileFunc_GetFileVersion_error&lt;br /&gt;
	IntOp $3 $1 &amp;gt;&amp;gt; 16&lt;br /&gt;
	IntOp $3 $3 &amp;amp; 0x0000FFFF&lt;br /&gt;
	IntOp $4 $1 &amp;amp; 0x0000FFFF&lt;br /&gt;
	IntOp $5 $2 &amp;gt;&amp;gt; 16&lt;br /&gt;
	IntOp $5 $5 &amp;amp; 0x0000FFFF&lt;br /&gt;
	IntOp $6 $2 &amp;amp; 0x0000FFFF&lt;br /&gt;
	StrCpy $0 &#039;$3.$4.$5.$6&#039;&lt;br /&gt;
	goto FileFunc_GetFileVersion_end&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetFileVersion_error:&lt;br /&gt;
	SetErrors&lt;br /&gt;
	StrCpy $0 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetFileVersion_end:&lt;br /&gt;
	Pop $6&lt;br /&gt;
	Pop $5&lt;br /&gt;
	Pop $4&lt;br /&gt;
	Pop $3&lt;br /&gt;
	Pop $2&lt;br /&gt;
	Pop $1&lt;br /&gt;
	Exch $0&lt;br /&gt;
&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
; ---------------&lt;br /&gt;
; GetClusterSize&lt;br /&gt;
&lt;br /&gt;
!define GetClusterSize `!insertmacro GetClusterSizeCall`&lt;br /&gt;
!define un.GetClusterSize `!insertmacro GetClusterSizeCall`&lt;br /&gt;
&lt;br /&gt;
!macro GetClusterSize&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro un.GetClusterSize&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetClusterSize_&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
&lt;br /&gt;
	System::Call &#039;kernel32::GetDiskFreeSpace(i0,*i0r0,*i0r1,*i0r2,*i)&#039;&lt;br /&gt;
	IntOp $0 $0 * $1&lt;br /&gt;
	Push $0&lt;br /&gt;
&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&amp;lt;/highlight-nsis&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-size: 110%&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Credits:&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;em&amp;gt;GetFileAttributes&amp;lt;/em&amp;gt; is borrowed from &amp;lt;b&amp;gt;filefunc.nsh&amp;lt;/b&amp;gt;. &amp;lt;em&amp;gt;GetSizeOnDisk&amp;lt;/em&amp;gt; has been altered slightly and renamed. The original macro is called &amp;lt;em&amp;gt;GetSize&amp;lt;/em&amp;gt;. You will find it in the Users Manual under E.1.3.&lt;br /&gt;
[[Category:Code Examples]]&lt;/div&gt;</summary>
		<author><name>Bnicer</name></author>
	</entry>
	<entry>
		<id>https://nsis.sourceforge.io/mediawiki/index.php?title=Get_size_on_disk&amp;diff=22892</id>
		<title>Get size on disk</title>
		<link rel="alternate" type="text/html" href="https://nsis.sourceforge.io/mediawiki/index.php?title=Get_size_on_disk&amp;diff=22892"/>
		<updated>2013-02-12T09:51:38Z</updated>

		<summary type="html">&lt;p&gt;Bnicer: Size On Disk (SOD) utility to get the space used by directories and files&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This example code shows you how to get the space used by directories and files.&lt;br /&gt;
&amp;lt;highlight-nsis&amp;gt;&lt;br /&gt;
; A utility for computing the NSIS (or NSIS Unicode) install folder size and the size of&lt;br /&gt;
; the uninstaller&lt;br /&gt;
; nsissize.nsi&lt;br /&gt;
; Compile &amp;amp; run the .exe&lt;br /&gt;
&lt;br /&gt;
Name &amp;quot;SOD Tool&amp;quot;&lt;br /&gt;
RequestExecutionLevel user&lt;br /&gt;
!define LOCAL &amp;quot;&amp;quot; ; Path where local include files reside&lt;br /&gt;
OutFile &amp;quot;${LOCAL}nsissize.exe&amp;quot;&lt;br /&gt;
!include &amp;quot;${LOCAL}macros.nsh&amp;quot;&lt;br /&gt;
ReserveFile &amp;quot;${NSISDIR}\Plugins\Math.dll&amp;quot;&lt;br /&gt;
#Icon &amp;quot;${LOCAL}arrows.ico&amp;quot;&lt;br /&gt;
ShowInstDetails show&lt;br /&gt;
&lt;br /&gt;
; Variables&lt;br /&gt;
Var NSIS&lt;br /&gt;
Var ZIP&lt;br /&gt;
Var ZIP_UN&lt;br /&gt;
Var COUNT&lt;br /&gt;
Var BLOCK&lt;br /&gt;
Var FILES&lt;br /&gt;
Var FOLDERS&lt;br /&gt;
Var SIZE_B&lt;br /&gt;
Var SIZE_M&lt;br /&gt;
Var SOD_B&lt;br /&gt;
Var SOD_K&lt;br /&gt;
Var SOD_M&lt;br /&gt;
Var SIZE_UN_B&lt;br /&gt;
Var SIZE_UN_K&lt;br /&gt;
Var SOD_UN_B&lt;br /&gt;
Var SOD_UN_K&lt;br /&gt;
&lt;br /&gt;
Function Separator ; comma&lt;br /&gt;
  StrCpy $R2 $R1&lt;br /&gt;
  StrCpy $COUNT &amp;quot;16&amp;quot; ; 1,000,000,000,000,000 limit&lt;br /&gt;
  StrLen $R4 $R1&lt;br /&gt;
  loop:&lt;br /&gt;
  IntCmp $COUNT 3 endloop endloop 0&lt;br /&gt;
  IntCmp $R4 $COUNT 0 +7 0&lt;br /&gt;
  IntOp $COUNT $COUNT - 1&lt;br /&gt;
  StrCpy $R2 $R2 -$COUNT&lt;br /&gt;
  StrCpy $R3 $R1 &amp;quot;&amp;quot; -$COUNT&lt;br /&gt;
  StrCpy $R2 &amp;quot;$R2,$R3&amp;quot;&lt;br /&gt;
  IntOp $COUNT $COUNT - 2&lt;br /&gt;
  Goto loop&lt;br /&gt;
  IntOp $COUNT $COUNT - 3&lt;br /&gt;
  Goto loop&lt;br /&gt;
  endloop:&lt;br /&gt;
FunctionEnd&lt;br /&gt;
&lt;br /&gt;
Section&lt;br /&gt;
; root&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS Unicode&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS Unicode&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS ANSI&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS ANSI&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  Goto done&lt;br /&gt;
  begin:&lt;br /&gt;
  IfFileExists &amp;quot;$NSIS&amp;quot; 0 done&lt;br /&gt;
  ${GetFileAttributes} &amp;quot;$NSIS&amp;quot; &amp;quot;COMPRESSED&amp;quot; $ZIP&lt;br /&gt;
  ${GetClusterSize} $BLOCK&lt;br /&gt;
  ${GetSizeOnDisk} &amp;quot;$NSIS&amp;quot; &amp;quot;/S=0B&amp;quot; &amp;quot;&amp;quot; $0 $1 $2&lt;br /&gt;
  Math::Script &amp;quot;r3 = ff($0 / 1024 / 1024.0, 16 +2&amp;quot;&lt;br /&gt;
  StrCpy $SIZE_B $0&lt;br /&gt;
  StrCpy $FILES $1&lt;br /&gt;
  StrCpy $FOLDERS $2&lt;br /&gt;
  StrCpy $SIZE_M $3&lt;br /&gt;
  ${GetSizeOnDisk} &amp;quot;$NSIS&amp;quot; &amp;quot;/S=0B&amp;quot; &amp;quot;$BLOCK&amp;quot; $0 $1 $2&lt;br /&gt;
  Math::Script &amp;quot;r4 = ff($0 / 1024.0, 16 +0); r5 = ff(r4 / 1024.0, 16 +2)&amp;quot;&lt;br /&gt;
  StrCpy $SOD_B $0&lt;br /&gt;
  StrCpy $SOD_K $4&lt;br /&gt;
  StrCpy $SOD_M $5&lt;br /&gt;
; uninstaller&lt;br /&gt;
  IfFileExists &amp;quot;$NSIS\uninst-nsis.exe&amp;quot; 0 done&lt;br /&gt;
  ${GetFileAttributes} &amp;quot;$NSIS\uninst-nsis.exe&amp;quot; &amp;quot;COMPRESSED&amp;quot; $ZIP_UN&lt;br /&gt;
  ${GetSizeOnDisk} &amp;quot;$NSIS&amp;quot; &amp;quot;/M=uninst-nsis.exe /S=0B&amp;quot; &amp;quot;&amp;quot; $0 $1 $2&lt;br /&gt;
  Math::Script &amp;quot;r6 = ff($0 / 1024.0, 16 +1); \&lt;br /&gt;
  a = $0; b = $BLOCK; c = a % b; #[c == 0, c = $BLOCK]; r7 = (b - c + a); \&lt;br /&gt;
  r8 = ff(r7 / 1024.0, 16 +1)&amp;quot;&lt;br /&gt;
  StrCpy $SIZE_UN_B $0&lt;br /&gt;
  StrCpy $SIZE_UN_K $6&lt;br /&gt;
  StrCpy $SOD_UN_B $7&lt;br /&gt;
  StrCpy $SOD_UN_K $8&lt;br /&gt;
; format&lt;br /&gt;
  StrCpy $R1 $SIZE_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SIZE_B $R2&lt;br /&gt;
&lt;br /&gt;
  StrCpy $R1 $SOD_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SOD_B $R2&lt;br /&gt;
&lt;br /&gt;
  StrCpy $R1 $SOD_K&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SOD_K $R2&lt;br /&gt;
&lt;br /&gt;
  StrCpy $R1 $SIZE_UN_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SIZE_UN_B $R2&lt;br /&gt;
  StrCpy $R1 $SOD_UN_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SOD_UN_B $R2&lt;br /&gt;
; output&lt;br /&gt;
  ; note: with compression SOD lines are incorrect&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;$NSIS&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;Size: $SIZE_M MB ($SIZE_B bytes)&amp;quot;&lt;br /&gt;
  StrCmp $ZIP &amp;quot;1&amp;quot; +3&lt;br /&gt;
  StrCmp $ZIP_UN &amp;quot;1&amp;quot; +2&lt;br /&gt;
  DetailPrint &amp;quot;SOD: $SOD_M MB ($SOD_B bytes)&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;Uninstaller&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;Size: $SIZE_UN_K KB ($SIZE_UN_B bytes)&amp;quot;&lt;br /&gt;
  StrCmp $ZIP &amp;quot;1&amp;quot; +3&lt;br /&gt;
  StrCmp $ZIP_UN &amp;quot;1&amp;quot; +2&lt;br /&gt;
  DetailPrint &amp;quot;SOD: $SOD_UN_K KB ($SOD_UN_B bytes)&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;$FILES files $FOLDERS folders $SOD_K Kb&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  Goto completed&lt;br /&gt;
  done:&lt;br /&gt;
  DetailPrint &amp;quot;File not found.&amp;quot;&lt;br /&gt;
  completed:&lt;br /&gt;
SectionEnd&lt;br /&gt;
&lt;br /&gt;
;--------------------------------&lt;br /&gt;
# EOF&lt;br /&gt;
&amp;lt;/highlight-nsis&amp;gt;&lt;br /&gt;
You should copy the next code into a separate file: &amp;lt;b&amp;gt;macros.nsh&amp;lt;/b&amp;gt;.&lt;br /&gt;
&amp;lt;highlight-nsis&amp;gt;&lt;br /&gt;
; Macros include file&lt;br /&gt;
;--------------------------------&lt;br /&gt;
/*&lt;br /&gt;
&lt;br /&gt;
 FileFunction=[GetSizeOnDisk|GetClusterSize|GetFileAttributes]&lt;br /&gt;
&lt;br /&gt;
*/&lt;br /&gt;
;_____________________________________________________________________________&lt;br /&gt;
;&lt;br /&gt;
;                         Macros&lt;br /&gt;
;_____________________________________________________________________________&lt;br /&gt;
;&lt;br /&gt;
; Change log window verbosity (default: 3=no script)&lt;br /&gt;
;&lt;br /&gt;
; Example:&lt;br /&gt;
; !include &amp;quot;sizemacros.nsh&amp;quot;&lt;br /&gt;
; !insertmacro GetSizeOnDisk&lt;br /&gt;
; ${FILEFUNC_VERBOSE} 4   # all verbosity&lt;br /&gt;
; !insertmacro GetClusterSize&lt;br /&gt;
; ${FILEFUNC_VERBOSE} 3   # no script&lt;br /&gt;
&lt;br /&gt;
!include Util.nsh ; for &amp;quot;CallArtificialFunction&amp;quot;&lt;br /&gt;
&lt;br /&gt;
!verbose push&lt;br /&gt;
!verbose 3&lt;br /&gt;
!ifndef _FILEFUNC_VERBOSE&lt;br /&gt;
	!define _FILEFUNC_VERBOSE 3&lt;br /&gt;
!endif&lt;br /&gt;
!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
!define FILEFUNC_VERBOSE `!insertmacro FILEFUNC_VERBOSE`&lt;br /&gt;
!verbose pop&lt;br /&gt;
&lt;br /&gt;
!macro FILEFUNC_VERBOSE _VERBOSE&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose 3&lt;br /&gt;
	!undef _FILEFUNC_VERBOSE&lt;br /&gt;
	!define _FILEFUNC_VERBOSE ${_VERBOSE}&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetSizeOnDiskCall _PATH _OPTIONS _FILESYSTEM _RESULT1 _RESULT2 _RESULT3&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
	Push `${_PATH}`&lt;br /&gt;
	Push `${_OPTIONS}`&lt;br /&gt;
	Push `${_FILESYSTEM}` ; block size&lt;br /&gt;
	${CallArtificialFunction} GetSizeOnDisk_&lt;br /&gt;
	Pop ${_RESULT1}&lt;br /&gt;
	Pop ${_RESULT2}&lt;br /&gt;
	Pop ${_RESULT3}&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetClusterSizeCall _RESULT&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
	${CallArtificialFunction} GetClusterSize_&lt;br /&gt;
	Pop ${_RESULT}&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetFileAttributesCall _PATH _ATTR _RESULT&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
	Push `${_PATH}`&lt;br /&gt;
	Push `${_ATTR}`&lt;br /&gt;
	${CallArtificialFunction} GetFileAttributes_&lt;br /&gt;
	Pop ${_RESULT}&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
; ---------------&lt;br /&gt;
; GetSizeOnDisk (modified &amp;quot;GetSize&amp;quot; - FileFunc.nsh - KiCHiK - Function &amp;quot;FindFiles&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
!define GetSizeOnDisk `!insertmacro GetSizeOnDiskCall`&lt;br /&gt;
!define un.GetSizeOnDisk `!insertmacro GetSizeOnDiskCall`&lt;br /&gt;
&lt;br /&gt;
!macro GetSizeOnDisk&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro un.GetSizeOnDisk&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
; Usage: similar to &amp;quot;GetSize&amp;quot;&lt;br /&gt;
&lt;br /&gt;
; For documentation, see the NSIS user manual: E.1.3 GetSize&lt;br /&gt;
; Three values are returned&lt;br /&gt;
&lt;br /&gt;
; $var1		; Result1: Size/Size on disk&lt;br /&gt;
; $var2		; Result2: Sum of files&lt;br /&gt;
; $var3		; Result3: Sum of directories&lt;br /&gt;
&lt;br /&gt;
; Example: ${GetSizeOnDisk} &amp;quot;$INSTDIR&amp;quot; &amp;quot;/S=0K&amp;quot; &amp;quot;4096&amp;quot; $0 $1 $2&lt;br /&gt;
&lt;br /&gt;
; Specifying 4096 (logical size) toggles the result&lt;br /&gt;
; Output is size on disk, if used, or size in bytes, if left empty &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
!macro GetSizeOnDisk_&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
&lt;br /&gt;
	; replace&lt;br /&gt;
	Exch $R1&lt;br /&gt;
	Exch&lt;br /&gt;
	Exch $1&lt;br /&gt;
	Exch 2&lt;br /&gt;
	; end replace&lt;br /&gt;
	Exch $0&lt;br /&gt;
	Exch&lt;br /&gt;
	Push $2&lt;br /&gt;
	Push $3&lt;br /&gt;
	Push $4&lt;br /&gt;
	Push $5&lt;br /&gt;
	Push $6&lt;br /&gt;
	Push $7&lt;br /&gt;
	Push $8&lt;br /&gt;
	Push $9&lt;br /&gt;
	; insert code&lt;br /&gt;
	Push $R2&lt;br /&gt;
	; end insert&lt;br /&gt;
	Push $R3&lt;br /&gt;
	Push $R4&lt;br /&gt;
	Push $R5&lt;br /&gt;
	Push $R6&lt;br /&gt;
	Push $R7&lt;br /&gt;
	Push $R8&lt;br /&gt;
	Push $R9&lt;br /&gt;
	ClearErrors&lt;br /&gt;
&lt;br /&gt;
	StrCpy $R9 $0 1 -1&lt;br /&gt;
	StrCmp $R9 &#039;\&#039; 0 +3&lt;br /&gt;
	StrCpy $0 $0 -1&lt;br /&gt;
	goto -3&lt;br /&gt;
	IfFileExists &#039;$0\*.*&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
&lt;br /&gt;
	StrCpy $3 &#039;&#039;&lt;br /&gt;
	StrCpy $4 &#039;&#039;&lt;br /&gt;
	StrCpy $5 &#039;&#039;&lt;br /&gt;
	StrCpy $6 &#039;&#039;&lt;br /&gt;
	StrCpy $8 0&lt;br /&gt;
	StrCpy $R3 &#039;&#039;&lt;br /&gt;
	StrCpy $R4 &#039;&#039;&lt;br /&gt;
	StrCpy $R5 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_option:&lt;br /&gt;
	StrCpy $R9 $1 1&lt;br /&gt;
	StrCpy $1 $1 &#039;&#039; 1&lt;br /&gt;
	StrCmp $R9 &#039; &#039; -2&lt;br /&gt;
	StrCmp $R9 &#039;&#039; FileFunc_GetSize_sizeset&lt;br /&gt;
	StrCmp $R9 &#039;/&#039; 0 -4&lt;br /&gt;
&lt;br /&gt;
	StrCpy $9 -1&lt;br /&gt;
	IntOp $9 $9 + 1&lt;br /&gt;
	StrCpy $R9 $1 1 $9&lt;br /&gt;
	StrCmp $R9 &#039;&#039; +2&lt;br /&gt;
	StrCmp $R9 &#039;/&#039; 0 -3&lt;br /&gt;
	StrCpy $8 $1 $9&lt;br /&gt;
	StrCpy $8 $8 &#039;&#039; 2&lt;br /&gt;
	StrCpy $R9 $8 &#039;&#039; -1&lt;br /&gt;
	StrCmp $R9 &#039; &#039; 0 +3&lt;br /&gt;
	StrCpy $8 $8 -1&lt;br /&gt;
	goto -3&lt;br /&gt;
	StrCpy $R9 $1 2&lt;br /&gt;
	StrCpy $1 $1 &#039;&#039; $9&lt;br /&gt;
&lt;br /&gt;
	StrCmp $R9 &#039;M=&#039; 0 FileFunc_GetSize_size&lt;br /&gt;
	StrCpy $4 $8&lt;br /&gt;
	goto FileFunc_GetSize_option&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_size:&lt;br /&gt;
	StrCmp $R9 &#039;S=&#039; 0 FileFunc_GetSize_gotosubdir&lt;br /&gt;
	StrCpy $6 $8&lt;br /&gt;
	goto FileFunc_GetSize_option&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_gotosubdir:&lt;br /&gt;
	StrCmp $R9 &#039;G=&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
	StrCpy $7 $8&lt;br /&gt;
	StrCmp $7 &#039;&#039; +3&lt;br /&gt;
	StrCmp $7 &#039;1&#039; +2&lt;br /&gt;
	StrCmp $7 &#039;0&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
	goto FileFunc_GetSize_option&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_sizeset:&lt;br /&gt;
	StrCmp $6 &#039;&#039; FileFunc_GetSize_default&lt;br /&gt;
	StrCpy $9 0&lt;br /&gt;
	StrCpy $R9 $6 1 $9&lt;br /&gt;
	StrCmp $R9 &#039;&#039; +4&lt;br /&gt;
	StrCmp $R9 &#039;:&#039; +3&lt;br /&gt;
	IntOp $9 $9 + 1&lt;br /&gt;
	goto -4&lt;br /&gt;
	StrCpy $5 $6 $9&lt;br /&gt;
	IntOp $9 $9 + 1&lt;br /&gt;
	StrCpy $1 $6 1 -1&lt;br /&gt;
	StrCpy $6 $6 -1 $9&lt;br /&gt;
	StrCmp $5 &#039;&#039; +2&lt;br /&gt;
	IntOp $5 $5 + 0&lt;br /&gt;
	StrCmp $6 &#039;&#039; +2&lt;br /&gt;
	IntOp $6 $6 + 0&lt;br /&gt;
&lt;br /&gt;
	StrCmp $1 &#039;B&#039; 0 +4&lt;br /&gt;
	StrCpy $1 1&lt;br /&gt;
	StrCpy $2 bytes&lt;br /&gt;
	goto FileFunc_GetSize_default&lt;br /&gt;
	StrCmp $1 &#039;K&#039; 0 +4&lt;br /&gt;
	StrCpy $1 1024&lt;br /&gt;
	StrCpy $2 Kb&lt;br /&gt;
	goto FileFunc_GetSize_default&lt;br /&gt;
	StrCmp $1 &#039;M&#039; 0 +4&lt;br /&gt;
	StrCpy $1 1048576&lt;br /&gt;
	StrCpy $2 Mb&lt;br /&gt;
	goto FileFunc_GetSize_default&lt;br /&gt;
	StrCmp $1 &#039;G&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
	StrCpy $1 1073741824&lt;br /&gt;
	StrCpy $2 Gb&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_default:&lt;br /&gt;
	StrCmp $4 &#039;&#039; 0 +2&lt;br /&gt;
	StrCpy $4 &#039;*.*&#039;&lt;br /&gt;
	StrCmp $7 &#039;&#039; 0 +2&lt;br /&gt;
	StrCpy $7 &#039;1&#039;&lt;br /&gt;
&lt;br /&gt;
	StrCpy $8 1&lt;br /&gt;
	Push $0&lt;br /&gt;
	SetDetailsPrint textonly&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_nextdir:&lt;br /&gt;
	IntOp $8 $8 - 1&lt;br /&gt;
	Pop $R8&lt;br /&gt;
	FindFirst $0 $R7 &#039;$R8\$4&#039;&lt;br /&gt;
	IfErrors FileFunc_GetSize_show&lt;br /&gt;
	StrCmp $R7 &#039;.&#039; 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	StrCmp $R7 &#039;..&#039; 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
	goto FileFunc_GetSize_show&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_dir:&lt;br /&gt;
	IfFileExists &#039;$R8\$R7\*.*&#039; 0 FileFunc_GetSize_file&lt;br /&gt;
	IntOp $R5 $R5 + 1&lt;br /&gt;
	goto FileFunc_GetSize_findnext&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_file:&lt;br /&gt;
	StrCpy $R6 0&lt;br /&gt;
	StrCmp $5$6 &#039;&#039; 0 +3&lt;br /&gt;
	IntOp $R4 $R4 + 1&lt;br /&gt;
	goto FileFunc_GetSize_findnext&lt;br /&gt;
	FileOpen $9 &#039;$R8\$R7&#039; r&lt;br /&gt;
	IfErrors +3&lt;br /&gt;
	FileSeek $9 0 END $R6&lt;br /&gt;
	FileClose $9&lt;br /&gt;
	StrCmp $5 &#039;&#039; +2&lt;br /&gt;
	IntCmp $R6 $5 0 FileFunc_GetSize_findnext&lt;br /&gt;
	StrCmp $6 &#039;&#039; +2&lt;br /&gt;
	IntCmp $R6 $6 0 0 FileFunc_GetSize_findnext&lt;br /&gt;
	IntOp $R4 $R4 + 1&lt;br /&gt;
	; insert code&lt;br /&gt;
	StrCmp $R1 &amp;quot;&amp;quot; +10 0&lt;br /&gt;
	StrCpy $R0 $R1&lt;br /&gt;
	IntOp $R6 $R6 + $R0&lt;br /&gt;
	IntOp $R1 $R6 % $R0&lt;br /&gt;
	StrCmp $R1 0 0 +2&lt;br /&gt;
	StrCpy $R1 $R0&lt;br /&gt;
	IntOp $R2 $R0 - $R1&lt;br /&gt;
	IntOp $R6 $R6 - $R0&lt;br /&gt;
	IntOp $R6 $R6 + $R2&lt;br /&gt;
	StrCpy $R1 $R0&lt;br /&gt;
	; end insert&lt;br /&gt;
	System::Int64Op $R3 + $R6&lt;br /&gt;
	Pop $R3&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_findnext:&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_show:&lt;br /&gt;
	StrCmp $5$6 &#039;&#039; FileFunc_GetSize_nosize&lt;br /&gt;
	System::Int64Op $R3 / $1&lt;br /&gt;
	Pop $9&lt;br /&gt;
	DetailPrint &#039;Size:$9 $2  Files:$R4  Folders:$R5&#039;&lt;br /&gt;
	goto FileFunc_GetSize_subdir&lt;br /&gt;
	FileFunc_GetSize_nosize:&lt;br /&gt;
	DetailPrint &#039;Files:$R4  Folders:$R5&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_subdir:&lt;br /&gt;
	StrCmp $7 0 FileFunc_GetSize_preend&lt;br /&gt;
	FindFirst $0 $R7 &#039;$R8\*.*&#039;&lt;br /&gt;
	StrCmp $R7 &#039;.&#039; 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	StrCmp $R7 &#039;..&#039; 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
	StrCmp $8 0 FileFunc_GetSize_preend FileFunc_GetSize_nextdir&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_pushdir:&lt;br /&gt;
	IfFileExists &#039;$R8\$R7\*.*&#039; 0 +3&lt;br /&gt;
	Push &#039;$R8\$R7&#039;&lt;br /&gt;
	IntOp $8 $8 + 1&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
	StrCmp $8 0 FileFunc_GetSize_preend FileFunc_GetSize_nextdir&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_preend:&lt;br /&gt;
	StrCmp $R3 &#039;&#039; FileFunc_GetSize_nosizeend&lt;br /&gt;
	System::Int64Op $R3 / $1&lt;br /&gt;
	Pop $R3&lt;br /&gt;
	FileFunc_GetSize_nosizeend:&lt;br /&gt;
	StrCpy $2 $R4&lt;br /&gt;
	StrCpy $1 $R5&lt;br /&gt;
	StrCpy $0 $R3&lt;br /&gt;
	goto FileFunc_GetSize_end&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_error:&lt;br /&gt;
	SetErrors&lt;br /&gt;
	StrCpy $0 &#039;&#039;&lt;br /&gt;
	StrCpy $1 &#039;&#039;&lt;br /&gt;
	StrCpy $2 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_end:&lt;br /&gt;
	SetDetailsPrint both&lt;br /&gt;
	Pop $R9&lt;br /&gt;
	Pop $R8&lt;br /&gt;
	Pop $R7&lt;br /&gt;
	Pop $R6&lt;br /&gt;
	Pop $R5&lt;br /&gt;
	Pop $R4&lt;br /&gt;
	Pop $R3&lt;br /&gt;
	; insert code&lt;br /&gt;
	Pop $R2&lt;br /&gt;
	; end insert&lt;br /&gt;
	Pop $9&lt;br /&gt;
	Pop $8&lt;br /&gt;
	Pop $7&lt;br /&gt;
	Pop $6&lt;br /&gt;
	Pop $5&lt;br /&gt;
	Pop $4&lt;br /&gt;
	Pop $3&lt;br /&gt;
	Exch $2&lt;br /&gt;
	Exch&lt;br /&gt;
	Exch $1&lt;br /&gt;
	Exch 2&lt;br /&gt;
	Exch $0&lt;br /&gt;
&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
; ---------------&lt;br /&gt;
; GetFileAttributes (FileFunc.nsh)&lt;br /&gt;
&lt;br /&gt;
!define GetFileAttributes `!insertmacro GetFileAttributesCall`&lt;br /&gt;
!define un.GetFileAttributes `!insertmacro GetFileAttributesCall`&lt;br /&gt;
&lt;br /&gt;
!macro GetFileAttributes&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro un.GetFileAttributes&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetFileAttributes_&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
	&lt;br /&gt;
	Exch $1&lt;br /&gt;
	Exch&lt;br /&gt;
	Exch $0&lt;br /&gt;
	Exch&lt;br /&gt;
	Push $2&lt;br /&gt;
	Push $3&lt;br /&gt;
	Push $4&lt;br /&gt;
	Push $5&lt;br /&gt;
&lt;br /&gt;
	System::Call &#039;kernel32::GetFileAttributes(t r0)i .r2&#039;&lt;br /&gt;
	StrCmp $2 -1 FileFunc_GetFileAttributes_error&lt;br /&gt;
	StrCpy $3 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x4000&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;ENCRYPTED|&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x2000&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;NOT_CONTENT_INDEXED|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x1000&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;OFFLINE|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0800&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;COMPRESSED|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0400&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;REPARSE_POINT|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0200&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;SPARSE_FILE|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0100&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;TEMPORARY|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0080&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;NORMAL|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0040&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;DEVICE|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0020&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;ARCHIVE|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0010&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;DIRECTORY|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0004&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;SYSTEM|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0002&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;HIDDEN|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0001&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;READONLY|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	StrCpy $0 $3 -1&lt;br /&gt;
	StrCmp $1 &#039;&#039; FileFunc_GetFileAttributes_end&lt;br /&gt;
	StrCmp $1 &#039;ALL&#039; FileFunc_GetFileAttributes_end&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetFileAttributes_attrcmp:&lt;br /&gt;
	StrCpy $5 0&lt;br /&gt;
	IntOp $5 $5 + 1&lt;br /&gt;
	StrCpy $4 $1 1 $5&lt;br /&gt;
	StrCmp $4 &#039;&#039; +2&lt;br /&gt;
	StrCmp $4 &#039;|&#039;  0 -3&lt;br /&gt;
	StrCpy $2 $1 $5&lt;br /&gt;
	IntOp $5 $5 + 1&lt;br /&gt;
	StrCpy $1 $1 &#039;&#039; $5&lt;br /&gt;
	StrLen $3 $2&lt;br /&gt;
	StrCpy $5 -1&lt;br /&gt;
	IntOp $5 $5 + 1&lt;br /&gt;
	StrCpy $4 $0 $3 $5&lt;br /&gt;
	StrCmp $4 &#039;&#039; FileFunc_GetFileAttributes_notfound&lt;br /&gt;
	StrCmp $4 $2 0 -3&lt;br /&gt;
	StrCmp $1 &#039;&#039; 0 FileFunc_GetFileAttributes_attrcmp&lt;br /&gt;
	StrCpy $0 1&lt;br /&gt;
	goto FileFunc_GetFileAttributes_end&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetFileAttributes_notfound:&lt;br /&gt;
	StrCpy $0 0&lt;br /&gt;
	goto FileFunc_GetFileAttributes_end&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetFileAttributes_error:&lt;br /&gt;
	SetErrors&lt;br /&gt;
	StrCpy $0 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetFileAttributes_end:&lt;br /&gt;
	Pop $5&lt;br /&gt;
	Pop $4&lt;br /&gt;
	Pop $3&lt;br /&gt;
	Pop $2&lt;br /&gt;
	Pop $1&lt;br /&gt;
	Exch $0&lt;br /&gt;
		&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!define GetFileVersion `!insertmacro GetFileVersionCall`&lt;br /&gt;
!define un.GetFileVersion `!insertmacro GetFileVersionCall`&lt;br /&gt;
&lt;br /&gt;
!macro GetFileVersion&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro un.GetFileVersion&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetFileVersion_&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
	&lt;br /&gt;
	Exch $0&lt;br /&gt;
	Push $1&lt;br /&gt;
	Push $2&lt;br /&gt;
	Push $3&lt;br /&gt;
	Push $4&lt;br /&gt;
	Push $5&lt;br /&gt;
	Push $6&lt;br /&gt;
	ClearErrors&lt;br /&gt;
&lt;br /&gt;
	GetDllVersion &#039;$0&#039; $1 $2&lt;br /&gt;
	IfErrors FileFunc_GetFileVersion_error&lt;br /&gt;
	IntOp $3 $1 &amp;gt;&amp;gt; 16&lt;br /&gt;
	IntOp $3 $3 &amp;amp; 0x0000FFFF&lt;br /&gt;
	IntOp $4 $1 &amp;amp; 0x0000FFFF&lt;br /&gt;
	IntOp $5 $2 &amp;gt;&amp;gt; 16&lt;br /&gt;
	IntOp $5 $5 &amp;amp; 0x0000FFFF&lt;br /&gt;
	IntOp $6 $2 &amp;amp; 0x0000FFFF&lt;br /&gt;
	StrCpy $0 &#039;$3.$4.$5.$6&#039;&lt;br /&gt;
	goto FileFunc_GetFileVersion_end&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetFileVersion_error:&lt;br /&gt;
	SetErrors&lt;br /&gt;
	StrCpy $0 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetFileVersion_end:&lt;br /&gt;
	Pop $6&lt;br /&gt;
	Pop $5&lt;br /&gt;
	Pop $4&lt;br /&gt;
	Pop $3&lt;br /&gt;
	Pop $2&lt;br /&gt;
	Pop $1&lt;br /&gt;
	Exch $0&lt;br /&gt;
&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
; ---------------&lt;br /&gt;
; GetClusterSize&lt;br /&gt;
&lt;br /&gt;
!define GetClusterSize `!insertmacro GetClusterSizeCall`&lt;br /&gt;
!define un.GetClusterSize `!insertmacro GetClusterSizeCall`&lt;br /&gt;
&lt;br /&gt;
!macro GetClusterSize&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro un.GetClusterSize&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetClusterSize_&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
&lt;br /&gt;
	System::Call &#039;kernel32::GetDiskFreeSpace(i0,*i0r0,*i0r1,*i0r2,*i)&#039;&lt;br /&gt;
	IntOp $0 $0 * $1&lt;br /&gt;
	Push $0&lt;br /&gt;
&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&amp;lt;/highlight-nsis&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-size: 110%&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Credits:&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;em&amp;gt;GetFileAttributes&amp;lt;/em&amp;gt; is borrowed from &amp;lt;b&amp;gt;filefunc.nsh&amp;lt;/b&amp;gt;. &amp;lt;em&amp;gt;GetSizeOnDisk&amp;lt;/em&amp;gt; has been altered slightly and renamed. The original macro is called &amp;lt;em&amp;gt;GetSize&amp;lt;/em&amp;gt;. You will find it in the Users Manual under E.1.3.&lt;br /&gt;
[[Category:Code Examples]]&lt;/div&gt;</summary>
		<author><name>Bnicer</name></author>
	</entry>
	<entry>
		<id>https://nsis.sourceforge.io/mediawiki/index.php?title=Get_size_on_disk&amp;diff=22891</id>
		<title>Get size on disk</title>
		<link rel="alternate" type="text/html" href="https://nsis.sourceforge.io/mediawiki/index.php?title=Get_size_on_disk&amp;diff=22891"/>
		<updated>2013-02-12T09:46:30Z</updated>

		<summary type="html">&lt;p&gt;Bnicer: Size On Disk (SOD) utility to get the space used by directories and files&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This example code shows you how to get the space used by directories and files.&lt;br /&gt;
&amp;lt;highlight-nsis&amp;gt;&lt;br /&gt;
; A utility for computing the NSIS (or NSIS Unicode) install folder size and the size of&lt;br /&gt;
; the uninstaller&lt;br /&gt;
; nsissize.nsi&lt;br /&gt;
; Compile &amp;amp; run the .exe&lt;br /&gt;
&lt;br /&gt;
Name &amp;quot;SOD Tool&amp;quot;&lt;br /&gt;
RequestExecutionLevel user&lt;br /&gt;
!define LOCAL &amp;quot;&amp;quot; ; Path where local include files reside&lt;br /&gt;
OutFile &amp;quot;${LOCAL}nsissize.exe&amp;quot;&lt;br /&gt;
!include &amp;quot;${LOCAL}macros.nsh&amp;quot;&lt;br /&gt;
ReserveFile &amp;quot;${NSISDIR}\Plugins\Math.dll&amp;quot;&lt;br /&gt;
#Icon &amp;quot;${LOCAL}arrows.ico&amp;quot;&lt;br /&gt;
ShowInstDetails show&lt;br /&gt;
&lt;br /&gt;
; Variables&lt;br /&gt;
Var NSIS&lt;br /&gt;
Var ZIP&lt;br /&gt;
Var ZIP_UN&lt;br /&gt;
Var COUNT&lt;br /&gt;
Var BLOCK&lt;br /&gt;
Var FILES&lt;br /&gt;
Var FOLDERS&lt;br /&gt;
Var SIZE_B&lt;br /&gt;
Var SIZE_M&lt;br /&gt;
Var SOD_B&lt;br /&gt;
Var SOD_K&lt;br /&gt;
Var SOD_M&lt;br /&gt;
Var SIZE_UN_B&lt;br /&gt;
Var SIZE_UN_K&lt;br /&gt;
Var SOD_UN_B&lt;br /&gt;
Var SOD_UN_K&lt;br /&gt;
&lt;br /&gt;
Function Separator ; comma&lt;br /&gt;
  StrCpy $R2 $R1&lt;br /&gt;
  StrCpy $COUNT &amp;quot;16&amp;quot; ; 1,000,000,000,000,000 limit&lt;br /&gt;
  StrLen $R4 $R1&lt;br /&gt;
  loop:&lt;br /&gt;
  IntCmp $COUNT 3 endloop endloop 0&lt;br /&gt;
  IntCmp $R4 $COUNT 0 +7 0&lt;br /&gt;
  IntOp $COUNT $COUNT - 1&lt;br /&gt;
  StrCpy $R2 $R2 -$COUNT&lt;br /&gt;
  StrCpy $R3 $R1 &amp;quot;&amp;quot; -$COUNT&lt;br /&gt;
  StrCpy $R2 &amp;quot;$R2,$R3&amp;quot;&lt;br /&gt;
  IntOp $COUNT $COUNT - 2&lt;br /&gt;
  Goto loop&lt;br /&gt;
  IntOp $COUNT $COUNT - 3&lt;br /&gt;
  Goto loop&lt;br /&gt;
  endloop:&lt;br /&gt;
FunctionEnd&lt;br /&gt;
&lt;br /&gt;
Section&lt;br /&gt;
; root&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS Unicode&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS Unicode&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS ANSI&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS ANSI&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  Goto done&lt;br /&gt;
  begin:&lt;br /&gt;
  IfFileExists &amp;quot;$NSIS&amp;quot; 0 done&lt;br /&gt;
  ${GetFileAttributes} &amp;quot;$NSIS&amp;quot; &amp;quot;COMPRESSED&amp;quot; $ZIP&lt;br /&gt;
  ${GetClusterSize} $BLOCK&lt;br /&gt;
  ${GetSizeOnDisk} &amp;quot;$NSIS&amp;quot; &amp;quot;/S=0B&amp;quot; &amp;quot;&amp;quot; $0 $1 $2&lt;br /&gt;
  Math::Script &amp;quot;r3 = ff($0 / 1024 / 1024.0, 16 +2&amp;quot;&lt;br /&gt;
  StrCpy $SIZE_B $0&lt;br /&gt;
  StrCpy $FILES $1&lt;br /&gt;
  StrCpy $FOLDERS $2&lt;br /&gt;
  StrCpy $SIZE_M $3&lt;br /&gt;
  ${GetSizeOnDisk} &amp;quot;$NSIS&amp;quot; &amp;quot;/S=0B&amp;quot; &amp;quot;$BLOCK&amp;quot; $0 $1 $2&lt;br /&gt;
  Math::Script &amp;quot;r4 = ff($0 / 1024.0, 16 +0); r5 = ff(r4 / 1024.0, 16 +2)&amp;quot;&lt;br /&gt;
  StrCpy $SOD_B $0&lt;br /&gt;
  StrCpy $SOD_K $4&lt;br /&gt;
  StrCpy $SOD_M $5&lt;br /&gt;
; uninstaller&lt;br /&gt;
  IfFileExists &amp;quot;$NSIS\uninst-nsis.exe&amp;quot; 0 done&lt;br /&gt;
  ${GetFileAttributes} &amp;quot;$NSIS\uninst-nsis.exe&amp;quot; &amp;quot;COMPRESSED&amp;quot; $ZIP_UN&lt;br /&gt;
  ${GetSizeOnDisk} &amp;quot;$NSIS&amp;quot; &amp;quot;/M=uninst-nsis.exe /S=0B&amp;quot; &amp;quot;&amp;quot; $0 $1 $2&lt;br /&gt;
  Math::Script &amp;quot;r6 = ff($0 / 1024.0, 16 +1); \&lt;br /&gt;
  a = $0; b = $BLOCK; c = a % b; #[c == 0, c = $BLOCK]; r7 = (b - c + a); \&lt;br /&gt;
  r8 = ff(r7 / 1024.0, 16 +1)&amp;quot;&lt;br /&gt;
  StrCpy $SIZE_UN_B $0&lt;br /&gt;
  StrCpy $SIZE_UN_K $6&lt;br /&gt;
  StrCpy $SOD_UN_B $7&lt;br /&gt;
  StrCpy $SOD_UN_K $8&lt;br /&gt;
  ; format&lt;br /&gt;
  StrCpy $R1 $SIZE_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SIZE_B $R2&lt;br /&gt;
&lt;br /&gt;
  StrCpy $R1 $SOD_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SOD_B $R2&lt;br /&gt;
&lt;br /&gt;
  StrCpy $R1 $SOD_K&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SOD_K $R2&lt;br /&gt;
&lt;br /&gt;
  StrCpy $R1 $SIZE_UN_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SIZE_UN_B $R2&lt;br /&gt;
  StrCpy $R1 $SOD_UN_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SOD_UN_B $R2&lt;br /&gt;
; output&lt;br /&gt;
  ; note: with compression SOD lines are incorrect&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;$NSIS&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;Size: $SIZE_M MB ($SIZE_B bytes)&amp;quot;&lt;br /&gt;
  StrCmp $ZIP &amp;quot;1&amp;quot; +3&lt;br /&gt;
  StrCmp $ZIP_UN &amp;quot;1&amp;quot; +2&lt;br /&gt;
  DetailPrint &amp;quot;SOD: $SOD_M MB ($SOD_B bytes)&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;Uninstaller&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;Size: $SIZE_UN_K KB ($SIZE_UN_B bytes)&amp;quot;&lt;br /&gt;
  StrCmp $ZIP &amp;quot;1&amp;quot; +3&lt;br /&gt;
  StrCmp $ZIP_UN &amp;quot;1&amp;quot; +2&lt;br /&gt;
  DetailPrint &amp;quot;SOD: $SOD_UN_K KB ($SOD_UN_B bytes)&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;$FILES files $FOLDERS folders $SOD_K Kb&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  Goto completed&lt;br /&gt;
  done:&lt;br /&gt;
  DetailPrint &amp;quot;File not found.&amp;quot;&lt;br /&gt;
  completed:&lt;br /&gt;
SectionEnd&lt;br /&gt;
&lt;br /&gt;
;--------------------------------&lt;br /&gt;
# EOF&lt;br /&gt;
&amp;lt;/highlight-nsis&amp;gt;&lt;br /&gt;
You should copy the next code into a separate file: &amp;lt;b&amp;gt;macros.nsh&amp;lt;/b&amp;gt;.&lt;br /&gt;
&amp;lt;highlight-nsis&amp;gt;&lt;br /&gt;
; Macros include file&lt;br /&gt;
;--------------------------------&lt;br /&gt;
/*&lt;br /&gt;
&lt;br /&gt;
 FileFunction=[GetSizeOnDisk|GetClusterSize|GetFileAttributes]&lt;br /&gt;
&lt;br /&gt;
*/&lt;br /&gt;
;_____________________________________________________________________________&lt;br /&gt;
;&lt;br /&gt;
;                         Macros&lt;br /&gt;
;_____________________________________________________________________________&lt;br /&gt;
;&lt;br /&gt;
; Change log window verbosity (default: 3=no script)&lt;br /&gt;
;&lt;br /&gt;
; Example:&lt;br /&gt;
; !include &amp;quot;sizemacros.nsh&amp;quot;&lt;br /&gt;
; !insertmacro GetSizeOnDisk&lt;br /&gt;
; ${FILEFUNC_VERBOSE} 4   # all verbosity&lt;br /&gt;
; !insertmacro GetClusterSize&lt;br /&gt;
; ${FILEFUNC_VERBOSE} 3   # no script&lt;br /&gt;
&lt;br /&gt;
!include Util.nsh ; for &amp;quot;CallArtificialFunction&amp;quot;&lt;br /&gt;
&lt;br /&gt;
!verbose push&lt;br /&gt;
!verbose 3&lt;br /&gt;
!ifndef _FILEFUNC_VERBOSE&lt;br /&gt;
	!define _FILEFUNC_VERBOSE 3&lt;br /&gt;
!endif&lt;br /&gt;
!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
!define FILEFUNC_VERBOSE `!insertmacro FILEFUNC_VERBOSE`&lt;br /&gt;
!verbose pop&lt;br /&gt;
&lt;br /&gt;
!macro FILEFUNC_VERBOSE _VERBOSE&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose 3&lt;br /&gt;
	!undef _FILEFUNC_VERBOSE&lt;br /&gt;
	!define _FILEFUNC_VERBOSE ${_VERBOSE}&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetSizeOnDiskCall _PATH _OPTIONS _FILESYSTEM _RESULT1 _RESULT2 _RESULT3&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
	Push `${_PATH}`&lt;br /&gt;
	Push `${_OPTIONS}`&lt;br /&gt;
	Push `${_FILESYSTEM}` ; block size&lt;br /&gt;
	${CallArtificialFunction} GetSizeOnDisk_&lt;br /&gt;
	Pop ${_RESULT1}&lt;br /&gt;
	Pop ${_RESULT2}&lt;br /&gt;
	Pop ${_RESULT3}&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetClusterSizeCall _RESULT&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
	${CallArtificialFunction} GetClusterSize_&lt;br /&gt;
	Pop ${_RESULT}&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetFileAttributesCall _PATH _ATTR _RESULT&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
	Push `${_PATH}`&lt;br /&gt;
	Push `${_ATTR}`&lt;br /&gt;
	${CallArtificialFunction} GetFileAttributes_&lt;br /&gt;
	Pop ${_RESULT}&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
; ---------------&lt;br /&gt;
; GetSizeOnDisk (modified &amp;quot;GetSize&amp;quot; - FileFunc.nsh - KiCHiK - Function &amp;quot;FindFiles&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
!define GetSizeOnDisk `!insertmacro GetSizeOnDiskCall`&lt;br /&gt;
!define un.GetSizeOnDisk `!insertmacro GetSizeOnDiskCall`&lt;br /&gt;
&lt;br /&gt;
!macro GetSizeOnDisk&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro un.GetSizeOnDisk&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
; Usage: similar to &amp;quot;GetSize&amp;quot;&lt;br /&gt;
&lt;br /&gt;
; For documentation, see the NSIS user manual: E.1.3 GetSize&lt;br /&gt;
; Three values are returned&lt;br /&gt;
&lt;br /&gt;
; $var1		; Result1: Size/Size on disk&lt;br /&gt;
; $var2		; Result2: Sum of files&lt;br /&gt;
; $var3		; Result3: Sum of directories&lt;br /&gt;
&lt;br /&gt;
; Example: ${GetSizeOnDisk} &amp;quot;$INSTDIR&amp;quot; &amp;quot;/S=0K&amp;quot; &amp;quot;4096&amp;quot; $0 $1 $2&lt;br /&gt;
&lt;br /&gt;
; Specifying 4096 (logical size) toggles the result&lt;br /&gt;
; Output is size on disk, if used, or size in bytes, if left empty &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
!macro GetSizeOnDisk_&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
&lt;br /&gt;
	; replace&lt;br /&gt;
	Exch $R1&lt;br /&gt;
	Exch&lt;br /&gt;
	Exch $1&lt;br /&gt;
	Exch 2&lt;br /&gt;
	; end replace&lt;br /&gt;
	Exch $0&lt;br /&gt;
	Exch&lt;br /&gt;
	Push $2&lt;br /&gt;
	Push $3&lt;br /&gt;
	Push $4&lt;br /&gt;
	Push $5&lt;br /&gt;
	Push $6&lt;br /&gt;
	Push $7&lt;br /&gt;
	Push $8&lt;br /&gt;
	Push $9&lt;br /&gt;
	; insert code&lt;br /&gt;
	Push $R2&lt;br /&gt;
	; end insert&lt;br /&gt;
	Push $R3&lt;br /&gt;
	Push $R4&lt;br /&gt;
	Push $R5&lt;br /&gt;
	Push $R6&lt;br /&gt;
	Push $R7&lt;br /&gt;
	Push $R8&lt;br /&gt;
	Push $R9&lt;br /&gt;
	ClearErrors&lt;br /&gt;
&lt;br /&gt;
	StrCpy $R9 $0 1 -1&lt;br /&gt;
	StrCmp $R9 &#039;\&#039; 0 +3&lt;br /&gt;
	StrCpy $0 $0 -1&lt;br /&gt;
	goto -3&lt;br /&gt;
	IfFileExists &#039;$0\*.*&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
&lt;br /&gt;
	StrCpy $3 &#039;&#039;&lt;br /&gt;
	StrCpy $4 &#039;&#039;&lt;br /&gt;
	StrCpy $5 &#039;&#039;&lt;br /&gt;
	StrCpy $6 &#039;&#039;&lt;br /&gt;
	StrCpy $8 0&lt;br /&gt;
	StrCpy $R3 &#039;&#039;&lt;br /&gt;
	StrCpy $R4 &#039;&#039;&lt;br /&gt;
	StrCpy $R5 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_option:&lt;br /&gt;
	StrCpy $R9 $1 1&lt;br /&gt;
	StrCpy $1 $1 &#039;&#039; 1&lt;br /&gt;
	StrCmp $R9 &#039; &#039; -2&lt;br /&gt;
	StrCmp $R9 &#039;&#039; FileFunc_GetSize_sizeset&lt;br /&gt;
	StrCmp $R9 &#039;/&#039; 0 -4&lt;br /&gt;
&lt;br /&gt;
	StrCpy $9 -1&lt;br /&gt;
	IntOp $9 $9 + 1&lt;br /&gt;
	StrCpy $R9 $1 1 $9&lt;br /&gt;
	StrCmp $R9 &#039;&#039; +2&lt;br /&gt;
	StrCmp $R9 &#039;/&#039; 0 -3&lt;br /&gt;
	StrCpy $8 $1 $9&lt;br /&gt;
	StrCpy $8 $8 &#039;&#039; 2&lt;br /&gt;
	StrCpy $R9 $8 &#039;&#039; -1&lt;br /&gt;
	StrCmp $R9 &#039; &#039; 0 +3&lt;br /&gt;
	StrCpy $8 $8 -1&lt;br /&gt;
	goto -3&lt;br /&gt;
	StrCpy $R9 $1 2&lt;br /&gt;
	StrCpy $1 $1 &#039;&#039; $9&lt;br /&gt;
&lt;br /&gt;
	StrCmp $R9 &#039;M=&#039; 0 FileFunc_GetSize_size&lt;br /&gt;
	StrCpy $4 $8&lt;br /&gt;
	goto FileFunc_GetSize_option&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_size:&lt;br /&gt;
	StrCmp $R9 &#039;S=&#039; 0 FileFunc_GetSize_gotosubdir&lt;br /&gt;
	StrCpy $6 $8&lt;br /&gt;
	goto FileFunc_GetSize_option&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_gotosubdir:&lt;br /&gt;
	StrCmp $R9 &#039;G=&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
	StrCpy $7 $8&lt;br /&gt;
	StrCmp $7 &#039;&#039; +3&lt;br /&gt;
	StrCmp $7 &#039;1&#039; +2&lt;br /&gt;
	StrCmp $7 &#039;0&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
	goto FileFunc_GetSize_option&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_sizeset:&lt;br /&gt;
	StrCmp $6 &#039;&#039; FileFunc_GetSize_default&lt;br /&gt;
	StrCpy $9 0&lt;br /&gt;
	StrCpy $R9 $6 1 $9&lt;br /&gt;
	StrCmp $R9 &#039;&#039; +4&lt;br /&gt;
	StrCmp $R9 &#039;:&#039; +3&lt;br /&gt;
	IntOp $9 $9 + 1&lt;br /&gt;
	goto -4&lt;br /&gt;
	StrCpy $5 $6 $9&lt;br /&gt;
	IntOp $9 $9 + 1&lt;br /&gt;
	StrCpy $1 $6 1 -1&lt;br /&gt;
	StrCpy $6 $6 -1 $9&lt;br /&gt;
	StrCmp $5 &#039;&#039; +2&lt;br /&gt;
	IntOp $5 $5 + 0&lt;br /&gt;
	StrCmp $6 &#039;&#039; +2&lt;br /&gt;
	IntOp $6 $6 + 0&lt;br /&gt;
&lt;br /&gt;
	StrCmp $1 &#039;B&#039; 0 +4&lt;br /&gt;
	StrCpy $1 1&lt;br /&gt;
	StrCpy $2 bytes&lt;br /&gt;
	goto FileFunc_GetSize_default&lt;br /&gt;
	StrCmp $1 &#039;K&#039; 0 +4&lt;br /&gt;
	StrCpy $1 1024&lt;br /&gt;
	StrCpy $2 Kb&lt;br /&gt;
	goto FileFunc_GetSize_default&lt;br /&gt;
	StrCmp $1 &#039;M&#039; 0 +4&lt;br /&gt;
	StrCpy $1 1048576&lt;br /&gt;
	StrCpy $2 Mb&lt;br /&gt;
	goto FileFunc_GetSize_default&lt;br /&gt;
	StrCmp $1 &#039;G&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
	StrCpy $1 1073741824&lt;br /&gt;
	StrCpy $2 Gb&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_default:&lt;br /&gt;
	StrCmp $4 &#039;&#039; 0 +2&lt;br /&gt;
	StrCpy $4 &#039;*.*&#039;&lt;br /&gt;
	StrCmp $7 &#039;&#039; 0 +2&lt;br /&gt;
	StrCpy $7 &#039;1&#039;&lt;br /&gt;
&lt;br /&gt;
	StrCpy $8 1&lt;br /&gt;
	Push $0&lt;br /&gt;
	SetDetailsPrint textonly&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_nextdir:&lt;br /&gt;
	IntOp $8 $8 - 1&lt;br /&gt;
	Pop $R8&lt;br /&gt;
	FindFirst $0 $R7 &#039;$R8\$4&#039;&lt;br /&gt;
	IfErrors FileFunc_GetSize_show&lt;br /&gt;
	StrCmp $R7 &#039;.&#039; 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	StrCmp $R7 &#039;..&#039; 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
	goto FileFunc_GetSize_show&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_dir:&lt;br /&gt;
	IfFileExists &#039;$R8\$R7\*.*&#039; 0 FileFunc_GetSize_file&lt;br /&gt;
	IntOp $R5 $R5 + 1&lt;br /&gt;
	goto FileFunc_GetSize_findnext&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_file:&lt;br /&gt;
	StrCpy $R6 0&lt;br /&gt;
	StrCmp $5$6 &#039;&#039; 0 +3&lt;br /&gt;
	IntOp $R4 $R4 + 1&lt;br /&gt;
	goto FileFunc_GetSize_findnext&lt;br /&gt;
	FileOpen $9 &#039;$R8\$R7&#039; r&lt;br /&gt;
	IfErrors +3&lt;br /&gt;
	FileSeek $9 0 END $R6&lt;br /&gt;
	FileClose $9&lt;br /&gt;
	StrCmp $5 &#039;&#039; +2&lt;br /&gt;
	IntCmp $R6 $5 0 FileFunc_GetSize_findnext&lt;br /&gt;
	StrCmp $6 &#039;&#039; +2&lt;br /&gt;
	IntCmp $R6 $6 0 0 FileFunc_GetSize_findnext&lt;br /&gt;
	IntOp $R4 $R4 + 1&lt;br /&gt;
	; insert code&lt;br /&gt;
	StrCmp $R1 &amp;quot;&amp;quot; +10 0&lt;br /&gt;
	StrCpy $R0 $R1&lt;br /&gt;
	IntOp $R6 $R6 + $R0&lt;br /&gt;
	IntOp $R1 $R6 % $R0&lt;br /&gt;
	StrCmp $R1 0 0 +2&lt;br /&gt;
	StrCpy $R1 $R0&lt;br /&gt;
	IntOp $R2 $R0 - $R1&lt;br /&gt;
	IntOp $R6 $R6 - $R0&lt;br /&gt;
	IntOp $R6 $R6 + $R2&lt;br /&gt;
	StrCpy $R1 $R0&lt;br /&gt;
	; end insert&lt;br /&gt;
	System::Int64Op $R3 + $R6&lt;br /&gt;
	Pop $R3&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_findnext:&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_show:&lt;br /&gt;
	StrCmp $5$6 &#039;&#039; FileFunc_GetSize_nosize&lt;br /&gt;
	System::Int64Op $R3 / $1&lt;br /&gt;
	Pop $9&lt;br /&gt;
	DetailPrint &#039;Size:$9 $2  Files:$R4  Folders:$R5&#039;&lt;br /&gt;
	goto FileFunc_GetSize_subdir&lt;br /&gt;
	FileFunc_GetSize_nosize:&lt;br /&gt;
	DetailPrint &#039;Files:$R4  Folders:$R5&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_subdir:&lt;br /&gt;
	StrCmp $7 0 FileFunc_GetSize_preend&lt;br /&gt;
	FindFirst $0 $R7 &#039;$R8\*.*&#039;&lt;br /&gt;
	StrCmp $R7 &#039;.&#039; 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	StrCmp $R7 &#039;..&#039; 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
	StrCmp $8 0 FileFunc_GetSize_preend FileFunc_GetSize_nextdir&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_pushdir:&lt;br /&gt;
	IfFileExists &#039;$R8\$R7\*.*&#039; 0 +3&lt;br /&gt;
	Push &#039;$R8\$R7&#039;&lt;br /&gt;
	IntOp $8 $8 + 1&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
	StrCmp $8 0 FileFunc_GetSize_preend FileFunc_GetSize_nextdir&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_preend:&lt;br /&gt;
	StrCmp $R3 &#039;&#039; FileFunc_GetSize_nosizeend&lt;br /&gt;
	System::Int64Op $R3 / $1&lt;br /&gt;
	Pop $R3&lt;br /&gt;
	FileFunc_GetSize_nosizeend:&lt;br /&gt;
	StrCpy $2 $R4&lt;br /&gt;
	StrCpy $1 $R5&lt;br /&gt;
	StrCpy $0 $R3&lt;br /&gt;
	goto FileFunc_GetSize_end&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_error:&lt;br /&gt;
	SetErrors&lt;br /&gt;
	StrCpy $0 &#039;&#039;&lt;br /&gt;
	StrCpy $1 &#039;&#039;&lt;br /&gt;
	StrCpy $2 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_end:&lt;br /&gt;
	SetDetailsPrint both&lt;br /&gt;
	Pop $R9&lt;br /&gt;
	Pop $R8&lt;br /&gt;
	Pop $R7&lt;br /&gt;
	Pop $R6&lt;br /&gt;
	Pop $R5&lt;br /&gt;
	Pop $R4&lt;br /&gt;
	Pop $R3&lt;br /&gt;
	; insert code&lt;br /&gt;
	Pop $R2&lt;br /&gt;
	; end insert&lt;br /&gt;
	Pop $9&lt;br /&gt;
	Pop $8&lt;br /&gt;
	Pop $7&lt;br /&gt;
	Pop $6&lt;br /&gt;
	Pop $5&lt;br /&gt;
	Pop $4&lt;br /&gt;
	Pop $3&lt;br /&gt;
	Exch $2&lt;br /&gt;
	Exch&lt;br /&gt;
	Exch $1&lt;br /&gt;
	Exch 2&lt;br /&gt;
	Exch $0&lt;br /&gt;
&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
; ---------------&lt;br /&gt;
; GetFileAttributes (FileFunc.nsh)&lt;br /&gt;
&lt;br /&gt;
!define GetFileAttributes `!insertmacro GetFileAttributesCall`&lt;br /&gt;
!define un.GetFileAttributes `!insertmacro GetFileAttributesCall`&lt;br /&gt;
&lt;br /&gt;
!macro GetFileAttributes&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro un.GetFileAttributes&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetFileAttributes_&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
	&lt;br /&gt;
	Exch $1&lt;br /&gt;
	Exch&lt;br /&gt;
	Exch $0&lt;br /&gt;
	Exch&lt;br /&gt;
	Push $2&lt;br /&gt;
	Push $3&lt;br /&gt;
	Push $4&lt;br /&gt;
	Push $5&lt;br /&gt;
&lt;br /&gt;
	System::Call &#039;kernel32::GetFileAttributes(t r0)i .r2&#039;&lt;br /&gt;
	StrCmp $2 -1 FileFunc_GetFileAttributes_error&lt;br /&gt;
	StrCpy $3 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x4000&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;ENCRYPTED|&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x2000&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;NOT_CONTENT_INDEXED|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x1000&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;OFFLINE|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0800&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;COMPRESSED|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0400&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;REPARSE_POINT|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0200&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;SPARSE_FILE|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0100&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;TEMPORARY|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0080&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;NORMAL|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0040&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;DEVICE|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0020&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;ARCHIVE|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0010&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;DIRECTORY|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0004&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;SYSTEM|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0002&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;HIDDEN|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0001&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;READONLY|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	StrCpy $0 $3 -1&lt;br /&gt;
	StrCmp $1 &#039;&#039; FileFunc_GetFileAttributes_end&lt;br /&gt;
	StrCmp $1 &#039;ALL&#039; FileFunc_GetFileAttributes_end&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetFileAttributes_attrcmp:&lt;br /&gt;
	StrCpy $5 0&lt;br /&gt;
	IntOp $5 $5 + 1&lt;br /&gt;
	StrCpy $4 $1 1 $5&lt;br /&gt;
	StrCmp $4 &#039;&#039; +2&lt;br /&gt;
	StrCmp $4 &#039;|&#039;  0 -3&lt;br /&gt;
	StrCpy $2 $1 $5&lt;br /&gt;
	IntOp $5 $5 + 1&lt;br /&gt;
	StrCpy $1 $1 &#039;&#039; $5&lt;br /&gt;
	StrLen $3 $2&lt;br /&gt;
	StrCpy $5 -1&lt;br /&gt;
	IntOp $5 $5 + 1&lt;br /&gt;
	StrCpy $4 $0 $3 $5&lt;br /&gt;
	StrCmp $4 &#039;&#039; FileFunc_GetFileAttributes_notfound&lt;br /&gt;
	StrCmp $4 $2 0 -3&lt;br /&gt;
	StrCmp $1 &#039;&#039; 0 FileFunc_GetFileAttributes_attrcmp&lt;br /&gt;
	StrCpy $0 1&lt;br /&gt;
	goto FileFunc_GetFileAttributes_end&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetFileAttributes_notfound:&lt;br /&gt;
	StrCpy $0 0&lt;br /&gt;
	goto FileFunc_GetFileAttributes_end&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetFileAttributes_error:&lt;br /&gt;
	SetErrors&lt;br /&gt;
	StrCpy $0 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetFileAttributes_end:&lt;br /&gt;
	Pop $5&lt;br /&gt;
	Pop $4&lt;br /&gt;
	Pop $3&lt;br /&gt;
	Pop $2&lt;br /&gt;
	Pop $1&lt;br /&gt;
	Exch $0&lt;br /&gt;
		&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!define GetFileVersion `!insertmacro GetFileVersionCall`&lt;br /&gt;
!define un.GetFileVersion `!insertmacro GetFileVersionCall`&lt;br /&gt;
&lt;br /&gt;
!macro GetFileVersion&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro un.GetFileVersion&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetFileVersion_&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
	&lt;br /&gt;
	Exch $0&lt;br /&gt;
	Push $1&lt;br /&gt;
	Push $2&lt;br /&gt;
	Push $3&lt;br /&gt;
	Push $4&lt;br /&gt;
	Push $5&lt;br /&gt;
	Push $6&lt;br /&gt;
	ClearErrors&lt;br /&gt;
&lt;br /&gt;
	GetDllVersion &#039;$0&#039; $1 $2&lt;br /&gt;
	IfErrors FileFunc_GetFileVersion_error&lt;br /&gt;
	IntOp $3 $1 &amp;gt;&amp;gt; 16&lt;br /&gt;
	IntOp $3 $3 &amp;amp; 0x0000FFFF&lt;br /&gt;
	IntOp $4 $1 &amp;amp; 0x0000FFFF&lt;br /&gt;
	IntOp $5 $2 &amp;gt;&amp;gt; 16&lt;br /&gt;
	IntOp $5 $5 &amp;amp; 0x0000FFFF&lt;br /&gt;
	IntOp $6 $2 &amp;amp; 0x0000FFFF&lt;br /&gt;
	StrCpy $0 &#039;$3.$4.$5.$6&#039;&lt;br /&gt;
	goto FileFunc_GetFileVersion_end&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetFileVersion_error:&lt;br /&gt;
	SetErrors&lt;br /&gt;
	StrCpy $0 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetFileVersion_end:&lt;br /&gt;
	Pop $6&lt;br /&gt;
	Pop $5&lt;br /&gt;
	Pop $4&lt;br /&gt;
	Pop $3&lt;br /&gt;
	Pop $2&lt;br /&gt;
	Pop $1&lt;br /&gt;
	Exch $0&lt;br /&gt;
&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
; ---------------&lt;br /&gt;
; GetClusterSize&lt;br /&gt;
&lt;br /&gt;
!define GetClusterSize `!insertmacro GetClusterSizeCall`&lt;br /&gt;
!define un.GetClusterSize `!insertmacro GetClusterSizeCall`&lt;br /&gt;
&lt;br /&gt;
!macro GetClusterSize&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro un.GetClusterSize&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetClusterSize_&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
&lt;br /&gt;
	System::Call &#039;kernel32::GetDiskFreeSpace(i0,*i0r0,*i0r1,*i0r2,*i)&#039;&lt;br /&gt;
	IntOp $0 $0 * $1&lt;br /&gt;
	Push $0&lt;br /&gt;
&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&amp;lt;/highlight-nsis&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-size: 110%&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Credits:&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;em&amp;gt;GetFileAttributes&amp;lt;/em&amp;gt; is borrowed from &amp;lt;b&amp;gt;filefunc.nsh&amp;lt;/b&amp;gt;. &amp;lt;em&amp;gt;GetSizeOnDisk&amp;lt;/em&amp;gt; has been altered slightly and renamed. The original macro is called &amp;lt;em&amp;gt;GetSize&amp;lt;/em&amp;gt;. You will find it in the Users Manual under E.1.3.&lt;br /&gt;
[[Category:Code Examples]]&lt;/div&gt;</summary>
		<author><name>Bnicer</name></author>
	</entry>
	<entry>
		<id>https://nsis.sourceforge.io/mediawiki/index.php?title=Get_size_on_disk&amp;diff=22890</id>
		<title>Get size on disk</title>
		<link rel="alternate" type="text/html" href="https://nsis.sourceforge.io/mediawiki/index.php?title=Get_size_on_disk&amp;diff=22890"/>
		<updated>2013-02-12T09:39:00Z</updated>

		<summary type="html">&lt;p&gt;Bnicer: A Size On Disk (SOD) utilty which uses a macro to get the space used by directories and files&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;span style=&amp;quot;font-size: 130%&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Get Size On Disk&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This example code shows you how to get the space used by directories and files.&lt;br /&gt;
&amp;lt;highlight-nsis&amp;gt;&lt;br /&gt;
; A utility for computing the NSIS (or NSIS Unicode) install folder size and the size of&lt;br /&gt;
; the uninstaller&lt;br /&gt;
; nsissize.nsi&lt;br /&gt;
; Compile &amp;amp; run the .exe&lt;br /&gt;
&lt;br /&gt;
Name &amp;quot;SOD Tool&amp;quot;&lt;br /&gt;
RequestExecutionLevel user&lt;br /&gt;
!define LOCAL &amp;quot;&amp;quot; ; Path where local include files reside&lt;br /&gt;
OutFile &amp;quot;${LOCAL}nsissize.exe&amp;quot;&lt;br /&gt;
!include &amp;quot;${LOCAL}macros.nsh&amp;quot;&lt;br /&gt;
ReserveFile &amp;quot;${NSISDIR}\Plugins\Math.dll&amp;quot;&lt;br /&gt;
#Icon &amp;quot;${LOCAL}arrows.ico&amp;quot;&lt;br /&gt;
ShowInstDetails show&lt;br /&gt;
&lt;br /&gt;
; Variables&lt;br /&gt;
Var NSIS&lt;br /&gt;
Var ZIP&lt;br /&gt;
Var ZIP_UN&lt;br /&gt;
Var COUNT&lt;br /&gt;
Var BLOCK&lt;br /&gt;
Var FILES&lt;br /&gt;
Var FOLDERS&lt;br /&gt;
Var SIZE_B&lt;br /&gt;
Var SIZE_M&lt;br /&gt;
Var SOD_B&lt;br /&gt;
Var SOD_K&lt;br /&gt;
Var SOD_M&lt;br /&gt;
Var SIZE_UN_B&lt;br /&gt;
Var SIZE_UN_K&lt;br /&gt;
Var SOD_UN_B&lt;br /&gt;
Var SOD_UN_K&lt;br /&gt;
&lt;br /&gt;
Function Separator ; comma&lt;br /&gt;
  StrCpy $R2 $R1&lt;br /&gt;
  StrCpy $COUNT &amp;quot;16&amp;quot; ; 1,000,000,000,000,000 limit&lt;br /&gt;
  StrLen $R4 $R1&lt;br /&gt;
  loop:&lt;br /&gt;
  IntCmp $COUNT 3 endloop endloop 0&lt;br /&gt;
  IntCmp $R4 $COUNT 0 +7 0&lt;br /&gt;
  IntOp $COUNT $COUNT - 1&lt;br /&gt;
  StrCpy $R2 $R2 -$COUNT&lt;br /&gt;
  StrCpy $R3 $R1 &amp;quot;&amp;quot; -$COUNT&lt;br /&gt;
  StrCpy $R2 &amp;quot;$R2,$R3&amp;quot;&lt;br /&gt;
  IntOp $COUNT $COUNT - 2&lt;br /&gt;
  Goto loop&lt;br /&gt;
  IntOp $COUNT $COUNT - 3&lt;br /&gt;
  Goto loop&lt;br /&gt;
  endloop:&lt;br /&gt;
FunctionEnd&lt;br /&gt;
&lt;br /&gt;
Section&lt;br /&gt;
; root&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS Unicode&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS Unicode&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS ANSI&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS ANSI&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  Goto done&lt;br /&gt;
  begin:&lt;br /&gt;
  IfFileExists &amp;quot;$NSIS&amp;quot; 0 done&lt;br /&gt;
  ${GetFileAttributes} &amp;quot;$NSIS&amp;quot; &amp;quot;COMPRESSED&amp;quot; $ZIP&lt;br /&gt;
  ${GetClusterSize} $BLOCK&lt;br /&gt;
  ${GetSizeOnDisk} &amp;quot;$NSIS&amp;quot; &amp;quot;/S=0B&amp;quot; &amp;quot;&amp;quot; $0 $1 $2&lt;br /&gt;
  Math::Script &amp;quot;r3 = ff($0 / 1024 / 1024.0, 16 +2&amp;quot;&lt;br /&gt;
  StrCpy $SIZE_B $0&lt;br /&gt;
  StrCpy $FILES $1&lt;br /&gt;
  StrCpy $FOLDERS $2&lt;br /&gt;
  StrCpy $SIZE_M $3&lt;br /&gt;
  ${GetSizeOnDisk} &amp;quot;$NSIS&amp;quot; &amp;quot;/S=0B&amp;quot; &amp;quot;$BLOCK&amp;quot; $0 $1 $2&lt;br /&gt;
  Math::Script &amp;quot;r4 = ff($0 / 1024.0, 16 +0); r5 = ff(r4 / 1024.0, 16 +2)&amp;quot;&lt;br /&gt;
  StrCpy $SOD_B $0&lt;br /&gt;
  StrCpy $SOD_K $4&lt;br /&gt;
  StrCpy $SOD_M $5&lt;br /&gt;
; uninstaller&lt;br /&gt;
  IfFileExists &amp;quot;$NSIS\uninst-nsis.exe&amp;quot; 0 done&lt;br /&gt;
  ${GetFileAttributes} &amp;quot;$NSIS\uninst-nsis.exe&amp;quot; &amp;quot;COMPRESSED&amp;quot; $ZIP_UN&lt;br /&gt;
  ${GetSizeOnDisk} &amp;quot;$NSIS&amp;quot; &amp;quot;/M=uninst-nsis.exe /S=0B&amp;quot; &amp;quot;&amp;quot; $0 $1 $2&lt;br /&gt;
  Math::Script &amp;quot;r6 = ff($0 / 1024.0, 16 +1); \&lt;br /&gt;
  a = $0; b = $BLOCK; c = a % b; #[c == 0, c = $BLOCK]; r7 = (b - c + a); \&lt;br /&gt;
  r8 = ff(r7 / 1024.0, 16 +1)&amp;quot;&lt;br /&gt;
  StrCpy $SIZE_UN_B $0&lt;br /&gt;
  StrCpy $SIZE_UN_K $6&lt;br /&gt;
  StrCpy $SOD_UN_B $7&lt;br /&gt;
  StrCpy $SOD_UN_K $8&lt;br /&gt;
  ; format&lt;br /&gt;
  StrCpy $R1 $SIZE_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SIZE_B $R2&lt;br /&gt;
&lt;br /&gt;
  StrCpy $R1 $SOD_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SOD_B $R2&lt;br /&gt;
&lt;br /&gt;
  StrCpy $R1 $SOD_K&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SOD_K $R2&lt;br /&gt;
&lt;br /&gt;
  StrCpy $R1 $SIZE_UN_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SIZE_UN_B $R2&lt;br /&gt;
  StrCpy $R1 $SOD_UN_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SOD_UN_B $R2&lt;br /&gt;
; output&lt;br /&gt;
  ; note: with compression SOD lines are incorrect&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;$NSIS&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;Size: $SIZE_M MB ($SIZE_B bytes)&amp;quot;&lt;br /&gt;
  StrCmp $ZIP &amp;quot;1&amp;quot; +3&lt;br /&gt;
  StrCmp $ZIP_UN &amp;quot;1&amp;quot; +2&lt;br /&gt;
  DetailPrint &amp;quot;SOD: $SOD_M MB ($SOD_B bytes)&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;Uninstaller&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;Size: $SIZE_UN_K KB ($SIZE_UN_B bytes)&amp;quot;&lt;br /&gt;
  StrCmp $ZIP &amp;quot;1&amp;quot; +3&lt;br /&gt;
  StrCmp $ZIP_UN &amp;quot;1&amp;quot; +2&lt;br /&gt;
  DetailPrint &amp;quot;SOD: $SOD_UN_K KB ($SOD_UN_B bytes)&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;$FILES files $FOLDERS folders $SOD_K Kb&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  Goto completed&lt;br /&gt;
  done:&lt;br /&gt;
  DetailPrint &amp;quot;File not found.&amp;quot;&lt;br /&gt;
  completed:&lt;br /&gt;
SectionEnd&lt;br /&gt;
&lt;br /&gt;
;--------------------------------&lt;br /&gt;
# EOF&lt;br /&gt;
&amp;lt;/highlight-nsis&amp;gt;&lt;br /&gt;
You should copy the next code into a separate file: &amp;lt;b&amp;gt;macros.nsh&amp;lt;/b&amp;gt;.&lt;br /&gt;
&amp;lt;highlight-nsis&amp;gt;&lt;br /&gt;
; Macros include file&lt;br /&gt;
;--------------------------------&lt;br /&gt;
/*&lt;br /&gt;
&lt;br /&gt;
 FileFunction=[GetSizeOnDisk|GetClusterSize|GetFileAttributes]&lt;br /&gt;
&lt;br /&gt;
*/&lt;br /&gt;
;_____________________________________________________________________________&lt;br /&gt;
;&lt;br /&gt;
;                         Macros&lt;br /&gt;
;_____________________________________________________________________________&lt;br /&gt;
;&lt;br /&gt;
; Change log window verbosity (default: 3=no script)&lt;br /&gt;
;&lt;br /&gt;
; Example:&lt;br /&gt;
; !include &amp;quot;sizemacros.nsh&amp;quot;&lt;br /&gt;
; !insertmacro GetSizeOnDisk&lt;br /&gt;
; ${FILEFUNC_VERBOSE} 4   # all verbosity&lt;br /&gt;
; !insertmacro GetClusterSize&lt;br /&gt;
; ${FILEFUNC_VERBOSE} 3   # no script&lt;br /&gt;
&lt;br /&gt;
!include Util.nsh ; for &amp;quot;CallArtificialFunction&amp;quot;&lt;br /&gt;
&lt;br /&gt;
!verbose push&lt;br /&gt;
!verbose 3&lt;br /&gt;
!ifndef _FILEFUNC_VERBOSE&lt;br /&gt;
	!define _FILEFUNC_VERBOSE 3&lt;br /&gt;
!endif&lt;br /&gt;
!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
!define FILEFUNC_VERBOSE `!insertmacro FILEFUNC_VERBOSE`&lt;br /&gt;
!verbose pop&lt;br /&gt;
&lt;br /&gt;
!macro FILEFUNC_VERBOSE _VERBOSE&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose 3&lt;br /&gt;
	!undef _FILEFUNC_VERBOSE&lt;br /&gt;
	!define _FILEFUNC_VERBOSE ${_VERBOSE}&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetSizeOnDiskCall _PATH _OPTIONS _FILESYSTEM _RESULT1 _RESULT2 _RESULT3&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
	Push `${_PATH}`&lt;br /&gt;
	Push `${_OPTIONS}`&lt;br /&gt;
	Push `${_FILESYSTEM}` ; block size&lt;br /&gt;
	${CallArtificialFunction} GetSizeOnDisk_&lt;br /&gt;
	Pop ${_RESULT1}&lt;br /&gt;
	Pop ${_RESULT2}&lt;br /&gt;
	Pop ${_RESULT3}&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetClusterSizeCall _RESULT&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
	${CallArtificialFunction} GetClusterSize_&lt;br /&gt;
	Pop ${_RESULT}&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetFileAttributesCall _PATH _ATTR _RESULT&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
	Push `${_PATH}`&lt;br /&gt;
	Push `${_ATTR}`&lt;br /&gt;
	${CallArtificialFunction} GetFileAttributes_&lt;br /&gt;
	Pop ${_RESULT}&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
; ---------------&lt;br /&gt;
; GetSizeOnDisk (modified &amp;quot;GetSize&amp;quot; - FileFunc.nsh - KiCHiK - Function &amp;quot;FindFiles&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
!define GetSizeOnDisk `!insertmacro GetSizeOnDiskCall`&lt;br /&gt;
!define un.GetSizeOnDisk `!insertmacro GetSizeOnDiskCall`&lt;br /&gt;
&lt;br /&gt;
!macro GetSizeOnDisk&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro un.GetSizeOnDisk&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
; Usage: similar to &amp;quot;GetSize&amp;quot;&lt;br /&gt;
&lt;br /&gt;
; For documentation, see the NSIS user manual: E.1.3 GetSize&lt;br /&gt;
; Three values are returned&lt;br /&gt;
&lt;br /&gt;
; $var1		; Result1: Size/Size on disk&lt;br /&gt;
; $var2		; Result2: Sum of files&lt;br /&gt;
; $var3		; Result3: Sum of directories&lt;br /&gt;
&lt;br /&gt;
; Example: ${GetSizeOnDisk} &amp;quot;$INSTDIR&amp;quot; &amp;quot;/S=0K&amp;quot; &amp;quot;4096&amp;quot; $0 $1 $2&lt;br /&gt;
&lt;br /&gt;
; Specifying 4096 (logical size) toggles the result&lt;br /&gt;
; Output is size on disk, if used, or size in bytes, if left empty &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
!macro GetSizeOnDisk_&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
&lt;br /&gt;
	; replace&lt;br /&gt;
	Exch $R1&lt;br /&gt;
	Exch&lt;br /&gt;
	Exch $1&lt;br /&gt;
	Exch 2&lt;br /&gt;
	; end replace&lt;br /&gt;
	Exch $0&lt;br /&gt;
	Exch&lt;br /&gt;
	Push $2&lt;br /&gt;
	Push $3&lt;br /&gt;
	Push $4&lt;br /&gt;
	Push $5&lt;br /&gt;
	Push $6&lt;br /&gt;
	Push $7&lt;br /&gt;
	Push $8&lt;br /&gt;
	Push $9&lt;br /&gt;
	; insert code&lt;br /&gt;
	Push $R2&lt;br /&gt;
	; end insert&lt;br /&gt;
	Push $R3&lt;br /&gt;
	Push $R4&lt;br /&gt;
	Push $R5&lt;br /&gt;
	Push $R6&lt;br /&gt;
	Push $R7&lt;br /&gt;
	Push $R8&lt;br /&gt;
	Push $R9&lt;br /&gt;
	ClearErrors&lt;br /&gt;
&lt;br /&gt;
	StrCpy $R9 $0 1 -1&lt;br /&gt;
	StrCmp $R9 &#039;\&#039; 0 +3&lt;br /&gt;
	StrCpy $0 $0 -1&lt;br /&gt;
	goto -3&lt;br /&gt;
	IfFileExists &#039;$0\*.*&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
&lt;br /&gt;
	StrCpy $3 &#039;&#039;&lt;br /&gt;
	StrCpy $4 &#039;&#039;&lt;br /&gt;
	StrCpy $5 &#039;&#039;&lt;br /&gt;
	StrCpy $6 &#039;&#039;&lt;br /&gt;
	StrCpy $8 0&lt;br /&gt;
	StrCpy $R3 &#039;&#039;&lt;br /&gt;
	StrCpy $R4 &#039;&#039;&lt;br /&gt;
	StrCpy $R5 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_option:&lt;br /&gt;
	StrCpy $R9 $1 1&lt;br /&gt;
	StrCpy $1 $1 &#039;&#039; 1&lt;br /&gt;
	StrCmp $R9 &#039; &#039; -2&lt;br /&gt;
	StrCmp $R9 &#039;&#039; FileFunc_GetSize_sizeset&lt;br /&gt;
	StrCmp $R9 &#039;/&#039; 0 -4&lt;br /&gt;
&lt;br /&gt;
	StrCpy $9 -1&lt;br /&gt;
	IntOp $9 $9 + 1&lt;br /&gt;
	StrCpy $R9 $1 1 $9&lt;br /&gt;
	StrCmp $R9 &#039;&#039; +2&lt;br /&gt;
	StrCmp $R9 &#039;/&#039; 0 -3&lt;br /&gt;
	StrCpy $8 $1 $9&lt;br /&gt;
	StrCpy $8 $8 &#039;&#039; 2&lt;br /&gt;
	StrCpy $R9 $8 &#039;&#039; -1&lt;br /&gt;
	StrCmp $R9 &#039; &#039; 0 +3&lt;br /&gt;
	StrCpy $8 $8 -1&lt;br /&gt;
	goto -3&lt;br /&gt;
	StrCpy $R9 $1 2&lt;br /&gt;
	StrCpy $1 $1 &#039;&#039; $9&lt;br /&gt;
&lt;br /&gt;
	StrCmp $R9 &#039;M=&#039; 0 FileFunc_GetSize_size&lt;br /&gt;
	StrCpy $4 $8&lt;br /&gt;
	goto FileFunc_GetSize_option&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_size:&lt;br /&gt;
	StrCmp $R9 &#039;S=&#039; 0 FileFunc_GetSize_gotosubdir&lt;br /&gt;
	StrCpy $6 $8&lt;br /&gt;
	goto FileFunc_GetSize_option&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_gotosubdir:&lt;br /&gt;
	StrCmp $R9 &#039;G=&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
	StrCpy $7 $8&lt;br /&gt;
	StrCmp $7 &#039;&#039; +3&lt;br /&gt;
	StrCmp $7 &#039;1&#039; +2&lt;br /&gt;
	StrCmp $7 &#039;0&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
	goto FileFunc_GetSize_option&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_sizeset:&lt;br /&gt;
	StrCmp $6 &#039;&#039; FileFunc_GetSize_default&lt;br /&gt;
	StrCpy $9 0&lt;br /&gt;
	StrCpy $R9 $6 1 $9&lt;br /&gt;
	StrCmp $R9 &#039;&#039; +4&lt;br /&gt;
	StrCmp $R9 &#039;:&#039; +3&lt;br /&gt;
	IntOp $9 $9 + 1&lt;br /&gt;
	goto -4&lt;br /&gt;
	StrCpy $5 $6 $9&lt;br /&gt;
	IntOp $9 $9 + 1&lt;br /&gt;
	StrCpy $1 $6 1 -1&lt;br /&gt;
	StrCpy $6 $6 -1 $9&lt;br /&gt;
	StrCmp $5 &#039;&#039; +2&lt;br /&gt;
	IntOp $5 $5 + 0&lt;br /&gt;
	StrCmp $6 &#039;&#039; +2&lt;br /&gt;
	IntOp $6 $6 + 0&lt;br /&gt;
&lt;br /&gt;
	StrCmp $1 &#039;B&#039; 0 +4&lt;br /&gt;
	StrCpy $1 1&lt;br /&gt;
	StrCpy $2 bytes&lt;br /&gt;
	goto FileFunc_GetSize_default&lt;br /&gt;
	StrCmp $1 &#039;K&#039; 0 +4&lt;br /&gt;
	StrCpy $1 1024&lt;br /&gt;
	StrCpy $2 Kb&lt;br /&gt;
	goto FileFunc_GetSize_default&lt;br /&gt;
	StrCmp $1 &#039;M&#039; 0 +4&lt;br /&gt;
	StrCpy $1 1048576&lt;br /&gt;
	StrCpy $2 Mb&lt;br /&gt;
	goto FileFunc_GetSize_default&lt;br /&gt;
	StrCmp $1 &#039;G&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
	StrCpy $1 1073741824&lt;br /&gt;
	StrCpy $2 Gb&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_default:&lt;br /&gt;
	StrCmp $4 &#039;&#039; 0 +2&lt;br /&gt;
	StrCpy $4 &#039;*.*&#039;&lt;br /&gt;
	StrCmp $7 &#039;&#039; 0 +2&lt;br /&gt;
	StrCpy $7 &#039;1&#039;&lt;br /&gt;
&lt;br /&gt;
	StrCpy $8 1&lt;br /&gt;
	Push $0&lt;br /&gt;
	SetDetailsPrint textonly&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_nextdir:&lt;br /&gt;
	IntOp $8 $8 - 1&lt;br /&gt;
	Pop $R8&lt;br /&gt;
	FindFirst $0 $R7 &#039;$R8\$4&#039;&lt;br /&gt;
	IfErrors FileFunc_GetSize_show&lt;br /&gt;
	StrCmp $R7 &#039;.&#039; 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	StrCmp $R7 &#039;..&#039; 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
	goto FileFunc_GetSize_show&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_dir:&lt;br /&gt;
	IfFileExists &#039;$R8\$R7\*.*&#039; 0 FileFunc_GetSize_file&lt;br /&gt;
	IntOp $R5 $R5 + 1&lt;br /&gt;
	goto FileFunc_GetSize_findnext&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_file:&lt;br /&gt;
	StrCpy $R6 0&lt;br /&gt;
	StrCmp $5$6 &#039;&#039; 0 +3&lt;br /&gt;
	IntOp $R4 $R4 + 1&lt;br /&gt;
	goto FileFunc_GetSize_findnext&lt;br /&gt;
	FileOpen $9 &#039;$R8\$R7&#039; r&lt;br /&gt;
	IfErrors +3&lt;br /&gt;
	FileSeek $9 0 END $R6&lt;br /&gt;
	FileClose $9&lt;br /&gt;
	StrCmp $5 &#039;&#039; +2&lt;br /&gt;
	IntCmp $R6 $5 0 FileFunc_GetSize_findnext&lt;br /&gt;
	StrCmp $6 &#039;&#039; +2&lt;br /&gt;
	IntCmp $R6 $6 0 0 FileFunc_GetSize_findnext&lt;br /&gt;
	IntOp $R4 $R4 + 1&lt;br /&gt;
	; insert code&lt;br /&gt;
	StrCmp $R1 &amp;quot;&amp;quot; +10 0&lt;br /&gt;
	StrCpy $R0 $R1&lt;br /&gt;
	IntOp $R6 $R6 + $R0&lt;br /&gt;
	IntOp $R1 $R6 % $R0&lt;br /&gt;
	StrCmp $R1 0 0 +2&lt;br /&gt;
	StrCpy $R1 $R0&lt;br /&gt;
	IntOp $R2 $R0 - $R1&lt;br /&gt;
	IntOp $R6 $R6 - $R0&lt;br /&gt;
	IntOp $R6 $R6 + $R2&lt;br /&gt;
	StrCpy $R1 $R0&lt;br /&gt;
	; end insert&lt;br /&gt;
	System::Int64Op $R3 + $R6&lt;br /&gt;
	Pop $R3&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_findnext:&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_show:&lt;br /&gt;
	StrCmp $5$6 &#039;&#039; FileFunc_GetSize_nosize&lt;br /&gt;
	System::Int64Op $R3 / $1&lt;br /&gt;
	Pop $9&lt;br /&gt;
	DetailPrint &#039;Size:$9 $2  Files:$R4  Folders:$R5&#039;&lt;br /&gt;
	goto FileFunc_GetSize_subdir&lt;br /&gt;
	FileFunc_GetSize_nosize:&lt;br /&gt;
	DetailPrint &#039;Files:$R4  Folders:$R5&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_subdir:&lt;br /&gt;
	StrCmp $7 0 FileFunc_GetSize_preend&lt;br /&gt;
	FindFirst $0 $R7 &#039;$R8\*.*&#039;&lt;br /&gt;
	StrCmp $R7 &#039;.&#039; 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	StrCmp $R7 &#039;..&#039; 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
	StrCmp $8 0 FileFunc_GetSize_preend FileFunc_GetSize_nextdir&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_pushdir:&lt;br /&gt;
	IfFileExists &#039;$R8\$R7\*.*&#039; 0 +3&lt;br /&gt;
	Push &#039;$R8\$R7&#039;&lt;br /&gt;
	IntOp $8 $8 + 1&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
	StrCmp $8 0 FileFunc_GetSize_preend FileFunc_GetSize_nextdir&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_preend:&lt;br /&gt;
	StrCmp $R3 &#039;&#039; FileFunc_GetSize_nosizeend&lt;br /&gt;
	System::Int64Op $R3 / $1&lt;br /&gt;
	Pop $R3&lt;br /&gt;
	FileFunc_GetSize_nosizeend:&lt;br /&gt;
	StrCpy $2 $R4&lt;br /&gt;
	StrCpy $1 $R5&lt;br /&gt;
	StrCpy $0 $R3&lt;br /&gt;
	goto FileFunc_GetSize_end&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_error:&lt;br /&gt;
	SetErrors&lt;br /&gt;
	StrCpy $0 &#039;&#039;&lt;br /&gt;
	StrCpy $1 &#039;&#039;&lt;br /&gt;
	StrCpy $2 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_end:&lt;br /&gt;
	SetDetailsPrint both&lt;br /&gt;
	Pop $R9&lt;br /&gt;
	Pop $R8&lt;br /&gt;
	Pop $R7&lt;br /&gt;
	Pop $R6&lt;br /&gt;
	Pop $R5&lt;br /&gt;
	Pop $R4&lt;br /&gt;
	Pop $R3&lt;br /&gt;
	; insert code&lt;br /&gt;
	Pop $R2&lt;br /&gt;
	; end insert&lt;br /&gt;
	Pop $9&lt;br /&gt;
	Pop $8&lt;br /&gt;
	Pop $7&lt;br /&gt;
	Pop $6&lt;br /&gt;
	Pop $5&lt;br /&gt;
	Pop $4&lt;br /&gt;
	Pop $3&lt;br /&gt;
	Exch $2&lt;br /&gt;
	Exch&lt;br /&gt;
	Exch $1&lt;br /&gt;
	Exch 2&lt;br /&gt;
	Exch $0&lt;br /&gt;
&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
; ---------------&lt;br /&gt;
; GetFileAttributes (FileFunc.nsh)&lt;br /&gt;
&lt;br /&gt;
!define GetFileAttributes `!insertmacro GetFileAttributesCall`&lt;br /&gt;
!define un.GetFileAttributes `!insertmacro GetFileAttributesCall`&lt;br /&gt;
&lt;br /&gt;
!macro GetFileAttributes&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro un.GetFileAttributes&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetFileAttributes_&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
	&lt;br /&gt;
	Exch $1&lt;br /&gt;
	Exch&lt;br /&gt;
	Exch $0&lt;br /&gt;
	Exch&lt;br /&gt;
	Push $2&lt;br /&gt;
	Push $3&lt;br /&gt;
	Push $4&lt;br /&gt;
	Push $5&lt;br /&gt;
&lt;br /&gt;
	System::Call &#039;kernel32::GetFileAttributes(t r0)i .r2&#039;&lt;br /&gt;
	StrCmp $2 -1 FileFunc_GetFileAttributes_error&lt;br /&gt;
	StrCpy $3 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x4000&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;ENCRYPTED|&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x2000&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;NOT_CONTENT_INDEXED|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x1000&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;OFFLINE|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0800&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;COMPRESSED|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0400&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;REPARSE_POINT|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0200&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;SPARSE_FILE|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0100&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;TEMPORARY|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0080&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;NORMAL|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0040&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;DEVICE|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0020&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;ARCHIVE|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0010&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;DIRECTORY|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0004&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;SYSTEM|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0002&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;HIDDEN|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0001&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;READONLY|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	StrCpy $0 $3 -1&lt;br /&gt;
	StrCmp $1 &#039;&#039; FileFunc_GetFileAttributes_end&lt;br /&gt;
	StrCmp $1 &#039;ALL&#039; FileFunc_GetFileAttributes_end&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetFileAttributes_attrcmp:&lt;br /&gt;
	StrCpy $5 0&lt;br /&gt;
	IntOp $5 $5 + 1&lt;br /&gt;
	StrCpy $4 $1 1 $5&lt;br /&gt;
	StrCmp $4 &#039;&#039; +2&lt;br /&gt;
	StrCmp $4 &#039;|&#039;  0 -3&lt;br /&gt;
	StrCpy $2 $1 $5&lt;br /&gt;
	IntOp $5 $5 + 1&lt;br /&gt;
	StrCpy $1 $1 &#039;&#039; $5&lt;br /&gt;
	StrLen $3 $2&lt;br /&gt;
	StrCpy $5 -1&lt;br /&gt;
	IntOp $5 $5 + 1&lt;br /&gt;
	StrCpy $4 $0 $3 $5&lt;br /&gt;
	StrCmp $4 &#039;&#039; FileFunc_GetFileAttributes_notfound&lt;br /&gt;
	StrCmp $4 $2 0 -3&lt;br /&gt;
	StrCmp $1 &#039;&#039; 0 FileFunc_GetFileAttributes_attrcmp&lt;br /&gt;
	StrCpy $0 1&lt;br /&gt;
	goto FileFunc_GetFileAttributes_end&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetFileAttributes_notfound:&lt;br /&gt;
	StrCpy $0 0&lt;br /&gt;
	goto FileFunc_GetFileAttributes_end&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetFileAttributes_error:&lt;br /&gt;
	SetErrors&lt;br /&gt;
	StrCpy $0 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetFileAttributes_end:&lt;br /&gt;
	Pop $5&lt;br /&gt;
	Pop $4&lt;br /&gt;
	Pop $3&lt;br /&gt;
	Pop $2&lt;br /&gt;
	Pop $1&lt;br /&gt;
	Exch $0&lt;br /&gt;
		&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!define GetFileVersion `!insertmacro GetFileVersionCall`&lt;br /&gt;
!define un.GetFileVersion `!insertmacro GetFileVersionCall`&lt;br /&gt;
&lt;br /&gt;
!macro GetFileVersion&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro un.GetFileVersion&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetFileVersion_&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
	&lt;br /&gt;
	Exch $0&lt;br /&gt;
	Push $1&lt;br /&gt;
	Push $2&lt;br /&gt;
	Push $3&lt;br /&gt;
	Push $4&lt;br /&gt;
	Push $5&lt;br /&gt;
	Push $6&lt;br /&gt;
	ClearErrors&lt;br /&gt;
&lt;br /&gt;
	GetDllVersion &#039;$0&#039; $1 $2&lt;br /&gt;
	IfErrors FileFunc_GetFileVersion_error&lt;br /&gt;
	IntOp $3 $1 &amp;gt;&amp;gt; 16&lt;br /&gt;
	IntOp $3 $3 &amp;amp; 0x0000FFFF&lt;br /&gt;
	IntOp $4 $1 &amp;amp; 0x0000FFFF&lt;br /&gt;
	IntOp $5 $2 &amp;gt;&amp;gt; 16&lt;br /&gt;
	IntOp $5 $5 &amp;amp; 0x0000FFFF&lt;br /&gt;
	IntOp $6 $2 &amp;amp; 0x0000FFFF&lt;br /&gt;
	StrCpy $0 &#039;$3.$4.$5.$6&#039;&lt;br /&gt;
	goto FileFunc_GetFileVersion_end&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetFileVersion_error:&lt;br /&gt;
	SetErrors&lt;br /&gt;
	StrCpy $0 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetFileVersion_end:&lt;br /&gt;
	Pop $6&lt;br /&gt;
	Pop $5&lt;br /&gt;
	Pop $4&lt;br /&gt;
	Pop $3&lt;br /&gt;
	Pop $2&lt;br /&gt;
	Pop $1&lt;br /&gt;
	Exch $0&lt;br /&gt;
&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
; ---------------&lt;br /&gt;
; GetClusterSize&lt;br /&gt;
&lt;br /&gt;
!define GetClusterSize `!insertmacro GetClusterSizeCall`&lt;br /&gt;
!define un.GetClusterSize `!insertmacro GetClusterSizeCall`&lt;br /&gt;
&lt;br /&gt;
!macro GetClusterSize&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro un.GetClusterSize&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetClusterSize_&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
&lt;br /&gt;
	System::Call &#039;kernel32::GetDiskFreeSpace(i0,*i0r0,*i0r1,*i0r2,*i)&#039;&lt;br /&gt;
	IntOp $0 $0 * $1&lt;br /&gt;
	Push $0&lt;br /&gt;
&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&amp;lt;/highlight-nsis&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-size: 110%&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Credits:&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;em&amp;gt;GetFileAttributes&amp;lt;/em&amp;gt; is borrowed from &amp;lt;b&amp;gt;filefunc.nsh&amp;lt;/b&amp;gt;. &amp;lt;em&amp;gt;GetSizeOnDisk&amp;lt;/em&amp;gt; has been altered slightly and renamed. The original macro is called &amp;lt;em&amp;gt;GetSize&amp;lt;/em&amp;gt;. You will find it in the Users Manual under E.1.3.&lt;br /&gt;
[[Category:Code Examples]]&lt;/div&gt;</summary>
		<author><name>Bnicer</name></author>
	</entry>
	<entry>
		<id>https://nsis.sourceforge.io/mediawiki/index.php?title=User:Bnicer&amp;diff=22887</id>
		<title>User:Bnicer</title>
		<link rel="alternate" type="text/html" href="https://nsis.sourceforge.io/mediawiki/index.php?title=User:Bnicer&amp;diff=22887"/>
		<updated>2013-02-08T14:30:44Z</updated>

		<summary type="html">&lt;p&gt;Bnicer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;span style=&amp;quot;font-size: 130%&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Get Size On Disk&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This example code shows you how to get the space used by directories and files.&lt;br /&gt;
&amp;lt;highlight-nsis&amp;gt;&lt;br /&gt;
; A utility for computing the NSIS (or NSIS Unicode) install folder size and the size of&lt;br /&gt;
; the uninstaller&lt;br /&gt;
; nsissize.nsi&lt;br /&gt;
; Compile &amp;amp; run the .exe&lt;br /&gt;
&lt;br /&gt;
Name &amp;quot;SOD Tool&amp;quot;&lt;br /&gt;
RequestExecutionLevel user&lt;br /&gt;
!define LOCAL &amp;quot;&amp;quot; ; Path where local include files reside&lt;br /&gt;
OutFile &amp;quot;${LOCAL}nsissize.exe&amp;quot;&lt;br /&gt;
!include &amp;quot;${LOCAL}macros.nsh&amp;quot;&lt;br /&gt;
ReserveFile &amp;quot;${NSISDIR}\Plugins\Math.dll&amp;quot;&lt;br /&gt;
#Icon &amp;quot;${LOCAL}arrows.ico&amp;quot;&lt;br /&gt;
ShowInstDetails show&lt;br /&gt;
&lt;br /&gt;
; Variables&lt;br /&gt;
Var NSIS&lt;br /&gt;
Var ZIP&lt;br /&gt;
Var ZIP_UN&lt;br /&gt;
Var COUNT&lt;br /&gt;
Var BLOCK&lt;br /&gt;
Var FILES&lt;br /&gt;
Var FOLDERS&lt;br /&gt;
Var SIZE_B&lt;br /&gt;
Var SIZE_M&lt;br /&gt;
Var SOD_B&lt;br /&gt;
Var SOD_K&lt;br /&gt;
Var SOD_M&lt;br /&gt;
Var SIZE_UN_B&lt;br /&gt;
Var SIZE_UN_K&lt;br /&gt;
Var SOD_UN_B&lt;br /&gt;
Var SOD_UN_K&lt;br /&gt;
&lt;br /&gt;
Function Separator ; comma&lt;br /&gt;
  StrCpy $R2 $R1&lt;br /&gt;
  StrCpy $COUNT &amp;quot;16&amp;quot; ; 1,000,000,000,000,000 limit&lt;br /&gt;
  StrLen $R4 $R1&lt;br /&gt;
  loop:&lt;br /&gt;
  IntCmp $COUNT 3 endloop endloop 0&lt;br /&gt;
  IntCmp $R4 $COUNT 0 +7 0&lt;br /&gt;
  IntOp $COUNT $COUNT - 1&lt;br /&gt;
  StrCpy $R2 $R2 -$COUNT&lt;br /&gt;
  StrCpy $R3 $R1 &amp;quot;&amp;quot; -$COUNT&lt;br /&gt;
  StrCpy $R2 &amp;quot;$R2,$R3&amp;quot;&lt;br /&gt;
  IntOp $COUNT $COUNT - 2&lt;br /&gt;
  Goto loop&lt;br /&gt;
  IntOp $COUNT $COUNT - 3&lt;br /&gt;
  Goto loop&lt;br /&gt;
  endloop:&lt;br /&gt;
FunctionEnd&lt;br /&gt;
&lt;br /&gt;
Section&lt;br /&gt;
; root&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS Unicode&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS Unicode&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS ANSI&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS ANSI&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  Goto done&lt;br /&gt;
  begin:&lt;br /&gt;
  IfFileExists &amp;quot;$NSIS&amp;quot; 0 done&lt;br /&gt;
  ${GetFileAttributes} &amp;quot;$NSIS&amp;quot; &amp;quot;COMPRESSED&amp;quot; $ZIP&lt;br /&gt;
  ${GetClusterSize} $BLOCK&lt;br /&gt;
  ${GetSizeOnDisk} &amp;quot;$NSIS&amp;quot; &amp;quot;/S=0B&amp;quot; &amp;quot;&amp;quot; $0 $1 $2&lt;br /&gt;
  Math::Script &amp;quot;r3 = ff($0 / 1024 / 1024.0, 16 +2&amp;quot;&lt;br /&gt;
  StrCpy $SIZE_B $0&lt;br /&gt;
  StrCpy $FILES $1&lt;br /&gt;
  StrCpy $FOLDERS $2&lt;br /&gt;
  StrCpy $SIZE_M $3&lt;br /&gt;
  ${GetSizeOnDisk} &amp;quot;$NSIS&amp;quot; &amp;quot;/S=0B&amp;quot; &amp;quot;$BLOCK&amp;quot; $0 $1 $2&lt;br /&gt;
  Math::Script &amp;quot;r4 = ff($0 / 1024.0, 16 +0); r5 = ff(r4 / 1024.0, 16 +2)&amp;quot;&lt;br /&gt;
  StrCpy $SOD_B $0&lt;br /&gt;
  StrCpy $SOD_K $4&lt;br /&gt;
  StrCpy $SOD_M $5&lt;br /&gt;
; uninstaller&lt;br /&gt;
  IfFileExists &amp;quot;$NSIS\uninst-nsis.exe&amp;quot; 0 done&lt;br /&gt;
  ${GetFileAttributes} &amp;quot;$NSIS\uninst-nsis.exe&amp;quot; &amp;quot;COMPRESSED&amp;quot; $ZIP_UN&lt;br /&gt;
  ${GetSizeOnDisk} &amp;quot;$NSIS&amp;quot; &amp;quot;/M=uninst-nsis.exe /S=0B&amp;quot; &amp;quot;&amp;quot; $0 $1 $2&lt;br /&gt;
  Math::Script &amp;quot;r6 = ff($0 / 1024.0, 16 +1); \&lt;br /&gt;
  a = $0; b = $BLOCK; c = a % b; #[c == 0, c = $BLOCK]; r7 = (b - c + a); \&lt;br /&gt;
  r8 = ff(r7 / 1024.0, 16 +1)&amp;quot;&lt;br /&gt;
  StrCpy $SIZE_UN_B $0&lt;br /&gt;
  StrCpy $SIZE_UN_K $6&lt;br /&gt;
  StrCpy $SOD_UN_B $7&lt;br /&gt;
  StrCpy $SOD_UN_K $8&lt;br /&gt;
  ; format&lt;br /&gt;
  StrCpy $R1 $SIZE_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SIZE_B $R2&lt;br /&gt;
&lt;br /&gt;
  StrCpy $R1 $SOD_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SOD_B $R2&lt;br /&gt;
&lt;br /&gt;
  StrCpy $R1 $SOD_K&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SOD_K $R2&lt;br /&gt;
&lt;br /&gt;
  StrCpy $R1 $SIZE_UN_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SIZE_UN_B $R2&lt;br /&gt;
  StrCpy $R1 $SOD_UN_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SOD_UN_B $R2&lt;br /&gt;
; output&lt;br /&gt;
  ; note: with compression SOD lines are incorrect&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;$NSIS&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;Size: $SIZE_M MB ($SIZE_B bytes)&amp;quot;&lt;br /&gt;
  StrCmp $ZIP &amp;quot;1&amp;quot; +3&lt;br /&gt;
  StrCmp $ZIP_UN &amp;quot;1&amp;quot; +2&lt;br /&gt;
  DetailPrint &amp;quot;SOD: $SOD_M MB ($SOD_B bytes)&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;Uninstaller&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;Size: $SIZE_UN_K KB ($SIZE_UN_B bytes)&amp;quot;&lt;br /&gt;
  StrCmp $ZIP &amp;quot;1&amp;quot; +3&lt;br /&gt;
  StrCmp $ZIP_UN &amp;quot;1&amp;quot; +2&lt;br /&gt;
  DetailPrint &amp;quot;SOD: $SOD_UN_K KB ($SOD_UN_B bytes)&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;$FILES files $FOLDERS folders $SOD_K Kb&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  Goto completed&lt;br /&gt;
  done:&lt;br /&gt;
  DetailPrint &amp;quot;File not found.&amp;quot;&lt;br /&gt;
  completed:&lt;br /&gt;
SectionEnd&lt;br /&gt;
&lt;br /&gt;
;--------------------------------&lt;br /&gt;
# EOF&lt;br /&gt;
&amp;lt;/highlight-nsis&amp;gt;&lt;br /&gt;
You should copy the next code into a separate file: &amp;lt;b&amp;gt;macros.nsh&amp;lt;/b&amp;gt;.&lt;br /&gt;
&amp;lt;highlight-nsis&amp;gt;&lt;br /&gt;
; Macros include file&lt;br /&gt;
;--------------------------------&lt;br /&gt;
/*&lt;br /&gt;
&lt;br /&gt;
 FileFunction=[GetSizeOnDisk|GetClusterSize|GetFileAttributes]&lt;br /&gt;
&lt;br /&gt;
*/&lt;br /&gt;
;_____________________________________________________________________________&lt;br /&gt;
;&lt;br /&gt;
;                         Macros&lt;br /&gt;
;_____________________________________________________________________________&lt;br /&gt;
;&lt;br /&gt;
; Change log window verbosity (default: 3=no script)&lt;br /&gt;
;&lt;br /&gt;
; Example:&lt;br /&gt;
; !include &amp;quot;sizemacros.nsh&amp;quot;&lt;br /&gt;
; !insertmacro GetSizeOnDisk&lt;br /&gt;
; ${FILEFUNC_VERBOSE} 4   # all verbosity&lt;br /&gt;
; !insertmacro GetClusterSize&lt;br /&gt;
; ${FILEFUNC_VERBOSE} 3   # no script&lt;br /&gt;
&lt;br /&gt;
!include Util.nsh ; for &amp;quot;CallArtificialFunction&amp;quot;&lt;br /&gt;
&lt;br /&gt;
!verbose push&lt;br /&gt;
!verbose 3&lt;br /&gt;
!ifndef _FILEFUNC_VERBOSE&lt;br /&gt;
	!define _FILEFUNC_VERBOSE 3&lt;br /&gt;
!endif&lt;br /&gt;
!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
!define FILEFUNC_VERBOSE `!insertmacro FILEFUNC_VERBOSE`&lt;br /&gt;
!verbose pop&lt;br /&gt;
&lt;br /&gt;
!macro FILEFUNC_VERBOSE _VERBOSE&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose 3&lt;br /&gt;
	!undef _FILEFUNC_VERBOSE&lt;br /&gt;
	!define _FILEFUNC_VERBOSE ${_VERBOSE}&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetSizeOnDiskCall _PATH _OPTIONS _FILESYSTEM _RESULT1 _RESULT2 _RESULT3&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
	Push `${_PATH}`&lt;br /&gt;
	Push `${_OPTIONS}`&lt;br /&gt;
	Push `${_FILESYSTEM}` ; block size&lt;br /&gt;
	${CallArtificialFunction} GetSizeOnDisk_&lt;br /&gt;
	Pop ${_RESULT1}&lt;br /&gt;
	Pop ${_RESULT2}&lt;br /&gt;
	Pop ${_RESULT3}&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetClusterSizeCall _RESULT&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
	${CallArtificialFunction} GetClusterSize_&lt;br /&gt;
	Pop ${_RESULT}&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetFileAttributesCall _PATH _ATTR _RESULT&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
	Push `${_PATH}`&lt;br /&gt;
	Push `${_ATTR}`&lt;br /&gt;
	${CallArtificialFunction} GetFileAttributes_&lt;br /&gt;
	Pop ${_RESULT}&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
; ---------------&lt;br /&gt;
; GetSizeOnDisk (modified &amp;quot;GetSize&amp;quot; - FileFunc.nsh - KiCHiK - Function &amp;quot;FindFiles&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
!define GetSizeOnDisk `!insertmacro GetSizeOnDiskCall`&lt;br /&gt;
!define un.GetSizeOnDisk `!insertmacro GetSizeOnDiskCall`&lt;br /&gt;
&lt;br /&gt;
!macro GetSizeOnDisk&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro un.GetSizeOnDisk&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
; Usage: similar to &amp;quot;GetSize&amp;quot;&lt;br /&gt;
&lt;br /&gt;
; For documentation, see the NSIS user manual: E.1.3 GetSize&lt;br /&gt;
; Three values are returned&lt;br /&gt;
&lt;br /&gt;
; $var1		; Result1: Size/Size on disk&lt;br /&gt;
; $var2		; Result2: Sum of files&lt;br /&gt;
; $var3		; Result3: Sum of directories&lt;br /&gt;
&lt;br /&gt;
; Example: ${GetSizeOnDisk} &amp;quot;$INSTDIR&amp;quot; &amp;quot;/S=0K&amp;quot; &amp;quot;4096&amp;quot; $0 $1 $2&lt;br /&gt;
&lt;br /&gt;
; Specifying 4096 (logical size) toggles the result&lt;br /&gt;
; Output is size on disk, if used, or size in bytes, if left empty &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
!macro GetSizeOnDisk_&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
&lt;br /&gt;
	; replace&lt;br /&gt;
	Exch $R1&lt;br /&gt;
	Exch&lt;br /&gt;
	Exch $1&lt;br /&gt;
	Exch 2&lt;br /&gt;
	; end replace&lt;br /&gt;
	Exch $0&lt;br /&gt;
	Exch&lt;br /&gt;
	Push $2&lt;br /&gt;
	Push $3&lt;br /&gt;
	Push $4&lt;br /&gt;
	Push $5&lt;br /&gt;
	Push $6&lt;br /&gt;
	Push $7&lt;br /&gt;
	Push $8&lt;br /&gt;
	Push $9&lt;br /&gt;
	; insert code&lt;br /&gt;
	Push $R2&lt;br /&gt;
	; end insert&lt;br /&gt;
	Push $R3&lt;br /&gt;
	Push $R4&lt;br /&gt;
	Push $R5&lt;br /&gt;
	Push $R6&lt;br /&gt;
	Push $R7&lt;br /&gt;
	Push $R8&lt;br /&gt;
	Push $R9&lt;br /&gt;
	ClearErrors&lt;br /&gt;
&lt;br /&gt;
	StrCpy $R9 $0 1 -1&lt;br /&gt;
	StrCmp $R9 &#039;\&#039; 0 +3&lt;br /&gt;
	StrCpy $0 $0 -1&lt;br /&gt;
	goto -3&lt;br /&gt;
	IfFileExists &#039;$0\*.*&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
&lt;br /&gt;
	StrCpy $3 &#039;&#039;&lt;br /&gt;
	StrCpy $4 &#039;&#039;&lt;br /&gt;
	StrCpy $5 &#039;&#039;&lt;br /&gt;
	StrCpy $6 &#039;&#039;&lt;br /&gt;
	StrCpy $8 0&lt;br /&gt;
	StrCpy $R3 &#039;&#039;&lt;br /&gt;
	StrCpy $R4 &#039;&#039;&lt;br /&gt;
	StrCpy $R5 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_option:&lt;br /&gt;
	StrCpy $R9 $1 1&lt;br /&gt;
	StrCpy $1 $1 &#039;&#039; 1&lt;br /&gt;
	StrCmp $R9 &#039; &#039; -2&lt;br /&gt;
	StrCmp $R9 &#039;&#039; FileFunc_GetSize_sizeset&lt;br /&gt;
	StrCmp $R9 &#039;/&#039; 0 -4&lt;br /&gt;
&lt;br /&gt;
	StrCpy $9 -1&lt;br /&gt;
	IntOp $9 $9 + 1&lt;br /&gt;
	StrCpy $R9 $1 1 $9&lt;br /&gt;
	StrCmp $R9 &#039;&#039; +2&lt;br /&gt;
	StrCmp $R9 &#039;/&#039; 0 -3&lt;br /&gt;
	StrCpy $8 $1 $9&lt;br /&gt;
	StrCpy $8 $8 &#039;&#039; 2&lt;br /&gt;
	StrCpy $R9 $8 &#039;&#039; -1&lt;br /&gt;
	StrCmp $R9 &#039; &#039; 0 +3&lt;br /&gt;
	StrCpy $8 $8 -1&lt;br /&gt;
	goto -3&lt;br /&gt;
	StrCpy $R9 $1 2&lt;br /&gt;
	StrCpy $1 $1 &#039;&#039; $9&lt;br /&gt;
&lt;br /&gt;
	StrCmp $R9 &#039;M=&#039; 0 FileFunc_GetSize_size&lt;br /&gt;
	StrCpy $4 $8&lt;br /&gt;
	goto FileFunc_GetSize_option&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_size:&lt;br /&gt;
	StrCmp $R9 &#039;S=&#039; 0 FileFunc_GetSize_gotosubdir&lt;br /&gt;
	StrCpy $6 $8&lt;br /&gt;
	goto FileFunc_GetSize_option&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_gotosubdir:&lt;br /&gt;
	StrCmp $R9 &#039;G=&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
	StrCpy $7 $8&lt;br /&gt;
	StrCmp $7 &#039;&#039; +3&lt;br /&gt;
	StrCmp $7 &#039;1&#039; +2&lt;br /&gt;
	StrCmp $7 &#039;0&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
	goto FileFunc_GetSize_option&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_sizeset:&lt;br /&gt;
	StrCmp $6 &#039;&#039; FileFunc_GetSize_default&lt;br /&gt;
	StrCpy $9 0&lt;br /&gt;
	StrCpy $R9 $6 1 $9&lt;br /&gt;
	StrCmp $R9 &#039;&#039; +4&lt;br /&gt;
	StrCmp $R9 &#039;:&#039; +3&lt;br /&gt;
	IntOp $9 $9 + 1&lt;br /&gt;
	goto -4&lt;br /&gt;
	StrCpy $5 $6 $9&lt;br /&gt;
	IntOp $9 $9 + 1&lt;br /&gt;
	StrCpy $1 $6 1 -1&lt;br /&gt;
	StrCpy $6 $6 -1 $9&lt;br /&gt;
	StrCmp $5 &#039;&#039; +2&lt;br /&gt;
	IntOp $5 $5 + 0&lt;br /&gt;
	StrCmp $6 &#039;&#039; +2&lt;br /&gt;
	IntOp $6 $6 + 0&lt;br /&gt;
&lt;br /&gt;
	StrCmp $1 &#039;B&#039; 0 +4&lt;br /&gt;
	StrCpy $1 1&lt;br /&gt;
	StrCpy $2 bytes&lt;br /&gt;
	goto FileFunc_GetSize_default&lt;br /&gt;
	StrCmp $1 &#039;K&#039; 0 +4&lt;br /&gt;
	StrCpy $1 1024&lt;br /&gt;
	StrCpy $2 Kb&lt;br /&gt;
	goto FileFunc_GetSize_default&lt;br /&gt;
	StrCmp $1 &#039;M&#039; 0 +4&lt;br /&gt;
	StrCpy $1 1048576&lt;br /&gt;
	StrCpy $2 Mb&lt;br /&gt;
	goto FileFunc_GetSize_default&lt;br /&gt;
	StrCmp $1 &#039;G&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
	StrCpy $1 1073741824&lt;br /&gt;
	StrCpy $2 Gb&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_default:&lt;br /&gt;
	StrCmp $4 &#039;&#039; 0 +2&lt;br /&gt;
	StrCpy $4 &#039;*.*&#039;&lt;br /&gt;
	StrCmp $7 &#039;&#039; 0 +2&lt;br /&gt;
	StrCpy $7 &#039;1&#039;&lt;br /&gt;
&lt;br /&gt;
	StrCpy $8 1&lt;br /&gt;
	Push $0&lt;br /&gt;
	SetDetailsPrint textonly&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_nextdir:&lt;br /&gt;
	IntOp $8 $8 - 1&lt;br /&gt;
	Pop $R8&lt;br /&gt;
	FindFirst $0 $R7 &#039;$R8\$4&#039;&lt;br /&gt;
	IfErrors FileFunc_GetSize_show&lt;br /&gt;
	StrCmp $R7 &#039;.&#039; 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	StrCmp $R7 &#039;..&#039; 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
	goto FileFunc_GetSize_show&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_dir:&lt;br /&gt;
	IfFileExists &#039;$R8\$R7\*.*&#039; 0 FileFunc_GetSize_file&lt;br /&gt;
	IntOp $R5 $R5 + 1&lt;br /&gt;
	goto FileFunc_GetSize_findnext&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_file:&lt;br /&gt;
	StrCpy $R6 0&lt;br /&gt;
	StrCmp $5$6 &#039;&#039; 0 +3&lt;br /&gt;
	IntOp $R4 $R4 + 1&lt;br /&gt;
	goto FileFunc_GetSize_findnext&lt;br /&gt;
	FileOpen $9 &#039;$R8\$R7&#039; r&lt;br /&gt;
	IfErrors +3&lt;br /&gt;
	FileSeek $9 0 END $R6&lt;br /&gt;
	FileClose $9&lt;br /&gt;
	StrCmp $5 &#039;&#039; +2&lt;br /&gt;
	IntCmp $R6 $5 0 FileFunc_GetSize_findnext&lt;br /&gt;
	StrCmp $6 &#039;&#039; +2&lt;br /&gt;
	IntCmp $R6 $6 0 0 FileFunc_GetSize_findnext&lt;br /&gt;
	IntOp $R4 $R4 + 1&lt;br /&gt;
	; insert code&lt;br /&gt;
	StrCmp $R1 &amp;quot;&amp;quot; +10 0&lt;br /&gt;
	StrCpy $R0 $R1&lt;br /&gt;
	IntOp $R6 $R6 + $R0&lt;br /&gt;
	IntOp $R1 $R6 % $R0&lt;br /&gt;
	StrCmp $R1 0 0 +2&lt;br /&gt;
	StrCpy $R1 $R0&lt;br /&gt;
	IntOp $R2 $R0 - $R1&lt;br /&gt;
	IntOp $R6 $R6 - $R0&lt;br /&gt;
	IntOp $R6 $R6 + $R2&lt;br /&gt;
	StrCpy $R1 $R0&lt;br /&gt;
	; end insert&lt;br /&gt;
	System::Int64Op $R3 + $R6&lt;br /&gt;
	Pop $R3&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_findnext:&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_show:&lt;br /&gt;
	StrCmp $5$6 &#039;&#039; FileFunc_GetSize_nosize&lt;br /&gt;
	System::Int64Op $R3 / $1&lt;br /&gt;
	Pop $9&lt;br /&gt;
	DetailPrint &#039;Size:$9 $2  Files:$R4  Folders:$R5&#039;&lt;br /&gt;
	goto FileFunc_GetSize_subdir&lt;br /&gt;
	FileFunc_GetSize_nosize:&lt;br /&gt;
	DetailPrint &#039;Files:$R4  Folders:$R5&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_subdir:&lt;br /&gt;
	StrCmp $7 0 FileFunc_GetSize_preend&lt;br /&gt;
	FindFirst $0 $R7 &#039;$R8\*.*&#039;&lt;br /&gt;
	StrCmp $R7 &#039;.&#039; 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	StrCmp $R7 &#039;..&#039; 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
	StrCmp $8 0 FileFunc_GetSize_preend FileFunc_GetSize_nextdir&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_pushdir:&lt;br /&gt;
	IfFileExists &#039;$R8\$R7\*.*&#039; 0 +3&lt;br /&gt;
	Push &#039;$R8\$R7&#039;&lt;br /&gt;
	IntOp $8 $8 + 1&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
	StrCmp $8 0 FileFunc_GetSize_preend FileFunc_GetSize_nextdir&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_preend:&lt;br /&gt;
	StrCmp $R3 &#039;&#039; FileFunc_GetSize_nosizeend&lt;br /&gt;
	System::Int64Op $R3 / $1&lt;br /&gt;
	Pop $R3&lt;br /&gt;
	FileFunc_GetSize_nosizeend:&lt;br /&gt;
	StrCpy $2 $R4&lt;br /&gt;
	StrCpy $1 $R5&lt;br /&gt;
	StrCpy $0 $R3&lt;br /&gt;
	goto FileFunc_GetSize_end&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_error:&lt;br /&gt;
	SetErrors&lt;br /&gt;
	StrCpy $0 &#039;&#039;&lt;br /&gt;
	StrCpy $1 &#039;&#039;&lt;br /&gt;
	StrCpy $2 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_end:&lt;br /&gt;
	SetDetailsPrint both&lt;br /&gt;
	Pop $R9&lt;br /&gt;
	Pop $R8&lt;br /&gt;
	Pop $R7&lt;br /&gt;
	Pop $R6&lt;br /&gt;
	Pop $R5&lt;br /&gt;
	Pop $R4&lt;br /&gt;
	Pop $R3&lt;br /&gt;
	; insert code&lt;br /&gt;
	Pop $R2&lt;br /&gt;
	; end insert&lt;br /&gt;
	Pop $9&lt;br /&gt;
	Pop $8&lt;br /&gt;
	Pop $7&lt;br /&gt;
	Pop $6&lt;br /&gt;
	Pop $5&lt;br /&gt;
	Pop $4&lt;br /&gt;
	Pop $3&lt;br /&gt;
	Exch $2&lt;br /&gt;
	Exch&lt;br /&gt;
	Exch $1&lt;br /&gt;
	Exch 2&lt;br /&gt;
	Exch $0&lt;br /&gt;
&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
; ---------------&lt;br /&gt;
; GetFileAttributes (FileFunc.nsh)&lt;br /&gt;
&lt;br /&gt;
!define GetFileAttributes `!insertmacro GetFileAttributesCall`&lt;br /&gt;
!define un.GetFileAttributes `!insertmacro GetFileAttributesCall`&lt;br /&gt;
&lt;br /&gt;
!macro GetFileAttributes&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro un.GetFileAttributes&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetFileAttributes_&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
	&lt;br /&gt;
	Exch $1&lt;br /&gt;
	Exch&lt;br /&gt;
	Exch $0&lt;br /&gt;
	Exch&lt;br /&gt;
	Push $2&lt;br /&gt;
	Push $3&lt;br /&gt;
	Push $4&lt;br /&gt;
	Push $5&lt;br /&gt;
&lt;br /&gt;
	System::Call &#039;kernel32::GetFileAttributes(t r0)i .r2&#039;&lt;br /&gt;
	StrCmp $2 -1 FileFunc_GetFileAttributes_error&lt;br /&gt;
	StrCpy $3 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x4000&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;ENCRYPTED|&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x2000&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;NOT_CONTENT_INDEXED|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x1000&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;OFFLINE|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0800&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;COMPRESSED|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0400&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;REPARSE_POINT|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0200&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;SPARSE_FILE|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0100&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;TEMPORARY|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0080&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;NORMAL|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0040&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;DEVICE|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0020&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;ARCHIVE|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0010&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;DIRECTORY|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0004&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;SYSTEM|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0002&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;HIDDEN|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0001&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;READONLY|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	StrCpy $0 $3 -1&lt;br /&gt;
	StrCmp $1 &#039;&#039; FileFunc_GetFileAttributes_end&lt;br /&gt;
	StrCmp $1 &#039;ALL&#039; FileFunc_GetFileAttributes_end&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetFileAttributes_attrcmp:&lt;br /&gt;
	StrCpy $5 0&lt;br /&gt;
	IntOp $5 $5 + 1&lt;br /&gt;
	StrCpy $4 $1 1 $5&lt;br /&gt;
	StrCmp $4 &#039;&#039; +2&lt;br /&gt;
	StrCmp $4 &#039;|&#039;  0 -3&lt;br /&gt;
	StrCpy $2 $1 $5&lt;br /&gt;
	IntOp $5 $5 + 1&lt;br /&gt;
	StrCpy $1 $1 &#039;&#039; $5&lt;br /&gt;
	StrLen $3 $2&lt;br /&gt;
	StrCpy $5 -1&lt;br /&gt;
	IntOp $5 $5 + 1&lt;br /&gt;
	StrCpy $4 $0 $3 $5&lt;br /&gt;
	StrCmp $4 &#039;&#039; FileFunc_GetFileAttributes_notfound&lt;br /&gt;
	StrCmp $4 $2 0 -3&lt;br /&gt;
	StrCmp $1 &#039;&#039; 0 FileFunc_GetFileAttributes_attrcmp&lt;br /&gt;
	StrCpy $0 1&lt;br /&gt;
	goto FileFunc_GetFileAttributes_end&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetFileAttributes_notfound:&lt;br /&gt;
	StrCpy $0 0&lt;br /&gt;
	goto FileFunc_GetFileAttributes_end&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetFileAttributes_error:&lt;br /&gt;
	SetErrors&lt;br /&gt;
	StrCpy $0 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetFileAttributes_end:&lt;br /&gt;
	Pop $5&lt;br /&gt;
	Pop $4&lt;br /&gt;
	Pop $3&lt;br /&gt;
	Pop $2&lt;br /&gt;
	Pop $1&lt;br /&gt;
	Exch $0&lt;br /&gt;
		&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!define GetFileVersion `!insertmacro GetFileVersionCall`&lt;br /&gt;
!define un.GetFileVersion `!insertmacro GetFileVersionCall`&lt;br /&gt;
&lt;br /&gt;
!macro GetFileVersion&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro un.GetFileVersion&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetFileVersion_&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
	&lt;br /&gt;
	Exch $0&lt;br /&gt;
	Push $1&lt;br /&gt;
	Push $2&lt;br /&gt;
	Push $3&lt;br /&gt;
	Push $4&lt;br /&gt;
	Push $5&lt;br /&gt;
	Push $6&lt;br /&gt;
	ClearErrors&lt;br /&gt;
&lt;br /&gt;
	GetDllVersion &#039;$0&#039; $1 $2&lt;br /&gt;
	IfErrors FileFunc_GetFileVersion_error&lt;br /&gt;
	IntOp $3 $1 &amp;gt;&amp;gt; 16&lt;br /&gt;
	IntOp $3 $3 &amp;amp; 0x0000FFFF&lt;br /&gt;
	IntOp $4 $1 &amp;amp; 0x0000FFFF&lt;br /&gt;
	IntOp $5 $2 &amp;gt;&amp;gt; 16&lt;br /&gt;
	IntOp $5 $5 &amp;amp; 0x0000FFFF&lt;br /&gt;
	IntOp $6 $2 &amp;amp; 0x0000FFFF&lt;br /&gt;
	StrCpy $0 &#039;$3.$4.$5.$6&#039;&lt;br /&gt;
	goto FileFunc_GetFileVersion_end&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetFileVersion_error:&lt;br /&gt;
	SetErrors&lt;br /&gt;
	StrCpy $0 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetFileVersion_end:&lt;br /&gt;
	Pop $6&lt;br /&gt;
	Pop $5&lt;br /&gt;
	Pop $4&lt;br /&gt;
	Pop $3&lt;br /&gt;
	Pop $2&lt;br /&gt;
	Pop $1&lt;br /&gt;
	Exch $0&lt;br /&gt;
&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
; ---------------&lt;br /&gt;
; GetClusterSize&lt;br /&gt;
&lt;br /&gt;
!define GetClusterSize `!insertmacro GetClusterSizeCall`&lt;br /&gt;
!define un.GetClusterSize `!insertmacro GetClusterSizeCall`&lt;br /&gt;
&lt;br /&gt;
!macro GetClusterSize&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro un.GetClusterSize&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetClusterSize_&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
&lt;br /&gt;
	System::Call &#039;kernel32::GetDiskFreeSpace(i0,*i0r0,*i0r1,*i0r2,*i)&#039;&lt;br /&gt;
	IntOp $0 $0 * $1&lt;br /&gt;
	Push $0&lt;br /&gt;
&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&amp;lt;/highlight-nsis&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-size: 110%&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Credits:&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;em&amp;gt;GetFileAttributes&amp;lt;/em&amp;gt; is borrowed from &amp;lt;b&amp;gt;filefunc.nsh&amp;lt;/b&amp;gt;. &amp;lt;em&amp;gt;GetSizeOnDisk&amp;lt;/em&amp;gt; has been altered slightly and renamed. The original macro is called &amp;lt;em&amp;gt;GetSize&amp;lt;/em&amp;gt;. You will find it in the Users Manual under E.1.3.&lt;/div&gt;</summary>
		<author><name>Bnicer</name></author>
	</entry>
	<entry>
		<id>https://nsis.sourceforge.io/mediawiki/index.php?title=User:Bnicer&amp;diff=22886</id>
		<title>User:Bnicer</title>
		<link rel="alternate" type="text/html" href="https://nsis.sourceforge.io/mediawiki/index.php?title=User:Bnicer&amp;diff=22886"/>
		<updated>2013-02-08T14:27:45Z</updated>

		<summary type="html">&lt;p&gt;Bnicer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;span style=&amp;quot;font-size: 130%&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Get Size On Disk&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This example code shows you how to get the space used by directories and files.&lt;br /&gt;
&amp;lt;highlight-nsis&amp;gt;&lt;br /&gt;
; A utility for computing the NSIS (or NSIS Unicode) install folder size and the size of&lt;br /&gt;
; the uninstaller&lt;br /&gt;
; nsissize.nsi&lt;br /&gt;
; Compile &amp;amp; run the .exe&lt;br /&gt;
&lt;br /&gt;
Name &amp;quot;SOD Tool&amp;quot;&lt;br /&gt;
RequestExecutionLevel user&lt;br /&gt;
!define LOCAL &amp;quot;&amp;quot; ; Path where local include files reside&lt;br /&gt;
OutFile &amp;quot;${LOCAL}nsissize.exe&amp;quot;&lt;br /&gt;
!include &amp;quot;${LOCAL}macros.nsh&amp;quot;&lt;br /&gt;
ReserveFile &amp;quot;${NSISDIR}\Plugins\Math.dll&amp;quot;&lt;br /&gt;
#Icon &amp;quot;${LOCAL}arrows.ico&amp;quot;&lt;br /&gt;
ShowInstDetails show&lt;br /&gt;
&lt;br /&gt;
; Variables&lt;br /&gt;
Var NSIS&lt;br /&gt;
Var ZIP&lt;br /&gt;
Var ZIP_UN&lt;br /&gt;
Var COUNT&lt;br /&gt;
Var BLOCK&lt;br /&gt;
Var FILES&lt;br /&gt;
Var FOLDERS&lt;br /&gt;
Var SIZE_B&lt;br /&gt;
Var SIZE_M&lt;br /&gt;
Var SOD_B&lt;br /&gt;
Var SOD_K&lt;br /&gt;
Var SOD_M&lt;br /&gt;
Var SIZE_UN_B&lt;br /&gt;
Var SIZE_UN_K&lt;br /&gt;
Var SOD_UN_B&lt;br /&gt;
Var SOD_UN_K&lt;br /&gt;
&lt;br /&gt;
Function Separator ; comma&lt;br /&gt;
  StrCpy $R2 $R1&lt;br /&gt;
  StrCpy $COUNT &amp;quot;16&amp;quot; ; 1,000,000,000,000,000 limit&lt;br /&gt;
  StrLen $R4 $R1&lt;br /&gt;
  loop:&lt;br /&gt;
  IntCmp $COUNT 3 endloop endloop 0&lt;br /&gt;
  IntCmp $R4 $COUNT 0 +7 0&lt;br /&gt;
  IntOp $COUNT $COUNT - 1&lt;br /&gt;
  StrCpy $R2 $R2 -$COUNT&lt;br /&gt;
  StrCpy $R3 $R1 &amp;quot;&amp;quot; -$COUNT&lt;br /&gt;
  StrCpy $R2 &amp;quot;$R2,$R3&amp;quot;&lt;br /&gt;
  IntOp $COUNT $COUNT - 2&lt;br /&gt;
  Goto loop&lt;br /&gt;
  IntOp $COUNT $COUNT - 3&lt;br /&gt;
  Goto loop&lt;br /&gt;
  endloop:&lt;br /&gt;
FunctionEnd&lt;br /&gt;
&lt;br /&gt;
Section&lt;br /&gt;
; root&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS Unicode&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS Unicode&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS ANSI&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS ANSI&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  Goto done&lt;br /&gt;
  begin:&lt;br /&gt;
  IfFileExists &amp;quot;$NSIS&amp;quot; 0 done&lt;br /&gt;
  ${GetFileAttributes} &amp;quot;$NSIS&amp;quot; &amp;quot;COMPRESSED&amp;quot; $ZIP&lt;br /&gt;
  ${GetClusterSize} $BLOCK&lt;br /&gt;
  ${GetSizeOnDisk} &amp;quot;$NSIS&amp;quot; &amp;quot;/S=0B&amp;quot; &amp;quot;&amp;quot; $0 $1 $2&lt;br /&gt;
  Math::Script &amp;quot;r3 = ff($0 / 1024 / 1024.0, 16 +2&amp;quot;&lt;br /&gt;
  StrCpy $SIZE_B $0&lt;br /&gt;
  StrCpy $FILES $1&lt;br /&gt;
  StrCpy $FOLDERS $2&lt;br /&gt;
  StrCpy $SIZE_M $3&lt;br /&gt;
  ${GetSizeOnDisk} &amp;quot;$NSIS&amp;quot; &amp;quot;/S=0B&amp;quot; &amp;quot;$BLOCK&amp;quot; $0 $1 $2&lt;br /&gt;
  Math::Script &amp;quot;r4 = ff($0 / 1024.0, 16 +0); r5 = ff(r4 / 1024.0, 16 +2)&amp;quot;&lt;br /&gt;
  StrCpy $SOD_B $0&lt;br /&gt;
  StrCpy $SOD_K $4&lt;br /&gt;
  StrCpy $SOD_M $5&lt;br /&gt;
; uninstaller&lt;br /&gt;
  IfFileExists &amp;quot;$NSIS\uninst-nsis.exe&amp;quot; 0 done&lt;br /&gt;
  ${GetFileAttributes} &amp;quot;$NSIS\uninst-nsis.exe&amp;quot; &amp;quot;COMPRESSED&amp;quot; $ZIP_UN&lt;br /&gt;
  ${GetSizeOnDisk} &amp;quot;$NSIS&amp;quot; &amp;quot;/M=uninst-nsis.exe /S=0B&amp;quot; &amp;quot;&amp;quot; $0 $1 $2&lt;br /&gt;
  Math::Script &amp;quot;r6 = ff($0 / 1024.0, 16 +1); \&lt;br /&gt;
  a = $0; b = $BLOCK; c = a % b; #[c == 0, c = $BLOCK]; r7 = (b - c + a); \&lt;br /&gt;
  r8 = ff(r7 / 1024.0, 16 +1)&amp;quot;&lt;br /&gt;
  StrCpy $SIZE_UN_B $0&lt;br /&gt;
  StrCpy $SIZE_UN_K $6&lt;br /&gt;
  StrCpy $SOD_UN_B $7&lt;br /&gt;
  StrCpy $SOD_UN_K $8&lt;br /&gt;
  ; format&lt;br /&gt;
  StrCpy $R1 $SIZE_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SIZE_B $R2&lt;br /&gt;
&lt;br /&gt;
  StrCpy $R1 $SOD_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SOD_B $R2&lt;br /&gt;
&lt;br /&gt;
  StrCpy $R1 $SOD_K&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SOD_K $R2&lt;br /&gt;
&lt;br /&gt;
  StrCpy $R1 $SIZE_UN_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SIZE_UN_B $R2&lt;br /&gt;
  StrCpy $R1 $SOD_UN_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SOD_UN_B $R2&lt;br /&gt;
; output&lt;br /&gt;
  ; note: with compression SOD lines are incorrect&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;$NSIS&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;Size: $SIZE_M MB ($SIZE_B bytes)&amp;quot;&lt;br /&gt;
  StrCmp $ZIP &amp;quot;1&amp;quot; +3&lt;br /&gt;
  StrCmp $ZIP_UN &amp;quot;1&amp;quot; +2&lt;br /&gt;
  DetailPrint &amp;quot;SOD: $SOD_M MB ($SOD_B bytes)&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;Uninstaller&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;Size: $SIZE_UN_K KB ($SIZE_UN_B bytes)&amp;quot;&lt;br /&gt;
  StrCmp $ZIP &amp;quot;1&amp;quot; +3&lt;br /&gt;
  StrCmp $ZIP_UN &amp;quot;1&amp;quot; +2&lt;br /&gt;
  DetailPrint &amp;quot;SOD: $SOD_UN_K KB ($SOD_UN_B bytes)&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;$FILES files $FOLDERS folders $SOD_K Kb&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  Goto completed&lt;br /&gt;
  done:&lt;br /&gt;
  DetailPrint &amp;quot;File not found.&amp;quot;&lt;br /&gt;
  completed:&lt;br /&gt;
SectionEnd&lt;br /&gt;
&lt;br /&gt;
;--------------------------------&lt;br /&gt;
# EOF&lt;br /&gt;
&amp;lt;/highlight-nsis&amp;gt;&lt;br /&gt;
You should copy the next code into a separate file: &amp;lt;b&amp;gt;macros.nsh&amp;lt;/b&amp;gt;.&lt;br /&gt;
&amp;lt;highlight-nsis&amp;gt;&lt;br /&gt;
; Macros include file&lt;br /&gt;
;--------------------------------&lt;br /&gt;
/*&lt;br /&gt;
&lt;br /&gt;
 FileFunction=[GetSizeOnDisk|GetClusterSize|GetFileAttributes]&lt;br /&gt;
&lt;br /&gt;
*/&lt;br /&gt;
;_____________________________________________________________________________&lt;br /&gt;
;&lt;br /&gt;
;                         Macros&lt;br /&gt;
;_____________________________________________________________________________&lt;br /&gt;
;&lt;br /&gt;
; Change log window verbosity (default: 3=no script)&lt;br /&gt;
;&lt;br /&gt;
; Example:&lt;br /&gt;
; !include &amp;quot;sizemacros.nsh&amp;quot;&lt;br /&gt;
; !insertmacro GetSizeOnDisk&lt;br /&gt;
; ${FILEFUNC_VERBOSE} 4   # all verbosity&lt;br /&gt;
; !insertmacro GetClusterSize&lt;br /&gt;
; ${FILEFUNC_VERBOSE} 3   # no script&lt;br /&gt;
&lt;br /&gt;
!include Util.nsh ; for &amp;quot;CallArtificialFunction&amp;quot;&lt;br /&gt;
&lt;br /&gt;
!verbose push&lt;br /&gt;
!verbose 3&lt;br /&gt;
!ifndef _FILEFUNC_VERBOSE&lt;br /&gt;
	!define _FILEFUNC_VERBOSE 3&lt;br /&gt;
!endif&lt;br /&gt;
!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
!define FILEFUNC_VERBOSE `!insertmacro FILEFUNC_VERBOSE`&lt;br /&gt;
!verbose pop&lt;br /&gt;
&lt;br /&gt;
!macro FILEFUNC_VERBOSE _VERBOSE&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose 3&lt;br /&gt;
	!undef _FILEFUNC_VERBOSE&lt;br /&gt;
	!define _FILEFUNC_VERBOSE ${_VERBOSE}&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetSizeOnDiskCall _PATH _OPTIONS _FILESYSTEM _RESULT1 _RESULT2 _RESULT3&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
	Push `${_PATH}`&lt;br /&gt;
	Push `${_OPTIONS}`&lt;br /&gt;
	Push `${_FILESYSTEM}` ; block size&lt;br /&gt;
	${CallArtificialFunction} GetSizeOnDisk_&lt;br /&gt;
	Pop ${_RESULT1}&lt;br /&gt;
	Pop ${_RESULT2}&lt;br /&gt;
	Pop ${_RESULT3}&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetClusterSizeCall _RESULT&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
	${CallArtificialFunction} GetClusterSize_&lt;br /&gt;
	Pop ${_RESULT}&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetFileAttributesCall _PATH _ATTR _RESULT&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
	Push `${_PATH}`&lt;br /&gt;
	Push `${_ATTR}`&lt;br /&gt;
	${CallArtificialFunction} GetFileAttributes_&lt;br /&gt;
	Pop ${_RESULT}&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
; ---------------&lt;br /&gt;
; GetSizeOnDisk (modified &amp;quot;GetSize&amp;quot; - FileFunc.nsh - KiCHiK - Function &amp;quot;FindFiles&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
!define GetSizeOnDisk `!insertmacro GetSizeOnDiskCall`&lt;br /&gt;
!define un.GetSizeOnDisk `!insertmacro GetSizeOnDiskCall`&lt;br /&gt;
&lt;br /&gt;
!macro GetSizeOnDisk&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro un.GetSizeOnDisk&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
; Usage: similar to &amp;quot;GetSize&amp;quot;&lt;br /&gt;
&lt;br /&gt;
; For documentation, see the NSIS user manual: E.1.3 GetSize&lt;br /&gt;
; Three values are returned&lt;br /&gt;
&lt;br /&gt;
; $var1		; Result1: Size/Size on disk&lt;br /&gt;
; $var2		; Result2: Sum of files&lt;br /&gt;
; $var3		; Result3: Sum of directories&lt;br /&gt;
&lt;br /&gt;
; Example: ${GetSizeOnDisk} &amp;quot;$INSTDIR&amp;quot; &amp;quot;/S=0K&amp;quot; &amp;quot;4096&amp;quot; $0 $1 $2&lt;br /&gt;
&lt;br /&gt;
; Specifying 4096 (logical size) toggles the result&lt;br /&gt;
; Output is size on disk, if used, or size in bytes, if left empty &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
!macro GetSizeOnDisk_&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
&lt;br /&gt;
	; replace&lt;br /&gt;
	Exch $R1&lt;br /&gt;
	Exch&lt;br /&gt;
	Exch $1&lt;br /&gt;
	Exch 2&lt;br /&gt;
	; end replace&lt;br /&gt;
	Exch $0&lt;br /&gt;
	Exch&lt;br /&gt;
	Push $2&lt;br /&gt;
	Push $3&lt;br /&gt;
	Push $4&lt;br /&gt;
	Push $5&lt;br /&gt;
	Push $6&lt;br /&gt;
	Push $7&lt;br /&gt;
	Push $8&lt;br /&gt;
	Push $9&lt;br /&gt;
	; insert code&lt;br /&gt;
	Push $R2&lt;br /&gt;
	; end insert&lt;br /&gt;
	Push $R3&lt;br /&gt;
	Push $R4&lt;br /&gt;
	Push $R5&lt;br /&gt;
	Push $R6&lt;br /&gt;
	Push $R7&lt;br /&gt;
	Push $R8&lt;br /&gt;
	Push $R9&lt;br /&gt;
	ClearErrors&lt;br /&gt;
&lt;br /&gt;
	StrCpy $R9 $0 1 -1&lt;br /&gt;
	StrCmp $R9 &#039;\&#039; 0 +3&lt;br /&gt;
	StrCpy $0 $0 -1&lt;br /&gt;
	goto -3&lt;br /&gt;
	IfFileExists &#039;$0\*.*&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
&lt;br /&gt;
	StrCpy $3 &#039;&#039;&lt;br /&gt;
	StrCpy $4 &#039;&#039;&lt;br /&gt;
	StrCpy $5 &#039;&#039;&lt;br /&gt;
	StrCpy $6 &#039;&#039;&lt;br /&gt;
	StrCpy $8 0&lt;br /&gt;
	StrCpy $R3 &#039;&#039;&lt;br /&gt;
	StrCpy $R4 &#039;&#039;&lt;br /&gt;
	StrCpy $R5 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_option:&lt;br /&gt;
	StrCpy $R9 $1 1&lt;br /&gt;
	StrCpy $1 $1 &#039;&#039; 1&lt;br /&gt;
	StrCmp $R9 &#039; &#039; -2&lt;br /&gt;
	StrCmp $R9 &#039;&#039; FileFunc_GetSize_sizeset&lt;br /&gt;
	StrCmp $R9 &#039;/&#039; 0 -4&lt;br /&gt;
&lt;br /&gt;
	StrCpy $9 -1&lt;br /&gt;
	IntOp $9 $9 + 1&lt;br /&gt;
	StrCpy $R9 $1 1 $9&lt;br /&gt;
	StrCmp $R9 &#039;&#039; +2&lt;br /&gt;
	StrCmp $R9 &#039;/&#039; 0 -3&lt;br /&gt;
	StrCpy $8 $1 $9&lt;br /&gt;
	StrCpy $8 $8 &#039;&#039; 2&lt;br /&gt;
	StrCpy $R9 $8 &#039;&#039; -1&lt;br /&gt;
	StrCmp $R9 &#039; &#039; 0 +3&lt;br /&gt;
	StrCpy $8 $8 -1&lt;br /&gt;
	goto -3&lt;br /&gt;
	StrCpy $R9 $1 2&lt;br /&gt;
	StrCpy $1 $1 &#039;&#039; $9&lt;br /&gt;
&lt;br /&gt;
	StrCmp $R9 &#039;M=&#039; 0 FileFunc_GetSize_size&lt;br /&gt;
	StrCpy $4 $8&lt;br /&gt;
	goto FileFunc_GetSize_option&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_size:&lt;br /&gt;
	StrCmp $R9 &#039;S=&#039; 0 FileFunc_GetSize_gotosubdir&lt;br /&gt;
	StrCpy $6 $8&lt;br /&gt;
	goto FileFunc_GetSize_option&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_gotosubdir:&lt;br /&gt;
	StrCmp $R9 &#039;G=&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
	StrCpy $7 $8&lt;br /&gt;
	StrCmp $7 &#039;&#039; +3&lt;br /&gt;
	StrCmp $7 &#039;1&#039; +2&lt;br /&gt;
	StrCmp $7 &#039;0&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
	goto FileFunc_GetSize_option&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_sizeset:&lt;br /&gt;
	StrCmp $6 &#039;&#039; FileFunc_GetSize_default&lt;br /&gt;
	StrCpy $9 0&lt;br /&gt;
	StrCpy $R9 $6 1 $9&lt;br /&gt;
	StrCmp $R9 &#039;&#039; +4&lt;br /&gt;
	StrCmp $R9 &#039;:&#039; +3&lt;br /&gt;
	IntOp $9 $9 + 1&lt;br /&gt;
	goto -4&lt;br /&gt;
	StrCpy $5 $6 $9&lt;br /&gt;
	IntOp $9 $9 + 1&lt;br /&gt;
	StrCpy $1 $6 1 -1&lt;br /&gt;
	StrCpy $6 $6 -1 $9&lt;br /&gt;
	StrCmp $5 &#039;&#039; +2&lt;br /&gt;
	IntOp $5 $5 + 0&lt;br /&gt;
	StrCmp $6 &#039;&#039; +2&lt;br /&gt;
	IntOp $6 $6 + 0&lt;br /&gt;
&lt;br /&gt;
	StrCmp $1 &#039;B&#039; 0 +4&lt;br /&gt;
	StrCpy $1 1&lt;br /&gt;
	StrCpy $2 bytes&lt;br /&gt;
	goto FileFunc_GetSize_default&lt;br /&gt;
	StrCmp $1 &#039;K&#039; 0 +4&lt;br /&gt;
	StrCpy $1 1024&lt;br /&gt;
	StrCpy $2 Kb&lt;br /&gt;
	goto FileFunc_GetSize_default&lt;br /&gt;
	StrCmp $1 &#039;M&#039; 0 +4&lt;br /&gt;
	StrCpy $1 1048576&lt;br /&gt;
	StrCpy $2 Mb&lt;br /&gt;
	goto FileFunc_GetSize_default&lt;br /&gt;
	StrCmp $1 &#039;G&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
	StrCpy $1 1073741824&lt;br /&gt;
	StrCpy $2 Gb&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_default:&lt;br /&gt;
	StrCmp $4 &#039;&#039; 0 +2&lt;br /&gt;
	StrCpy $4 &#039;*.*&#039;&lt;br /&gt;
	StrCmp $7 &#039;&#039; 0 +2&lt;br /&gt;
	StrCpy $7 &#039;1&#039;&lt;br /&gt;
&lt;br /&gt;
	StrCpy $8 1&lt;br /&gt;
	Push $0&lt;br /&gt;
	SetDetailsPrint textonly&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_nextdir:&lt;br /&gt;
	IntOp $8 $8 - 1&lt;br /&gt;
	Pop $R8&lt;br /&gt;
	FindFirst $0 $R7 &#039;$R8\$4&#039;&lt;br /&gt;
	IfErrors FileFunc_GetSize_show&lt;br /&gt;
	StrCmp $R7 &#039;.&#039; 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	StrCmp $R7 &#039;..&#039; 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
	goto FileFunc_GetSize_show&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_dir:&lt;br /&gt;
	IfFileExists &#039;$R8\$R7\*.*&#039; 0 FileFunc_GetSize_file&lt;br /&gt;
	IntOp $R5 $R5 + 1&lt;br /&gt;
	goto FileFunc_GetSize_findnext&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_file:&lt;br /&gt;
	StrCpy $R6 0&lt;br /&gt;
	StrCmp $5$6 &#039;&#039; 0 +3&lt;br /&gt;
	IntOp $R4 $R4 + 1&lt;br /&gt;
	goto FileFunc_GetSize_findnext&lt;br /&gt;
	FileOpen $9 &#039;$R8\$R7&#039; r&lt;br /&gt;
	IfErrors +3&lt;br /&gt;
	FileSeek $9 0 END $R6&lt;br /&gt;
	FileClose $9&lt;br /&gt;
	StrCmp $5 &#039;&#039; +2&lt;br /&gt;
	IntCmp $R6 $5 0 FileFunc_GetSize_findnext&lt;br /&gt;
	StrCmp $6 &#039;&#039; +2&lt;br /&gt;
	IntCmp $R6 $6 0 0 FileFunc_GetSize_findnext&lt;br /&gt;
	IntOp $R4 $R4 + 1&lt;br /&gt;
	; insert code&lt;br /&gt;
	StrCmp $R1 &amp;quot;&amp;quot; +10 0&lt;br /&gt;
	StrCpy $R0 $R1&lt;br /&gt;
	IntOp $R6 $R6 + $R0&lt;br /&gt;
	IntOp $R1 $R6 % $R0&lt;br /&gt;
	StrCmp $R1 0 0 +2&lt;br /&gt;
	StrCpy $R1 $R0&lt;br /&gt;
	IntOp $R2 $R0 - $R1&lt;br /&gt;
	IntOp $R6 $R6 - $R0&lt;br /&gt;
	IntOp $R6 $R6 + $R2&lt;br /&gt;
	StrCpy $R1 $R0&lt;br /&gt;
	; end insert&lt;br /&gt;
	System::Int64Op $R3 + $R6&lt;br /&gt;
	Pop $R3&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_findnext:&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_show:&lt;br /&gt;
	StrCmp $5$6 &#039;&#039; FileFunc_GetSize_nosize&lt;br /&gt;
	System::Int64Op $R3 / $1&lt;br /&gt;
	Pop $9&lt;br /&gt;
	DetailPrint &#039;Size:$9 $2  Files:$R4  Folders:$R5&#039;&lt;br /&gt;
	goto FileFunc_GetSize_subdir&lt;br /&gt;
	FileFunc_GetSize_nosize:&lt;br /&gt;
	DetailPrint &#039;Files:$R4  Folders:$R5&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_subdir:&lt;br /&gt;
	StrCmp $7 0 FileFunc_GetSize_preend&lt;br /&gt;
	FindFirst $0 $R7 &#039;$R8\*.*&#039;&lt;br /&gt;
	StrCmp $R7 &#039;.&#039; 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	StrCmp $R7 &#039;..&#039; 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
	StrCmp $8 0 FileFunc_GetSize_preend FileFunc_GetSize_nextdir&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_pushdir:&lt;br /&gt;
	IfFileExists &#039;$R8\$R7\*.*&#039; 0 +3&lt;br /&gt;
	Push &#039;$R8\$R7&#039;&lt;br /&gt;
	IntOp $8 $8 + 1&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
	StrCmp $8 0 FileFunc_GetSize_preend FileFunc_GetSize_nextdir&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_preend:&lt;br /&gt;
	StrCmp $R3 &#039;&#039; FileFunc_GetSize_nosizeend&lt;br /&gt;
	System::Int64Op $R3 / $1&lt;br /&gt;
	Pop $R3&lt;br /&gt;
	FileFunc_GetSize_nosizeend:&lt;br /&gt;
	StrCpy $2 $R4&lt;br /&gt;
	StrCpy $1 $R5&lt;br /&gt;
	StrCpy $0 $R3&lt;br /&gt;
	goto FileFunc_GetSize_end&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_error:&lt;br /&gt;
	SetErrors&lt;br /&gt;
	StrCpy $0 &#039;&#039;&lt;br /&gt;
	StrCpy $1 &#039;&#039;&lt;br /&gt;
	StrCpy $2 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_end:&lt;br /&gt;
	SetDetailsPrint both&lt;br /&gt;
	Pop $R9&lt;br /&gt;
	Pop $R8&lt;br /&gt;
	Pop $R7&lt;br /&gt;
	Pop $R6&lt;br /&gt;
	Pop $R5&lt;br /&gt;
	Pop $R4&lt;br /&gt;
	Pop $R3&lt;br /&gt;
	; insert code&lt;br /&gt;
	Pop $R2&lt;br /&gt;
	; end insert&lt;br /&gt;
	Pop $9&lt;br /&gt;
	Pop $8&lt;br /&gt;
	Pop $7&lt;br /&gt;
	Pop $6&lt;br /&gt;
	Pop $5&lt;br /&gt;
	Pop $4&lt;br /&gt;
	Pop $3&lt;br /&gt;
	Exch $2&lt;br /&gt;
	Exch&lt;br /&gt;
	Exch $1&lt;br /&gt;
	Exch 2&lt;br /&gt;
	Exch $0&lt;br /&gt;
&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
; ---------------&lt;br /&gt;
; GetFileAttributes (FileFunc.nsh)&lt;br /&gt;
&lt;br /&gt;
!define GetFileAttributes `!insertmacro GetFileAttributesCall`&lt;br /&gt;
!define un.GetFileAttributes `!insertmacro GetFileAttributesCall`&lt;br /&gt;
&lt;br /&gt;
!macro GetFileAttributes&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro un.GetFileAttributes&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetFileAttributes_&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
	&lt;br /&gt;
	Exch $1&lt;br /&gt;
	Exch&lt;br /&gt;
	Exch $0&lt;br /&gt;
	Exch&lt;br /&gt;
	Push $2&lt;br /&gt;
	Push $3&lt;br /&gt;
	Push $4&lt;br /&gt;
	Push $5&lt;br /&gt;
&lt;br /&gt;
	System::Call &#039;kernel32::GetFileAttributes(t r0)i .r2&#039;&lt;br /&gt;
	StrCmp $2 -1 FileFunc_GetFileAttributes_error&lt;br /&gt;
	StrCpy $3 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x4000&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;ENCRYPTED|&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x2000&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;NOT_CONTENT_INDEXED|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x1000&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;OFFLINE|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0800&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;COMPRESSED|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0400&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;REPARSE_POINT|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0200&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;SPARSE_FILE|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0100&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;TEMPORARY|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0080&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;NORMAL|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0040&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;DEVICE|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0020&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;ARCHIVE|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0010&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;DIRECTORY|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0004&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;SYSTEM|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0002&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;HIDDEN|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0001&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;READONLY|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	StrCpy $0 $3 -1&lt;br /&gt;
	StrCmp $1 &#039;&#039; FileFunc_GetFileAttributes_end&lt;br /&gt;
	StrCmp $1 &#039;ALL&#039; FileFunc_GetFileAttributes_end&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetFileAttributes_attrcmp:&lt;br /&gt;
	StrCpy $5 0&lt;br /&gt;
	IntOp $5 $5 + 1&lt;br /&gt;
	StrCpy $4 $1 1 $5&lt;br /&gt;
	StrCmp $4 &#039;&#039; +2&lt;br /&gt;
	StrCmp $4 &#039;|&#039;  0 -3&lt;br /&gt;
	StrCpy $2 $1 $5&lt;br /&gt;
	IntOp $5 $5 + 1&lt;br /&gt;
	StrCpy $1 $1 &#039;&#039; $5&lt;br /&gt;
	StrLen $3 $2&lt;br /&gt;
	StrCpy $5 -1&lt;br /&gt;
	IntOp $5 $5 + 1&lt;br /&gt;
	StrCpy $4 $0 $3 $5&lt;br /&gt;
	StrCmp $4 &#039;&#039; FileFunc_GetFileAttributes_notfound&lt;br /&gt;
	StrCmp $4 $2 0 -3&lt;br /&gt;
	StrCmp $1 &#039;&#039; 0 FileFunc_GetFileAttributes_attrcmp&lt;br /&gt;
	StrCpy $0 1&lt;br /&gt;
	goto FileFunc_GetFileAttributes_end&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetFileAttributes_notfound:&lt;br /&gt;
	StrCpy $0 0&lt;br /&gt;
	goto FileFunc_GetFileAttributes_end&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetFileAttributes_error:&lt;br /&gt;
	SetErrors&lt;br /&gt;
	StrCpy $0 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetFileAttributes_end:&lt;br /&gt;
	Pop $5&lt;br /&gt;
	Pop $4&lt;br /&gt;
	Pop $3&lt;br /&gt;
	Pop $2&lt;br /&gt;
	Pop $1&lt;br /&gt;
	Exch $0&lt;br /&gt;
		&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!define GetFileVersion `!insertmacro GetFileVersionCall`&lt;br /&gt;
!define un.GetFileVersion `!insertmacro GetFileVersionCall`&lt;br /&gt;
&lt;br /&gt;
!macro GetFileVersion&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro un.GetFileVersion&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetFileVersion_&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
	&lt;br /&gt;
	Exch $0&lt;br /&gt;
	Push $1&lt;br /&gt;
	Push $2&lt;br /&gt;
	Push $3&lt;br /&gt;
	Push $4&lt;br /&gt;
	Push $5&lt;br /&gt;
	Push $6&lt;br /&gt;
	ClearErrors&lt;br /&gt;
&lt;br /&gt;
	GetDllVersion &#039;$0&#039; $1 $2&lt;br /&gt;
	IfErrors FileFunc_GetFileVersion_error&lt;br /&gt;
	IntOp $3 $1 &amp;gt;&amp;gt; 16&lt;br /&gt;
	IntOp $3 $3 &amp;amp; 0x0000FFFF&lt;br /&gt;
	IntOp $4 $1 &amp;amp; 0x0000FFFF&lt;br /&gt;
	IntOp $5 $2 &amp;gt;&amp;gt; 16&lt;br /&gt;
	IntOp $5 $5 &amp;amp; 0x0000FFFF&lt;br /&gt;
	IntOp $6 $2 &amp;amp; 0x0000FFFF&lt;br /&gt;
	StrCpy $0 &#039;$3.$4.$5.$6&#039;&lt;br /&gt;
	goto FileFunc_GetFileVersion_end&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetFileVersion_error:&lt;br /&gt;
	SetErrors&lt;br /&gt;
	StrCpy $0 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetFileVersion_end:&lt;br /&gt;
	Pop $6&lt;br /&gt;
	Pop $5&lt;br /&gt;
	Pop $4&lt;br /&gt;
	Pop $3&lt;br /&gt;
	Pop $2&lt;br /&gt;
	Pop $1&lt;br /&gt;
	Exch $0&lt;br /&gt;
&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
; ---------------&lt;br /&gt;
; GetClusterSize&lt;br /&gt;
&lt;br /&gt;
!define GetClusterSize `!insertmacro GetClusterSizeCall`&lt;br /&gt;
!define un.GetClusterSize `!insertmacro GetClusterSizeCall`&lt;br /&gt;
&lt;br /&gt;
!macro GetClusterSize&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro un.GetClusterSize&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetClusterSize_&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
&lt;br /&gt;
	System::Call &#039;kernel32::GetDiskFreeSpace(i0,*i0r0,*i0r1,*i0r2,*i)&#039;&lt;br /&gt;
	IntOp $0 $0 * $1&lt;br /&gt;
	Push $0&lt;br /&gt;
&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&amp;lt;/highlight-nsis&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-size: 110%&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Credits:&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;em&amp;gt;GetFileAttributes&amp;lt;/em&amp;gt; is borrowed from &amp;lt;b&amp;gt;filefunc.nsh&amp;lt;/b&amp;gt;.&lt;br /&gt;
&amp;lt;em&amp;gt;GetSizeOnDisk&amp;lt;/em&amp;gt; has been altered slightly and renamed. The original macro is called &amp;lt;em&amp;gt;GetSize&amp;lt;/em&amp;gt;. You will find it in the Users Manual under E.1.3.&lt;/div&gt;</summary>
		<author><name>Bnicer</name></author>
	</entry>
	<entry>
		<id>https://nsis.sourceforge.io/mediawiki/index.php?title=User:Bnicer&amp;diff=22885</id>
		<title>User:Bnicer</title>
		<link rel="alternate" type="text/html" href="https://nsis.sourceforge.io/mediawiki/index.php?title=User:Bnicer&amp;diff=22885"/>
		<updated>2013-02-08T07:19:34Z</updated>

		<summary type="html">&lt;p&gt;Bnicer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;span style=&amp;quot;font-size: 130%&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Get Size On Disk&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This example code shows you how to get the space used by directories and files.&lt;br /&gt;
&amp;lt;highlight-nsis&amp;gt;&lt;br /&gt;
; A utility for computing the NSIS (or NSIS Unicode) install folder size and the size&lt;br /&gt;
; of the uninstaller&lt;br /&gt;
; nsissize.nsi&lt;br /&gt;
; Compile &amp;amp; run the .exe&lt;br /&gt;
&lt;br /&gt;
; Note: where either the folder or the uninstaller have been compressed, size on disk&lt;br /&gt;
; results will not be shown, as they would be incorrect&lt;br /&gt;
&lt;br /&gt;
Name &amp;quot;SOD Tool&amp;quot;&lt;br /&gt;
RequestExecutionLevel user&lt;br /&gt;
!define LOCAL &amp;quot;&amp;quot; ; Path where local include files reside&lt;br /&gt;
OutFile &amp;quot;${LOCAL}nsissize.exe&amp;quot;&lt;br /&gt;
!include &amp;quot;${LOCAL}macros.nsh&amp;quot;&lt;br /&gt;
ReserveFile &amp;quot;${NSISDIR}\Plugins\Math.dll&amp;quot;&lt;br /&gt;
#Icon &amp;quot;${LOCAL}arrows.ico&amp;quot;&lt;br /&gt;
ShowInstDetails show&lt;br /&gt;
&lt;br /&gt;
; Variables&lt;br /&gt;
Var NSIS&lt;br /&gt;
Var ZIP&lt;br /&gt;
Var ZIP_UN&lt;br /&gt;
Var COUNT&lt;br /&gt;
Var BLOCK&lt;br /&gt;
Var FILES&lt;br /&gt;
Var FOLDERS&lt;br /&gt;
Var SIZE_B&lt;br /&gt;
Var SIZE_M&lt;br /&gt;
Var SOD_B&lt;br /&gt;
Var SOD_K&lt;br /&gt;
Var SOD_M&lt;br /&gt;
Var SIZE_UN_B&lt;br /&gt;
Var SIZE_UN_K&lt;br /&gt;
Var SOD_UN_B&lt;br /&gt;
Var SOD_UN_K&lt;br /&gt;
&lt;br /&gt;
Function Separator ; comma&lt;br /&gt;
  StrCpy $R2 $R1&lt;br /&gt;
  StrCpy $COUNT &amp;quot;16&amp;quot; ; 1,000,000,000,000,000 limit&lt;br /&gt;
  StrLen $R4 $R1&lt;br /&gt;
  loop:&lt;br /&gt;
  IntCmp $COUNT 3 endloop endloop 0&lt;br /&gt;
  IntCmp $R4 $COUNT 0 +7 0&lt;br /&gt;
  IntOp $COUNT $COUNT - 1&lt;br /&gt;
  StrCpy $R2 $R2 -$COUNT&lt;br /&gt;
  StrCpy $R3 $R1 &amp;quot;&amp;quot; -$COUNT&lt;br /&gt;
  StrCpy $R2 &amp;quot;$R2,$R3&amp;quot;&lt;br /&gt;
  IntOp $COUNT $COUNT - 2&lt;br /&gt;
  Goto loop&lt;br /&gt;
  IntOp $COUNT $COUNT - 3&lt;br /&gt;
  Goto loop&lt;br /&gt;
  endloop:&lt;br /&gt;
FunctionEnd&lt;br /&gt;
&lt;br /&gt;
Section&lt;br /&gt;
; root&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS Unicode&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS Unicode&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS ANSI&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS ANSI&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  Goto done&lt;br /&gt;
  begin:&lt;br /&gt;
  IfFileExists &amp;quot;$NSIS&amp;quot; 0 done&lt;br /&gt;
  ${GetFileAttributes} &amp;quot;$NSIS&amp;quot; &amp;quot;COMPRESSED&amp;quot; $ZIP&lt;br /&gt;
  ${GetClusterSize} $BLOCK&lt;br /&gt;
  ${GetSizeOnDisk} &amp;quot;$NSIS&amp;quot; &amp;quot;/S=0B&amp;quot; &amp;quot;&amp;quot; $0 $1 $2&lt;br /&gt;
  Math::Script &amp;quot;r3 = ff($0 / 1024 / 1024.0, 16 +2&amp;quot;&lt;br /&gt;
  StrCpy $SIZE_B $0&lt;br /&gt;
  StrCpy $FILES $1&lt;br /&gt;
  StrCpy $FOLDERS $2&lt;br /&gt;
  StrCpy $SIZE_M $3&lt;br /&gt;
  ${GetSizeOnDisk} &amp;quot;$NSIS&amp;quot; &amp;quot;/S=0B&amp;quot; &amp;quot;$BLOCK&amp;quot; $0 $1 $2&lt;br /&gt;
  Math::Script &amp;quot;r4 = ff($0 / 1024.0, 16 +0); r5 = ff(r4 / 1024.0, 16 +2)&amp;quot;&lt;br /&gt;
  StrCpy $SOD_B $0&lt;br /&gt;
  StrCpy $SOD_K $4&lt;br /&gt;
  StrCpy $SOD_M $5&lt;br /&gt;
; uninstaller&lt;br /&gt;
  IfFileExists &amp;quot;$NSIS\uninst-nsis.exe&amp;quot; 0 done&lt;br /&gt;
  ${GetFileAttributes} &amp;quot;$NSIS\uninst-nsis.exe&amp;quot; &amp;quot;COMPRESSED&amp;quot; $ZIP_UN&lt;br /&gt;
  ${GetSizeOnDisk} &amp;quot;$NSIS&amp;quot; &amp;quot;/M=uninst-nsis.exe /S=0B&amp;quot; &amp;quot;&amp;quot; $0 $1 $2&lt;br /&gt;
  Math::Script &amp;quot;r6 = ff($0 / 1024.0, 16 +1); \&lt;br /&gt;
  a = $0; b = $BLOCK; c = a % b; #[c == 0, c = $BLOCK]; r7 = (b - c + a); \&lt;br /&gt;
  r8 = ff(r7 / 1024.0, 16 +1)&amp;quot;&lt;br /&gt;
  StrCpy $SIZE_UN_B $0&lt;br /&gt;
  StrCpy $SIZE_UN_K $6&lt;br /&gt;
  StrCpy $SOD_UN_B $7&lt;br /&gt;
  StrCpy $SOD_UN_K $8&lt;br /&gt;
  ; format&lt;br /&gt;
  StrCpy $R1 $SIZE_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SIZE_B $R2&lt;br /&gt;
&lt;br /&gt;
  StrCpy $R1 $SOD_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SOD_B $R2&lt;br /&gt;
&lt;br /&gt;
  StrCpy $R1 $SOD_K&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SOD_K $R2&lt;br /&gt;
&lt;br /&gt;
  StrCpy $R1 $SIZE_UN_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SIZE_UN_B $R2&lt;br /&gt;
  StrCpy $R1 $SOD_UN_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SOD_UN_B $R2&lt;br /&gt;
; output&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;$NSIS&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;Size: $SIZE_M MB ($SIZE_B bytes)&amp;quot;&lt;br /&gt;
  StrCmp $ZIP &amp;quot;1&amp;quot; +3&lt;br /&gt;
  StrCmp $ZIP_UN &amp;quot;1&amp;quot; +2&lt;br /&gt;
  DetailPrint &amp;quot;SOD: $SOD_M MB ($SOD_B bytes)&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;Uninstaller&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;Size: $SIZE_UN_K KB ($SIZE_UN_B bytes)&amp;quot;&lt;br /&gt;
  StrCmp $ZIP &amp;quot;1&amp;quot; +3&lt;br /&gt;
  StrCmp $ZIP_UN &amp;quot;1&amp;quot; +2&lt;br /&gt;
  DetailPrint &amp;quot;SOD: $SOD_UN_K KB ($SOD_UN_B bytes)&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;$FILES files $FOLDERS folders $SOD_K Kb&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  Goto completed&lt;br /&gt;
  done:&lt;br /&gt;
  DetailPrint &amp;quot;File not found.&amp;quot;&lt;br /&gt;
  completed:&lt;br /&gt;
SectionEnd&lt;br /&gt;
&lt;br /&gt;
;--------------------------------&lt;br /&gt;
# EOF&lt;br /&gt;
&amp;lt;/highlight-nsis&amp;gt;&lt;br /&gt;
You should copy the next code into a separate file called &amp;lt;b&amp;gt;macros.nsh&amp;lt;/b&amp;gt;.&lt;br /&gt;
&amp;lt;highlight-nsis&amp;gt;&lt;br /&gt;
; Macros include file&lt;br /&gt;
;--------------------------------&lt;br /&gt;
/*&lt;br /&gt;
&lt;br /&gt;
 FileFunction=[GetSizeOnDisk|GetClusterSize|GetFileAttributes]&lt;br /&gt;
&lt;br /&gt;
*/&lt;br /&gt;
;_____________________________________________________________________________&lt;br /&gt;
;&lt;br /&gt;
;                         Macros&lt;br /&gt;
;_____________________________________________________________________________&lt;br /&gt;
;&lt;br /&gt;
; Change log window verbosity (default: 3=no script)&lt;br /&gt;
;&lt;br /&gt;
; Example:&lt;br /&gt;
; !include &amp;quot;sizemacros.nsh&amp;quot;&lt;br /&gt;
; !insertmacro GetSizeOnDisk&lt;br /&gt;
; ${FILEFUNC_VERBOSE} 4   # all verbosity&lt;br /&gt;
; !insertmacro GetClusterSize&lt;br /&gt;
; ${FILEFUNC_VERBOSE} 3   # no script&lt;br /&gt;
&lt;br /&gt;
!include Util.nsh ; for &amp;quot;CallArtificialFunction&amp;quot;&lt;br /&gt;
&lt;br /&gt;
!verbose push&lt;br /&gt;
!verbose 3&lt;br /&gt;
!ifndef _FILEFUNC_VERBOSE&lt;br /&gt;
	!define _FILEFUNC_VERBOSE 3&lt;br /&gt;
!endif&lt;br /&gt;
!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
!define FILEFUNC_VERBOSE `!insertmacro FILEFUNC_VERBOSE`&lt;br /&gt;
!verbose pop&lt;br /&gt;
&lt;br /&gt;
!macro FILEFUNC_VERBOSE _VERBOSE&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose 3&lt;br /&gt;
	!undef _FILEFUNC_VERBOSE&lt;br /&gt;
	!define _FILEFUNC_VERBOSE ${_VERBOSE}&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetSizeOnDiskCall _PATH _OPTIONS _FILESYSTEM _RESULT1 _RESULT2 _RESULT3&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
	Push `${_PATH}`&lt;br /&gt;
	Push `${_OPTIONS}`&lt;br /&gt;
	Push `${_FILESYSTEM}` ; block size&lt;br /&gt;
	${CallArtificialFunction} GetSizeOnDisk_&lt;br /&gt;
	Pop ${_RESULT1}&lt;br /&gt;
	Pop ${_RESULT2}&lt;br /&gt;
	Pop ${_RESULT3}&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetClusterSizeCall _RESULT&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
	${CallArtificialFunction} GetClusterSize_&lt;br /&gt;
	Pop ${_RESULT}&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetFileAttributesCall _PATH _ATTR _RESULT&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
	Push `${_PATH}`&lt;br /&gt;
	Push `${_ATTR}`&lt;br /&gt;
	${CallArtificialFunction} GetFileAttributes_&lt;br /&gt;
	Pop ${_RESULT}&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
; ---------------&lt;br /&gt;
; GetSizeOnDisk (modified &amp;quot;GetSize&amp;quot; - FileFunc.nsh - KiCHiK - Function &amp;quot;FindFiles&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
!define GetSizeOnDisk `!insertmacro GetSizeOnDiskCall`&lt;br /&gt;
!define un.GetSizeOnDisk `!insertmacro GetSizeOnDiskCall`&lt;br /&gt;
&lt;br /&gt;
!macro GetSizeOnDisk&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro un.GetSizeOnDisk&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
; Usage: similar to &amp;quot;GetSize&amp;quot;&lt;br /&gt;
&lt;br /&gt;
; For documentation, see the NSIS user manual: E.1.3 GetSize&lt;br /&gt;
; Three values are returned&lt;br /&gt;
&lt;br /&gt;
; $var1		; Result1: Size/Size on disk&lt;br /&gt;
; $var2		; Result2: Sum of files&lt;br /&gt;
; $var3		; Result3: Sum of directories&lt;br /&gt;
&lt;br /&gt;
; Example: ${GetSizeOnDisk} &amp;quot;$INSTDIR&amp;quot; &amp;quot;/S=0K&amp;quot; &amp;quot;4096&amp;quot; $0 $1 $2&lt;br /&gt;
&lt;br /&gt;
; Specifying 4096 (logical size) toggles the result&lt;br /&gt;
; Output is size on disk (4KB clusters), if used, or size in bytes, if left empty &amp;quot;&amp;quot;&lt;br /&gt;
; Caution: All writable variables go on the stack; make sure you save them before&lt;br /&gt;
&lt;br /&gt;
!macro GetSizeOnDisk_&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
&lt;br /&gt;
	; replace&lt;br /&gt;
	Exch $R1&lt;br /&gt;
	Exch&lt;br /&gt;
	Exch $1&lt;br /&gt;
	Exch 2&lt;br /&gt;
	; end replace&lt;br /&gt;
	Exch $0&lt;br /&gt;
	Exch&lt;br /&gt;
	Push $2&lt;br /&gt;
	Push $3&lt;br /&gt;
	Push $4&lt;br /&gt;
	Push $5&lt;br /&gt;
	Push $6&lt;br /&gt;
	Push $7&lt;br /&gt;
	Push $8&lt;br /&gt;
	Push $9&lt;br /&gt;
	; insert code&lt;br /&gt;
	Push $R2&lt;br /&gt;
	; end insert&lt;br /&gt;
	Push $R3&lt;br /&gt;
	Push $R4&lt;br /&gt;
	Push $R5&lt;br /&gt;
	Push $R6&lt;br /&gt;
	Push $R7&lt;br /&gt;
	Push $R8&lt;br /&gt;
	Push $R9&lt;br /&gt;
	ClearErrors&lt;br /&gt;
&lt;br /&gt;
	StrCpy $R9 $0 1 -1&lt;br /&gt;
	StrCmp $R9 &#039;\&#039; 0 +3&lt;br /&gt;
	StrCpy $0 $0 -1&lt;br /&gt;
	goto -3&lt;br /&gt;
	IfFileExists &#039;$0\*.*&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
&lt;br /&gt;
	StrCpy $3 &#039;&#039;&lt;br /&gt;
	StrCpy $4 &#039;&#039;&lt;br /&gt;
	StrCpy $5 &#039;&#039;&lt;br /&gt;
	StrCpy $6 &#039;&#039;&lt;br /&gt;
	StrCpy $8 0&lt;br /&gt;
	StrCpy $R3 &#039;&#039;&lt;br /&gt;
	StrCpy $R4 &#039;&#039;&lt;br /&gt;
	StrCpy $R5 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_option:&lt;br /&gt;
	StrCpy $R9 $1 1&lt;br /&gt;
	StrCpy $1 $1 &#039;&#039; 1&lt;br /&gt;
	StrCmp $R9 &#039; &#039; -2&lt;br /&gt;
	StrCmp $R9 &#039;&#039; FileFunc_GetSize_sizeset&lt;br /&gt;
	StrCmp $R9 &#039;/&#039; 0 -4&lt;br /&gt;
&lt;br /&gt;
	StrCpy $9 -1&lt;br /&gt;
	IntOp $9 $9 + 1&lt;br /&gt;
	StrCpy $R9 $1 1 $9&lt;br /&gt;
	StrCmp $R9 &#039;&#039; +2&lt;br /&gt;
	StrCmp $R9 &#039;/&#039; 0 -3&lt;br /&gt;
	StrCpy $8 $1 $9&lt;br /&gt;
	StrCpy $8 $8 &#039;&#039; 2&lt;br /&gt;
	StrCpy $R9 $8 &#039;&#039; -1&lt;br /&gt;
	StrCmp $R9 &#039; &#039; 0 +3&lt;br /&gt;
	StrCpy $8 $8 -1&lt;br /&gt;
	goto -3&lt;br /&gt;
	StrCpy $R9 $1 2&lt;br /&gt;
	StrCpy $1 $1 &#039;&#039; $9&lt;br /&gt;
&lt;br /&gt;
	StrCmp $R9 &#039;M=&#039; 0 FileFunc_GetSize_size&lt;br /&gt;
	StrCpy $4 $8&lt;br /&gt;
	goto FileFunc_GetSize_option&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_size:&lt;br /&gt;
	StrCmp $R9 &#039;S=&#039; 0 FileFunc_GetSize_gotosubdir&lt;br /&gt;
	StrCpy $6 $8&lt;br /&gt;
	goto FileFunc_GetSize_option&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_gotosubdir:&lt;br /&gt;
	StrCmp $R9 &#039;G=&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
	StrCpy $7 $8&lt;br /&gt;
	StrCmp $7 &#039;&#039; +3&lt;br /&gt;
	StrCmp $7 &#039;1&#039; +2&lt;br /&gt;
	StrCmp $7 &#039;0&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
	goto FileFunc_GetSize_option&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_sizeset:&lt;br /&gt;
	StrCmp $6 &#039;&#039; FileFunc_GetSize_default&lt;br /&gt;
	StrCpy $9 0&lt;br /&gt;
	StrCpy $R9 $6 1 $9&lt;br /&gt;
	StrCmp $R9 &#039;&#039; +4&lt;br /&gt;
	StrCmp $R9 &#039;:&#039; +3&lt;br /&gt;
	IntOp $9 $9 + 1&lt;br /&gt;
	goto -4&lt;br /&gt;
	StrCpy $5 $6 $9&lt;br /&gt;
	IntOp $9 $9 + 1&lt;br /&gt;
	StrCpy $1 $6 1 -1&lt;br /&gt;
	StrCpy $6 $6 -1 $9&lt;br /&gt;
	StrCmp $5 &#039;&#039; +2&lt;br /&gt;
	IntOp $5 $5 + 0&lt;br /&gt;
	StrCmp $6 &#039;&#039; +2&lt;br /&gt;
	IntOp $6 $6 + 0&lt;br /&gt;
&lt;br /&gt;
	StrCmp $1 &#039;B&#039; 0 +4&lt;br /&gt;
	StrCpy $1 1&lt;br /&gt;
	StrCpy $2 bytes&lt;br /&gt;
	goto FileFunc_GetSize_default&lt;br /&gt;
	StrCmp $1 &#039;K&#039; 0 +4&lt;br /&gt;
	StrCpy $1 1024&lt;br /&gt;
	StrCpy $2 Kb&lt;br /&gt;
	goto FileFunc_GetSize_default&lt;br /&gt;
	StrCmp $1 &#039;M&#039; 0 +4&lt;br /&gt;
	StrCpy $1 1048576&lt;br /&gt;
	StrCpy $2 Mb&lt;br /&gt;
	goto FileFunc_GetSize_default&lt;br /&gt;
	StrCmp $1 &#039;G&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
	StrCpy $1 1073741824&lt;br /&gt;
	StrCpy $2 Gb&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_default:&lt;br /&gt;
	StrCmp $4 &#039;&#039; 0 +2&lt;br /&gt;
	StrCpy $4 &#039;*.*&#039;&lt;br /&gt;
	StrCmp $7 &#039;&#039; 0 +2&lt;br /&gt;
	StrCpy $7 &#039;1&#039;&lt;br /&gt;
&lt;br /&gt;
	StrCpy $8 1&lt;br /&gt;
	Push $0&lt;br /&gt;
	SetDetailsPrint textonly&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_nextdir:&lt;br /&gt;
	IntOp $8 $8 - 1&lt;br /&gt;
	Pop $R8&lt;br /&gt;
	FindFirst $0 $R7 &#039;$R8\$4&#039;&lt;br /&gt;
	IfErrors FileFunc_GetSize_show&lt;br /&gt;
	StrCmp $R7 &#039;.&#039; 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	StrCmp $R7 &#039;..&#039; 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
	goto FileFunc_GetSize_show&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_dir:&lt;br /&gt;
	IfFileExists &#039;$R8\$R7\*.*&#039; 0 FileFunc_GetSize_file&lt;br /&gt;
	IntOp $R5 $R5 + 1&lt;br /&gt;
	goto FileFunc_GetSize_findnext&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_file:&lt;br /&gt;
	StrCpy $R6 0&lt;br /&gt;
	StrCmp $5$6 &#039;&#039; 0 +3&lt;br /&gt;
	IntOp $R4 $R4 + 1&lt;br /&gt;
	goto FileFunc_GetSize_findnext&lt;br /&gt;
	FileOpen $9 &#039;$R8\$R7&#039; r&lt;br /&gt;
	IfErrors +3&lt;br /&gt;
	FileSeek $9 0 END $R6&lt;br /&gt;
	FileClose $9&lt;br /&gt;
	StrCmp $5 &#039;&#039; +2&lt;br /&gt;
	IntCmp $R6 $5 0 FileFunc_GetSize_findnext&lt;br /&gt;
	StrCmp $6 &#039;&#039; +2&lt;br /&gt;
	IntCmp $R6 $6 0 0 FileFunc_GetSize_findnext&lt;br /&gt;
	IntOp $R4 $R4 + 1&lt;br /&gt;
	; insert code&lt;br /&gt;
	StrCmp $R1 &amp;quot;&amp;quot; +10 0&lt;br /&gt;
	StrCpy $R0 $R1&lt;br /&gt;
	IntOp $R6 $R6 + $R0&lt;br /&gt;
	IntOp $R1 $R6 % $R0&lt;br /&gt;
	StrCmp $R1 0 0 +2&lt;br /&gt;
	StrCpy $R1 $R0&lt;br /&gt;
	IntOp $R2 $R0 - $R1&lt;br /&gt;
	IntOp $R6 $R6 - $R0&lt;br /&gt;
	IntOp $R6 $R6 + $R2&lt;br /&gt;
	StrCpy $R1 $R0&lt;br /&gt;
	; end insert&lt;br /&gt;
	System::Int64Op $R3 + $R6&lt;br /&gt;
	Pop $R3&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_findnext:&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_show:&lt;br /&gt;
	StrCmp $5$6 &#039;&#039; FileFunc_GetSize_nosize&lt;br /&gt;
	System::Int64Op $R3 / $1&lt;br /&gt;
	Pop $9&lt;br /&gt;
	DetailPrint &#039;Size:$9 $2  Files:$R4  Folders:$R5&#039;&lt;br /&gt;
	goto FileFunc_GetSize_subdir&lt;br /&gt;
	FileFunc_GetSize_nosize:&lt;br /&gt;
	DetailPrint &#039;Files:$R4  Folders:$R5&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_subdir:&lt;br /&gt;
	StrCmp $7 0 FileFunc_GetSize_preend&lt;br /&gt;
	FindFirst $0 $R7 &#039;$R8\*.*&#039;&lt;br /&gt;
	StrCmp $R7 &#039;.&#039; 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	StrCmp $R7 &#039;..&#039; 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
	StrCmp $8 0 FileFunc_GetSize_preend FileFunc_GetSize_nextdir&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_pushdir:&lt;br /&gt;
	IfFileExists &#039;$R8\$R7\*.*&#039; 0 +3&lt;br /&gt;
	Push &#039;$R8\$R7&#039;&lt;br /&gt;
	IntOp $8 $8 + 1&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
	StrCmp $8 0 FileFunc_GetSize_preend FileFunc_GetSize_nextdir&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_preend:&lt;br /&gt;
	StrCmp $R3 &#039;&#039; FileFunc_GetSize_nosizeend&lt;br /&gt;
	System::Int64Op $R3 / $1&lt;br /&gt;
	Pop $R3&lt;br /&gt;
	FileFunc_GetSize_nosizeend:&lt;br /&gt;
	StrCpy $2 $R4&lt;br /&gt;
	StrCpy $1 $R5&lt;br /&gt;
	StrCpy $0 $R3&lt;br /&gt;
	goto FileFunc_GetSize_end&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_error:&lt;br /&gt;
	SetErrors&lt;br /&gt;
	StrCpy $0 &#039;&#039;&lt;br /&gt;
	StrCpy $1 &#039;&#039;&lt;br /&gt;
	StrCpy $2 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_end:&lt;br /&gt;
	SetDetailsPrint both&lt;br /&gt;
	Pop $R9&lt;br /&gt;
	Pop $R8&lt;br /&gt;
	Pop $R7&lt;br /&gt;
	Pop $R6&lt;br /&gt;
	Pop $R5&lt;br /&gt;
	Pop $R4&lt;br /&gt;
	Pop $R3&lt;br /&gt;
	; insert code&lt;br /&gt;
	Pop $R2&lt;br /&gt;
	; end insert&lt;br /&gt;
	Pop $9&lt;br /&gt;
	Pop $8&lt;br /&gt;
	Pop $7&lt;br /&gt;
	Pop $6&lt;br /&gt;
	Pop $5&lt;br /&gt;
	Pop $4&lt;br /&gt;
	Pop $3&lt;br /&gt;
	Exch $2&lt;br /&gt;
	Exch&lt;br /&gt;
	Exch $1&lt;br /&gt;
	Exch 2&lt;br /&gt;
	Exch $0&lt;br /&gt;
&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
; ---------------&lt;br /&gt;
; GetFileAttributes (FileFunc.nsh)&lt;br /&gt;
&lt;br /&gt;
!define GetFileAttributes `!insertmacro GetFileAttributesCall`&lt;br /&gt;
!define un.GetFileAttributes `!insertmacro GetFileAttributesCall`&lt;br /&gt;
&lt;br /&gt;
!macro GetFileAttributes&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro un.GetFileAttributes&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetFileAttributes_&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
	&lt;br /&gt;
	Exch $1&lt;br /&gt;
	Exch&lt;br /&gt;
	Exch $0&lt;br /&gt;
	Exch&lt;br /&gt;
	Push $2&lt;br /&gt;
	Push $3&lt;br /&gt;
	Push $4&lt;br /&gt;
	Push $5&lt;br /&gt;
&lt;br /&gt;
	System::Call &#039;kernel32::GetFileAttributes(t r0)i .r2&#039;&lt;br /&gt;
	StrCmp $2 -1 FileFunc_GetFileAttributes_error&lt;br /&gt;
	StrCpy $3 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x4000&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;ENCRYPTED|&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x2000&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;NOT_CONTENT_INDEXED|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x1000&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;OFFLINE|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0800&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;COMPRESSED|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0400&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;REPARSE_POINT|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0200&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;SPARSE_FILE|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0100&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;TEMPORARY|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0080&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;NORMAL|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0040&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;DEVICE|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0020&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;ARCHIVE|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0010&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;DIRECTORY|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0004&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;SYSTEM|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0002&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;HIDDEN|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0001&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;READONLY|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	StrCpy $0 $3 -1&lt;br /&gt;
	StrCmp $1 &#039;&#039; FileFunc_GetFileAttributes_end&lt;br /&gt;
	StrCmp $1 &#039;ALL&#039; FileFunc_GetFileAttributes_end&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetFileAttributes_attrcmp:&lt;br /&gt;
	StrCpy $5 0&lt;br /&gt;
	IntOp $5 $5 + 1&lt;br /&gt;
	StrCpy $4 $1 1 $5&lt;br /&gt;
	StrCmp $4 &#039;&#039; +2&lt;br /&gt;
	StrCmp $4 &#039;|&#039;  0 -3&lt;br /&gt;
	StrCpy $2 $1 $5&lt;br /&gt;
	IntOp $5 $5 + 1&lt;br /&gt;
	StrCpy $1 $1 &#039;&#039; $5&lt;br /&gt;
	StrLen $3 $2&lt;br /&gt;
	StrCpy $5 -1&lt;br /&gt;
	IntOp $5 $5 + 1&lt;br /&gt;
	StrCpy $4 $0 $3 $5&lt;br /&gt;
	StrCmp $4 &#039;&#039; FileFunc_GetFileAttributes_notfound&lt;br /&gt;
	StrCmp $4 $2 0 -3&lt;br /&gt;
	StrCmp $1 &#039;&#039; 0 FileFunc_GetFileAttributes_attrcmp&lt;br /&gt;
	StrCpy $0 1&lt;br /&gt;
	goto FileFunc_GetFileAttributes_end&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetFileAttributes_notfound:&lt;br /&gt;
	StrCpy $0 0&lt;br /&gt;
	goto FileFunc_GetFileAttributes_end&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetFileAttributes_error:&lt;br /&gt;
	SetErrors&lt;br /&gt;
	StrCpy $0 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetFileAttributes_end:&lt;br /&gt;
	Pop $5&lt;br /&gt;
	Pop $4&lt;br /&gt;
	Pop $3&lt;br /&gt;
	Pop $2&lt;br /&gt;
	Pop $1&lt;br /&gt;
	Exch $0&lt;br /&gt;
		&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!define GetFileVersion `!insertmacro GetFileVersionCall`&lt;br /&gt;
!define un.GetFileVersion `!insertmacro GetFileVersionCall`&lt;br /&gt;
&lt;br /&gt;
!macro GetFileVersion&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro un.GetFileVersion&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetFileVersion_&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
	&lt;br /&gt;
	Exch $0&lt;br /&gt;
	Push $1&lt;br /&gt;
	Push $2&lt;br /&gt;
	Push $3&lt;br /&gt;
	Push $4&lt;br /&gt;
	Push $5&lt;br /&gt;
	Push $6&lt;br /&gt;
	ClearErrors&lt;br /&gt;
&lt;br /&gt;
	GetDllVersion &#039;$0&#039; $1 $2&lt;br /&gt;
	IfErrors FileFunc_GetFileVersion_error&lt;br /&gt;
	IntOp $3 $1 &amp;gt;&amp;gt; 16&lt;br /&gt;
	IntOp $3 $3 &amp;amp; 0x0000FFFF&lt;br /&gt;
	IntOp $4 $1 &amp;amp; 0x0000FFFF&lt;br /&gt;
	IntOp $5 $2 &amp;gt;&amp;gt; 16&lt;br /&gt;
	IntOp $5 $5 &amp;amp; 0x0000FFFF&lt;br /&gt;
	IntOp $6 $2 &amp;amp; 0x0000FFFF&lt;br /&gt;
	StrCpy $0 &#039;$3.$4.$5.$6&#039;&lt;br /&gt;
	goto FileFunc_GetFileVersion_end&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetFileVersion_error:&lt;br /&gt;
	SetErrors&lt;br /&gt;
	StrCpy $0 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetFileVersion_end:&lt;br /&gt;
	Pop $6&lt;br /&gt;
	Pop $5&lt;br /&gt;
	Pop $4&lt;br /&gt;
	Pop $3&lt;br /&gt;
	Pop $2&lt;br /&gt;
	Pop $1&lt;br /&gt;
	Exch $0&lt;br /&gt;
&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
; ---------------&lt;br /&gt;
; GetClusterSize&lt;br /&gt;
&lt;br /&gt;
!define GetClusterSize `!insertmacro GetClusterSizeCall`&lt;br /&gt;
!define un.GetClusterSize `!insertmacro GetClusterSizeCall`&lt;br /&gt;
&lt;br /&gt;
!macro GetClusterSize&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro un.GetClusterSize&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetClusterSize_&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
&lt;br /&gt;
	System::Call &#039;kernel32::GetDiskFreeSpace(i0,*i0r0,*i0r1,*i0r2,*i)&#039;&lt;br /&gt;
	IntOp $0 $0 * $1&lt;br /&gt;
	Push $0&lt;br /&gt;
&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&amp;lt;/highlight-nsis&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-size: 110%&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Credits:&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;em&amp;gt;GetFileAttributes&amp;lt;/em&amp;gt; is borrowed from &amp;lt;b&amp;gt;filefunc.nsh&amp;lt;/b&amp;gt;.&lt;br /&gt;
&amp;lt;em&amp;gt;GetSizeOnDisk&amp;lt;/em&amp;gt; has been altered slightly and renamed. The original macro is called &amp;lt;em&amp;gt;GetSize&amp;lt;/em&amp;gt;. You will find it in the Users Manual under E.1.3.&lt;/div&gt;</summary>
		<author><name>Bnicer</name></author>
	</entry>
	<entry>
		<id>https://nsis.sourceforge.io/mediawiki/index.php?title=User:Bnicer&amp;diff=22884</id>
		<title>User:Bnicer</title>
		<link rel="alternate" type="text/html" href="https://nsis.sourceforge.io/mediawiki/index.php?title=User:Bnicer&amp;diff=22884"/>
		<updated>2013-02-08T07:13:43Z</updated>

		<summary type="html">&lt;p&gt;Bnicer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;span style=&amp;quot;font-size: 130%&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Get Size On Disk&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This example code shows you how to get the space used by directories and files.&lt;br /&gt;
&amp;lt;highlight-nsis&amp;gt;&lt;br /&gt;
; A utility for computing the NSIS (or NSIS Unicode) 32-bit install folder size and the&lt;br /&gt;
; size of the uninstaller&lt;br /&gt;
; nsissize.nsi&lt;br /&gt;
; Compile &amp;amp; run the .exe&lt;br /&gt;
&lt;br /&gt;
; Note: where either the folder or the uninstaller have been compressed, size on disk&lt;br /&gt;
; results will not be shown, as they would be incorrect&lt;br /&gt;
&lt;br /&gt;
Name &amp;quot;SOD Tool&amp;quot;&lt;br /&gt;
RequestExecutionLevel user&lt;br /&gt;
!define LOCAL &amp;quot;&amp;quot; ; Path where local include files reside&lt;br /&gt;
OutFile &amp;quot;${LOCAL}nsissize.exe&amp;quot;&lt;br /&gt;
!include &amp;quot;${LOCAL}macros.nsh&amp;quot;&lt;br /&gt;
ReserveFile &amp;quot;${NSISDIR}\Plugins\Math.dll&amp;quot;&lt;br /&gt;
#Icon &amp;quot;${LOCAL}arrows.ico&amp;quot;&lt;br /&gt;
ShowInstDetails show&lt;br /&gt;
&lt;br /&gt;
; Variables&lt;br /&gt;
Var NSIS&lt;br /&gt;
Var ZIP&lt;br /&gt;
Var ZIP_UN&lt;br /&gt;
Var COUNT&lt;br /&gt;
Var BLOCK&lt;br /&gt;
Var FILES&lt;br /&gt;
Var FOLDERS&lt;br /&gt;
Var SIZE_B&lt;br /&gt;
Var SIZE_M&lt;br /&gt;
Var SOD_B&lt;br /&gt;
Var SOD_K&lt;br /&gt;
Var SOD_M&lt;br /&gt;
Var SIZE_UN_B&lt;br /&gt;
Var SIZE_UN_K&lt;br /&gt;
Var SOD_UN_B&lt;br /&gt;
Var SOD_UN_K&lt;br /&gt;
&lt;br /&gt;
Function Separator ; comma&lt;br /&gt;
  StrCpy $R2 $R1&lt;br /&gt;
  StrCpy $COUNT &amp;quot;16&amp;quot; ; 1,000,000,000,000,000 limit&lt;br /&gt;
  StrLen $R4 $R1&lt;br /&gt;
  loop:&lt;br /&gt;
  IntCmp $COUNT 3 endloop endloop 0&lt;br /&gt;
  IntCmp $R4 $COUNT 0 +7 0&lt;br /&gt;
  IntOp $COUNT $COUNT - 1&lt;br /&gt;
  StrCpy $R2 $R2 -$COUNT&lt;br /&gt;
  StrCpy $R3 $R1 &amp;quot;&amp;quot; -$COUNT&lt;br /&gt;
  StrCpy $R2 &amp;quot;$R2,$R3&amp;quot;&lt;br /&gt;
  IntOp $COUNT $COUNT - 2&lt;br /&gt;
  Goto loop&lt;br /&gt;
  IntOp $COUNT $COUNT - 3&lt;br /&gt;
  Goto loop&lt;br /&gt;
  endloop:&lt;br /&gt;
FunctionEnd&lt;br /&gt;
&lt;br /&gt;
Section&lt;br /&gt;
; root&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS Unicode&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS Unicode&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS ANSI&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS ANSI&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  Goto done&lt;br /&gt;
  begin:&lt;br /&gt;
  IfFileExists &amp;quot;$NSIS&amp;quot; 0 done&lt;br /&gt;
  ${GetFileAttributes} &amp;quot;$NSIS&amp;quot; &amp;quot;COMPRESSED&amp;quot; $ZIP&lt;br /&gt;
  ${GetClusterSize} $BLOCK&lt;br /&gt;
  ${GetSizeOnDisk} &amp;quot;$NSIS&amp;quot; &amp;quot;/S=0B&amp;quot; &amp;quot;&amp;quot; $0 $1 $2&lt;br /&gt;
  Math::Script &amp;quot;r3 = ff($0 / 1024 / 1024.0, 16 +2&amp;quot;&lt;br /&gt;
  StrCpy $SIZE_B $0&lt;br /&gt;
  StrCpy $FILES $1&lt;br /&gt;
  StrCpy $FOLDERS $2&lt;br /&gt;
  StrCpy $SIZE_M $3&lt;br /&gt;
  ${GetSizeOnDisk} &amp;quot;$NSIS&amp;quot; &amp;quot;/S=0B&amp;quot; &amp;quot;$BLOCK&amp;quot; $0 $1 $2&lt;br /&gt;
  Math::Script &amp;quot;r4 = ff($0 / 1024.0, 16 +0); r5 = ff(r4 / 1024.0, 16 +2)&amp;quot;&lt;br /&gt;
  StrCpy $SOD_B $0&lt;br /&gt;
  StrCpy $SOD_K $4&lt;br /&gt;
  StrCpy $SOD_M $5&lt;br /&gt;
; uninstaller&lt;br /&gt;
  IfFileExists &amp;quot;$NSIS\uninst-nsis.exe&amp;quot; 0 done&lt;br /&gt;
  ${GetFileAttributes} &amp;quot;$NSIS\uninst-nsis.exe&amp;quot; &amp;quot;COMPRESSED&amp;quot; $ZIP_UN&lt;br /&gt;
  ${GetSizeOnDisk} &amp;quot;$NSIS&amp;quot; &amp;quot;/M=uninst-nsis.exe /S=0B&amp;quot; &amp;quot;&amp;quot; $0 $1 $2&lt;br /&gt;
  Math::Script &amp;quot;r6 = ff($0 / 1024.0, 16 +1); \&lt;br /&gt;
  a = $0; b = $BLOCK; c = a % b; #[c == 0, c = $BLOCK]; r7 = (b - c + a); \&lt;br /&gt;
  r8 = ff(r7 / 1024.0, 16 +1)&amp;quot;&lt;br /&gt;
  StrCpy $SIZE_UN_B $0&lt;br /&gt;
  StrCpy $SIZE_UN_K $6&lt;br /&gt;
  StrCpy $SOD_UN_B $7&lt;br /&gt;
  StrCpy $SOD_UN_K $8&lt;br /&gt;
  ; format&lt;br /&gt;
  StrCpy $R1 $SIZE_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SIZE_B $R2&lt;br /&gt;
&lt;br /&gt;
  StrCpy $R1 $SOD_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SOD_B $R2&lt;br /&gt;
&lt;br /&gt;
  StrCpy $R1 $SOD_K&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SOD_K $R2&lt;br /&gt;
&lt;br /&gt;
  StrCpy $R1 $SIZE_UN_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SIZE_UN_B $R2&lt;br /&gt;
  StrCpy $R1 $SOD_UN_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SOD_UN_B $R2&lt;br /&gt;
; output&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;$NSIS&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;Size: $SIZE_M MB ($SIZE_B bytes)&amp;quot;&lt;br /&gt;
  StrCmp $ZIP &amp;quot;1&amp;quot; +3&lt;br /&gt;
  StrCmp $ZIP_UN &amp;quot;1&amp;quot; +2&lt;br /&gt;
  DetailPrint &amp;quot;SOD: $SOD_M MB ($SOD_B bytes)&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;Uninstaller&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;Size: $SIZE_UN_K KB ($SIZE_UN_B bytes)&amp;quot;&lt;br /&gt;
  StrCmp $ZIP &amp;quot;1&amp;quot; +3&lt;br /&gt;
  StrCmp $ZIP_UN &amp;quot;1&amp;quot; +2&lt;br /&gt;
  DetailPrint &amp;quot;SOD: $SOD_UN_K KB ($SOD_UN_B bytes)&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;$FILES files $FOLDERS folders $SOD_K Kb&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  Goto completed&lt;br /&gt;
  done:&lt;br /&gt;
  DetailPrint &amp;quot;File not found.&amp;quot;&lt;br /&gt;
  completed:&lt;br /&gt;
SectionEnd&lt;br /&gt;
&lt;br /&gt;
;--------------------------------&lt;br /&gt;
# EOF&lt;br /&gt;
&amp;lt;/highlight-nsis&amp;gt;&lt;br /&gt;
You should copy the next code into a separate file called &amp;lt;b&amp;gt;macros.nsh&amp;lt;/b&amp;gt;.&lt;br /&gt;
&amp;lt;highlight-nsis&amp;gt;&lt;br /&gt;
; Macros include file&lt;br /&gt;
;--------------------------------&lt;br /&gt;
/*&lt;br /&gt;
&lt;br /&gt;
 FileFunction=[GetSizeOnDisk|GetClusterSize|GetFileAttributes]&lt;br /&gt;
&lt;br /&gt;
*/&lt;br /&gt;
;_____________________________________________________________________________&lt;br /&gt;
;&lt;br /&gt;
;                         Macros&lt;br /&gt;
;_____________________________________________________________________________&lt;br /&gt;
;&lt;br /&gt;
; Change log window verbosity (default: 3=no script)&lt;br /&gt;
;&lt;br /&gt;
; Example:&lt;br /&gt;
; !include &amp;quot;sizemacros.nsh&amp;quot;&lt;br /&gt;
; !insertmacro GetSizeOnDisk&lt;br /&gt;
; ${FILEFUNC_VERBOSE} 4   # all verbosity&lt;br /&gt;
; !insertmacro GetClusterSize&lt;br /&gt;
; ${FILEFUNC_VERBOSE} 3   # no script&lt;br /&gt;
&lt;br /&gt;
!include Util.nsh ; for &amp;quot;CallArtificialFunction&amp;quot;&lt;br /&gt;
&lt;br /&gt;
!verbose push&lt;br /&gt;
!verbose 3&lt;br /&gt;
!ifndef _FILEFUNC_VERBOSE&lt;br /&gt;
	!define _FILEFUNC_VERBOSE 3&lt;br /&gt;
!endif&lt;br /&gt;
!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
!define FILEFUNC_VERBOSE `!insertmacro FILEFUNC_VERBOSE`&lt;br /&gt;
!verbose pop&lt;br /&gt;
&lt;br /&gt;
!macro FILEFUNC_VERBOSE _VERBOSE&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose 3&lt;br /&gt;
	!undef _FILEFUNC_VERBOSE&lt;br /&gt;
	!define _FILEFUNC_VERBOSE ${_VERBOSE}&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetSizeOnDiskCall _PATH _OPTIONS _FILESYSTEM _RESULT1 _RESULT2 _RESULT3&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
	Push `${_PATH}`&lt;br /&gt;
	Push `${_OPTIONS}`&lt;br /&gt;
	Push `${_FILESYSTEM}` ; block size&lt;br /&gt;
	${CallArtificialFunction} GetSizeOnDisk_&lt;br /&gt;
	Pop ${_RESULT1}&lt;br /&gt;
	Pop ${_RESULT2}&lt;br /&gt;
	Pop ${_RESULT3}&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetClusterSizeCall _RESULT&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
	${CallArtificialFunction} GetClusterSize_&lt;br /&gt;
	Pop ${_RESULT}&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetFileAttributesCall _PATH _ATTR _RESULT&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
	Push `${_PATH}`&lt;br /&gt;
	Push `${_ATTR}`&lt;br /&gt;
	${CallArtificialFunction} GetFileAttributes_&lt;br /&gt;
	Pop ${_RESULT}&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
; ---------------&lt;br /&gt;
; GetSizeOnDisk (modified &amp;quot;GetSize&amp;quot; - FileFunc.nsh - KiCHiK - Function &amp;quot;FindFiles&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
!define GetSizeOnDisk `!insertmacro GetSizeOnDiskCall`&lt;br /&gt;
!define un.GetSizeOnDisk `!insertmacro GetSizeOnDiskCall`&lt;br /&gt;
&lt;br /&gt;
!macro GetSizeOnDisk&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro un.GetSizeOnDisk&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
; Usage: similar to &amp;quot;GetSize&amp;quot;&lt;br /&gt;
&lt;br /&gt;
; For documentation, see the NSIS user manual: E.1.3 GetSize&lt;br /&gt;
; Three values are returned&lt;br /&gt;
&lt;br /&gt;
; $var1		; Result1: Size/Size on disk&lt;br /&gt;
; $var2		; Result2: Sum of files&lt;br /&gt;
; $var3		; Result3: Sum of directories&lt;br /&gt;
&lt;br /&gt;
; Example: ${GetSizeOnDisk} &amp;quot;$INSTDIR&amp;quot; &amp;quot;/S=0K&amp;quot; &amp;quot;4096&amp;quot; $0 $1 $2&lt;br /&gt;
&lt;br /&gt;
; Specifying 4096 (logical size) toggles the result&lt;br /&gt;
; Output is size on disk (4KB clusters), if used, or size in bytes, if left empty &amp;quot;&amp;quot;&lt;br /&gt;
; Caution: All writable variables go on the stack; make sure you save them before&lt;br /&gt;
&lt;br /&gt;
!macro GetSizeOnDisk_&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
&lt;br /&gt;
	; replace&lt;br /&gt;
	Exch $R1&lt;br /&gt;
	Exch&lt;br /&gt;
	Exch $1&lt;br /&gt;
	Exch 2&lt;br /&gt;
	; end replace&lt;br /&gt;
	Exch $0&lt;br /&gt;
	Exch&lt;br /&gt;
	Push $2&lt;br /&gt;
	Push $3&lt;br /&gt;
	Push $4&lt;br /&gt;
	Push $5&lt;br /&gt;
	Push $6&lt;br /&gt;
	Push $7&lt;br /&gt;
	Push $8&lt;br /&gt;
	Push $9&lt;br /&gt;
	; insert code&lt;br /&gt;
	Push $R2&lt;br /&gt;
	; end insert&lt;br /&gt;
	Push $R3&lt;br /&gt;
	Push $R4&lt;br /&gt;
	Push $R5&lt;br /&gt;
	Push $R6&lt;br /&gt;
	Push $R7&lt;br /&gt;
	Push $R8&lt;br /&gt;
	Push $R9&lt;br /&gt;
	ClearErrors&lt;br /&gt;
&lt;br /&gt;
	StrCpy $R9 $0 1 -1&lt;br /&gt;
	StrCmp $R9 &#039;\&#039; 0 +3&lt;br /&gt;
	StrCpy $0 $0 -1&lt;br /&gt;
	goto -3&lt;br /&gt;
	IfFileExists &#039;$0\*.*&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
&lt;br /&gt;
	StrCpy $3 &#039;&#039;&lt;br /&gt;
	StrCpy $4 &#039;&#039;&lt;br /&gt;
	StrCpy $5 &#039;&#039;&lt;br /&gt;
	StrCpy $6 &#039;&#039;&lt;br /&gt;
	StrCpy $8 0&lt;br /&gt;
	StrCpy $R3 &#039;&#039;&lt;br /&gt;
	StrCpy $R4 &#039;&#039;&lt;br /&gt;
	StrCpy $R5 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_option:&lt;br /&gt;
	StrCpy $R9 $1 1&lt;br /&gt;
	StrCpy $1 $1 &#039;&#039; 1&lt;br /&gt;
	StrCmp $R9 &#039; &#039; -2&lt;br /&gt;
	StrCmp $R9 &#039;&#039; FileFunc_GetSize_sizeset&lt;br /&gt;
	StrCmp $R9 &#039;/&#039; 0 -4&lt;br /&gt;
&lt;br /&gt;
	StrCpy $9 -1&lt;br /&gt;
	IntOp $9 $9 + 1&lt;br /&gt;
	StrCpy $R9 $1 1 $9&lt;br /&gt;
	StrCmp $R9 &#039;&#039; +2&lt;br /&gt;
	StrCmp $R9 &#039;/&#039; 0 -3&lt;br /&gt;
	StrCpy $8 $1 $9&lt;br /&gt;
	StrCpy $8 $8 &#039;&#039; 2&lt;br /&gt;
	StrCpy $R9 $8 &#039;&#039; -1&lt;br /&gt;
	StrCmp $R9 &#039; &#039; 0 +3&lt;br /&gt;
	StrCpy $8 $8 -1&lt;br /&gt;
	goto -3&lt;br /&gt;
	StrCpy $R9 $1 2&lt;br /&gt;
	StrCpy $1 $1 &#039;&#039; $9&lt;br /&gt;
&lt;br /&gt;
	StrCmp $R9 &#039;M=&#039; 0 FileFunc_GetSize_size&lt;br /&gt;
	StrCpy $4 $8&lt;br /&gt;
	goto FileFunc_GetSize_option&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_size:&lt;br /&gt;
	StrCmp $R9 &#039;S=&#039; 0 FileFunc_GetSize_gotosubdir&lt;br /&gt;
	StrCpy $6 $8&lt;br /&gt;
	goto FileFunc_GetSize_option&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_gotosubdir:&lt;br /&gt;
	StrCmp $R9 &#039;G=&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
	StrCpy $7 $8&lt;br /&gt;
	StrCmp $7 &#039;&#039; +3&lt;br /&gt;
	StrCmp $7 &#039;1&#039; +2&lt;br /&gt;
	StrCmp $7 &#039;0&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
	goto FileFunc_GetSize_option&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_sizeset:&lt;br /&gt;
	StrCmp $6 &#039;&#039; FileFunc_GetSize_default&lt;br /&gt;
	StrCpy $9 0&lt;br /&gt;
	StrCpy $R9 $6 1 $9&lt;br /&gt;
	StrCmp $R9 &#039;&#039; +4&lt;br /&gt;
	StrCmp $R9 &#039;:&#039; +3&lt;br /&gt;
	IntOp $9 $9 + 1&lt;br /&gt;
	goto -4&lt;br /&gt;
	StrCpy $5 $6 $9&lt;br /&gt;
	IntOp $9 $9 + 1&lt;br /&gt;
	StrCpy $1 $6 1 -1&lt;br /&gt;
	StrCpy $6 $6 -1 $9&lt;br /&gt;
	StrCmp $5 &#039;&#039; +2&lt;br /&gt;
	IntOp $5 $5 + 0&lt;br /&gt;
	StrCmp $6 &#039;&#039; +2&lt;br /&gt;
	IntOp $6 $6 + 0&lt;br /&gt;
&lt;br /&gt;
	StrCmp $1 &#039;B&#039; 0 +4&lt;br /&gt;
	StrCpy $1 1&lt;br /&gt;
	StrCpy $2 bytes&lt;br /&gt;
	goto FileFunc_GetSize_default&lt;br /&gt;
	StrCmp $1 &#039;K&#039; 0 +4&lt;br /&gt;
	StrCpy $1 1024&lt;br /&gt;
	StrCpy $2 Kb&lt;br /&gt;
	goto FileFunc_GetSize_default&lt;br /&gt;
	StrCmp $1 &#039;M&#039; 0 +4&lt;br /&gt;
	StrCpy $1 1048576&lt;br /&gt;
	StrCpy $2 Mb&lt;br /&gt;
	goto FileFunc_GetSize_default&lt;br /&gt;
	StrCmp $1 &#039;G&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
	StrCpy $1 1073741824&lt;br /&gt;
	StrCpy $2 Gb&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_default:&lt;br /&gt;
	StrCmp $4 &#039;&#039; 0 +2&lt;br /&gt;
	StrCpy $4 &#039;*.*&#039;&lt;br /&gt;
	StrCmp $7 &#039;&#039; 0 +2&lt;br /&gt;
	StrCpy $7 &#039;1&#039;&lt;br /&gt;
&lt;br /&gt;
	StrCpy $8 1&lt;br /&gt;
	Push $0&lt;br /&gt;
	SetDetailsPrint textonly&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_nextdir:&lt;br /&gt;
	IntOp $8 $8 - 1&lt;br /&gt;
	Pop $R8&lt;br /&gt;
	FindFirst $0 $R7 &#039;$R8\$4&#039;&lt;br /&gt;
	IfErrors FileFunc_GetSize_show&lt;br /&gt;
	StrCmp $R7 &#039;.&#039; 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	StrCmp $R7 &#039;..&#039; 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
	goto FileFunc_GetSize_show&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_dir:&lt;br /&gt;
	IfFileExists &#039;$R8\$R7\*.*&#039; 0 FileFunc_GetSize_file&lt;br /&gt;
	IntOp $R5 $R5 + 1&lt;br /&gt;
	goto FileFunc_GetSize_findnext&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_file:&lt;br /&gt;
	StrCpy $R6 0&lt;br /&gt;
	StrCmp $5$6 &#039;&#039; 0 +3&lt;br /&gt;
	IntOp $R4 $R4 + 1&lt;br /&gt;
	goto FileFunc_GetSize_findnext&lt;br /&gt;
	FileOpen $9 &#039;$R8\$R7&#039; r&lt;br /&gt;
	IfErrors +3&lt;br /&gt;
	FileSeek $9 0 END $R6&lt;br /&gt;
	FileClose $9&lt;br /&gt;
	StrCmp $5 &#039;&#039; +2&lt;br /&gt;
	IntCmp $R6 $5 0 FileFunc_GetSize_findnext&lt;br /&gt;
	StrCmp $6 &#039;&#039; +2&lt;br /&gt;
	IntCmp $R6 $6 0 0 FileFunc_GetSize_findnext&lt;br /&gt;
	IntOp $R4 $R4 + 1&lt;br /&gt;
	; insert code&lt;br /&gt;
	StrCmp $R1 &amp;quot;&amp;quot; +10 0&lt;br /&gt;
	StrCpy $R0 $R1&lt;br /&gt;
	IntOp $R6 $R6 + $R0&lt;br /&gt;
	IntOp $R1 $R6 % $R0&lt;br /&gt;
	StrCmp $R1 0 0 +2&lt;br /&gt;
	StrCpy $R1 $R0&lt;br /&gt;
	IntOp $R2 $R0 - $R1&lt;br /&gt;
	IntOp $R6 $R6 - $R0&lt;br /&gt;
	IntOp $R6 $R6 + $R2&lt;br /&gt;
	StrCpy $R1 $R0&lt;br /&gt;
	; end insert&lt;br /&gt;
	System::Int64Op $R3 + $R6&lt;br /&gt;
	Pop $R3&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_findnext:&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_show:&lt;br /&gt;
	StrCmp $5$6 &#039;&#039; FileFunc_GetSize_nosize&lt;br /&gt;
	System::Int64Op $R3 / $1&lt;br /&gt;
	Pop $9&lt;br /&gt;
	DetailPrint &#039;Size:$9 $2  Files:$R4  Folders:$R5&#039;&lt;br /&gt;
	goto FileFunc_GetSize_subdir&lt;br /&gt;
	FileFunc_GetSize_nosize:&lt;br /&gt;
	DetailPrint &#039;Files:$R4  Folders:$R5&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_subdir:&lt;br /&gt;
	StrCmp $7 0 FileFunc_GetSize_preend&lt;br /&gt;
	FindFirst $0 $R7 &#039;$R8\*.*&#039;&lt;br /&gt;
	StrCmp $R7 &#039;.&#039; 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	StrCmp $R7 &#039;..&#039; 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
	StrCmp $8 0 FileFunc_GetSize_preend FileFunc_GetSize_nextdir&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_pushdir:&lt;br /&gt;
	IfFileExists &#039;$R8\$R7\*.*&#039; 0 +3&lt;br /&gt;
	Push &#039;$R8\$R7&#039;&lt;br /&gt;
	IntOp $8 $8 + 1&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
	StrCmp $8 0 FileFunc_GetSize_preend FileFunc_GetSize_nextdir&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_preend:&lt;br /&gt;
	StrCmp $R3 &#039;&#039; FileFunc_GetSize_nosizeend&lt;br /&gt;
	System::Int64Op $R3 / $1&lt;br /&gt;
	Pop $R3&lt;br /&gt;
	FileFunc_GetSize_nosizeend:&lt;br /&gt;
	StrCpy $2 $R4&lt;br /&gt;
	StrCpy $1 $R5&lt;br /&gt;
	StrCpy $0 $R3&lt;br /&gt;
	goto FileFunc_GetSize_end&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_error:&lt;br /&gt;
	SetErrors&lt;br /&gt;
	StrCpy $0 &#039;&#039;&lt;br /&gt;
	StrCpy $1 &#039;&#039;&lt;br /&gt;
	StrCpy $2 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_end:&lt;br /&gt;
	SetDetailsPrint both&lt;br /&gt;
	Pop $R9&lt;br /&gt;
	Pop $R8&lt;br /&gt;
	Pop $R7&lt;br /&gt;
	Pop $R6&lt;br /&gt;
	Pop $R5&lt;br /&gt;
	Pop $R4&lt;br /&gt;
	Pop $R3&lt;br /&gt;
	; insert code&lt;br /&gt;
	Pop $R2&lt;br /&gt;
	; end insert&lt;br /&gt;
	Pop $9&lt;br /&gt;
	Pop $8&lt;br /&gt;
	Pop $7&lt;br /&gt;
	Pop $6&lt;br /&gt;
	Pop $5&lt;br /&gt;
	Pop $4&lt;br /&gt;
	Pop $3&lt;br /&gt;
	Exch $2&lt;br /&gt;
	Exch&lt;br /&gt;
	Exch $1&lt;br /&gt;
	Exch 2&lt;br /&gt;
	Exch $0&lt;br /&gt;
&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
; ---------------&lt;br /&gt;
; GetFileAttributes (FileFunc.nsh)&lt;br /&gt;
&lt;br /&gt;
!define GetFileAttributes `!insertmacro GetFileAttributesCall`&lt;br /&gt;
!define un.GetFileAttributes `!insertmacro GetFileAttributesCall`&lt;br /&gt;
&lt;br /&gt;
!macro GetFileAttributes&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro un.GetFileAttributes&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetFileAttributes_&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
	&lt;br /&gt;
	Exch $1&lt;br /&gt;
	Exch&lt;br /&gt;
	Exch $0&lt;br /&gt;
	Exch&lt;br /&gt;
	Push $2&lt;br /&gt;
	Push $3&lt;br /&gt;
	Push $4&lt;br /&gt;
	Push $5&lt;br /&gt;
&lt;br /&gt;
	System::Call &#039;kernel32::GetFileAttributes(t r0)i .r2&#039;&lt;br /&gt;
	StrCmp $2 -1 FileFunc_GetFileAttributes_error&lt;br /&gt;
	StrCpy $3 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x4000&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;ENCRYPTED|&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x2000&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;NOT_CONTENT_INDEXED|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x1000&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;OFFLINE|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0800&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;COMPRESSED|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0400&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;REPARSE_POINT|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0200&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;SPARSE_FILE|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0100&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;TEMPORARY|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0080&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;NORMAL|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0040&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;DEVICE|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0020&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;ARCHIVE|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0010&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;DIRECTORY|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0004&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;SYSTEM|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0002&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;HIDDEN|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0001&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;READONLY|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	StrCpy $0 $3 -1&lt;br /&gt;
	StrCmp $1 &#039;&#039; FileFunc_GetFileAttributes_end&lt;br /&gt;
	StrCmp $1 &#039;ALL&#039; FileFunc_GetFileAttributes_end&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetFileAttributes_attrcmp:&lt;br /&gt;
	StrCpy $5 0&lt;br /&gt;
	IntOp $5 $5 + 1&lt;br /&gt;
	StrCpy $4 $1 1 $5&lt;br /&gt;
	StrCmp $4 &#039;&#039; +2&lt;br /&gt;
	StrCmp $4 &#039;|&#039;  0 -3&lt;br /&gt;
	StrCpy $2 $1 $5&lt;br /&gt;
	IntOp $5 $5 + 1&lt;br /&gt;
	StrCpy $1 $1 &#039;&#039; $5&lt;br /&gt;
	StrLen $3 $2&lt;br /&gt;
	StrCpy $5 -1&lt;br /&gt;
	IntOp $5 $5 + 1&lt;br /&gt;
	StrCpy $4 $0 $3 $5&lt;br /&gt;
	StrCmp $4 &#039;&#039; FileFunc_GetFileAttributes_notfound&lt;br /&gt;
	StrCmp $4 $2 0 -3&lt;br /&gt;
	StrCmp $1 &#039;&#039; 0 FileFunc_GetFileAttributes_attrcmp&lt;br /&gt;
	StrCpy $0 1&lt;br /&gt;
	goto FileFunc_GetFileAttributes_end&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetFileAttributes_notfound:&lt;br /&gt;
	StrCpy $0 0&lt;br /&gt;
	goto FileFunc_GetFileAttributes_end&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetFileAttributes_error:&lt;br /&gt;
	SetErrors&lt;br /&gt;
	StrCpy $0 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetFileAttributes_end:&lt;br /&gt;
	Pop $5&lt;br /&gt;
	Pop $4&lt;br /&gt;
	Pop $3&lt;br /&gt;
	Pop $2&lt;br /&gt;
	Pop $1&lt;br /&gt;
	Exch $0&lt;br /&gt;
		&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!define GetFileVersion `!insertmacro GetFileVersionCall`&lt;br /&gt;
!define un.GetFileVersion `!insertmacro GetFileVersionCall`&lt;br /&gt;
&lt;br /&gt;
!macro GetFileVersion&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro un.GetFileVersion&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetFileVersion_&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
	&lt;br /&gt;
	Exch $0&lt;br /&gt;
	Push $1&lt;br /&gt;
	Push $2&lt;br /&gt;
	Push $3&lt;br /&gt;
	Push $4&lt;br /&gt;
	Push $5&lt;br /&gt;
	Push $6&lt;br /&gt;
	ClearErrors&lt;br /&gt;
&lt;br /&gt;
	GetDllVersion &#039;$0&#039; $1 $2&lt;br /&gt;
	IfErrors FileFunc_GetFileVersion_error&lt;br /&gt;
	IntOp $3 $1 &amp;gt;&amp;gt; 16&lt;br /&gt;
	IntOp $3 $3 &amp;amp; 0x0000FFFF&lt;br /&gt;
	IntOp $4 $1 &amp;amp; 0x0000FFFF&lt;br /&gt;
	IntOp $5 $2 &amp;gt;&amp;gt; 16&lt;br /&gt;
	IntOp $5 $5 &amp;amp; 0x0000FFFF&lt;br /&gt;
	IntOp $6 $2 &amp;amp; 0x0000FFFF&lt;br /&gt;
	StrCpy $0 &#039;$3.$4.$5.$6&#039;&lt;br /&gt;
	goto FileFunc_GetFileVersion_end&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetFileVersion_error:&lt;br /&gt;
	SetErrors&lt;br /&gt;
	StrCpy $0 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetFileVersion_end:&lt;br /&gt;
	Pop $6&lt;br /&gt;
	Pop $5&lt;br /&gt;
	Pop $4&lt;br /&gt;
	Pop $3&lt;br /&gt;
	Pop $2&lt;br /&gt;
	Pop $1&lt;br /&gt;
	Exch $0&lt;br /&gt;
&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
; ---------------&lt;br /&gt;
; GetClusterSize&lt;br /&gt;
&lt;br /&gt;
!define GetClusterSize `!insertmacro GetClusterSizeCall`&lt;br /&gt;
!define un.GetClusterSize `!insertmacro GetClusterSizeCall`&lt;br /&gt;
&lt;br /&gt;
!macro GetClusterSize&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro un.GetClusterSize&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetClusterSize_&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
&lt;br /&gt;
	System::Call &#039;kernel32::GetDiskFreeSpace(i0,*i0r0,*i0r1,*i0r2,*i)&#039;&lt;br /&gt;
	IntOp $0 $0 * $1&lt;br /&gt;
	Push $0&lt;br /&gt;
&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&amp;lt;/highlight-nsis&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-size: 110%&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Credits:&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;em&amp;gt;GetFileAttributes&amp;lt;/em&amp;gt; is borrowed from &amp;lt;b&amp;gt;filefunc.nsh&amp;lt;/b&amp;gt;.&lt;br /&gt;
&amp;lt;em&amp;gt;GetSizeOnDisk&amp;lt;/em&amp;gt; has been altered slightly and renamed. The original macro is called &amp;lt;em&amp;gt;GetSize&amp;lt;/em&amp;gt;. You will find it in the Users Manual under E.1.3.&lt;/div&gt;</summary>
		<author><name>Bnicer</name></author>
	</entry>
	<entry>
		<id>https://nsis.sourceforge.io/mediawiki/index.php?title=User:Bnicer&amp;diff=22883</id>
		<title>User:Bnicer</title>
		<link rel="alternate" type="text/html" href="https://nsis.sourceforge.io/mediawiki/index.php?title=User:Bnicer&amp;diff=22883"/>
		<updated>2013-02-08T07:05:15Z</updated>

		<summary type="html">&lt;p&gt;Bnicer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;span style=&amp;quot;font-size: 130%&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Get Size On Disk&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This example code shows you how to automatically get the space used by files and folders.&lt;br /&gt;
&amp;lt;highlight-nsis&amp;gt;&lt;br /&gt;
; A utility for computing the NSIS (or NSIS Unicode) 32-bit install folder size and the&lt;br /&gt;
; size of the uninstaller&lt;br /&gt;
; nsissize.nsi&lt;br /&gt;
; Compile &amp;amp; run the .exe&lt;br /&gt;
&lt;br /&gt;
; Note: where either the folder or the uninstaller have been compressed, size on disk&lt;br /&gt;
; results will not be shown, as they would be incorrect&lt;br /&gt;
&lt;br /&gt;
Name &amp;quot;SOD Tool&amp;quot;&lt;br /&gt;
RequestExecutionLevel user&lt;br /&gt;
!define LOCAL &amp;quot;&amp;quot; ; Path where local include files reside&lt;br /&gt;
OutFile &amp;quot;${LOCAL}nsissize.exe&amp;quot;&lt;br /&gt;
!include &amp;quot;${LOCAL}macros.nsh&amp;quot;&lt;br /&gt;
ReserveFile &amp;quot;${NSISDIR}\Plugins\Math.dll&amp;quot;&lt;br /&gt;
#Icon &amp;quot;${LOCAL}arrows.ico&amp;quot;&lt;br /&gt;
ShowInstDetails show&lt;br /&gt;
&lt;br /&gt;
; Variables&lt;br /&gt;
Var NSIS&lt;br /&gt;
Var ZIP&lt;br /&gt;
Var ZIP_UN&lt;br /&gt;
Var COUNT&lt;br /&gt;
Var BLOCK&lt;br /&gt;
Var FILES&lt;br /&gt;
Var FOLDERS&lt;br /&gt;
Var SIZE_B&lt;br /&gt;
Var SIZE_M&lt;br /&gt;
Var SOD_B&lt;br /&gt;
Var SOD_K&lt;br /&gt;
Var SOD_M&lt;br /&gt;
Var SIZE_UN_B&lt;br /&gt;
Var SIZE_UN_K&lt;br /&gt;
Var SOD_UN_B&lt;br /&gt;
Var SOD_UN_K&lt;br /&gt;
&lt;br /&gt;
Function Separator ; comma&lt;br /&gt;
  StrCpy $R2 $R1&lt;br /&gt;
  StrCpy $COUNT &amp;quot;16&amp;quot; ; 1,000,000,000,000,000 limit&lt;br /&gt;
  StrLen $R4 $R1&lt;br /&gt;
  loop:&lt;br /&gt;
  IntCmp $COUNT 3 endloop endloop 0&lt;br /&gt;
  IntCmp $R4 $COUNT 0 +7 0&lt;br /&gt;
  IntOp $COUNT $COUNT - 1&lt;br /&gt;
  StrCpy $R2 $R2 -$COUNT&lt;br /&gt;
  StrCpy $R3 $R1 &amp;quot;&amp;quot; -$COUNT&lt;br /&gt;
  StrCpy $R2 &amp;quot;$R2,$R3&amp;quot;&lt;br /&gt;
  IntOp $COUNT $COUNT - 2&lt;br /&gt;
  Goto loop&lt;br /&gt;
  IntOp $COUNT $COUNT - 3&lt;br /&gt;
  Goto loop&lt;br /&gt;
  endloop:&lt;br /&gt;
FunctionEnd&lt;br /&gt;
&lt;br /&gt;
Section&lt;br /&gt;
; root&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS Unicode&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS Unicode&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS ANSI&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS ANSI&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  Goto done&lt;br /&gt;
  begin:&lt;br /&gt;
  IfFileExists &amp;quot;$NSIS&amp;quot; 0 done&lt;br /&gt;
  ${GetFileAttributes} &amp;quot;$NSIS&amp;quot; &amp;quot;COMPRESSED&amp;quot; $ZIP&lt;br /&gt;
  ${GetClusterSize} $BLOCK&lt;br /&gt;
  ${GetSizeOnDisk} &amp;quot;$NSIS&amp;quot; &amp;quot;/S=0B&amp;quot; &amp;quot;&amp;quot; $0 $1 $2&lt;br /&gt;
  Math::Script &amp;quot;r3 = ff($0 / 1024 / 1024.0, 16 +2&amp;quot;&lt;br /&gt;
  StrCpy $SIZE_B $0&lt;br /&gt;
  StrCpy $FILES $1&lt;br /&gt;
  StrCpy $FOLDERS $2&lt;br /&gt;
  StrCpy $SIZE_M $3&lt;br /&gt;
  ${GetSizeOnDisk} &amp;quot;$NSIS&amp;quot; &amp;quot;/S=0B&amp;quot; &amp;quot;$BLOCK&amp;quot; $0 $1 $2&lt;br /&gt;
  Math::Script &amp;quot;r4 = ff($0 / 1024.0, 16 +0); r5 = ff(r4 / 1024.0, 16 +2)&amp;quot;&lt;br /&gt;
  StrCpy $SOD_B $0&lt;br /&gt;
  StrCpy $SOD_K $4&lt;br /&gt;
  StrCpy $SOD_M $5&lt;br /&gt;
; uninstaller&lt;br /&gt;
  IfFileExists &amp;quot;$NSIS\uninst-nsis.exe&amp;quot; 0 done&lt;br /&gt;
  ${GetFileAttributes} &amp;quot;$NSIS\uninst-nsis.exe&amp;quot; &amp;quot;COMPRESSED&amp;quot; $ZIP_UN&lt;br /&gt;
  ${GetSizeOnDisk} &amp;quot;$NSIS&amp;quot; &amp;quot;/M=uninst-nsis.exe /S=0B&amp;quot; &amp;quot;&amp;quot; $0 $1 $2&lt;br /&gt;
  Math::Script &amp;quot;r6 = ff($0 / 1024.0, 16 +1); \&lt;br /&gt;
  a = $0; b = $BLOCK; c = a % b; #[c == 0, c = $BLOCK]; r7 = (b - c + a); \&lt;br /&gt;
  r8 = ff(r7 / 1024.0, 16 +1)&amp;quot;&lt;br /&gt;
  StrCpy $SIZE_UN_B $0&lt;br /&gt;
  StrCpy $SIZE_UN_K $6&lt;br /&gt;
  StrCpy $SOD_UN_B $7&lt;br /&gt;
  StrCpy $SOD_UN_K $8&lt;br /&gt;
  ; format&lt;br /&gt;
  StrCpy $R1 $SIZE_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SIZE_B $R2&lt;br /&gt;
&lt;br /&gt;
  StrCpy $R1 $SOD_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SOD_B $R2&lt;br /&gt;
&lt;br /&gt;
  StrCpy $R1 $SOD_K&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SOD_K $R2&lt;br /&gt;
&lt;br /&gt;
  StrCpy $R1 $SIZE_UN_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SIZE_UN_B $R2&lt;br /&gt;
  StrCpy $R1 $SOD_UN_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SOD_UN_B $R2&lt;br /&gt;
; output&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;$NSIS&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;Size: $SIZE_M MB ($SIZE_B bytes)&amp;quot;&lt;br /&gt;
  StrCmp $ZIP &amp;quot;1&amp;quot; +3&lt;br /&gt;
  StrCmp $ZIP_UN &amp;quot;1&amp;quot; +2&lt;br /&gt;
  DetailPrint &amp;quot;SOD: $SOD_M MB ($SOD_B bytes)&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;Uninstaller&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;Size: $SIZE_UN_K KB ($SIZE_UN_B bytes)&amp;quot;&lt;br /&gt;
  StrCmp $ZIP &amp;quot;1&amp;quot; +3&lt;br /&gt;
  StrCmp $ZIP_UN &amp;quot;1&amp;quot; +2&lt;br /&gt;
  DetailPrint &amp;quot;SOD: $SOD_UN_K KB ($SOD_UN_B bytes)&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;$FILES files $FOLDERS folders $SOD_K Kb&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  Goto completed&lt;br /&gt;
  done:&lt;br /&gt;
  DetailPrint &amp;quot;File not found.&amp;quot;&lt;br /&gt;
  completed:&lt;br /&gt;
SectionEnd&lt;br /&gt;
&lt;br /&gt;
;--------------------------------&lt;br /&gt;
# EOF&lt;br /&gt;
&amp;lt;/highlight-nsis&amp;gt;&lt;br /&gt;
You should copy the next code into a separate file called &amp;lt;b&amp;gt;macros.nsh&amp;lt;/b&amp;gt;.&lt;br /&gt;
&amp;lt;highlight-nsis&amp;gt;&lt;br /&gt;
; Macros include file&lt;br /&gt;
;--------------------------------&lt;br /&gt;
/*&lt;br /&gt;
&lt;br /&gt;
 FileFunction=[GetSizeOnDisk|GetClusterSize|GetFileAttributes]&lt;br /&gt;
&lt;br /&gt;
*/&lt;br /&gt;
;_____________________________________________________________________________&lt;br /&gt;
;&lt;br /&gt;
;                         Macros&lt;br /&gt;
;_____________________________________________________________________________&lt;br /&gt;
;&lt;br /&gt;
; Change log window verbosity (default: 3=no script)&lt;br /&gt;
;&lt;br /&gt;
; Example:&lt;br /&gt;
; !include &amp;quot;sizemacros.nsh&amp;quot;&lt;br /&gt;
; !insertmacro GetSizeOnDisk&lt;br /&gt;
; ${FILEFUNC_VERBOSE} 4   # all verbosity&lt;br /&gt;
; !insertmacro GetClusterSize&lt;br /&gt;
; ${FILEFUNC_VERBOSE} 3   # no script&lt;br /&gt;
&lt;br /&gt;
!include Util.nsh ; for &amp;quot;CallArtificialFunction&amp;quot;&lt;br /&gt;
&lt;br /&gt;
!verbose push&lt;br /&gt;
!verbose 3&lt;br /&gt;
!ifndef _FILEFUNC_VERBOSE&lt;br /&gt;
	!define _FILEFUNC_VERBOSE 3&lt;br /&gt;
!endif&lt;br /&gt;
!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
!define FILEFUNC_VERBOSE `!insertmacro FILEFUNC_VERBOSE`&lt;br /&gt;
!verbose pop&lt;br /&gt;
&lt;br /&gt;
!macro FILEFUNC_VERBOSE _VERBOSE&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose 3&lt;br /&gt;
	!undef _FILEFUNC_VERBOSE&lt;br /&gt;
	!define _FILEFUNC_VERBOSE ${_VERBOSE}&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetSizeOnDiskCall _PATH _OPTIONS _FILESYSTEM _RESULT1 _RESULT2 _RESULT3&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
	Push `${_PATH}`&lt;br /&gt;
	Push `${_OPTIONS}`&lt;br /&gt;
	Push `${_FILESYSTEM}` ; block size&lt;br /&gt;
	${CallArtificialFunction} GetSizeOnDisk_&lt;br /&gt;
	Pop ${_RESULT1}&lt;br /&gt;
	Pop ${_RESULT2}&lt;br /&gt;
	Pop ${_RESULT3}&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetClusterSizeCall _RESULT&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
	${CallArtificialFunction} GetClusterSize_&lt;br /&gt;
	Pop ${_RESULT}&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetFileAttributesCall _PATH _ATTR _RESULT&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
	Push `${_PATH}`&lt;br /&gt;
	Push `${_ATTR}`&lt;br /&gt;
	${CallArtificialFunction} GetFileAttributes_&lt;br /&gt;
	Pop ${_RESULT}&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
; ---------------&lt;br /&gt;
; GetSizeOnDisk (modified &amp;quot;GetSize&amp;quot; - FileFunc.nsh - KiCHiK - Function &amp;quot;FindFiles&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
!define GetSizeOnDisk `!insertmacro GetSizeOnDiskCall`&lt;br /&gt;
!define un.GetSizeOnDisk `!insertmacro GetSizeOnDiskCall`&lt;br /&gt;
&lt;br /&gt;
!macro GetSizeOnDisk&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro un.GetSizeOnDisk&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
; Usage: similar to &amp;quot;GetSize&amp;quot;&lt;br /&gt;
&lt;br /&gt;
; For documentation, see the NSIS user manual: E.1.3 GetSize&lt;br /&gt;
; Three values are returned&lt;br /&gt;
&lt;br /&gt;
; $var1		; Result1: Size/Size on disk&lt;br /&gt;
; $var2		; Result2: Sum of files&lt;br /&gt;
; $var3		; Result3: Sum of directories&lt;br /&gt;
&lt;br /&gt;
; Example: ${GetSizeOnDisk} &amp;quot;$INSTDIR&amp;quot; &amp;quot;/S=0K&amp;quot; &amp;quot;4096&amp;quot; $0 $1 $2&lt;br /&gt;
&lt;br /&gt;
; Specifying 4096 (logical size) toggles the result&lt;br /&gt;
; Output is size on disk (4KB clusters), if used, or size in bytes, if left empty &amp;quot;&amp;quot;&lt;br /&gt;
; Caution: All writable variables go on the stack; make sure you save them before&lt;br /&gt;
&lt;br /&gt;
!macro GetSizeOnDisk_&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
&lt;br /&gt;
	; replace&lt;br /&gt;
	Exch $R1&lt;br /&gt;
	Exch&lt;br /&gt;
	Exch $1&lt;br /&gt;
	Exch 2&lt;br /&gt;
	; end replace&lt;br /&gt;
	Exch $0&lt;br /&gt;
	Exch&lt;br /&gt;
	Push $2&lt;br /&gt;
	Push $3&lt;br /&gt;
	Push $4&lt;br /&gt;
	Push $5&lt;br /&gt;
	Push $6&lt;br /&gt;
	Push $7&lt;br /&gt;
	Push $8&lt;br /&gt;
	Push $9&lt;br /&gt;
	; insert code&lt;br /&gt;
	Push $R2&lt;br /&gt;
	; end insert&lt;br /&gt;
	Push $R3&lt;br /&gt;
	Push $R4&lt;br /&gt;
	Push $R5&lt;br /&gt;
	Push $R6&lt;br /&gt;
	Push $R7&lt;br /&gt;
	Push $R8&lt;br /&gt;
	Push $R9&lt;br /&gt;
	ClearErrors&lt;br /&gt;
&lt;br /&gt;
	StrCpy $R9 $0 1 -1&lt;br /&gt;
	StrCmp $R9 &#039;\&#039; 0 +3&lt;br /&gt;
	StrCpy $0 $0 -1&lt;br /&gt;
	goto -3&lt;br /&gt;
	IfFileExists &#039;$0\*.*&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
&lt;br /&gt;
	StrCpy $3 &#039;&#039;&lt;br /&gt;
	StrCpy $4 &#039;&#039;&lt;br /&gt;
	StrCpy $5 &#039;&#039;&lt;br /&gt;
	StrCpy $6 &#039;&#039;&lt;br /&gt;
	StrCpy $8 0&lt;br /&gt;
	StrCpy $R3 &#039;&#039;&lt;br /&gt;
	StrCpy $R4 &#039;&#039;&lt;br /&gt;
	StrCpy $R5 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_option:&lt;br /&gt;
	StrCpy $R9 $1 1&lt;br /&gt;
	StrCpy $1 $1 &#039;&#039; 1&lt;br /&gt;
	StrCmp $R9 &#039; &#039; -2&lt;br /&gt;
	StrCmp $R9 &#039;&#039; FileFunc_GetSize_sizeset&lt;br /&gt;
	StrCmp $R9 &#039;/&#039; 0 -4&lt;br /&gt;
&lt;br /&gt;
	StrCpy $9 -1&lt;br /&gt;
	IntOp $9 $9 + 1&lt;br /&gt;
	StrCpy $R9 $1 1 $9&lt;br /&gt;
	StrCmp $R9 &#039;&#039; +2&lt;br /&gt;
	StrCmp $R9 &#039;/&#039; 0 -3&lt;br /&gt;
	StrCpy $8 $1 $9&lt;br /&gt;
	StrCpy $8 $8 &#039;&#039; 2&lt;br /&gt;
	StrCpy $R9 $8 &#039;&#039; -1&lt;br /&gt;
	StrCmp $R9 &#039; &#039; 0 +3&lt;br /&gt;
	StrCpy $8 $8 -1&lt;br /&gt;
	goto -3&lt;br /&gt;
	StrCpy $R9 $1 2&lt;br /&gt;
	StrCpy $1 $1 &#039;&#039; $9&lt;br /&gt;
&lt;br /&gt;
	StrCmp $R9 &#039;M=&#039; 0 FileFunc_GetSize_size&lt;br /&gt;
	StrCpy $4 $8&lt;br /&gt;
	goto FileFunc_GetSize_option&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_size:&lt;br /&gt;
	StrCmp $R9 &#039;S=&#039; 0 FileFunc_GetSize_gotosubdir&lt;br /&gt;
	StrCpy $6 $8&lt;br /&gt;
	goto FileFunc_GetSize_option&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_gotosubdir:&lt;br /&gt;
	StrCmp $R9 &#039;G=&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
	StrCpy $7 $8&lt;br /&gt;
	StrCmp $7 &#039;&#039; +3&lt;br /&gt;
	StrCmp $7 &#039;1&#039; +2&lt;br /&gt;
	StrCmp $7 &#039;0&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
	goto FileFunc_GetSize_option&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_sizeset:&lt;br /&gt;
	StrCmp $6 &#039;&#039; FileFunc_GetSize_default&lt;br /&gt;
	StrCpy $9 0&lt;br /&gt;
	StrCpy $R9 $6 1 $9&lt;br /&gt;
	StrCmp $R9 &#039;&#039; +4&lt;br /&gt;
	StrCmp $R9 &#039;:&#039; +3&lt;br /&gt;
	IntOp $9 $9 + 1&lt;br /&gt;
	goto -4&lt;br /&gt;
	StrCpy $5 $6 $9&lt;br /&gt;
	IntOp $9 $9 + 1&lt;br /&gt;
	StrCpy $1 $6 1 -1&lt;br /&gt;
	StrCpy $6 $6 -1 $9&lt;br /&gt;
	StrCmp $5 &#039;&#039; +2&lt;br /&gt;
	IntOp $5 $5 + 0&lt;br /&gt;
	StrCmp $6 &#039;&#039; +2&lt;br /&gt;
	IntOp $6 $6 + 0&lt;br /&gt;
&lt;br /&gt;
	StrCmp $1 &#039;B&#039; 0 +4&lt;br /&gt;
	StrCpy $1 1&lt;br /&gt;
	StrCpy $2 bytes&lt;br /&gt;
	goto FileFunc_GetSize_default&lt;br /&gt;
	StrCmp $1 &#039;K&#039; 0 +4&lt;br /&gt;
	StrCpy $1 1024&lt;br /&gt;
	StrCpy $2 Kb&lt;br /&gt;
	goto FileFunc_GetSize_default&lt;br /&gt;
	StrCmp $1 &#039;M&#039; 0 +4&lt;br /&gt;
	StrCpy $1 1048576&lt;br /&gt;
	StrCpy $2 Mb&lt;br /&gt;
	goto FileFunc_GetSize_default&lt;br /&gt;
	StrCmp $1 &#039;G&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
	StrCpy $1 1073741824&lt;br /&gt;
	StrCpy $2 Gb&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_default:&lt;br /&gt;
	StrCmp $4 &#039;&#039; 0 +2&lt;br /&gt;
	StrCpy $4 &#039;*.*&#039;&lt;br /&gt;
	StrCmp $7 &#039;&#039; 0 +2&lt;br /&gt;
	StrCpy $7 &#039;1&#039;&lt;br /&gt;
&lt;br /&gt;
	StrCpy $8 1&lt;br /&gt;
	Push $0&lt;br /&gt;
	SetDetailsPrint textonly&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_nextdir:&lt;br /&gt;
	IntOp $8 $8 - 1&lt;br /&gt;
	Pop $R8&lt;br /&gt;
	FindFirst $0 $R7 &#039;$R8\$4&#039;&lt;br /&gt;
	IfErrors FileFunc_GetSize_show&lt;br /&gt;
	StrCmp $R7 &#039;.&#039; 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	StrCmp $R7 &#039;..&#039; 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
	goto FileFunc_GetSize_show&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_dir:&lt;br /&gt;
	IfFileExists &#039;$R8\$R7\*.*&#039; 0 FileFunc_GetSize_file&lt;br /&gt;
	IntOp $R5 $R5 + 1&lt;br /&gt;
	goto FileFunc_GetSize_findnext&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_file:&lt;br /&gt;
	StrCpy $R6 0&lt;br /&gt;
	StrCmp $5$6 &#039;&#039; 0 +3&lt;br /&gt;
	IntOp $R4 $R4 + 1&lt;br /&gt;
	goto FileFunc_GetSize_findnext&lt;br /&gt;
	FileOpen $9 &#039;$R8\$R7&#039; r&lt;br /&gt;
	IfErrors +3&lt;br /&gt;
	FileSeek $9 0 END $R6&lt;br /&gt;
	FileClose $9&lt;br /&gt;
	StrCmp $5 &#039;&#039; +2&lt;br /&gt;
	IntCmp $R6 $5 0 FileFunc_GetSize_findnext&lt;br /&gt;
	StrCmp $6 &#039;&#039; +2&lt;br /&gt;
	IntCmp $R6 $6 0 0 FileFunc_GetSize_findnext&lt;br /&gt;
	IntOp $R4 $R4 + 1&lt;br /&gt;
	; insert code&lt;br /&gt;
	StrCmp $R1 &amp;quot;&amp;quot; +10 0&lt;br /&gt;
	StrCpy $R0 $R1&lt;br /&gt;
	IntOp $R6 $R6 + $R0&lt;br /&gt;
	IntOp $R1 $R6 % $R0&lt;br /&gt;
	StrCmp $R1 0 0 +2&lt;br /&gt;
	StrCpy $R1 $R0&lt;br /&gt;
	IntOp $R2 $R0 - $R1&lt;br /&gt;
	IntOp $R6 $R6 - $R0&lt;br /&gt;
	IntOp $R6 $R6 + $R2&lt;br /&gt;
	StrCpy $R1 $R0&lt;br /&gt;
	; end insert&lt;br /&gt;
	System::Int64Op $R3 + $R6&lt;br /&gt;
	Pop $R3&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_findnext:&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_show:&lt;br /&gt;
	StrCmp $5$6 &#039;&#039; FileFunc_GetSize_nosize&lt;br /&gt;
	System::Int64Op $R3 / $1&lt;br /&gt;
	Pop $9&lt;br /&gt;
	DetailPrint &#039;Size:$9 $2  Files:$R4  Folders:$R5&#039;&lt;br /&gt;
	goto FileFunc_GetSize_subdir&lt;br /&gt;
	FileFunc_GetSize_nosize:&lt;br /&gt;
	DetailPrint &#039;Files:$R4  Folders:$R5&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_subdir:&lt;br /&gt;
	StrCmp $7 0 FileFunc_GetSize_preend&lt;br /&gt;
	FindFirst $0 $R7 &#039;$R8\*.*&#039;&lt;br /&gt;
	StrCmp $R7 &#039;.&#039; 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	StrCmp $R7 &#039;..&#039; 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
	StrCmp $8 0 FileFunc_GetSize_preend FileFunc_GetSize_nextdir&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_pushdir:&lt;br /&gt;
	IfFileExists &#039;$R8\$R7\*.*&#039; 0 +3&lt;br /&gt;
	Push &#039;$R8\$R7&#039;&lt;br /&gt;
	IntOp $8 $8 + 1&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
	StrCmp $8 0 FileFunc_GetSize_preend FileFunc_GetSize_nextdir&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_preend:&lt;br /&gt;
	StrCmp $R3 &#039;&#039; FileFunc_GetSize_nosizeend&lt;br /&gt;
	System::Int64Op $R3 / $1&lt;br /&gt;
	Pop $R3&lt;br /&gt;
	FileFunc_GetSize_nosizeend:&lt;br /&gt;
	StrCpy $2 $R4&lt;br /&gt;
	StrCpy $1 $R5&lt;br /&gt;
	StrCpy $0 $R3&lt;br /&gt;
	goto FileFunc_GetSize_end&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_error:&lt;br /&gt;
	SetErrors&lt;br /&gt;
	StrCpy $0 &#039;&#039;&lt;br /&gt;
	StrCpy $1 &#039;&#039;&lt;br /&gt;
	StrCpy $2 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_end:&lt;br /&gt;
	SetDetailsPrint both&lt;br /&gt;
	Pop $R9&lt;br /&gt;
	Pop $R8&lt;br /&gt;
	Pop $R7&lt;br /&gt;
	Pop $R6&lt;br /&gt;
	Pop $R5&lt;br /&gt;
	Pop $R4&lt;br /&gt;
	Pop $R3&lt;br /&gt;
	; insert code&lt;br /&gt;
	Pop $R2&lt;br /&gt;
	; end insert&lt;br /&gt;
	Pop $9&lt;br /&gt;
	Pop $8&lt;br /&gt;
	Pop $7&lt;br /&gt;
	Pop $6&lt;br /&gt;
	Pop $5&lt;br /&gt;
	Pop $4&lt;br /&gt;
	Pop $3&lt;br /&gt;
	Exch $2&lt;br /&gt;
	Exch&lt;br /&gt;
	Exch $1&lt;br /&gt;
	Exch 2&lt;br /&gt;
	Exch $0&lt;br /&gt;
&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
; ---------------&lt;br /&gt;
; GetFileAttributes (FileFunc.nsh)&lt;br /&gt;
&lt;br /&gt;
!define GetFileAttributes `!insertmacro GetFileAttributesCall`&lt;br /&gt;
!define un.GetFileAttributes `!insertmacro GetFileAttributesCall`&lt;br /&gt;
&lt;br /&gt;
!macro GetFileAttributes&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro un.GetFileAttributes&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetFileAttributes_&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
	&lt;br /&gt;
	Exch $1&lt;br /&gt;
	Exch&lt;br /&gt;
	Exch $0&lt;br /&gt;
	Exch&lt;br /&gt;
	Push $2&lt;br /&gt;
	Push $3&lt;br /&gt;
	Push $4&lt;br /&gt;
	Push $5&lt;br /&gt;
&lt;br /&gt;
	System::Call &#039;kernel32::GetFileAttributes(t r0)i .r2&#039;&lt;br /&gt;
	StrCmp $2 -1 FileFunc_GetFileAttributes_error&lt;br /&gt;
	StrCpy $3 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x4000&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;ENCRYPTED|&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x2000&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;NOT_CONTENT_INDEXED|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x1000&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;OFFLINE|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0800&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;COMPRESSED|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0400&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;REPARSE_POINT|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0200&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;SPARSE_FILE|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0100&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;TEMPORARY|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0080&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;NORMAL|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0040&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;DEVICE|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0020&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;ARCHIVE|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0010&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;DIRECTORY|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0004&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;SYSTEM|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0002&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;HIDDEN|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0001&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;READONLY|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	StrCpy $0 $3 -1&lt;br /&gt;
	StrCmp $1 &#039;&#039; FileFunc_GetFileAttributes_end&lt;br /&gt;
	StrCmp $1 &#039;ALL&#039; FileFunc_GetFileAttributes_end&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetFileAttributes_attrcmp:&lt;br /&gt;
	StrCpy $5 0&lt;br /&gt;
	IntOp $5 $5 + 1&lt;br /&gt;
	StrCpy $4 $1 1 $5&lt;br /&gt;
	StrCmp $4 &#039;&#039; +2&lt;br /&gt;
	StrCmp $4 &#039;|&#039;  0 -3&lt;br /&gt;
	StrCpy $2 $1 $5&lt;br /&gt;
	IntOp $5 $5 + 1&lt;br /&gt;
	StrCpy $1 $1 &#039;&#039; $5&lt;br /&gt;
	StrLen $3 $2&lt;br /&gt;
	StrCpy $5 -1&lt;br /&gt;
	IntOp $5 $5 + 1&lt;br /&gt;
	StrCpy $4 $0 $3 $5&lt;br /&gt;
	StrCmp $4 &#039;&#039; FileFunc_GetFileAttributes_notfound&lt;br /&gt;
	StrCmp $4 $2 0 -3&lt;br /&gt;
	StrCmp $1 &#039;&#039; 0 FileFunc_GetFileAttributes_attrcmp&lt;br /&gt;
	StrCpy $0 1&lt;br /&gt;
	goto FileFunc_GetFileAttributes_end&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetFileAttributes_notfound:&lt;br /&gt;
	StrCpy $0 0&lt;br /&gt;
	goto FileFunc_GetFileAttributes_end&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetFileAttributes_error:&lt;br /&gt;
	SetErrors&lt;br /&gt;
	StrCpy $0 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetFileAttributes_end:&lt;br /&gt;
	Pop $5&lt;br /&gt;
	Pop $4&lt;br /&gt;
	Pop $3&lt;br /&gt;
	Pop $2&lt;br /&gt;
	Pop $1&lt;br /&gt;
	Exch $0&lt;br /&gt;
		&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!define GetFileVersion `!insertmacro GetFileVersionCall`&lt;br /&gt;
!define un.GetFileVersion `!insertmacro GetFileVersionCall`&lt;br /&gt;
&lt;br /&gt;
!macro GetFileVersion&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro un.GetFileVersion&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetFileVersion_&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
	&lt;br /&gt;
	Exch $0&lt;br /&gt;
	Push $1&lt;br /&gt;
	Push $2&lt;br /&gt;
	Push $3&lt;br /&gt;
	Push $4&lt;br /&gt;
	Push $5&lt;br /&gt;
	Push $6&lt;br /&gt;
	ClearErrors&lt;br /&gt;
&lt;br /&gt;
	GetDllVersion &#039;$0&#039; $1 $2&lt;br /&gt;
	IfErrors FileFunc_GetFileVersion_error&lt;br /&gt;
	IntOp $3 $1 &amp;gt;&amp;gt; 16&lt;br /&gt;
	IntOp $3 $3 &amp;amp; 0x0000FFFF&lt;br /&gt;
	IntOp $4 $1 &amp;amp; 0x0000FFFF&lt;br /&gt;
	IntOp $5 $2 &amp;gt;&amp;gt; 16&lt;br /&gt;
	IntOp $5 $5 &amp;amp; 0x0000FFFF&lt;br /&gt;
	IntOp $6 $2 &amp;amp; 0x0000FFFF&lt;br /&gt;
	StrCpy $0 &#039;$3.$4.$5.$6&#039;&lt;br /&gt;
	goto FileFunc_GetFileVersion_end&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetFileVersion_error:&lt;br /&gt;
	SetErrors&lt;br /&gt;
	StrCpy $0 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetFileVersion_end:&lt;br /&gt;
	Pop $6&lt;br /&gt;
	Pop $5&lt;br /&gt;
	Pop $4&lt;br /&gt;
	Pop $3&lt;br /&gt;
	Pop $2&lt;br /&gt;
	Pop $1&lt;br /&gt;
	Exch $0&lt;br /&gt;
&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
; ---------------&lt;br /&gt;
; GetClusterSize&lt;br /&gt;
&lt;br /&gt;
!define GetClusterSize `!insertmacro GetClusterSizeCall`&lt;br /&gt;
!define un.GetClusterSize `!insertmacro GetClusterSizeCall`&lt;br /&gt;
&lt;br /&gt;
!macro GetClusterSize&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro un.GetClusterSize&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetClusterSize_&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
&lt;br /&gt;
	System::Call &#039;kernel32::GetDiskFreeSpace(i0,*i0r0,*i0r1,*i0r2,*i)&#039;&lt;br /&gt;
	IntOp $0 $0 * $1&lt;br /&gt;
	Push $0&lt;br /&gt;
&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&amp;lt;/highlight-nsis&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-size: 110%&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Credits:&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;em&amp;gt;GetFileAttributes&amp;lt;/em&amp;gt; is borrowed from &amp;lt;b&amp;gt;filefunc.nsh&amp;lt;/b&amp;gt;.&lt;br /&gt;
&amp;lt;em&amp;gt;GetSizeOnDisk&amp;lt;/em&amp;gt; has been altered slightly and renamed. The original macro is called &amp;lt;em&amp;gt;GetSize&amp;lt;/em&amp;gt;. You will find it in the Users Manual under E.1.3.&lt;/div&gt;</summary>
		<author><name>Bnicer</name></author>
	</entry>
	<entry>
		<id>https://nsis.sourceforge.io/mediawiki/index.php?title=User:Bnicer&amp;diff=22882</id>
		<title>User:Bnicer</title>
		<link rel="alternate" type="text/html" href="https://nsis.sourceforge.io/mediawiki/index.php?title=User:Bnicer&amp;diff=22882"/>
		<updated>2013-02-08T06:51:32Z</updated>

		<summary type="html">&lt;p&gt;Bnicer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;span style=&amp;quot;font-size: 130%&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Get Size On Disk&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There are two types of sizes. The physical size of files in bytes vs. the logical size on disk used.&lt;br /&gt;
This NSIS example code shows you how to get both sizes all in one go.&lt;br /&gt;
&amp;lt;highlight-nsis&amp;gt;&lt;br /&gt;
; A utility for computing the NSIS (or NSIS Unicode) 32-bit install folder size and the&lt;br /&gt;
; size of the uninstaller&lt;br /&gt;
; nsissize.nsi&lt;br /&gt;
; Compile &amp;amp; run the .exe&lt;br /&gt;
&lt;br /&gt;
; Note: where either the folder or the uninstaller have been compressed, size on disk&lt;br /&gt;
; results will not be shown, as they would be incorrect&lt;br /&gt;
&lt;br /&gt;
Name &amp;quot;SOD Tool&amp;quot;&lt;br /&gt;
RequestExecutionLevel user&lt;br /&gt;
!define LOCAL &amp;quot;&amp;quot; ; Path where local include files reside&lt;br /&gt;
OutFile &amp;quot;${LOCAL}nsissize.exe&amp;quot;&lt;br /&gt;
!include &amp;quot;${LOCAL}macros.nsh&amp;quot;&lt;br /&gt;
ReserveFile &amp;quot;${NSISDIR}\Plugins\Math.dll&amp;quot;&lt;br /&gt;
#Icon &amp;quot;${LOCAL}arrows.ico&amp;quot;&lt;br /&gt;
ShowInstDetails show&lt;br /&gt;
&lt;br /&gt;
; Variables&lt;br /&gt;
Var NSIS&lt;br /&gt;
Var ZIP&lt;br /&gt;
Var ZIP_UN&lt;br /&gt;
Var COUNT&lt;br /&gt;
Var BLOCK&lt;br /&gt;
Var FILES&lt;br /&gt;
Var FOLDERS&lt;br /&gt;
Var SIZE_B&lt;br /&gt;
Var SIZE_M&lt;br /&gt;
Var SOD_B&lt;br /&gt;
Var SOD_K&lt;br /&gt;
Var SOD_M&lt;br /&gt;
Var SIZE_UN_B&lt;br /&gt;
Var SIZE_UN_K&lt;br /&gt;
Var SOD_UN_B&lt;br /&gt;
Var SOD_UN_K&lt;br /&gt;
&lt;br /&gt;
Function Separator ; comma&lt;br /&gt;
  StrCpy $R2 $R1&lt;br /&gt;
  StrCpy $COUNT &amp;quot;16&amp;quot; ; 1,000,000,000,000,000 limit&lt;br /&gt;
  StrLen $R4 $R1&lt;br /&gt;
  loop:&lt;br /&gt;
  IntCmp $COUNT 3 endloop endloop 0&lt;br /&gt;
  IntCmp $R4 $COUNT 0 +7 0&lt;br /&gt;
  IntOp $COUNT $COUNT - 1&lt;br /&gt;
  StrCpy $R2 $R2 -$COUNT&lt;br /&gt;
  StrCpy $R3 $R1 &amp;quot;&amp;quot; -$COUNT&lt;br /&gt;
  StrCpy $R2 &amp;quot;$R2,$R3&amp;quot;&lt;br /&gt;
  IntOp $COUNT $COUNT - 2&lt;br /&gt;
  Goto loop&lt;br /&gt;
  IntOp $COUNT $COUNT - 3&lt;br /&gt;
  Goto loop&lt;br /&gt;
  endloop:&lt;br /&gt;
FunctionEnd&lt;br /&gt;
&lt;br /&gt;
Section&lt;br /&gt;
; root&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS Unicode&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS Unicode&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS ANSI&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS ANSI&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  Goto done&lt;br /&gt;
  begin:&lt;br /&gt;
  IfFileExists &amp;quot;$NSIS&amp;quot; 0 done&lt;br /&gt;
  ${GetFileAttributes} &amp;quot;$NSIS&amp;quot; &amp;quot;COMPRESSED&amp;quot; $ZIP&lt;br /&gt;
  ${GetClusterSize} $BLOCK&lt;br /&gt;
  ${GetSizeOnDisk} &amp;quot;$NSIS&amp;quot; &amp;quot;/S=0B&amp;quot; &amp;quot;&amp;quot; $0 $1 $2&lt;br /&gt;
  Math::Script &amp;quot;r3 = ff($0 / 1024 / 1024.0, 16 +2&amp;quot;&lt;br /&gt;
  StrCpy $SIZE_B $0&lt;br /&gt;
  StrCpy $FILES $1&lt;br /&gt;
  StrCpy $FOLDERS $2&lt;br /&gt;
  StrCpy $SIZE_M $3&lt;br /&gt;
  ${GetSizeOnDisk} &amp;quot;$NSIS&amp;quot; &amp;quot;/S=0B&amp;quot; &amp;quot;$BLOCK&amp;quot; $0 $1 $2&lt;br /&gt;
  Math::Script &amp;quot;r4 = ff($0 / 1024.0, 16 +0); r5 = ff(r4 / 1024.0, 16 +2)&amp;quot;&lt;br /&gt;
  StrCpy $SOD_B $0&lt;br /&gt;
  StrCpy $SOD_K $4&lt;br /&gt;
  StrCpy $SOD_M $5&lt;br /&gt;
; uninstaller&lt;br /&gt;
  IfFileExists &amp;quot;$NSIS\uninst-nsis.exe&amp;quot; 0 done&lt;br /&gt;
  ${GetFileAttributes} &amp;quot;$NSIS\uninst-nsis.exe&amp;quot; &amp;quot;COMPRESSED&amp;quot; $ZIP_UN&lt;br /&gt;
  ${GetSizeOnDisk} &amp;quot;$NSIS&amp;quot; &amp;quot;/M=uninst-nsis.exe /S=0B&amp;quot; &amp;quot;&amp;quot; $0 $1 $2&lt;br /&gt;
  Math::Script &amp;quot;r6 = ff($0 / 1024.0, 16 +1); \&lt;br /&gt;
  a = $0; b = $BLOCK; c = a % b; #[c == 0, c = $BLOCK]; r7 = (b - c + a); \&lt;br /&gt;
  r8 = ff(r7 / 1024.0, 16 +1)&amp;quot;&lt;br /&gt;
  StrCpy $SIZE_UN_B $0&lt;br /&gt;
  StrCpy $SIZE_UN_K $6&lt;br /&gt;
  StrCpy $SOD_UN_B $7&lt;br /&gt;
  StrCpy $SOD_UN_K $8&lt;br /&gt;
  ; format&lt;br /&gt;
  StrCpy $R1 $SIZE_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SIZE_B $R2&lt;br /&gt;
&lt;br /&gt;
  StrCpy $R1 $SOD_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SOD_B $R2&lt;br /&gt;
&lt;br /&gt;
  StrCpy $R1 $SOD_K&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SOD_K $R2&lt;br /&gt;
&lt;br /&gt;
  StrCpy $R1 $SIZE_UN_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SIZE_UN_B $R2&lt;br /&gt;
  StrCpy $R1 $SOD_UN_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SOD_UN_B $R2&lt;br /&gt;
; output&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;$NSIS&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;Size: $SIZE_M MB ($SIZE_B bytes)&amp;quot;&lt;br /&gt;
  StrCmp $ZIP &amp;quot;1&amp;quot; +3&lt;br /&gt;
  StrCmp $ZIP_UN &amp;quot;1&amp;quot; +2&lt;br /&gt;
  DetailPrint &amp;quot;SOD: $SOD_M MB ($SOD_B bytes)&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;Uninstaller&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;Size: $SIZE_UN_K KB ($SIZE_UN_B bytes)&amp;quot;&lt;br /&gt;
  StrCmp $ZIP &amp;quot;1&amp;quot; +3&lt;br /&gt;
  StrCmp $ZIP_UN &amp;quot;1&amp;quot; +2&lt;br /&gt;
  DetailPrint &amp;quot;SOD: $SOD_UN_K KB ($SOD_UN_B bytes)&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;$FILES files $FOLDERS folders $SOD_K Kb&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  Goto completed&lt;br /&gt;
  done:&lt;br /&gt;
  DetailPrint &amp;quot;File not found.&amp;quot;&lt;br /&gt;
  completed:&lt;br /&gt;
SectionEnd&lt;br /&gt;
&lt;br /&gt;
;--------------------------------&lt;br /&gt;
# EOF&lt;br /&gt;
&amp;lt;/highlight-nsis&amp;gt;&lt;br /&gt;
You should copy the next code into a separate file called &amp;lt;b&amp;gt;macros.nsh&amp;lt;/b&amp;gt;.&lt;br /&gt;
&amp;lt;highlight-nsis&amp;gt;&lt;br /&gt;
; Macros include file&lt;br /&gt;
;--------------------------------&lt;br /&gt;
/*&lt;br /&gt;
&lt;br /&gt;
 FileFunction=[GetSizeOnDisk|GetClusterSize|GetFileAttributes]&lt;br /&gt;
&lt;br /&gt;
*/&lt;br /&gt;
;_____________________________________________________________________________&lt;br /&gt;
;&lt;br /&gt;
;                         Macros&lt;br /&gt;
;_____________________________________________________________________________&lt;br /&gt;
;&lt;br /&gt;
; Change log window verbosity (default: 3=no script)&lt;br /&gt;
;&lt;br /&gt;
; Example:&lt;br /&gt;
; !include &amp;quot;sizemacros.nsh&amp;quot;&lt;br /&gt;
; !insertmacro GetSizeOnDisk&lt;br /&gt;
; ${FILEFUNC_VERBOSE} 4   # all verbosity&lt;br /&gt;
; !insertmacro GetClusterSize&lt;br /&gt;
; ${FILEFUNC_VERBOSE} 3   # no script&lt;br /&gt;
&lt;br /&gt;
!include Util.nsh ; for &amp;quot;CallArtificialFunction&amp;quot;&lt;br /&gt;
&lt;br /&gt;
!verbose push&lt;br /&gt;
!verbose 3&lt;br /&gt;
!ifndef _FILEFUNC_VERBOSE&lt;br /&gt;
	!define _FILEFUNC_VERBOSE 3&lt;br /&gt;
!endif&lt;br /&gt;
!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
!define FILEFUNC_VERBOSE `!insertmacro FILEFUNC_VERBOSE`&lt;br /&gt;
!verbose pop&lt;br /&gt;
&lt;br /&gt;
!macro FILEFUNC_VERBOSE _VERBOSE&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose 3&lt;br /&gt;
	!undef _FILEFUNC_VERBOSE&lt;br /&gt;
	!define _FILEFUNC_VERBOSE ${_VERBOSE}&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetSizeOnDiskCall _PATH _OPTIONS _FILESYSTEM _RESULT1 _RESULT2 _RESULT3&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
	Push `${_PATH}`&lt;br /&gt;
	Push `${_OPTIONS}`&lt;br /&gt;
	Push `${_FILESYSTEM}` ; block size&lt;br /&gt;
	${CallArtificialFunction} GetSizeOnDisk_&lt;br /&gt;
	Pop ${_RESULT1}&lt;br /&gt;
	Pop ${_RESULT2}&lt;br /&gt;
	Pop ${_RESULT3}&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetClusterSizeCall _RESULT&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
	${CallArtificialFunction} GetClusterSize_&lt;br /&gt;
	Pop ${_RESULT}&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetFileAttributesCall _PATH _ATTR _RESULT&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
	Push `${_PATH}`&lt;br /&gt;
	Push `${_ATTR}`&lt;br /&gt;
	${CallArtificialFunction} GetFileAttributes_&lt;br /&gt;
	Pop ${_RESULT}&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
; ---------------&lt;br /&gt;
; GetSizeOnDisk (modified &amp;quot;GetSize&amp;quot; - FileFunc.nsh - KiCHiK - Function &amp;quot;FindFiles&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
!define GetSizeOnDisk `!insertmacro GetSizeOnDiskCall`&lt;br /&gt;
!define un.GetSizeOnDisk `!insertmacro GetSizeOnDiskCall`&lt;br /&gt;
&lt;br /&gt;
!macro GetSizeOnDisk&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro un.GetSizeOnDisk&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
; Usage: similar to &amp;quot;GetSize&amp;quot;&lt;br /&gt;
&lt;br /&gt;
; For documentation, see the NSIS user manual: E.1.3 GetSize&lt;br /&gt;
; Three values are returned&lt;br /&gt;
&lt;br /&gt;
; $var1		; Result1: Size/Size on disk&lt;br /&gt;
; $var2		; Result2: Sum of files&lt;br /&gt;
; $var3		; Result3: Sum of directories&lt;br /&gt;
&lt;br /&gt;
; Example: ${GetSizeOnDisk} &amp;quot;$INSTDIR&amp;quot; &amp;quot;/S=0K&amp;quot; &amp;quot;4096&amp;quot; $0 $1 $2&lt;br /&gt;
&lt;br /&gt;
; Specifying 4096 (logical size) toggles the result&lt;br /&gt;
; Output is size on disk (4KB clusters), if used, or size in bytes, if left empty &amp;quot;&amp;quot;&lt;br /&gt;
; Caution: All writable variables go on the stack; make sure you save them before&lt;br /&gt;
&lt;br /&gt;
!macro GetSizeOnDisk_&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
&lt;br /&gt;
	; replace&lt;br /&gt;
	Exch $R1&lt;br /&gt;
	Exch&lt;br /&gt;
	Exch $1&lt;br /&gt;
	Exch 2&lt;br /&gt;
	; end replace&lt;br /&gt;
	Exch $0&lt;br /&gt;
	Exch&lt;br /&gt;
	Push $2&lt;br /&gt;
	Push $3&lt;br /&gt;
	Push $4&lt;br /&gt;
	Push $5&lt;br /&gt;
	Push $6&lt;br /&gt;
	Push $7&lt;br /&gt;
	Push $8&lt;br /&gt;
	Push $9&lt;br /&gt;
	; insert code&lt;br /&gt;
	Push $R2&lt;br /&gt;
	; end insert&lt;br /&gt;
	Push $R3&lt;br /&gt;
	Push $R4&lt;br /&gt;
	Push $R5&lt;br /&gt;
	Push $R6&lt;br /&gt;
	Push $R7&lt;br /&gt;
	Push $R8&lt;br /&gt;
	Push $R9&lt;br /&gt;
	ClearErrors&lt;br /&gt;
&lt;br /&gt;
	StrCpy $R9 $0 1 -1&lt;br /&gt;
	StrCmp $R9 &#039;\&#039; 0 +3&lt;br /&gt;
	StrCpy $0 $0 -1&lt;br /&gt;
	goto -3&lt;br /&gt;
	IfFileExists &#039;$0\*.*&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
&lt;br /&gt;
	StrCpy $3 &#039;&#039;&lt;br /&gt;
	StrCpy $4 &#039;&#039;&lt;br /&gt;
	StrCpy $5 &#039;&#039;&lt;br /&gt;
	StrCpy $6 &#039;&#039;&lt;br /&gt;
	StrCpy $8 0&lt;br /&gt;
	StrCpy $R3 &#039;&#039;&lt;br /&gt;
	StrCpy $R4 &#039;&#039;&lt;br /&gt;
	StrCpy $R5 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_option:&lt;br /&gt;
	StrCpy $R9 $1 1&lt;br /&gt;
	StrCpy $1 $1 &#039;&#039; 1&lt;br /&gt;
	StrCmp $R9 &#039; &#039; -2&lt;br /&gt;
	StrCmp $R9 &#039;&#039; FileFunc_GetSize_sizeset&lt;br /&gt;
	StrCmp $R9 &#039;/&#039; 0 -4&lt;br /&gt;
&lt;br /&gt;
	StrCpy $9 -1&lt;br /&gt;
	IntOp $9 $9 + 1&lt;br /&gt;
	StrCpy $R9 $1 1 $9&lt;br /&gt;
	StrCmp $R9 &#039;&#039; +2&lt;br /&gt;
	StrCmp $R9 &#039;/&#039; 0 -3&lt;br /&gt;
	StrCpy $8 $1 $9&lt;br /&gt;
	StrCpy $8 $8 &#039;&#039; 2&lt;br /&gt;
	StrCpy $R9 $8 &#039;&#039; -1&lt;br /&gt;
	StrCmp $R9 &#039; &#039; 0 +3&lt;br /&gt;
	StrCpy $8 $8 -1&lt;br /&gt;
	goto -3&lt;br /&gt;
	StrCpy $R9 $1 2&lt;br /&gt;
	StrCpy $1 $1 &#039;&#039; $9&lt;br /&gt;
&lt;br /&gt;
	StrCmp $R9 &#039;M=&#039; 0 FileFunc_GetSize_size&lt;br /&gt;
	StrCpy $4 $8&lt;br /&gt;
	goto FileFunc_GetSize_option&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_size:&lt;br /&gt;
	StrCmp $R9 &#039;S=&#039; 0 FileFunc_GetSize_gotosubdir&lt;br /&gt;
	StrCpy $6 $8&lt;br /&gt;
	goto FileFunc_GetSize_option&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_gotosubdir:&lt;br /&gt;
	StrCmp $R9 &#039;G=&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
	StrCpy $7 $8&lt;br /&gt;
	StrCmp $7 &#039;&#039; +3&lt;br /&gt;
	StrCmp $7 &#039;1&#039; +2&lt;br /&gt;
	StrCmp $7 &#039;0&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
	goto FileFunc_GetSize_option&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_sizeset:&lt;br /&gt;
	StrCmp $6 &#039;&#039; FileFunc_GetSize_default&lt;br /&gt;
	StrCpy $9 0&lt;br /&gt;
	StrCpy $R9 $6 1 $9&lt;br /&gt;
	StrCmp $R9 &#039;&#039; +4&lt;br /&gt;
	StrCmp $R9 &#039;:&#039; +3&lt;br /&gt;
	IntOp $9 $9 + 1&lt;br /&gt;
	goto -4&lt;br /&gt;
	StrCpy $5 $6 $9&lt;br /&gt;
	IntOp $9 $9 + 1&lt;br /&gt;
	StrCpy $1 $6 1 -1&lt;br /&gt;
	StrCpy $6 $6 -1 $9&lt;br /&gt;
	StrCmp $5 &#039;&#039; +2&lt;br /&gt;
	IntOp $5 $5 + 0&lt;br /&gt;
	StrCmp $6 &#039;&#039; +2&lt;br /&gt;
	IntOp $6 $6 + 0&lt;br /&gt;
&lt;br /&gt;
	StrCmp $1 &#039;B&#039; 0 +4&lt;br /&gt;
	StrCpy $1 1&lt;br /&gt;
	StrCpy $2 bytes&lt;br /&gt;
	goto FileFunc_GetSize_default&lt;br /&gt;
	StrCmp $1 &#039;K&#039; 0 +4&lt;br /&gt;
	StrCpy $1 1024&lt;br /&gt;
	StrCpy $2 Kb&lt;br /&gt;
	goto FileFunc_GetSize_default&lt;br /&gt;
	StrCmp $1 &#039;M&#039; 0 +4&lt;br /&gt;
	StrCpy $1 1048576&lt;br /&gt;
	StrCpy $2 Mb&lt;br /&gt;
	goto FileFunc_GetSize_default&lt;br /&gt;
	StrCmp $1 &#039;G&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
	StrCpy $1 1073741824&lt;br /&gt;
	StrCpy $2 Gb&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_default:&lt;br /&gt;
	StrCmp $4 &#039;&#039; 0 +2&lt;br /&gt;
	StrCpy $4 &#039;*.*&#039;&lt;br /&gt;
	StrCmp $7 &#039;&#039; 0 +2&lt;br /&gt;
	StrCpy $7 &#039;1&#039;&lt;br /&gt;
&lt;br /&gt;
	StrCpy $8 1&lt;br /&gt;
	Push $0&lt;br /&gt;
	SetDetailsPrint textonly&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_nextdir:&lt;br /&gt;
	IntOp $8 $8 - 1&lt;br /&gt;
	Pop $R8&lt;br /&gt;
	FindFirst $0 $R7 &#039;$R8\$4&#039;&lt;br /&gt;
	IfErrors FileFunc_GetSize_show&lt;br /&gt;
	StrCmp $R7 &#039;.&#039; 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	StrCmp $R7 &#039;..&#039; 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
	goto FileFunc_GetSize_show&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_dir:&lt;br /&gt;
	IfFileExists &#039;$R8\$R7\*.*&#039; 0 FileFunc_GetSize_file&lt;br /&gt;
	IntOp $R5 $R5 + 1&lt;br /&gt;
	goto FileFunc_GetSize_findnext&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_file:&lt;br /&gt;
	StrCpy $R6 0&lt;br /&gt;
	StrCmp $5$6 &#039;&#039; 0 +3&lt;br /&gt;
	IntOp $R4 $R4 + 1&lt;br /&gt;
	goto FileFunc_GetSize_findnext&lt;br /&gt;
	FileOpen $9 &#039;$R8\$R7&#039; r&lt;br /&gt;
	IfErrors +3&lt;br /&gt;
	FileSeek $9 0 END $R6&lt;br /&gt;
	FileClose $9&lt;br /&gt;
	StrCmp $5 &#039;&#039; +2&lt;br /&gt;
	IntCmp $R6 $5 0 FileFunc_GetSize_findnext&lt;br /&gt;
	StrCmp $6 &#039;&#039; +2&lt;br /&gt;
	IntCmp $R6 $6 0 0 FileFunc_GetSize_findnext&lt;br /&gt;
	IntOp $R4 $R4 + 1&lt;br /&gt;
	; insert code&lt;br /&gt;
	StrCmp $R1 &amp;quot;&amp;quot; +10 0&lt;br /&gt;
	StrCpy $R0 $R1&lt;br /&gt;
	IntOp $R6 $R6 + $R0&lt;br /&gt;
	IntOp $R1 $R6 % $R0&lt;br /&gt;
	StrCmp $R1 0 0 +2&lt;br /&gt;
	StrCpy $R1 $R0&lt;br /&gt;
	IntOp $R2 $R0 - $R1&lt;br /&gt;
	IntOp $R6 $R6 - $R0&lt;br /&gt;
	IntOp $R6 $R6 + $R2&lt;br /&gt;
	StrCpy $R1 $R0&lt;br /&gt;
	; end insert&lt;br /&gt;
	System::Int64Op $R3 + $R6&lt;br /&gt;
	Pop $R3&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_findnext:&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_show:&lt;br /&gt;
	StrCmp $5$6 &#039;&#039; FileFunc_GetSize_nosize&lt;br /&gt;
	System::Int64Op $R3 / $1&lt;br /&gt;
	Pop $9&lt;br /&gt;
	DetailPrint &#039;Size:$9 $2  Files:$R4  Folders:$R5&#039;&lt;br /&gt;
	goto FileFunc_GetSize_subdir&lt;br /&gt;
	FileFunc_GetSize_nosize:&lt;br /&gt;
	DetailPrint &#039;Files:$R4  Folders:$R5&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_subdir:&lt;br /&gt;
	StrCmp $7 0 FileFunc_GetSize_preend&lt;br /&gt;
	FindFirst $0 $R7 &#039;$R8\*.*&#039;&lt;br /&gt;
	StrCmp $R7 &#039;.&#039; 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	StrCmp $R7 &#039;..&#039; 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
	StrCmp $8 0 FileFunc_GetSize_preend FileFunc_GetSize_nextdir&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_pushdir:&lt;br /&gt;
	IfFileExists &#039;$R8\$R7\*.*&#039; 0 +3&lt;br /&gt;
	Push &#039;$R8\$R7&#039;&lt;br /&gt;
	IntOp $8 $8 + 1&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
	StrCmp $8 0 FileFunc_GetSize_preend FileFunc_GetSize_nextdir&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_preend:&lt;br /&gt;
	StrCmp $R3 &#039;&#039; FileFunc_GetSize_nosizeend&lt;br /&gt;
	System::Int64Op $R3 / $1&lt;br /&gt;
	Pop $R3&lt;br /&gt;
	FileFunc_GetSize_nosizeend:&lt;br /&gt;
	StrCpy $2 $R4&lt;br /&gt;
	StrCpy $1 $R5&lt;br /&gt;
	StrCpy $0 $R3&lt;br /&gt;
	goto FileFunc_GetSize_end&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_error:&lt;br /&gt;
	SetErrors&lt;br /&gt;
	StrCpy $0 &#039;&#039;&lt;br /&gt;
	StrCpy $1 &#039;&#039;&lt;br /&gt;
	StrCpy $2 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_end:&lt;br /&gt;
	SetDetailsPrint both&lt;br /&gt;
	Pop $R9&lt;br /&gt;
	Pop $R8&lt;br /&gt;
	Pop $R7&lt;br /&gt;
	Pop $R6&lt;br /&gt;
	Pop $R5&lt;br /&gt;
	Pop $R4&lt;br /&gt;
	Pop $R3&lt;br /&gt;
	; insert code&lt;br /&gt;
	Pop $R2&lt;br /&gt;
	; end insert&lt;br /&gt;
	Pop $9&lt;br /&gt;
	Pop $8&lt;br /&gt;
	Pop $7&lt;br /&gt;
	Pop $6&lt;br /&gt;
	Pop $5&lt;br /&gt;
	Pop $4&lt;br /&gt;
	Pop $3&lt;br /&gt;
	Exch $2&lt;br /&gt;
	Exch&lt;br /&gt;
	Exch $1&lt;br /&gt;
	Exch 2&lt;br /&gt;
	Exch $0&lt;br /&gt;
&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
; ---------------&lt;br /&gt;
; GetFileAttributes (FileFunc.nsh)&lt;br /&gt;
&lt;br /&gt;
!define GetFileAttributes `!insertmacro GetFileAttributesCall`&lt;br /&gt;
!define un.GetFileAttributes `!insertmacro GetFileAttributesCall`&lt;br /&gt;
&lt;br /&gt;
!macro GetFileAttributes&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro un.GetFileAttributes&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetFileAttributes_&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
	&lt;br /&gt;
	Exch $1&lt;br /&gt;
	Exch&lt;br /&gt;
	Exch $0&lt;br /&gt;
	Exch&lt;br /&gt;
	Push $2&lt;br /&gt;
	Push $3&lt;br /&gt;
	Push $4&lt;br /&gt;
	Push $5&lt;br /&gt;
&lt;br /&gt;
	System::Call &#039;kernel32::GetFileAttributes(t r0)i .r2&#039;&lt;br /&gt;
	StrCmp $2 -1 FileFunc_GetFileAttributes_error&lt;br /&gt;
	StrCpy $3 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x4000&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;ENCRYPTED|&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x2000&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;NOT_CONTENT_INDEXED|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x1000&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;OFFLINE|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0800&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;COMPRESSED|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0400&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;REPARSE_POINT|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0200&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;SPARSE_FILE|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0100&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;TEMPORARY|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0080&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;NORMAL|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0040&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;DEVICE|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0020&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;ARCHIVE|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0010&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;DIRECTORY|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0004&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;SYSTEM|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0002&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;HIDDEN|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0001&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;READONLY|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	StrCpy $0 $3 -1&lt;br /&gt;
	StrCmp $1 &#039;&#039; FileFunc_GetFileAttributes_end&lt;br /&gt;
	StrCmp $1 &#039;ALL&#039; FileFunc_GetFileAttributes_end&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetFileAttributes_attrcmp:&lt;br /&gt;
	StrCpy $5 0&lt;br /&gt;
	IntOp $5 $5 + 1&lt;br /&gt;
	StrCpy $4 $1 1 $5&lt;br /&gt;
	StrCmp $4 &#039;&#039; +2&lt;br /&gt;
	StrCmp $4 &#039;|&#039;  0 -3&lt;br /&gt;
	StrCpy $2 $1 $5&lt;br /&gt;
	IntOp $5 $5 + 1&lt;br /&gt;
	StrCpy $1 $1 &#039;&#039; $5&lt;br /&gt;
	StrLen $3 $2&lt;br /&gt;
	StrCpy $5 -1&lt;br /&gt;
	IntOp $5 $5 + 1&lt;br /&gt;
	StrCpy $4 $0 $3 $5&lt;br /&gt;
	StrCmp $4 &#039;&#039; FileFunc_GetFileAttributes_notfound&lt;br /&gt;
	StrCmp $4 $2 0 -3&lt;br /&gt;
	StrCmp $1 &#039;&#039; 0 FileFunc_GetFileAttributes_attrcmp&lt;br /&gt;
	StrCpy $0 1&lt;br /&gt;
	goto FileFunc_GetFileAttributes_end&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetFileAttributes_notfound:&lt;br /&gt;
	StrCpy $0 0&lt;br /&gt;
	goto FileFunc_GetFileAttributes_end&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetFileAttributes_error:&lt;br /&gt;
	SetErrors&lt;br /&gt;
	StrCpy $0 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetFileAttributes_end:&lt;br /&gt;
	Pop $5&lt;br /&gt;
	Pop $4&lt;br /&gt;
	Pop $3&lt;br /&gt;
	Pop $2&lt;br /&gt;
	Pop $1&lt;br /&gt;
	Exch $0&lt;br /&gt;
		&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!define GetFileVersion `!insertmacro GetFileVersionCall`&lt;br /&gt;
!define un.GetFileVersion `!insertmacro GetFileVersionCall`&lt;br /&gt;
&lt;br /&gt;
!macro GetFileVersion&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro un.GetFileVersion&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetFileVersion_&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
	&lt;br /&gt;
	Exch $0&lt;br /&gt;
	Push $1&lt;br /&gt;
	Push $2&lt;br /&gt;
	Push $3&lt;br /&gt;
	Push $4&lt;br /&gt;
	Push $5&lt;br /&gt;
	Push $6&lt;br /&gt;
	ClearErrors&lt;br /&gt;
&lt;br /&gt;
	GetDllVersion &#039;$0&#039; $1 $2&lt;br /&gt;
	IfErrors FileFunc_GetFileVersion_error&lt;br /&gt;
	IntOp $3 $1 &amp;gt;&amp;gt; 16&lt;br /&gt;
	IntOp $3 $3 &amp;amp; 0x0000FFFF&lt;br /&gt;
	IntOp $4 $1 &amp;amp; 0x0000FFFF&lt;br /&gt;
	IntOp $5 $2 &amp;gt;&amp;gt; 16&lt;br /&gt;
	IntOp $5 $5 &amp;amp; 0x0000FFFF&lt;br /&gt;
	IntOp $6 $2 &amp;amp; 0x0000FFFF&lt;br /&gt;
	StrCpy $0 &#039;$3.$4.$5.$6&#039;&lt;br /&gt;
	goto FileFunc_GetFileVersion_end&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetFileVersion_error:&lt;br /&gt;
	SetErrors&lt;br /&gt;
	StrCpy $0 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetFileVersion_end:&lt;br /&gt;
	Pop $6&lt;br /&gt;
	Pop $5&lt;br /&gt;
	Pop $4&lt;br /&gt;
	Pop $3&lt;br /&gt;
	Pop $2&lt;br /&gt;
	Pop $1&lt;br /&gt;
	Exch $0&lt;br /&gt;
&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
; ---------------&lt;br /&gt;
; GetClusterSize&lt;br /&gt;
&lt;br /&gt;
!define GetClusterSize `!insertmacro GetClusterSizeCall`&lt;br /&gt;
!define un.GetClusterSize `!insertmacro GetClusterSizeCall`&lt;br /&gt;
&lt;br /&gt;
!macro GetClusterSize&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro un.GetClusterSize&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetClusterSize_&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
&lt;br /&gt;
	System::Call &#039;kernel32::GetDiskFreeSpace(i0,*i0r0,*i0r1,*i0r2,*i)&#039;&lt;br /&gt;
	IntOp $0 $0 * $1&lt;br /&gt;
	Push $0&lt;br /&gt;
&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&amp;lt;/highlight-nsis&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-size: 110%&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Credits:&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;em&amp;gt;GetFileAttributes&amp;lt;/em&amp;gt; is borrowed from &amp;lt;b&amp;gt;filefunc.nsh&amp;lt;/b&amp;gt;.&lt;br /&gt;
&amp;lt;em&amp;gt;GetSizeOnDisk&amp;lt;/em&amp;gt; has been altered slightly and renamed. The original macro is called &amp;lt;em&amp;gt;GetSize&amp;lt;/em&amp;gt;. You will find it in the Users Manual under E.1.3.&lt;/div&gt;</summary>
		<author><name>Bnicer</name></author>
	</entry>
	<entry>
		<id>https://nsis.sourceforge.io/mediawiki/index.php?title=User:Bnicer&amp;diff=22881</id>
		<title>User:Bnicer</title>
		<link rel="alternate" type="text/html" href="https://nsis.sourceforge.io/mediawiki/index.php?title=User:Bnicer&amp;diff=22881"/>
		<updated>2013-02-08T06:07:00Z</updated>

		<summary type="html">&lt;p&gt;Bnicer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;span style=&amp;quot;font-size: 130%&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Get Size On Disk&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There are two types of sizes. The physical size of files in bytes vs. the logical size on disk used.&lt;br /&gt;
This NSIS example code shows you how to get both sizes all in one go.&lt;br /&gt;
&amp;lt;highlight-nsis&amp;gt;&lt;br /&gt;
; A utility for computing the NSIS (or NSIS Unicode) 32-bit install folder size and the&lt;br /&gt;
; size of the uninstaller&lt;br /&gt;
; nsissize.nsi&lt;br /&gt;
; Compile &amp;amp; run the .exe&lt;br /&gt;
&lt;br /&gt;
; Note: where either the folder or the uninstaller have been compressed, size on disk&lt;br /&gt;
; results will not be shown, as they would be incorrect&lt;br /&gt;
&lt;br /&gt;
Name &amp;quot;SOD Tool&amp;quot;&lt;br /&gt;
RequestExecutionLevel user&lt;br /&gt;
!define LOCAL &amp;quot;&amp;quot; ; Path where local include files reside&lt;br /&gt;
OutFile &amp;quot;${LOCAL}nsissize.exe&amp;quot;&lt;br /&gt;
!include &amp;quot;${LOCAL}macros.nsh&amp;quot;&lt;br /&gt;
ReserveFile &amp;quot;${NSISDIR}\Plugins\Math.dll&amp;quot;&lt;br /&gt;
#Icon &amp;quot;${LOCAL}arrows.ico&amp;quot;&lt;br /&gt;
ShowInstDetails show&lt;br /&gt;
&lt;br /&gt;
; Variables&lt;br /&gt;
Var NSIS&lt;br /&gt;
Var ZIP&lt;br /&gt;
Var ZIP_UN&lt;br /&gt;
Var COUNT&lt;br /&gt;
Var BLOCK&lt;br /&gt;
Var FILES&lt;br /&gt;
Var FOLDERS&lt;br /&gt;
Var SIZE_B&lt;br /&gt;
Var SIZE_M&lt;br /&gt;
Var SOD_B&lt;br /&gt;
Var SOD_K&lt;br /&gt;
Var SOD_M&lt;br /&gt;
Var SIZE_UN_B&lt;br /&gt;
Var SIZE_UN_K&lt;br /&gt;
Var SOD_UN_B&lt;br /&gt;
Var SOD_UN_K&lt;br /&gt;
&lt;br /&gt;
Function Separator ; comma&lt;br /&gt;
  StrCpy $R2 $R1&lt;br /&gt;
  StrCpy $COUNT &amp;quot;16&amp;quot; ; 1,000,000,000,000,000 limit&lt;br /&gt;
  StrLen $R4 $R1&lt;br /&gt;
  loop:&lt;br /&gt;
  IntCmp $COUNT 3 endloop endloop 0&lt;br /&gt;
  IntCmp $R4 $COUNT 0 +7 0&lt;br /&gt;
  IntOp $COUNT $COUNT - 1&lt;br /&gt;
  StrCpy $R2 $R2 -$COUNT&lt;br /&gt;
  StrCpy $R3 $R1 &amp;quot;&amp;quot; -$COUNT&lt;br /&gt;
  StrCpy $R2 &amp;quot;$R2,$R3&amp;quot;&lt;br /&gt;
  IntOp $COUNT $COUNT - 2&lt;br /&gt;
  Goto loop&lt;br /&gt;
  IntOp $COUNT $COUNT - 3&lt;br /&gt;
  Goto loop&lt;br /&gt;
  endloop:&lt;br /&gt;
FunctionEnd&lt;br /&gt;
&lt;br /&gt;
Section&lt;br /&gt;
; root&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS Unicode&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS Unicode&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS ANSI&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS ANSI&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  Goto done&lt;br /&gt;
  begin:&lt;br /&gt;
  IfFileExists &amp;quot;$NSIS&amp;quot; 0 done&lt;br /&gt;
  ${GetFileAttributes} &amp;quot;$NSIS&amp;quot; &amp;quot;COMPRESSED&amp;quot; $ZIP&lt;br /&gt;
  ${GetClusterSize} $BLOCK&lt;br /&gt;
  ${GetSizeOnDisk} &amp;quot;$NSIS&amp;quot; &amp;quot;/S=0B&amp;quot; &amp;quot;&amp;quot; $0 $1 $2&lt;br /&gt;
  Math::Script &amp;quot;r3 = ff($0 / 1024 / 1024.0, 16 +2&amp;quot;&lt;br /&gt;
  StrCpy $SIZE_B $0&lt;br /&gt;
  StrCpy $FILES $1&lt;br /&gt;
  StrCpy $FOLDERS $2&lt;br /&gt;
  StrCpy $SIZE_M $3&lt;br /&gt;
  ${GetSizeOnDisk} &amp;quot;$NSIS&amp;quot; &amp;quot;/S=0B&amp;quot; &amp;quot;$BLOCK&amp;quot; $0 $1 $2&lt;br /&gt;
  Math::Script &amp;quot;r4 = ff($0 / 1024.0, 16 +0); r5 = ff(r4 / 1024.0, 16 +2)&amp;quot;&lt;br /&gt;
  StrCpy $SOD_B $0&lt;br /&gt;
  StrCpy $SOD_K $4&lt;br /&gt;
  StrCpy $SOD_M $5&lt;br /&gt;
; uninstaller&lt;br /&gt;
  IfFileExists &amp;quot;$NSIS\uninst-nsis.exe&amp;quot; 0 done&lt;br /&gt;
  ${GetFileAttributes} &amp;quot;$NSIS\uninst-nsis.exe&amp;quot; &amp;quot;COMPRESSED&amp;quot; $ZIP_UN&lt;br /&gt;
  ${GetSizeOnDisk} &amp;quot;$NSIS&amp;quot; &amp;quot;/M=uninst-nsis.exe /S=0B&amp;quot; &amp;quot;&amp;quot; $0 $1 $2&lt;br /&gt;
  Math::Script &amp;quot;r6 = ff($0 / 1024.0, 16 +1); \&lt;br /&gt;
  a = $0; b = $BLOCK; c = a % b; #[c == 0, c = $BLOCK]; r7 = (b - c + a); \&lt;br /&gt;
  r8 = ff(r7 / 1024.0, 16 +1)&amp;quot;&lt;br /&gt;
  StrCpy $SIZE_UN_B $0&lt;br /&gt;
  StrCpy $SIZE_UN_K $6&lt;br /&gt;
  StrCpy $SOD_UN_B $7&lt;br /&gt;
  StrCpy $SOD_UN_K $8&lt;br /&gt;
  ; format&lt;br /&gt;
  StrCpy $R1 $SIZE_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SIZE_B $R2&lt;br /&gt;
&lt;br /&gt;
  StrCpy $R1 $SOD_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SOD_B $R2&lt;br /&gt;
&lt;br /&gt;
  StrCpy $R1 $SOD_K&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SOD_K $R2&lt;br /&gt;
&lt;br /&gt;
  StrCpy $R1 $SIZE_UN_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SIZE_UN_B $R2&lt;br /&gt;
  StrCpy $R1 $SOD_UN_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SOD_UN_B $R2&lt;br /&gt;
; output&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;$NSIS&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;Size: $SIZE_M MB ($SIZE_B bytes)&amp;quot;&lt;br /&gt;
  StrCmp $ZIP &amp;quot;1&amp;quot; +3&lt;br /&gt;
  StrCmp $ZIP_UN &amp;quot;1&amp;quot; +2&lt;br /&gt;
  DetailPrint &amp;quot;SOD: $SOD_M MB ($SOD_B bytes)&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;Uninstaller&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;Size: $SIZE_UN_K KB ($SIZE_UN_B bytes)&amp;quot;&lt;br /&gt;
  StrCmp $ZIP &amp;quot;1&amp;quot; +3&lt;br /&gt;
  StrCmp $ZIP_UN &amp;quot;1&amp;quot; +2&lt;br /&gt;
  DetailPrint &amp;quot;SOD: $SOD_UN_K KB ($SOD_UN_B bytes)&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;$FILES files $FOLDERS folders $SOD_K Kb&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  Goto completed&lt;br /&gt;
  done:&lt;br /&gt;
  DetailPrint &amp;quot;File not found.&amp;quot;&lt;br /&gt;
  completed:&lt;br /&gt;
SectionEnd&lt;br /&gt;
&lt;br /&gt;
;--------------------------------&lt;br /&gt;
# EOF&lt;br /&gt;
&amp;lt;/highlight-nsis&amp;gt;&lt;br /&gt;
You should copy the next code into a separate file called &amp;lt;b&amp;gt;macros.nsh&amp;lt;/b&amp;gt;.&lt;br /&gt;
&amp;lt;highlight-nsis&amp;gt;&lt;br /&gt;
; Macros include file&lt;br /&gt;
;--------------------------------&lt;br /&gt;
/*&lt;br /&gt;
&lt;br /&gt;
 FileFunction=[GetSizeOnDisk|GetClusterSize|GetFileAttributes]&lt;br /&gt;
&lt;br /&gt;
*/&lt;br /&gt;
;_____________________________________________________________________________&lt;br /&gt;
;&lt;br /&gt;
;                         Macros&lt;br /&gt;
;_____________________________________________________________________________&lt;br /&gt;
;&lt;br /&gt;
; Change log window verbosity (default: 3=no script)&lt;br /&gt;
;&lt;br /&gt;
; Example:&lt;br /&gt;
; !include &amp;quot;sizemacros.nsh&amp;quot;&lt;br /&gt;
; !insertmacro GetSizeOnDisk&lt;br /&gt;
; ${FILEFUNC_VERBOSE} 4   # all verbosity&lt;br /&gt;
; !insertmacro GetClusterSize&lt;br /&gt;
; ${FILEFUNC_VERBOSE} 3   # no script&lt;br /&gt;
&lt;br /&gt;
!include Util.nsh ; for &amp;quot;CallArtificialFunction&amp;quot;&lt;br /&gt;
&lt;br /&gt;
!verbose push&lt;br /&gt;
!verbose 3&lt;br /&gt;
!ifndef _FILEFUNC_VERBOSE&lt;br /&gt;
	!define _FILEFUNC_VERBOSE 3&lt;br /&gt;
!endif&lt;br /&gt;
!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
!define FILEFUNC_VERBOSE `!insertmacro FILEFUNC_VERBOSE`&lt;br /&gt;
!verbose pop&lt;br /&gt;
&lt;br /&gt;
!macro FILEFUNC_VERBOSE _VERBOSE&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose 3&lt;br /&gt;
	!undef _FILEFUNC_VERBOSE&lt;br /&gt;
	!define _FILEFUNC_VERBOSE ${_VERBOSE}&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetSizeOnDiskCall _PATH _OPTIONS _FILESYSTEM _RESULT1 _RESULT2 _RESULT3&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
	Push `${_PATH}`&lt;br /&gt;
	Push `${_OPTIONS}`&lt;br /&gt;
	Push `${_FILESYSTEM}` ; block size&lt;br /&gt;
	${CallArtificialFunction} GetSizeOnDisk_&lt;br /&gt;
	Pop ${_RESULT1}&lt;br /&gt;
	Pop ${_RESULT2}&lt;br /&gt;
	Pop ${_RESULT3}&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetClusterSizeCall _RESULT&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
	${CallArtificialFunction} GetClusterSize_&lt;br /&gt;
	Pop ${_RESULT}&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetFileAttributesCall _PATH _ATTR _RESULT&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
	Push `${_PATH}`&lt;br /&gt;
	Push `${_ATTR}`&lt;br /&gt;
	${CallArtificialFunction} GetFileAttributes_&lt;br /&gt;
	Pop ${_RESULT}&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
; ---------------&lt;br /&gt;
; GetSizeOnDisk (modified &amp;quot;GetSize&amp;quot; - FileFunc.nsh - KiCHiK - Function &amp;quot;FindFiles&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
!define GetSizeOnDisk `!insertmacro GetSizeOnDiskCall`&lt;br /&gt;
!define un.GetSizeOnDisk `!insertmacro GetSizeOnDiskCall`&lt;br /&gt;
&lt;br /&gt;
!macro GetSizeOnDisk&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro un.GetSizeOnDisk&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
; Usage: similar to &amp;quot;GetSize&amp;quot;&lt;br /&gt;
&lt;br /&gt;
; For documentation, see the NSIS user manual: E.1.3 GetSize&lt;br /&gt;
; Three values are returned&lt;br /&gt;
&lt;br /&gt;
; $var1		; Result1: Size/Size on disk&lt;br /&gt;
; $var2		; Result2: Sum of files&lt;br /&gt;
; $var3		; Result3: Sum of directories&lt;br /&gt;
&lt;br /&gt;
; Example: ${GetSizeOnDisk} &amp;quot;$INSTDIR&amp;quot; &amp;quot;/S=0K&amp;quot; &amp;quot;4096&amp;quot; $0 $1 $2&lt;br /&gt;
&lt;br /&gt;
; Specifying 4096 (logical size) toggles the result&lt;br /&gt;
; Output is size on disk (4KB clusters), if used, or size in bytes, if left empty &amp;quot;&amp;quot;&lt;br /&gt;
; Caution: All writable variables go on the stack; make sure you save them before&lt;br /&gt;
&lt;br /&gt;
!macro GetSizeOnDisk_&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
&lt;br /&gt;
	; replace&lt;br /&gt;
	Exch $R1&lt;br /&gt;
	Exch&lt;br /&gt;
	Exch $1&lt;br /&gt;
	Exch 2&lt;br /&gt;
	; end replace&lt;br /&gt;
	Exch $0&lt;br /&gt;
	Exch&lt;br /&gt;
	Push $2&lt;br /&gt;
	Push $3&lt;br /&gt;
	Push $4&lt;br /&gt;
	Push $5&lt;br /&gt;
	Push $6&lt;br /&gt;
	Push $7&lt;br /&gt;
	Push $8&lt;br /&gt;
	Push $9&lt;br /&gt;
	; insert code&lt;br /&gt;
	Push $R2&lt;br /&gt;
	; end insert&lt;br /&gt;
	Push $R3&lt;br /&gt;
	Push $R4&lt;br /&gt;
	Push $R5&lt;br /&gt;
	Push $R6&lt;br /&gt;
	Push $R7&lt;br /&gt;
	Push $R8&lt;br /&gt;
	Push $R9&lt;br /&gt;
	ClearErrors&lt;br /&gt;
&lt;br /&gt;
	StrCpy $R9 $0 1 -1&lt;br /&gt;
	StrCmp $R9 &#039;\&#039; 0 +3&lt;br /&gt;
	StrCpy $0 $0 -1&lt;br /&gt;
	goto -3&lt;br /&gt;
	IfFileExists &#039;$0\*.*&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
&lt;br /&gt;
	StrCpy $3 &#039;&#039;&lt;br /&gt;
	StrCpy $4 &#039;&#039;&lt;br /&gt;
	StrCpy $5 &#039;&#039;&lt;br /&gt;
	StrCpy $6 &#039;&#039;&lt;br /&gt;
	StrCpy $8 0&lt;br /&gt;
	StrCpy $R3 &#039;&#039;&lt;br /&gt;
	StrCpy $R4 &#039;&#039;&lt;br /&gt;
	StrCpy $R5 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_option:&lt;br /&gt;
	StrCpy $R9 $1 1&lt;br /&gt;
	StrCpy $1 $1 &#039;&#039; 1&lt;br /&gt;
	StrCmp $R9 &#039; &#039; -2&lt;br /&gt;
	StrCmp $R9 &#039;&#039; FileFunc_GetSize_sizeset&lt;br /&gt;
	StrCmp $R9 &#039;/&#039; 0 -4&lt;br /&gt;
&lt;br /&gt;
	StrCpy $9 -1&lt;br /&gt;
	IntOp $9 $9 + 1&lt;br /&gt;
	StrCpy $R9 $1 1 $9&lt;br /&gt;
	StrCmp $R9 &#039;&#039; +2&lt;br /&gt;
	StrCmp $R9 &#039;/&#039; 0 -3&lt;br /&gt;
	StrCpy $8 $1 $9&lt;br /&gt;
	StrCpy $8 $8 &#039;&#039; 2&lt;br /&gt;
	StrCpy $R9 $8 &#039;&#039; -1&lt;br /&gt;
	StrCmp $R9 &#039; &#039; 0 +3&lt;br /&gt;
	StrCpy $8 $8 -1&lt;br /&gt;
	goto -3&lt;br /&gt;
	StrCpy $R9 $1 2&lt;br /&gt;
	StrCpy $1 $1 &#039;&#039; $9&lt;br /&gt;
&lt;br /&gt;
	StrCmp $R9 &#039;M=&#039; 0 FileFunc_GetSize_size&lt;br /&gt;
	StrCpy $4 $8&lt;br /&gt;
	goto FileFunc_GetSize_option&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_size:&lt;br /&gt;
	StrCmp $R9 &#039;S=&#039; 0 FileFunc_GetSize_gotosubdir&lt;br /&gt;
	StrCpy $6 $8&lt;br /&gt;
	goto FileFunc_GetSize_option&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_gotosubdir:&lt;br /&gt;
	StrCmp $R9 &#039;G=&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
	StrCpy $7 $8&lt;br /&gt;
	StrCmp $7 &#039;&#039; +3&lt;br /&gt;
	StrCmp $7 &#039;1&#039; +2&lt;br /&gt;
	StrCmp $7 &#039;0&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
	goto FileFunc_GetSize_option&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_sizeset:&lt;br /&gt;
	StrCmp $6 &#039;&#039; FileFunc_GetSize_default&lt;br /&gt;
	StrCpy $9 0&lt;br /&gt;
	StrCpy $R9 $6 1 $9&lt;br /&gt;
	StrCmp $R9 &#039;&#039; +4&lt;br /&gt;
	StrCmp $R9 &#039;:&#039; +3&lt;br /&gt;
	IntOp $9 $9 + 1&lt;br /&gt;
	goto -4&lt;br /&gt;
	StrCpy $5 $6 $9&lt;br /&gt;
	IntOp $9 $9 + 1&lt;br /&gt;
	StrCpy $1 $6 1 -1&lt;br /&gt;
	StrCpy $6 $6 -1 $9&lt;br /&gt;
	StrCmp $5 &#039;&#039; +2&lt;br /&gt;
	IntOp $5 $5 + 0&lt;br /&gt;
	StrCmp $6 &#039;&#039; +2&lt;br /&gt;
	IntOp $6 $6 + 0&lt;br /&gt;
&lt;br /&gt;
	StrCmp $1 &#039;B&#039; 0 +4&lt;br /&gt;
	StrCpy $1 1&lt;br /&gt;
	StrCpy $2 bytes&lt;br /&gt;
	goto FileFunc_GetSize_default&lt;br /&gt;
	StrCmp $1 &#039;K&#039; 0 +4&lt;br /&gt;
	StrCpy $1 1024&lt;br /&gt;
	StrCpy $2 Kb&lt;br /&gt;
	goto FileFunc_GetSize_default&lt;br /&gt;
	StrCmp $1 &#039;M&#039; 0 +4&lt;br /&gt;
	StrCpy $1 1048576&lt;br /&gt;
	StrCpy $2 Mb&lt;br /&gt;
	goto FileFunc_GetSize_default&lt;br /&gt;
	StrCmp $1 &#039;G&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
	StrCpy $1 1073741824&lt;br /&gt;
	StrCpy $2 Gb&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_default:&lt;br /&gt;
	StrCmp $4 &#039;&#039; 0 +2&lt;br /&gt;
	StrCpy $4 &#039;*.*&#039;&lt;br /&gt;
	StrCmp $7 &#039;&#039; 0 +2&lt;br /&gt;
	StrCpy $7 &#039;1&#039;&lt;br /&gt;
&lt;br /&gt;
	StrCpy $8 1&lt;br /&gt;
	Push $0&lt;br /&gt;
	SetDetailsPrint textonly&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_nextdir:&lt;br /&gt;
	IntOp $8 $8 - 1&lt;br /&gt;
	Pop $R8&lt;br /&gt;
	FindFirst $0 $R7 &#039;$R8\$4&#039;&lt;br /&gt;
	IfErrors FileFunc_GetSize_show&lt;br /&gt;
	StrCmp $R7 &#039;.&#039; 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	StrCmp $R7 &#039;..&#039; 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
	goto FileFunc_GetSize_show&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_dir:&lt;br /&gt;
	IfFileExists &#039;$R8\$R7\*.*&#039; 0 FileFunc_GetSize_file&lt;br /&gt;
	IntOp $R5 $R5 + 1&lt;br /&gt;
	goto FileFunc_GetSize_findnext&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_file:&lt;br /&gt;
	StrCpy $R6 0&lt;br /&gt;
	StrCmp $5$6 &#039;&#039; 0 +3&lt;br /&gt;
	IntOp $R4 $R4 + 1&lt;br /&gt;
	goto FileFunc_GetSize_findnext&lt;br /&gt;
	FileOpen $9 &#039;$R8\$R7&#039; r&lt;br /&gt;
	IfErrors +3&lt;br /&gt;
	FileSeek $9 0 END $R6&lt;br /&gt;
	FileClose $9&lt;br /&gt;
	StrCmp $5 &#039;&#039; +2&lt;br /&gt;
	IntCmp $R6 $5 0 FileFunc_GetSize_findnext&lt;br /&gt;
	StrCmp $6 &#039;&#039; +2&lt;br /&gt;
	IntCmp $R6 $6 0 0 FileFunc_GetSize_findnext&lt;br /&gt;
	IntOp $R4 $R4 + 1&lt;br /&gt;
	; insert code&lt;br /&gt;
	StrCmp $R1 &amp;quot;&amp;quot; +10 0&lt;br /&gt;
	StrCpy $R0 $R1&lt;br /&gt;
	IntOp $R6 $R6 + $R0&lt;br /&gt;
	IntOp $R1 $R6 % $R0&lt;br /&gt;
	StrCmp $R1 0 0 +2&lt;br /&gt;
	StrCpy $R1 $R0&lt;br /&gt;
	IntOp $R2 $R0 - $R1&lt;br /&gt;
	IntOp $R6 $R6 - $R0&lt;br /&gt;
	IntOp $R6 $R6 + $R2&lt;br /&gt;
	StrCpy $R1 $R0&lt;br /&gt;
	; end insert&lt;br /&gt;
	System::Int64Op $R3 + $R6&lt;br /&gt;
	Pop $R3&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_findnext:&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_show:&lt;br /&gt;
	StrCmp $5$6 &#039;&#039; FileFunc_GetSize_nosize&lt;br /&gt;
	System::Int64Op $R3 / $1&lt;br /&gt;
	Pop $9&lt;br /&gt;
	DetailPrint &#039;Size:$9 $2  Files:$R4  Folders:$R5&#039;&lt;br /&gt;
	goto FileFunc_GetSize_subdir&lt;br /&gt;
	FileFunc_GetSize_nosize:&lt;br /&gt;
	DetailPrint &#039;Files:$R4  Folders:$R5&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_subdir:&lt;br /&gt;
	StrCmp $7 0 FileFunc_GetSize_preend&lt;br /&gt;
	FindFirst $0 $R7 &#039;$R8\*.*&#039;&lt;br /&gt;
	StrCmp $R7 &#039;.&#039; 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	StrCmp $R7 &#039;..&#039; 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
	StrCmp $8 0 FileFunc_GetSize_preend FileFunc_GetSize_nextdir&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_pushdir:&lt;br /&gt;
	IfFileExists &#039;$R8\$R7\*.*&#039; 0 +3&lt;br /&gt;
	Push &#039;$R8\$R7&#039;&lt;br /&gt;
	IntOp $8 $8 + 1&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
	StrCmp $8 0 FileFunc_GetSize_preend FileFunc_GetSize_nextdir&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_preend:&lt;br /&gt;
	StrCmp $R3 &#039;&#039; FileFunc_GetSize_nosizeend&lt;br /&gt;
	System::Int64Op $R3 / $1&lt;br /&gt;
	Pop $R3&lt;br /&gt;
	FileFunc_GetSize_nosizeend:&lt;br /&gt;
	StrCpy $2 $R4&lt;br /&gt;
	StrCpy $1 $R5&lt;br /&gt;
	StrCpy $0 $R3&lt;br /&gt;
	goto FileFunc_GetSize_end&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_error:&lt;br /&gt;
	SetErrors&lt;br /&gt;
	StrCpy $0 &#039;&#039;&lt;br /&gt;
	StrCpy $1 &#039;&#039;&lt;br /&gt;
	StrCpy $2 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_end:&lt;br /&gt;
	SetDetailsPrint both&lt;br /&gt;
	Pop $R9&lt;br /&gt;
	Pop $R8&lt;br /&gt;
	Pop $R7&lt;br /&gt;
	Pop $R6&lt;br /&gt;
	Pop $R5&lt;br /&gt;
	Pop $R4&lt;br /&gt;
	Pop $R3&lt;br /&gt;
	; insert code&lt;br /&gt;
	Pop $R2&lt;br /&gt;
	; end insert&lt;br /&gt;
	Pop $9&lt;br /&gt;
	Pop $8&lt;br /&gt;
	Pop $7&lt;br /&gt;
	Pop $6&lt;br /&gt;
	Pop $5&lt;br /&gt;
	Pop $4&lt;br /&gt;
	Pop $3&lt;br /&gt;
	Exch $2&lt;br /&gt;
	Exch&lt;br /&gt;
	Exch $1&lt;br /&gt;
	Exch 2&lt;br /&gt;
	Exch $0&lt;br /&gt;
&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
; ---------------&lt;br /&gt;
; GetFileAttributes (FileFunc.nsh)&lt;br /&gt;
&lt;br /&gt;
!define GetFileAttributes `!insertmacro GetFileAttributesCall`&lt;br /&gt;
!define un.GetFileAttributes `!insertmacro GetFileAttributesCall`&lt;br /&gt;
&lt;br /&gt;
!macro GetFileAttributes&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro un.GetFileAttributes&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetFileAttributes_&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
	&lt;br /&gt;
	Exch $1&lt;br /&gt;
	Exch&lt;br /&gt;
	Exch $0&lt;br /&gt;
	Exch&lt;br /&gt;
	Push $2&lt;br /&gt;
	Push $3&lt;br /&gt;
	Push $4&lt;br /&gt;
	Push $5&lt;br /&gt;
&lt;br /&gt;
	System::Call &#039;kernel32::GetFileAttributes(t r0)i .r2&#039;&lt;br /&gt;
	StrCmp $2 -1 FileFunc_GetFileAttributes_error&lt;br /&gt;
	StrCpy $3 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x4000&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;ENCRYPTED|&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x2000&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;NOT_CONTENT_INDEXED|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x1000&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;OFFLINE|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0800&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;COMPRESSED|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0400&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;REPARSE_POINT|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0200&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;SPARSE_FILE|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0100&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;TEMPORARY|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0080&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;NORMAL|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0040&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;DEVICE|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0020&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;ARCHIVE|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0010&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;DIRECTORY|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0004&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;SYSTEM|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0002&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;HIDDEN|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0001&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;READONLY|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	StrCpy $0 $3 -1&lt;br /&gt;
	StrCmp $1 &#039;&#039; FileFunc_GetFileAttributes_end&lt;br /&gt;
	StrCmp $1 &#039;ALL&#039; FileFunc_GetFileAttributes_end&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetFileAttributes_attrcmp:&lt;br /&gt;
	StrCpy $5 0&lt;br /&gt;
	IntOp $5 $5 + 1&lt;br /&gt;
	StrCpy $4 $1 1 $5&lt;br /&gt;
	StrCmp $4 &#039;&#039; +2&lt;br /&gt;
	StrCmp $4 &#039;|&#039;  0 -3&lt;br /&gt;
	StrCpy $2 $1 $5&lt;br /&gt;
	IntOp $5 $5 + 1&lt;br /&gt;
	StrCpy $1 $1 &#039;&#039; $5&lt;br /&gt;
	StrLen $3 $2&lt;br /&gt;
	StrCpy $5 -1&lt;br /&gt;
	IntOp $5 $5 + 1&lt;br /&gt;
	StrCpy $4 $0 $3 $5&lt;br /&gt;
	StrCmp $4 &#039;&#039; FileFunc_GetFileAttributes_notfound&lt;br /&gt;
	StrCmp $4 $2 0 -3&lt;br /&gt;
	StrCmp $1 &#039;&#039; 0 FileFunc_GetFileAttributes_attrcmp&lt;br /&gt;
	StrCpy $0 1&lt;br /&gt;
	goto FileFunc_GetFileAttributes_end&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetFileAttributes_notfound:&lt;br /&gt;
	StrCpy $0 0&lt;br /&gt;
	goto FileFunc_GetFileAttributes_end&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetFileAttributes_error:&lt;br /&gt;
	SetErrors&lt;br /&gt;
	StrCpy $0 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetFileAttributes_end:&lt;br /&gt;
	Pop $5&lt;br /&gt;
	Pop $4&lt;br /&gt;
	Pop $3&lt;br /&gt;
	Pop $2&lt;br /&gt;
	Pop $1&lt;br /&gt;
	Exch $0&lt;br /&gt;
		&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!define GetFileVersion `!insertmacro GetFileVersionCall`&lt;br /&gt;
!define un.GetFileVersion `!insertmacro GetFileVersionCall`&lt;br /&gt;
&lt;br /&gt;
!macro GetFileVersion&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro un.GetFileVersion&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetFileVersion_&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
	&lt;br /&gt;
	Exch $0&lt;br /&gt;
	Push $1&lt;br /&gt;
	Push $2&lt;br /&gt;
	Push $3&lt;br /&gt;
	Push $4&lt;br /&gt;
	Push $5&lt;br /&gt;
	Push $6&lt;br /&gt;
	ClearErrors&lt;br /&gt;
&lt;br /&gt;
	GetDllVersion &#039;$0&#039; $1 $2&lt;br /&gt;
	IfErrors FileFunc_GetFileVersion_error&lt;br /&gt;
	IntOp $3 $1 &amp;gt;&amp;gt; 16&lt;br /&gt;
	IntOp $3 $3 &amp;amp; 0x0000FFFF&lt;br /&gt;
	IntOp $4 $1 &amp;amp; 0x0000FFFF&lt;br /&gt;
	IntOp $5 $2 &amp;gt;&amp;gt; 16&lt;br /&gt;
	IntOp $5 $5 &amp;amp; 0x0000FFFF&lt;br /&gt;
	IntOp $6 $2 &amp;amp; 0x0000FFFF&lt;br /&gt;
	StrCpy $0 &#039;$3.$4.$5.$6&#039;&lt;br /&gt;
	goto FileFunc_GetFileVersion_end&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetFileVersion_error:&lt;br /&gt;
	SetErrors&lt;br /&gt;
	StrCpy $0 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetFileVersion_end:&lt;br /&gt;
	Pop $6&lt;br /&gt;
	Pop $5&lt;br /&gt;
	Pop $4&lt;br /&gt;
	Pop $3&lt;br /&gt;
	Pop $2&lt;br /&gt;
	Pop $1&lt;br /&gt;
	Exch $0&lt;br /&gt;
&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
; ---------------&lt;br /&gt;
; GetClusterSize&lt;br /&gt;
&lt;br /&gt;
!define GetClusterSize `!insertmacro GetClusterSizeCall`&lt;br /&gt;
!define un.GetClusterSize `!insertmacro GetClusterSizeCall`&lt;br /&gt;
&lt;br /&gt;
!macro GetClusterSize&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro un.GetClusterSize&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetClusterSize_&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
&lt;br /&gt;
	System::Call &#039;kernel32::GetDiskFreeSpace(i0,*i0r0,*i0r1,*i0r2,*i)&#039;&lt;br /&gt;
	IntOp $0 $0 * $1&lt;br /&gt;
	Push $0&lt;br /&gt;
&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&amp;lt;/highlight-nsis&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-size: 110%&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Credits:&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;em&amp;gt;GetFileAttributes&amp;lt;/em&amp;gt; is borrowed from &amp;lt;b&amp;gt;filefunc.nsh&amp;lt;/b&amp;gt;. For usage documentation look under section E.1.7 in the Users Manual.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;em&amp;gt;GetSizeOnDisk&amp;lt;/em&amp;gt; also comes from &amp;lt;b&amp;gt;filefunc.nsh&amp;lt;/b&amp;gt;, but has been altered slightly and renamed. The original macro was called &amp;lt;em&amp;gt;GetSize&amp;lt;/em&amp;gt;. You will find it in the Users Manual under E.1.3.&lt;/div&gt;</summary>
		<author><name>Bnicer</name></author>
	</entry>
	<entry>
		<id>https://nsis.sourceforge.io/mediawiki/index.php?title=User:Bnicer&amp;diff=22878</id>
		<title>User:Bnicer</title>
		<link rel="alternate" type="text/html" href="https://nsis.sourceforge.io/mediawiki/index.php?title=User:Bnicer&amp;diff=22878"/>
		<updated>2013-02-08T05:47:27Z</updated>

		<summary type="html">&lt;p&gt;Bnicer: Get Size On Disk function&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;span style=&amp;quot;color: red; font-size: 130%&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Get Size On Disk&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There are two types of sizes. The physical size of files in bytes vs. the logical size on disk used.&lt;br /&gt;
This NSIS example code shows you how to get both sizes all in one go.&lt;br /&gt;
&amp;lt;highlight-nsis&amp;gt;&lt;br /&gt;
; A utility for computing the NSIS (or NSIS Unicode) 32-bit install folder size and the&lt;br /&gt;
; size of the uninstaller&lt;br /&gt;
; nsissize.nsi&lt;br /&gt;
; Compile &amp;amp; run the .exe&lt;br /&gt;
&lt;br /&gt;
; Note: where either the folder or the uninstaller have been compressed, size on disk&lt;br /&gt;
; results will not be shown, as they would be incorrect&lt;br /&gt;
&lt;br /&gt;
Name &amp;quot;SOD Tool&amp;quot;&lt;br /&gt;
RequestExecutionLevel user&lt;br /&gt;
!define LOCAL &amp;quot;&amp;quot; ; Path where local include files reside&lt;br /&gt;
OutFile &amp;quot;${LOCAL}nsissize.exe&amp;quot;&lt;br /&gt;
!include &amp;quot;${LOCAL}macros.nsh&amp;quot;&lt;br /&gt;
ReserveFile &amp;quot;${NSISDIR}\Plugins\Math.dll&amp;quot;&lt;br /&gt;
#Icon &amp;quot;${LOCAL}arrows.ico&amp;quot;&lt;br /&gt;
ShowInstDetails show&lt;br /&gt;
&lt;br /&gt;
; Variables&lt;br /&gt;
Var NSIS&lt;br /&gt;
Var ZIP&lt;br /&gt;
Var ZIP_UN&lt;br /&gt;
Var COUNT&lt;br /&gt;
Var BLOCK&lt;br /&gt;
Var FILES&lt;br /&gt;
Var FOLDERS&lt;br /&gt;
Var SIZE_B&lt;br /&gt;
Var SIZE_M&lt;br /&gt;
Var SOD_B&lt;br /&gt;
Var SOD_K&lt;br /&gt;
Var SOD_M&lt;br /&gt;
Var SIZE_UN_B&lt;br /&gt;
Var SIZE_UN_K&lt;br /&gt;
Var SOD_UN_B&lt;br /&gt;
Var SOD_UN_K&lt;br /&gt;
&lt;br /&gt;
Function Separator ; comma&lt;br /&gt;
  StrCpy $R2 $R1&lt;br /&gt;
  StrCpy $COUNT &amp;quot;16&amp;quot; ; 1,000,000,000,000,000 limit&lt;br /&gt;
  StrLen $R4 $R1&lt;br /&gt;
  loop:&lt;br /&gt;
  IntCmp $COUNT 3 endloop endloop 0&lt;br /&gt;
  IntCmp $R4 $COUNT 0 +7 0&lt;br /&gt;
  IntOp $COUNT $COUNT - 1&lt;br /&gt;
  StrCpy $R2 $R2 -$COUNT&lt;br /&gt;
  StrCpy $R3 $R1 &amp;quot;&amp;quot; -$COUNT&lt;br /&gt;
  StrCpy $R2 &amp;quot;$R2,$R3&amp;quot;&lt;br /&gt;
  IntOp $COUNT $COUNT - 2&lt;br /&gt;
  Goto loop&lt;br /&gt;
  IntOp $COUNT $COUNT - 3&lt;br /&gt;
  Goto loop&lt;br /&gt;
  endloop:&lt;br /&gt;
FunctionEnd&lt;br /&gt;
&lt;br /&gt;
Section&lt;br /&gt;
; root&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS Unicode&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS Unicode&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS ANSI&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS ANSI&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  ReadRegStr $NSIS HKLM &amp;quot;SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\\&lt;br /&gt;
  NSIS&amp;quot; &amp;quot;InstallLocation&amp;quot;&lt;br /&gt;
  IfErrors 0 begin&lt;br /&gt;
  ClearErrors&lt;br /&gt;
  Goto done&lt;br /&gt;
  begin:&lt;br /&gt;
  IfFileExists &amp;quot;$NSIS&amp;quot; 0 done&lt;br /&gt;
  ${GetFileAttributes} &amp;quot;$NSIS&amp;quot; &amp;quot;COMPRESSED&amp;quot; $ZIP&lt;br /&gt;
  ${GetClusterSize} $BLOCK&lt;br /&gt;
  ${GetSizeOnDisk} &amp;quot;$NSIS&amp;quot; &amp;quot;/S=0B&amp;quot; &amp;quot;&amp;quot; $0 $1 $2&lt;br /&gt;
  Math::Script &amp;quot;r3 = ff($0 / 1024 / 1024.0, 16 +2&amp;quot;&lt;br /&gt;
  StrCpy $SIZE_B $0&lt;br /&gt;
  StrCpy $FILES $1&lt;br /&gt;
  StrCpy $FOLDERS $2&lt;br /&gt;
  StrCpy $SIZE_M $3&lt;br /&gt;
  ${GetSizeOnDisk} &amp;quot;$NSIS&amp;quot; &amp;quot;/S=0B&amp;quot; &amp;quot;$BLOCK&amp;quot; $0 $1 $2&lt;br /&gt;
  Math::Script &amp;quot;r4 = ff($0 / 1024.0, 16 +0); r5 = ff(r4 / 1024.0, 16 +2)&amp;quot;&lt;br /&gt;
  StrCpy $SOD_B $0&lt;br /&gt;
  StrCpy $SOD_K $4&lt;br /&gt;
  StrCpy $SOD_M $5&lt;br /&gt;
; uninstaller&lt;br /&gt;
  IfFileExists &amp;quot;$NSIS\uninst-nsis.exe&amp;quot; 0 done&lt;br /&gt;
  ${GetFileAttributes} &amp;quot;$NSIS\uninst-nsis.exe&amp;quot; &amp;quot;COMPRESSED&amp;quot; $ZIP_UN&lt;br /&gt;
  ${GetSizeOnDisk} &amp;quot;$NSIS&amp;quot; &amp;quot;/M=uninst-nsis.exe /S=0B&amp;quot; &amp;quot;&amp;quot; $0 $1 $2&lt;br /&gt;
  Math::Script &amp;quot;r6 = ff($0 / 1024.0, 16 +1); \&lt;br /&gt;
  a = $0; b = $BLOCK; c = a % b; #[c == 0, c = $BLOCK]; r7 = (b - c + a); \&lt;br /&gt;
  r8 = ff(r7 / 1024.0, 16 +1)&amp;quot;&lt;br /&gt;
  StrCpy $SIZE_UN_B $0&lt;br /&gt;
  StrCpy $SIZE_UN_K $6&lt;br /&gt;
  StrCpy $SOD_UN_B $7&lt;br /&gt;
  StrCpy $SOD_UN_K $8&lt;br /&gt;
  ; format&lt;br /&gt;
  StrCpy $R1 $SIZE_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SIZE_B $R2&lt;br /&gt;
&lt;br /&gt;
  StrCpy $R1 $SOD_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SOD_B $R2&lt;br /&gt;
&lt;br /&gt;
  StrCpy $R1 $SOD_K&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SOD_K $R2&lt;br /&gt;
&lt;br /&gt;
  StrCpy $R1 $SIZE_UN_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SIZE_UN_B $R2&lt;br /&gt;
  StrCpy $R1 $SOD_UN_B&lt;br /&gt;
  Call Separator&lt;br /&gt;
  StrCpy $SOD_UN_B $R2&lt;br /&gt;
; output&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;$NSIS&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;Size: $SIZE_M MB ($SIZE_B bytes)&amp;quot;&lt;br /&gt;
  StrCmp $ZIP &amp;quot;1&amp;quot; +3&lt;br /&gt;
  StrCmp $ZIP_UN &amp;quot;1&amp;quot; +2&lt;br /&gt;
  DetailPrint &amp;quot;SOD: $SOD_M MB ($SOD_B bytes)&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;Uninstaller&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;Size: $SIZE_UN_K KB ($SIZE_UN_B bytes)&amp;quot;&lt;br /&gt;
  StrCmp $ZIP &amp;quot;1&amp;quot; +3&lt;br /&gt;
  StrCmp $ZIP_UN &amp;quot;1&amp;quot; +2&lt;br /&gt;
  DetailPrint &amp;quot;SOD: $SOD_UN_K KB ($SOD_UN_B bytes)&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;$FILES files $FOLDERS folders $SOD_K Kb&amp;quot;&lt;br /&gt;
  DetailPrint &amp;quot;&amp;quot;&lt;br /&gt;
  Goto completed&lt;br /&gt;
  done:&lt;br /&gt;
  DetailPrint &amp;quot;File not found.&amp;quot;&lt;br /&gt;
  completed:&lt;br /&gt;
SectionEnd&lt;br /&gt;
&lt;br /&gt;
;--------------------------------&lt;br /&gt;
# EOF&lt;br /&gt;
&amp;lt;/highlight-nsis&amp;gt;&lt;br /&gt;
You should copy the next code into a separate file called &amp;lt;b&amp;gt;macros.nsh&amp;lt;/b&amp;gt;.&lt;br /&gt;
&amp;lt;highlight-nsis&amp;gt;&lt;br /&gt;
; Macros include file&lt;br /&gt;
;--------------------------------&lt;br /&gt;
/*&lt;br /&gt;
&lt;br /&gt;
 FileFunction=[GetSizeOnDisk|GetClusterSize|GetFileAttributes]&lt;br /&gt;
&lt;br /&gt;
*/&lt;br /&gt;
;_____________________________________________________________________________&lt;br /&gt;
;&lt;br /&gt;
;                         Macros&lt;br /&gt;
;_____________________________________________________________________________&lt;br /&gt;
;&lt;br /&gt;
; Change log window verbosity (default: 3=no script)&lt;br /&gt;
;&lt;br /&gt;
; Example:&lt;br /&gt;
; !include &amp;quot;sizemacros.nsh&amp;quot;&lt;br /&gt;
; !insertmacro GetSizeOnDisk&lt;br /&gt;
; ${FILEFUNC_VERBOSE} 4   # all verbosity&lt;br /&gt;
; !insertmacro GetClusterSize&lt;br /&gt;
; ${FILEFUNC_VERBOSE} 3   # no script&lt;br /&gt;
&lt;br /&gt;
!include Util.nsh ; for &amp;quot;CallArtificialFunction&amp;quot;&lt;br /&gt;
&lt;br /&gt;
!verbose push&lt;br /&gt;
!verbose 3&lt;br /&gt;
!ifndef _FILEFUNC_VERBOSE&lt;br /&gt;
	!define _FILEFUNC_VERBOSE 3&lt;br /&gt;
!endif&lt;br /&gt;
!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
!define FILEFUNC_VERBOSE `!insertmacro FILEFUNC_VERBOSE`&lt;br /&gt;
!verbose pop&lt;br /&gt;
&lt;br /&gt;
!macro FILEFUNC_VERBOSE _VERBOSE&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose 3&lt;br /&gt;
	!undef _FILEFUNC_VERBOSE&lt;br /&gt;
	!define _FILEFUNC_VERBOSE ${_VERBOSE}&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetSizeOnDiskCall _PATH _OPTIONS _FILESYSTEM _RESULT1 _RESULT2 _RESULT3&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
	Push `${_PATH}`&lt;br /&gt;
	Push `${_OPTIONS}`&lt;br /&gt;
	Push `${_FILESYSTEM}` ; block size&lt;br /&gt;
	${CallArtificialFunction} GetSizeOnDisk_&lt;br /&gt;
	Pop ${_RESULT1}&lt;br /&gt;
	Pop ${_RESULT2}&lt;br /&gt;
	Pop ${_RESULT3}&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetClusterSizeCall _RESULT&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
	${CallArtificialFunction} GetClusterSize_&lt;br /&gt;
	Pop ${_RESULT}&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetFileAttributesCall _PATH _ATTR _RESULT&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
	Push `${_PATH}`&lt;br /&gt;
	Push `${_ATTR}`&lt;br /&gt;
	${CallArtificialFunction} GetFileAttributes_&lt;br /&gt;
	Pop ${_RESULT}&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
; ---------------&lt;br /&gt;
; GetSizeOnDisk (modified &amp;quot;GetSize&amp;quot; - FileFunc.nsh - KiCHiK - Function &amp;quot;FindFiles&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
!define GetSizeOnDisk `!insertmacro GetSizeOnDiskCall`&lt;br /&gt;
!define un.GetSizeOnDisk `!insertmacro GetSizeOnDiskCall`&lt;br /&gt;
&lt;br /&gt;
!macro GetSizeOnDisk&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro un.GetSizeOnDisk&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
; Usage: similar to &amp;quot;GetSize&amp;quot;&lt;br /&gt;
&lt;br /&gt;
; For documentation, see the NSIS user manual: E.1.3 GetSize&lt;br /&gt;
; Three values are returned&lt;br /&gt;
&lt;br /&gt;
; $var1		; Result1: Size/Size on disk&lt;br /&gt;
; $var2		; Result2: Sum of files&lt;br /&gt;
; $var3		; Result3: Sum of directories&lt;br /&gt;
&lt;br /&gt;
; Example: ${GetSizeOnDisk} &amp;quot;$INSTDIR&amp;quot; &amp;quot;/S=0K&amp;quot; &amp;quot;4096&amp;quot; $0 $1 $2&lt;br /&gt;
&lt;br /&gt;
; Specifying 4096 (logical size) toggles the result&lt;br /&gt;
; Output is size on disk (4KB clusters), if used, or size in bytes, if left empty &amp;quot;&amp;quot;&lt;br /&gt;
; Caution: All writable variables go on the stack; make sure you save them before&lt;br /&gt;
&lt;br /&gt;
!macro GetSizeOnDisk_&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
&lt;br /&gt;
	; replace&lt;br /&gt;
	Exch $R1&lt;br /&gt;
	Exch&lt;br /&gt;
	Exch $1&lt;br /&gt;
	Exch 2&lt;br /&gt;
	; end replace&lt;br /&gt;
	Exch $0&lt;br /&gt;
	Exch&lt;br /&gt;
	Push $2&lt;br /&gt;
	Push $3&lt;br /&gt;
	Push $4&lt;br /&gt;
	Push $5&lt;br /&gt;
	Push $6&lt;br /&gt;
	Push $7&lt;br /&gt;
	Push $8&lt;br /&gt;
	Push $9&lt;br /&gt;
	; insert code&lt;br /&gt;
	Push $R2&lt;br /&gt;
	; end insert&lt;br /&gt;
	Push $R3&lt;br /&gt;
	Push $R4&lt;br /&gt;
	Push $R5&lt;br /&gt;
	Push $R6&lt;br /&gt;
	Push $R7&lt;br /&gt;
	Push $R8&lt;br /&gt;
	Push $R9&lt;br /&gt;
	ClearErrors&lt;br /&gt;
&lt;br /&gt;
	StrCpy $R9 $0 1 -1&lt;br /&gt;
	StrCmp $R9 &#039;\&#039; 0 +3&lt;br /&gt;
	StrCpy $0 $0 -1&lt;br /&gt;
	goto -3&lt;br /&gt;
	IfFileExists &#039;$0\*.*&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
&lt;br /&gt;
	StrCpy $3 &#039;&#039;&lt;br /&gt;
	StrCpy $4 &#039;&#039;&lt;br /&gt;
	StrCpy $5 &#039;&#039;&lt;br /&gt;
	StrCpy $6 &#039;&#039;&lt;br /&gt;
	StrCpy $8 0&lt;br /&gt;
	StrCpy $R3 &#039;&#039;&lt;br /&gt;
	StrCpy $R4 &#039;&#039;&lt;br /&gt;
	StrCpy $R5 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_option:&lt;br /&gt;
	StrCpy $R9 $1 1&lt;br /&gt;
	StrCpy $1 $1 &#039;&#039; 1&lt;br /&gt;
	StrCmp $R9 &#039; &#039; -2&lt;br /&gt;
	StrCmp $R9 &#039;&#039; FileFunc_GetSize_sizeset&lt;br /&gt;
	StrCmp $R9 &#039;/&#039; 0 -4&lt;br /&gt;
&lt;br /&gt;
	StrCpy $9 -1&lt;br /&gt;
	IntOp $9 $9 + 1&lt;br /&gt;
	StrCpy $R9 $1 1 $9&lt;br /&gt;
	StrCmp $R9 &#039;&#039; +2&lt;br /&gt;
	StrCmp $R9 &#039;/&#039; 0 -3&lt;br /&gt;
	StrCpy $8 $1 $9&lt;br /&gt;
	StrCpy $8 $8 &#039;&#039; 2&lt;br /&gt;
	StrCpy $R9 $8 &#039;&#039; -1&lt;br /&gt;
	StrCmp $R9 &#039; &#039; 0 +3&lt;br /&gt;
	StrCpy $8 $8 -1&lt;br /&gt;
	goto -3&lt;br /&gt;
	StrCpy $R9 $1 2&lt;br /&gt;
	StrCpy $1 $1 &#039;&#039; $9&lt;br /&gt;
&lt;br /&gt;
	StrCmp $R9 &#039;M=&#039; 0 FileFunc_GetSize_size&lt;br /&gt;
	StrCpy $4 $8&lt;br /&gt;
	goto FileFunc_GetSize_option&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_size:&lt;br /&gt;
	StrCmp $R9 &#039;S=&#039; 0 FileFunc_GetSize_gotosubdir&lt;br /&gt;
	StrCpy $6 $8&lt;br /&gt;
	goto FileFunc_GetSize_option&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_gotosubdir:&lt;br /&gt;
	StrCmp $R9 &#039;G=&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
	StrCpy $7 $8&lt;br /&gt;
	StrCmp $7 &#039;&#039; +3&lt;br /&gt;
	StrCmp $7 &#039;1&#039; +2&lt;br /&gt;
	StrCmp $7 &#039;0&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
	goto FileFunc_GetSize_option&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_sizeset:&lt;br /&gt;
	StrCmp $6 &#039;&#039; FileFunc_GetSize_default&lt;br /&gt;
	StrCpy $9 0&lt;br /&gt;
	StrCpy $R9 $6 1 $9&lt;br /&gt;
	StrCmp $R9 &#039;&#039; +4&lt;br /&gt;
	StrCmp $R9 &#039;:&#039; +3&lt;br /&gt;
	IntOp $9 $9 + 1&lt;br /&gt;
	goto -4&lt;br /&gt;
	StrCpy $5 $6 $9&lt;br /&gt;
	IntOp $9 $9 + 1&lt;br /&gt;
	StrCpy $1 $6 1 -1&lt;br /&gt;
	StrCpy $6 $6 -1 $9&lt;br /&gt;
	StrCmp $5 &#039;&#039; +2&lt;br /&gt;
	IntOp $5 $5 + 0&lt;br /&gt;
	StrCmp $6 &#039;&#039; +2&lt;br /&gt;
	IntOp $6 $6 + 0&lt;br /&gt;
&lt;br /&gt;
	StrCmp $1 &#039;B&#039; 0 +4&lt;br /&gt;
	StrCpy $1 1&lt;br /&gt;
	StrCpy $2 bytes&lt;br /&gt;
	goto FileFunc_GetSize_default&lt;br /&gt;
	StrCmp $1 &#039;K&#039; 0 +4&lt;br /&gt;
	StrCpy $1 1024&lt;br /&gt;
	StrCpy $2 Kb&lt;br /&gt;
	goto FileFunc_GetSize_default&lt;br /&gt;
	StrCmp $1 &#039;M&#039; 0 +4&lt;br /&gt;
	StrCpy $1 1048576&lt;br /&gt;
	StrCpy $2 Mb&lt;br /&gt;
	goto FileFunc_GetSize_default&lt;br /&gt;
	StrCmp $1 &#039;G&#039; 0 FileFunc_GetSize_error&lt;br /&gt;
	StrCpy $1 1073741824&lt;br /&gt;
	StrCpy $2 Gb&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_default:&lt;br /&gt;
	StrCmp $4 &#039;&#039; 0 +2&lt;br /&gt;
	StrCpy $4 &#039;*.*&#039;&lt;br /&gt;
	StrCmp $7 &#039;&#039; 0 +2&lt;br /&gt;
	StrCpy $7 &#039;1&#039;&lt;br /&gt;
&lt;br /&gt;
	StrCpy $8 1&lt;br /&gt;
	Push $0&lt;br /&gt;
	SetDetailsPrint textonly&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_nextdir:&lt;br /&gt;
	IntOp $8 $8 - 1&lt;br /&gt;
	Pop $R8&lt;br /&gt;
	FindFirst $0 $R7 &#039;$R8\$4&#039;&lt;br /&gt;
	IfErrors FileFunc_GetSize_show&lt;br /&gt;
	StrCmp $R7 &#039;.&#039; 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	StrCmp $R7 &#039;..&#039; 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
	goto FileFunc_GetSize_show&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_dir:&lt;br /&gt;
	IfFileExists &#039;$R8\$R7\*.*&#039; 0 FileFunc_GetSize_file&lt;br /&gt;
	IntOp $R5 $R5 + 1&lt;br /&gt;
	goto FileFunc_GetSize_findnext&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_file:&lt;br /&gt;
	StrCpy $R6 0&lt;br /&gt;
	StrCmp $5$6 &#039;&#039; 0 +3&lt;br /&gt;
	IntOp $R4 $R4 + 1&lt;br /&gt;
	goto FileFunc_GetSize_findnext&lt;br /&gt;
	FileOpen $9 &#039;$R8\$R7&#039; r&lt;br /&gt;
	IfErrors +3&lt;br /&gt;
	FileSeek $9 0 END $R6&lt;br /&gt;
	FileClose $9&lt;br /&gt;
	StrCmp $5 &#039;&#039; +2&lt;br /&gt;
	IntCmp $R6 $5 0 FileFunc_GetSize_findnext&lt;br /&gt;
	StrCmp $6 &#039;&#039; +2&lt;br /&gt;
	IntCmp $R6 $6 0 0 FileFunc_GetSize_findnext&lt;br /&gt;
	IntOp $R4 $R4 + 1&lt;br /&gt;
	; insert code&lt;br /&gt;
	StrCmp $R1 &amp;quot;&amp;quot; +10 0&lt;br /&gt;
	StrCpy $R0 $R1&lt;br /&gt;
	IntOp $R6 $R6 + $R0&lt;br /&gt;
	IntOp $R1 $R6 % $R0&lt;br /&gt;
	StrCmp $R1 0 0 +2&lt;br /&gt;
	StrCpy $R1 $R0&lt;br /&gt;
	IntOp $R2 $R0 - $R1&lt;br /&gt;
	IntOp $R6 $R6 - $R0&lt;br /&gt;
	IntOp $R6 $R6 + $R2&lt;br /&gt;
	StrCpy $R1 $R0&lt;br /&gt;
	; end insert&lt;br /&gt;
	System::Int64Op $R3 + $R6&lt;br /&gt;
	Pop $R3&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_findnext:&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_dir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_show:&lt;br /&gt;
	StrCmp $5$6 &#039;&#039; FileFunc_GetSize_nosize&lt;br /&gt;
	System::Int64Op $R3 / $1&lt;br /&gt;
	Pop $9&lt;br /&gt;
	DetailPrint &#039;Size:$9 $2  Files:$R4  Folders:$R5&#039;&lt;br /&gt;
	goto FileFunc_GetSize_subdir&lt;br /&gt;
	FileFunc_GetSize_nosize:&lt;br /&gt;
	DetailPrint &#039;Files:$R4  Folders:$R5&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_subdir:&lt;br /&gt;
	StrCmp $7 0 FileFunc_GetSize_preend&lt;br /&gt;
	FindFirst $0 $R7 &#039;$R8\*.*&#039;&lt;br /&gt;
	StrCmp $R7 &#039;.&#039; 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	StrCmp $R7 &#039;..&#039; 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
	StrCmp $8 0 FileFunc_GetSize_preend FileFunc_GetSize_nextdir&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_pushdir:&lt;br /&gt;
	IfFileExists &#039;$R8\$R7\*.*&#039; 0 +3&lt;br /&gt;
	Push &#039;$R8\$R7&#039;&lt;br /&gt;
	IntOp $8 $8 + 1&lt;br /&gt;
	FindNext $0 $R7&lt;br /&gt;
	IfErrors 0 FileFunc_GetSize_pushdir&lt;br /&gt;
	FindClose $0&lt;br /&gt;
	StrCmp $8 0 FileFunc_GetSize_preend FileFunc_GetSize_nextdir&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_preend:&lt;br /&gt;
	StrCmp $R3 &#039;&#039; FileFunc_GetSize_nosizeend&lt;br /&gt;
	System::Int64Op $R3 / $1&lt;br /&gt;
	Pop $R3&lt;br /&gt;
	FileFunc_GetSize_nosizeend:&lt;br /&gt;
	StrCpy $2 $R4&lt;br /&gt;
	StrCpy $1 $R5&lt;br /&gt;
	StrCpy $0 $R3&lt;br /&gt;
	goto FileFunc_GetSize_end&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_error:&lt;br /&gt;
	SetErrors&lt;br /&gt;
	StrCpy $0 &#039;&#039;&lt;br /&gt;
	StrCpy $1 &#039;&#039;&lt;br /&gt;
	StrCpy $2 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetSize_end:&lt;br /&gt;
	SetDetailsPrint both&lt;br /&gt;
	Pop $R9&lt;br /&gt;
	Pop $R8&lt;br /&gt;
	Pop $R7&lt;br /&gt;
	Pop $R6&lt;br /&gt;
	Pop $R5&lt;br /&gt;
	Pop $R4&lt;br /&gt;
	Pop $R3&lt;br /&gt;
	; insert code&lt;br /&gt;
	Pop $R2&lt;br /&gt;
	; end insert&lt;br /&gt;
	Pop $9&lt;br /&gt;
	Pop $8&lt;br /&gt;
	Pop $7&lt;br /&gt;
	Pop $6&lt;br /&gt;
	Pop $5&lt;br /&gt;
	Pop $4&lt;br /&gt;
	Pop $3&lt;br /&gt;
	Exch $2&lt;br /&gt;
	Exch&lt;br /&gt;
	Exch $1&lt;br /&gt;
	Exch 2&lt;br /&gt;
	Exch $0&lt;br /&gt;
&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
; ---------------&lt;br /&gt;
; GetFileAttributes (FileFunc.nsh)&lt;br /&gt;
&lt;br /&gt;
!define GetFileAttributes `!insertmacro GetFileAttributesCall`&lt;br /&gt;
!define un.GetFileAttributes `!insertmacro GetFileAttributesCall`&lt;br /&gt;
&lt;br /&gt;
!macro GetFileAttributes&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro un.GetFileAttributes&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetFileAttributes_&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
	&lt;br /&gt;
	Exch $1&lt;br /&gt;
	Exch&lt;br /&gt;
	Exch $0&lt;br /&gt;
	Exch&lt;br /&gt;
	Push $2&lt;br /&gt;
	Push $3&lt;br /&gt;
	Push $4&lt;br /&gt;
	Push $5&lt;br /&gt;
&lt;br /&gt;
	System::Call &#039;kernel32::GetFileAttributes(t r0)i .r2&#039;&lt;br /&gt;
	StrCmp $2 -1 FileFunc_GetFileAttributes_error&lt;br /&gt;
	StrCpy $3 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x4000&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;ENCRYPTED|&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x2000&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;NOT_CONTENT_INDEXED|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x1000&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;OFFLINE|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0800&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;COMPRESSED|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0400&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;REPARSE_POINT|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0200&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;SPARSE_FILE|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0100&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;TEMPORARY|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0080&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;NORMAL|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0040&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;DEVICE|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0020&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;ARCHIVE|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0010&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;DIRECTORY|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0004&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;SYSTEM|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0002&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;HIDDEN|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	IntOp $0 $2 &amp;amp; 0x0001&lt;br /&gt;
	IntCmp $0 0 +2&lt;br /&gt;
	StrCpy $3 &#039;READONLY|$3&#039;&lt;br /&gt;
&lt;br /&gt;
	StrCpy $0 $3 -1&lt;br /&gt;
	StrCmp $1 &#039;&#039; FileFunc_GetFileAttributes_end&lt;br /&gt;
	StrCmp $1 &#039;ALL&#039; FileFunc_GetFileAttributes_end&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetFileAttributes_attrcmp:&lt;br /&gt;
	StrCpy $5 0&lt;br /&gt;
	IntOp $5 $5 + 1&lt;br /&gt;
	StrCpy $4 $1 1 $5&lt;br /&gt;
	StrCmp $4 &#039;&#039; +2&lt;br /&gt;
	StrCmp $4 &#039;|&#039;  0 -3&lt;br /&gt;
	StrCpy $2 $1 $5&lt;br /&gt;
	IntOp $5 $5 + 1&lt;br /&gt;
	StrCpy $1 $1 &#039;&#039; $5&lt;br /&gt;
	StrLen $3 $2&lt;br /&gt;
	StrCpy $5 -1&lt;br /&gt;
	IntOp $5 $5 + 1&lt;br /&gt;
	StrCpy $4 $0 $3 $5&lt;br /&gt;
	StrCmp $4 &#039;&#039; FileFunc_GetFileAttributes_notfound&lt;br /&gt;
	StrCmp $4 $2 0 -3&lt;br /&gt;
	StrCmp $1 &#039;&#039; 0 FileFunc_GetFileAttributes_attrcmp&lt;br /&gt;
	StrCpy $0 1&lt;br /&gt;
	goto FileFunc_GetFileAttributes_end&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetFileAttributes_notfound:&lt;br /&gt;
	StrCpy $0 0&lt;br /&gt;
	goto FileFunc_GetFileAttributes_end&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetFileAttributes_error:&lt;br /&gt;
	SetErrors&lt;br /&gt;
	StrCpy $0 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetFileAttributes_end:&lt;br /&gt;
	Pop $5&lt;br /&gt;
	Pop $4&lt;br /&gt;
	Pop $3&lt;br /&gt;
	Pop $2&lt;br /&gt;
	Pop $1&lt;br /&gt;
	Exch $0&lt;br /&gt;
		&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!define GetFileVersion `!insertmacro GetFileVersionCall`&lt;br /&gt;
!define un.GetFileVersion `!insertmacro GetFileVersionCall`&lt;br /&gt;
&lt;br /&gt;
!macro GetFileVersion&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro un.GetFileVersion&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetFileVersion_&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
	&lt;br /&gt;
	Exch $0&lt;br /&gt;
	Push $1&lt;br /&gt;
	Push $2&lt;br /&gt;
	Push $3&lt;br /&gt;
	Push $4&lt;br /&gt;
	Push $5&lt;br /&gt;
	Push $6&lt;br /&gt;
	ClearErrors&lt;br /&gt;
&lt;br /&gt;
	GetDllVersion &#039;$0&#039; $1 $2&lt;br /&gt;
	IfErrors FileFunc_GetFileVersion_error&lt;br /&gt;
	IntOp $3 $1 &amp;gt;&amp;gt; 16&lt;br /&gt;
	IntOp $3 $3 &amp;amp; 0x0000FFFF&lt;br /&gt;
	IntOp $4 $1 &amp;amp; 0x0000FFFF&lt;br /&gt;
	IntOp $5 $2 &amp;gt;&amp;gt; 16&lt;br /&gt;
	IntOp $5 $5 &amp;amp; 0x0000FFFF&lt;br /&gt;
	IntOp $6 $2 &amp;amp; 0x0000FFFF&lt;br /&gt;
	StrCpy $0 &#039;$3.$4.$5.$6&#039;&lt;br /&gt;
	goto FileFunc_GetFileVersion_end&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetFileVersion_error:&lt;br /&gt;
	SetErrors&lt;br /&gt;
	StrCpy $0 &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	FileFunc_GetFileVersion_end:&lt;br /&gt;
	Pop $6&lt;br /&gt;
	Pop $5&lt;br /&gt;
	Pop $4&lt;br /&gt;
	Pop $3&lt;br /&gt;
	Pop $2&lt;br /&gt;
	Pop $1&lt;br /&gt;
	Exch $0&lt;br /&gt;
&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
; ---------------&lt;br /&gt;
; GetClusterSize&lt;br /&gt;
&lt;br /&gt;
!define GetClusterSize `!insertmacro GetClusterSizeCall`&lt;br /&gt;
!define un.GetClusterSize `!insertmacro GetClusterSizeCall`&lt;br /&gt;
&lt;br /&gt;
!macro GetClusterSize&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro un.GetClusterSize&lt;br /&gt;
!macroend&lt;br /&gt;
&lt;br /&gt;
!macro GetClusterSize_&lt;br /&gt;
	!verbose push&lt;br /&gt;
	!verbose ${_FILEFUNC_VERBOSE}&lt;br /&gt;
&lt;br /&gt;
	System::Call &#039;kernel32::GetDiskFreeSpace(i0,*i0r0,*i0r1,*i0r2,*i)&#039;&lt;br /&gt;
	IntOp $0 $0 * $1&lt;br /&gt;
	Push $0&lt;br /&gt;
&lt;br /&gt;
	!verbose pop&lt;br /&gt;
!macroend&lt;br /&gt;
&amp;lt;/highlight-nsis&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-size: 110%&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Credits:&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;em&amp;gt;GetFileAttributes&amp;lt;/em&amp;gt; is borrowed from &amp;lt;b&amp;gt;filefunc.nsh&amp;lt;/b&amp;gt;. For usage documentation look under section E.1.7 in the Users Manual.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;em&amp;gt;GetSizeOnDisk&amp;lt;/em&amp;gt; also comes from &amp;lt;b&amp;gt;filefunc.nsh&amp;lt;/b&amp;gt;, but has been altered slightly and renamed. The original macro was called &amp;lt;em&amp;gt;GetSize&amp;lt;/em&amp;gt;. You will find it in the Users Manual under E.1.3.&lt;/div&gt;</summary>
		<author><name>Bnicer</name></author>
	</entry>
</feed>