From 63e86580e564ec6d569d71bce53c2b05343814dd Mon Sep 17 00:00:00 2001 From: david Date: Wed, 5 May 2010 20:38:57 +0000 Subject: [PATCH] Use $INSTDIR instead of a hardcoded $PROGRAMFILES/WinPcap or $PROGRAMFILES64/WinPcap. Set $INSTDIR to $PROGRAMFILES/WinPcap or $PROGRAMFILES64/WinPcap depending, but don't modify it if it already has a value (from /D= on the command line). These changes make /D= work to install a few files into an alternate directory. --- mswin32/winpcap/winpcap-nmap.nsi | 61 +++++++++++++++++++------------- 1 file changed, 37 insertions(+), 24 deletions(-) diff --git a/mswin32/winpcap/winpcap-nmap.nsi b/mswin32/winpcap/winpcap-nmap.nsi index 397021be9..71f15ab43 100644 --- a/mswin32/winpcap/winpcap-nmap.nsi +++ b/mswin32/winpcap/winpcap-nmap.nsi @@ -30,9 +30,15 @@ OutFile "winpcap-nmap-4.11.exe" RequestExecutionLevel admin -; The default installation directory -InstallDir $PROGRAMFILES\WinPcap -;No longer check registry for the location, let installer handle everything. +; These leave either "1" or "0" in $0. +Function is64bit + System::Call "kernel32::GetCurrentProcess() i .s" + System::Call "kernel32::IsWow64Process(i s, *i .r0)" +FunctionEnd +Function un.is64bit + System::Call "kernel32::GetCurrentProcess() i .s" + System::Call "kernel32::IsWow64Process(i s, *i .r0)" +FunctionEnd VIProductVersion "4.1.0.1753" VIAddVersionKey /LANG=1033 "FileVersion" "4.1.0.1753" @@ -125,6 +131,17 @@ Function .onInit StrCpy $my_ver "4.1.0.1753" StrCpy $npf_startup "YES" + ; Always use the requested /D= $INSTDIR if given. + StrCmp $INSTDIR "" "" instdir_nochange + ; On 64-bit Windows, $PROGRAMFILES is "C:\Program Files (x86)" and + ; $PROGRAMFILES64 is "C:\Program Files". We want "C:\Program Files" + ; on 32-bit or 64-bit. + StrCpy $INSTDIR "$PROGRAMFILES\WinPcap" + Call is64bit + StrCmp $0 "0" instdir_nochange + StrCpy $INSTDIR "$PROGRAMFILES64\WinPcap" + instdir_nochange: + ${GetParameters} $R0 ClearErrors ${GetOptions} $R0 "/NPFSTARTUP=" $npf_startup @@ -361,11 +378,8 @@ Section "WinPcap" SecWinPcap File vista\x86\Packet.dll install: - - ; check for x64, install the correct npf.sys file into system32\drivers - System::Call "kernel32::GetCurrentProcess() i .s" - System::Call "kernel32::IsWow64Process(i s, *i .r0)" - StrCmp $0 "0" is32bit is64bit + Call is64bit + StrCmp $0 "0" install_32bit install_64bit ; Note, NSIS states: "You should always quote the path to make sure spaces ; in the path will not disrupt Windows to find the uninstaller." @@ -374,25 +388,25 @@ Section "WinPcap" SecWinPcap ; DisplayIcon doesn't usually have quotes (even on Microsoft installations) and ; HKLM Software\PackageName doesn't usually have quotes either. - is32bit: - SetOutPath "$PROGRAMFILES\WinPcap" + install_32bit: + SetOutPath $INSTDIR File rpcapd.exe File LICENSE - WriteUninstaller "$PROGRAMFILES\WinPcap\uninstall.exe" + WriteUninstaller "$INSTDIR\uninstall.exe" DetailPrint "Installing x86 driver" SetOutPath $SYSDIR\drivers File npf.sys ; x86 NT5/NT6 version - WriteRegStr HKLM "Software\WinPcap" "" "$PROGRAMFILES\WinPcap" - WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\WinPcapInst" "UninstallString" "$\"$PROGRAMFILES\WinPcap\uninstall.exe$\"" - WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\WinPcapInst" "QuietUninstallString" "$\"$PROGRAMFILES\WinPcap\uninstall.exe$\" /S" - WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\WinPcapInst" "DisplayIcon" "$PROGRAMFILES\WinPcap\uninstall.exe" + WriteRegStr HKLM "Software\WinPcap" "" "$INSTDIR" + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\WinPcapInst" "UninstallString" "$\"$INSTDIR\uninstall.exe$\"" + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\WinPcapInst" "QuietUninstallString" "$\"$INSTDIR\uninstall.exe$\" /S" + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\WinPcapInst" "DisplayIcon" "$INSTDIR\uninstall.exe" Goto npfdone - is64bit: - SetOutPath "$PROGRAMFILES64\WinPcap" + install_64bit: + SetOutPath $INSTDIR File rpcapd.exe File LICENSE - WriteUninstaller "$PROGRAMFILES64\WinPcap\uninstall.exe" + WriteUninstaller "$INSTDIR\uninstall.exe" DetailPrint "Installing x64 driver" SetOutPath $SYSDIR\drivers ; disable Wow64FsRedirection @@ -412,12 +426,12 @@ Section "WinPcap" SecWinPcap vista_x64_packet: File vista\x64\Packet.dll ; x64 Vista version nt5_x64_packet_done: - WriteRegStr HKLM "Software\WinPcap" "" "$PROGRAMFILES64\WinPcap" + WriteRegStr HKLM "Software\WinPcap" "" "$INSTDIR" ; re-enable Wow64FsRedirection System::Call kernel32::Wow64EnableWow64FsRedirection(i1) - WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\WinPcapInst" "UninstallString" "$\"$PROGRAMFILES64\WinPcap\uninstall.exe$\"" - WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\WinPcapInst" "QuietUninstallString" "$\"$PROGRAMFILES64\WinPcap\uninstall.exe$\" /S" - WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\WinPcapInst" "DisplayIcon" "$PROGRAMFILES64\WinPcap\uninstall.exe" + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\WinPcapInst" "UninstallString" "$\"$INSTDIR\uninstall.exe$\"" + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\WinPcapInst" "QuietUninstallString" "$\"$INSTDIR\uninstall.exe$\" /S" + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\WinPcapInst" "DisplayIcon" "$INSTDIR\uninstall.exe" npfdone: @@ -479,8 +493,7 @@ Section "Uninstall" Delete $SYSDIR\wpcap.dll ; check for x64, delete npf.sys file from system32\drivers - System::Call "kernel32::GetCurrentProcess() i .s" - System::Call "kernel32::IsWow64Process(i s, *i .r0)" + Call un.is64bit StrCmp $0 "0" del32bitnpf del64bitnpf del64bitnpf: ; disable Wow64FsRedirection