github.com/theQRL/go-zond@v0.1.1/build/nsis.pathupdate.nsh (about)

     1  !include "WinMessages.nsh"
     2  
     3  ; see https://support.microsoft.com/en-us/kb/104011
     4  !define Environ 'HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"'
     5  ; HKEY_LOCAL_MACHINE = 0x80000002
     6  
     7  ; AddToPath - Appends dir to PATH
     8  ;   (does not work on Win9x/ME)
     9  ;
    10  ; Usage:
    11  ;   Push "dir"
    12  ;   Call AddToPath
    13  Function AddToPath
    14    Exch $0
    15    Push $1
    16    Push $2
    17    Push $3
    18    Push $4
    19  
    20    ; NSIS ReadRegStr returns empty string on string overflow
    21    ; Native calls are used here to check actual length of PATH
    22    ; $4 = RegOpenKey(HKEY_LOCAL_MACHINE, "SYSTEM\CurrentControlSet\Control\Session Manager\Environment", &$3)
    23    System::Call "advapi32::RegOpenKey(i 0x80000002, t'SYSTEM\CurrentControlSet\Control\Session Manager\Environment', *i.r3) i.r4"
    24    IntCmp $4 0 0 done done
    25  
    26    ; $4 = RegQueryValueEx($3, "PATH", (DWORD*)0, (DWORD*)0, &$1, ($2=NSIS_MAX_STRLEN, &$2))
    27    ; RegCloseKey($3)
    28    System::Call "advapi32::RegQueryValueEx(i $3, t'PATH', i 0, i 0, t.r1, *i ${NSIS_MAX_STRLEN} r2) i.r4"
    29    System::Call "advapi32::RegCloseKey(i $3)"
    30  
    31    IntCmp $4 234 0 +4 +4 ; $4 == ERROR_MORE_DATA
    32      DetailPrint "AddToPath: original length $2 > ${NSIS_MAX_STRLEN}"
    33      MessageBox MB_OK "PATH not updated, original length $2 > ${NSIS_MAX_STRLEN}"
    34      Goto done
    35  
    36    IntCmp $4 0 +5 ; $4 != NO_ERROR
    37      IntCmp $4 2 +3 ; $4 != ERROR_FILE_NOT_FOUND
    38        DetailPrint "AddToPath: unexpected error code $4"
    39        Goto done
    40      StrCpy $1 ""
    41  
    42    ; Check if already in PATH
    43    Push "$1;"
    44    Push "$0;"
    45    Call StrStr
    46    Pop $2
    47    StrCmp $2 "" 0 done
    48    Push "$1;"
    49    Push "$0\;"
    50    Call StrStr
    51    Pop $2
    52    StrCmp $2 "" 0 done
    53  
    54    ; Prevent NSIS string overflow
    55    StrLen $2 $0
    56    StrLen $3 $1
    57    IntOp $2 $2 + $3
    58    IntOp $2 $2 + 2 ; $2 = strlen(dir) + strlen(PATH) + sizeof(";")
    59    IntCmp $2 ${NSIS_MAX_STRLEN} +4 +4 0
    60      DetailPrint "AddToPath: new length $2 > ${NSIS_MAX_STRLEN}"
    61      MessageBox MB_OK "PATH not updated, new length $2 > ${NSIS_MAX_STRLEN}."
    62      Goto done
    63  
    64    ; Append dir to PATH
    65    DetailPrint "Add to PATH: $0"
    66    StrCpy $2 $1 1 -1
    67    StrCmp $2 ";" 0 +2
    68      StrCpy $1 $1 -1 ; remove trailing ';'
    69    StrCmp $1 "" +2   ; no leading ';'
    70      StrCpy $0 "$1;$0"
    71    
    72    WriteRegExpandStr ${Environ} "PATH" $0
    73    SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000
    74  
    75  done:
    76    Pop $4
    77    Pop $3
    78    Pop $2
    79    Pop $1
    80    Pop $0
    81  FunctionEnd
    82  
    83  
    84  ; RemoveFromPath - Removes dir from PATH
    85  ;
    86  ; Usage:
    87  ;   Push "dir"
    88  ;   Call RemoveFromPath
    89  Function un.RemoveFromPath
    90    Exch $0
    91    Push $1
    92    Push $2
    93    Push $3
    94    Push $4
    95    Push $5
    96    Push $6
    97  
    98    ; NSIS ReadRegStr returns empty string on string overflow
    99    ; Native calls are used here to check actual length of PATH
   100    ; $4 = RegOpenKey(HKEY_LOCAL_MACHINE, "SYSTEM\CurrentControlSet\Control\Session Manager\Environment", &$3)
   101    System::Call "advapi32::RegOpenKey(i 0x80000002, t'SYSTEM\CurrentControlSet\Control\Session Manager\Environment', *i.r3) i.r4"
   102    IntCmp $4 0 0 done done
   103  
   104    ; $4 = RegQueryValueEx($3, "PATH", (DWORD*)0, (DWORD*)0, &$1, ($2=NSIS_MAX_STRLEN, &$2))
   105    ; RegCloseKey($3)
   106    System::Call "advapi32::RegQueryValueEx(i $3, t'PATH', i 0, i 0, t.r1, *i ${NSIS_MAX_STRLEN} r2) i.r4"
   107    System::Call "advapi32::RegCloseKey(i $3)"
   108  
   109    IntCmp $4 234 0 +4 +4 ; $4 == ERROR_MORE_DATA
   110      DetailPrint "RemoveFromPath: original length $2 > ${NSIS_MAX_STRLEN}"
   111      MessageBox MB_OK "PATH not updated, original length $2 > ${NSIS_MAX_STRLEN}"
   112      Goto done
   113  
   114    IntCmp $4 0 +5 ; $4 != NO_ERROR
   115      IntCmp $4 2 +3 ; $4 != ERROR_FILE_NOT_FOUND
   116        DetailPrint "RemoveFromPath: unexpected error code $4"
   117        Goto done
   118      StrCpy $1 ""
   119  
   120    ; length < ${NSIS_MAX_STRLEN} -> ReadRegStr can be used
   121    ReadRegStr $1 ${Environ} "PATH"
   122    StrCpy $5 $1 1 -1
   123    StrCmp $5 ";" +2
   124    StrCpy $1 "$1;" ; ensure trailing ';'
   125    Push $1
   126    Push "$0;"
   127    Call un.StrStr
   128    Pop $2 ; pos of our dir
   129    StrCmp $2 "" done
   130  
   131    DetailPrint "Remove from PATH: $0"
   132    StrLen $3 "$0;"
   133    StrLen $4 $2
   134    StrCpy $5 $1 -$4 ; $5 is now the part before the path to remove
   135    StrCpy $6 $2 "" $3 ; $6 is now the part after the path to remove
   136    StrCpy $3 "$5$6"
   137    StrCpy $5 $3 1 -1
   138    StrCmp $5 ";" 0 +2
   139      StrCpy $3 $3 -1 ; remove trailing ';'
   140    WriteRegExpandStr ${Environ} "PATH" $3
   141    SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000
   142  
   143  done:
   144    Pop $6
   145    Pop $5
   146    Pop $4
   147    Pop $3
   148    Pop $2
   149    Pop $1
   150    Pop $0
   151  FunctionEnd
   152   
   153