<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://nsis.sourceforge.io/mediawiki/index.php?action=history&amp;feed=atom&amp;title=AddToPath_safe</id>
	<title>AddToPath safe - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://nsis.sourceforge.io/mediawiki/index.php?action=history&amp;feed=atom&amp;title=AddToPath_safe"/>
	<link rel="alternate" type="text/html" href="https://nsis.sourceforge.io/mediawiki/index.php?title=AddToPath_safe&amp;action=history"/>
	<updated>2026-08-10T15:51:16Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.39.17</generator>
	<entry>
		<id>https://nsis.sourceforge.io/mediawiki/index.php?title=AddToPath_safe&amp;diff=25967&amp;oldid=prev</id>
		<title>ChrFranke: /* Description */ Update link to smartmontools installer</title>
		<link rel="alternate" type="text/html" href="https://nsis.sourceforge.io/mediawiki/index.php?title=AddToPath_safe&amp;diff=25967&amp;oldid=prev"/>
		<updated>2025-06-16T09:09:33Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Description: &lt;/span&gt; Update link to smartmontools installer&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;â† Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 09:09, 16 June 2025&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l7&quot;&gt;Line 7:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 7:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;This function adds a directory to the %PATH% variable. It is a safe version of AddToPath from [[Path Manipulation]]. It prevents truncation or corruption of %PATH% if string length exceeds ${NSIS_MAX_STRLEN}. It does not change the %PATH% in this case. No plugin is required.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;This function adds a directory to the %PATH% variable. It is a safe version of AddToPath from [[Path Manipulation]]. It prevents truncation or corruption of %PATH% if string length exceeds ${NSIS_MAX_STRLEN}. It does not change the %PATH% in this case. No plugin is required.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;The code was extracted from the [https://&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;www&lt;/del&gt;.smartmontools&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;.org&lt;/del&gt;/&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;browser&lt;/del&gt;/&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;trunk&lt;/del&gt;/&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;smartmontools&lt;/del&gt;/os_win32/installer.nsi&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;?rev=5422&lt;/del&gt;#&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;L706 &lt;/del&gt;smartmontools installer]. Provided here separately by its author to allow usage without the GPLv2+ restrictions.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;The code was extracted from the [https://&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;github&lt;/ins&gt;.&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;com/smartmontools/&lt;/ins&gt;smartmontools/&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;blob&lt;/ins&gt;/&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;7120b0e792af6ca146cfcb1336effa02d994ac59&lt;/ins&gt;/&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;src&lt;/ins&gt;/os_win32/installer.nsi#&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;L722 &lt;/ins&gt;smartmontools installer]. Provided here separately by its author to allow usage without the GPLv2+ restrictions.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;For a RemoveFromPath function, see [[Path Manipulation]].&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;For a RemoveFromPath function, see [[Path Manipulation]].&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;!-- diff cache key n22049_wiki-wiki_:diff::1.12:old-25838:rev-25967 --&gt;
&lt;/table&gt;</summary>
		<author><name>ChrFranke</name></author>
	</entry>
	<entry>
		<id>https://nsis.sourceforge.io/mediawiki/index.php?title=AddToPath_safe&amp;diff=25838&amp;oldid=prev</id>
		<title>ChrFranke: First</title>
		<link rel="alternate" type="text/html" href="https://nsis.sourceforge.io/mediawiki/index.php?title=AddToPath_safe&amp;diff=25838&amp;oldid=prev"/>
		<updated>2022-12-13T14:27:22Z</updated>

		<summary type="html">&lt;p&gt;First&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{PageAuthor|ChrFranke}} &lt;br /&gt;
&lt;br /&gt;
== Description ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Version:&amp;#039;&amp;#039;&amp;#039; 1.0&lt;br /&gt;
&lt;br /&gt;
This function adds a directory to the %PATH% variable. It is a safe version of AddToPath from [[Path Manipulation]]. It prevents truncation or corruption of %PATH% if string length exceeds ${NSIS_MAX_STRLEN}. It does not change the %PATH% in this case. No plugin is required.&lt;br /&gt;
&lt;br /&gt;
The code was extracted from the [https://www.smartmontools.org/browser/trunk/smartmontools/os_win32/installer.nsi?rev=5422#L706 smartmontools installer]. Provided here separately by its author to allow usage without the GPLv2+ restrictions.&lt;br /&gt;
&lt;br /&gt;
For a RemoveFromPath function, see [[Path Manipulation]].&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;highlight-nsis&amp;gt;&lt;br /&gt;
  Push &amp;quot;$INSTDIR\bin&amp;quot;&lt;br /&gt;
  Call AddToPath&lt;br /&gt;
&amp;lt;/highlight-nsis&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Dependencies ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;highlight-nsis&amp;gt;&lt;br /&gt;
!include &amp;quot;LogicLib.nsh&amp;quot;&lt;br /&gt;
!include &amp;quot;WinMessages.nsh&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Function StrStr&lt;br /&gt;
  ...&lt;br /&gt;
FunctionEnd&lt;br /&gt;
&amp;lt;/highlight-nsis&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For possible code of StrStr, see [[StrStr|this page]].&lt;br /&gt;
&lt;br /&gt;
== Function code ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;highlight-nsis&amp;gt;&lt;br /&gt;
; Registry Entry for environment&lt;br /&gt;
; All users (Warning: length often exceeds 1024 if many packages are installed):&lt;br /&gt;
;!define Environ &amp;#039;HKLM &amp;quot;SYSTEM\CurrentControlSet\Control\Session Manager\Environment&amp;quot;&amp;#039;&lt;br /&gt;
; Current user only:&lt;br /&gt;
!define Environ &amp;#039;HKCU &amp;quot;Environment&amp;quot;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
; AddToPath - Appends dir to PATH&lt;br /&gt;
;   (does not work on Win9x/ME)&lt;br /&gt;
;&lt;br /&gt;
; Usage:&lt;br /&gt;
;   Push &amp;quot;dir&amp;quot;&lt;br /&gt;
;   Call AddToPath&lt;br /&gt;
&lt;br /&gt;
Function AddToPath&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;
&lt;br /&gt;
  ; NSIS ReadRegStr returns empty string on string overflow&lt;br /&gt;
  ; Native calls are used here to check actual length of PATH&lt;br /&gt;
&lt;br /&gt;
  ; $4 = RegOpenKey(HKEY_CURRENT_USER, &amp;quot;Environment&amp;quot;, &amp;amp;$3)&lt;br /&gt;
  System::Call &amp;quot;advapi32::RegOpenKey(i 0x80000001, t&amp;#039;Environment&amp;#039;, *i.r3) i.r4&amp;quot;&lt;br /&gt;
  IntCmp $4 0 0 done done&lt;br /&gt;
  ; $4 = RegQueryValueEx($3, &amp;quot;PATH&amp;quot;, (DWORD*)0, (DWORD*)0, &amp;amp;$1, ($2=NSIS_MAX_STRLEN, &amp;amp;$2))&lt;br /&gt;
  ; RegCloseKey($3)&lt;br /&gt;
  System::Call &amp;quot;advapi32::RegQueryValueEx(i $3, t&amp;#039;PATH&amp;#039;, i 0, i 0, t.r1, *i ${NSIS_MAX_STRLEN} r2) i.r4&amp;quot;&lt;br /&gt;
  System::Call &amp;quot;advapi32::RegCloseKey(i $3)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  ${If} $4 = 234 ; ERROR_MORE_DATA&lt;br /&gt;
    DetailPrint &amp;quot;AddToPath: original length $2 &amp;gt; ${NSIS_MAX_STRLEN}&amp;quot;&lt;br /&gt;
    MessageBox MB_OK &amp;quot;PATH not updated, original length $2 &amp;gt; ${NSIS_MAX_STRLEN}&amp;quot; /SD IDOK&lt;br /&gt;
    Goto done&lt;br /&gt;
  ${EndIf}&lt;br /&gt;
&lt;br /&gt;
  ${If} $4 &amp;lt;&amp;gt; 0 ; NO_ERROR&lt;br /&gt;
    ${If} $4 &amp;lt;&amp;gt; 2 ; ERROR_FILE_NOT_FOUND&lt;br /&gt;
      DetailPrint &amp;quot;AddToPath: unexpected error code $4&amp;quot;&lt;br /&gt;
      Goto done&lt;br /&gt;
    ${EndIf}&lt;br /&gt;
    StrCpy $1 &amp;quot;&amp;quot;&lt;br /&gt;
  ${EndIf}&lt;br /&gt;
&lt;br /&gt;
  ; Check if already in PATH&lt;br /&gt;
  Push &amp;quot;$1;&amp;quot;&lt;br /&gt;
  Push &amp;quot;$0;&amp;quot;&lt;br /&gt;
  Call StrStr&lt;br /&gt;
  Pop $2&lt;br /&gt;
  StrCmp $2 &amp;quot;&amp;quot; 0 done&lt;br /&gt;
  Push &amp;quot;$1;&amp;quot;&lt;br /&gt;
  Push &amp;quot;$0\;&amp;quot;&lt;br /&gt;
  Call StrStr&lt;br /&gt;
  Pop $2&lt;br /&gt;
  StrCmp $2 &amp;quot;&amp;quot; 0 done&lt;br /&gt;
&lt;br /&gt;
  ; Prevent NSIS string overflow&lt;br /&gt;
  StrLen $2 $0&lt;br /&gt;
  StrLen $3 $1&lt;br /&gt;
  IntOp $2 $2 + $3&lt;br /&gt;
  IntOp $2 $2 + 2 ; $2 = strlen(dir) + strlen(PATH) + sizeof(&amp;quot;;&amp;quot;)&lt;br /&gt;
  ${If} $2 &amp;gt; ${NSIS_MAX_STRLEN}&lt;br /&gt;
    DetailPrint &amp;quot;AddToPath: new length $2 &amp;gt; ${NSIS_MAX_STRLEN}&amp;quot;&lt;br /&gt;
    MessageBox MB_OK &amp;quot;PATH not updated, new length $2 &amp;gt; ${NSIS_MAX_STRLEN}.&amp;quot; /SD IDOK&lt;br /&gt;
    Goto done&lt;br /&gt;
  ${EndIf}&lt;br /&gt;
&lt;br /&gt;
  ; Append dir to PATH&lt;br /&gt;
  DetailPrint &amp;quot;Add to PATH: $0&amp;quot;&lt;br /&gt;
  StrCpy $2 $1 1 -1&lt;br /&gt;
  ${If} $2 == &amp;quot;;&amp;quot;&lt;br /&gt;
    StrCpy $1 $1 -1 ; remove trailing &amp;#039;;&amp;#039;&lt;br /&gt;
  ${EndIf}&lt;br /&gt;
  ${If} $1 != &amp;quot;&amp;quot; ; no leading &amp;#039;;&amp;#039;&lt;br /&gt;
    StrCpy $0 &amp;quot;$1;$0&amp;quot;&lt;br /&gt;
  ${EndIf}&lt;br /&gt;
  WriteRegExpandStr ${Environ} &amp;quot;PATH&amp;quot; $0&lt;br /&gt;
  SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 &amp;quot;STR:Environment&amp;quot; /TIMEOUT=5000&lt;br /&gt;
&lt;br /&gt;
done:&lt;br /&gt;
  Pop $4&lt;br /&gt;
  Pop $3&lt;br /&gt;
  Pop $2&lt;br /&gt;
  Pop $1&lt;br /&gt;
  Pop $0&lt;br /&gt;
FunctionEnd&lt;br /&gt;
&amp;lt;/highlight-nsis&amp;gt;&lt;/div&gt;</summary>
		<author><name>ChrFranke</name></author>
	</entry>
</feed>