From d0e0b25c9eb10dd358c718acfa855482a8ff210e Mon Sep 17 00:00:00 2001 From: sledgehammer999 Date: Mon, 28 Jul 2014 19:29:51 +0300 Subject: [PATCH] Installer correctly associates torrents and magnet links with qBittorrent under non-admin accounts. Closes #291 #527 #579 #614 #964. --- src/windows/README.txt | 8 +- src/windows/UAC.nsh | 297 +++++++++++++++++++++++ src/windows/installer.nsi | 97 +++++++- src/windows/nsis plugins/UAC Unicode.zip | Bin 0 -> 8189 bytes src/windows/nsis plugins/UAC.zip | Bin 0 -> 51315 bytes src/windows/options.nsi | 36 ++- src/windows/uninstaller.nsi | 63 ++++- 7 files changed, 476 insertions(+), 25 deletions(-) create mode 100644 src/windows/UAC.nsh create mode 100644 src/windows/nsis plugins/UAC Unicode.zip create mode 100644 src/windows/nsis plugins/UAC.zip diff --git a/src/windows/README.txt b/src/windows/README.txt index a332a48b5..7cce83eff 100644 --- a/src/windows/README.txt +++ b/src/windows/README.txt @@ -22,7 +22,11 @@ I tested with NSIS 3.0a0. "!define PROG_VERSION "3.0.3"" to the version of qbittorrent you just built. 2. Extract the plugins found in the folder "nsis plugins" into your NSIS's unicode Plugin directory(usually C:\Program Files\NSIS\Plugins\x86-unicode). - Only the *.dll files are needed. + Only the *.dll files are needed. Don't use the .dll from UAC.zip, use the one from "UAC Unicode.zip". + NOTE: To build the unicode version of UAC with MSVC2008 you need: + a) the sources from UAC.zip + b) apply the util.cpp.diff from "UAC Unicode.zip" to util.cpp + c) in a msvc command prompt issue: cl.exe /O1s /GS- /GR- /EHs-c- /Zl /LD /DUNICODE RunAs.cpp uac.cpp util.cpp /link kernel32.lib user32.lib shell32.lib advapi32.lib ole32.lib /DLL /MANIFEST:NO /OUT:uac.dll 3. The script you need to compile is "qbittorrent.nsi". It includes all other necessary scripts. 4. The script expects the following file tree: @@ -59,5 +63,5 @@ If you add any new LangString variable to the scripts you NEED to provide "translations" of it to all the .nsi files inside "installer-translations. You can always leave the english string but you have to use all the LANG_ for the given variable. Otherwise, if the user chooses a language that you -haven't provide a LANG_ for your variable then your string will be empty. +haven't provided a LANG_ for your variable then your string will be empty. Don't worry though, NSIS throws warnings for this when compiling the scripts. diff --git a/src/windows/UAC.nsh b/src/windows/UAC.nsh new file mode 100644 index 000000000..b496d7011 --- /dev/null +++ b/src/windows/UAC.nsh @@ -0,0 +1,297 @@ +/*** UAC Plug-in *** + +Interactive User (MediumIL) Admin user (HighIL) +***[Setup.exe]************* ***[Setup.exe]************** +* * * * +* +++[.OnInit]+++++++++++ * * +++[.OnInit]++++++++++++ * +* + UAC_RunElevated >---+-+----> * + + * +* + NSIS.Quit + * * + + * +* +++++++++++++++++++++++ * * ++++++++++++++++++++++++ * +* * * * +* * * * +* +++[Section]+++++++++++ * * +++[Section]++++++++++++ * +* + + * /--+-+- +** +** Get integrity level of current process +** +**/ +!macro UAC_GetIntegrityLevel outvar +UAC::_ 6 +!if "${outvar}" != "s" + Pop ${outvar} +!endif +!macroend + + + +/* UAC_IsAdmin +** +** Is the current process running with administrator privileges? Result in $0 +** +** ${If} ${UAC_IsAdmin} ... +** +**/ +!macro UAC_IsAdmin +UAC::_ 2 +!macroend +!define UAC_IsAdmin `"" UAC_IsAdmin ""` +!macro _UAC_IsAdmin _a _b _t _f +!insertmacro _UAC_MakeLL_Cmp _!= 0 2s +!macroend + + + +/* UAC_IsInnerInstance +** +** Does the current process have a NSIS/UAC parent process that is part of the elevation operation? +** +** ${If} ${UAC_IsInnerInstance} ... +** +**/ +!macro UAC_IsInnerInstance +UAC::_ 3 +!macroend +!define UAC_IsInnerInstance `"" UAC_IsInnerInstance ""` +!macro _UAC_IsInnerInstance _a _b _t _f +!insertmacro _UAC_MakeLL_Cmp _!= 0 3s +!macroend + + + +/* UAC_PageElevation_OnInit, UAC_PageElevation_OnGuiInit, +** +** Helper macros for elevation on a custom elevation page, see the DualMode example for more information. +** +**/ +!macro UAC_Notify_OnGuiInit +UAC::_ 4 +!macroend +!macro UAC_PageElevation_OnGuiInit +!insertmacro UAC_Notify_OnGuiInit +!macroend +!macro UAC_PageElevation_OnInit +UAC::_ 5 +${IfThen} ${Errors} ${|} Quit ${|} +!macroend + + + +/* UAC_AsUser_Call +** +** Calls a function or label in the user process instance. +** All the UAC_AsUser_* macros use this helper macro. +** +**/ +!define UAC_SYNCREGISTERS 0x1 +;define UAC_SYNCSTACK 0x2 +!define UAC_SYNCOUTDIR 0x4 +!define UAC_SYNCINSTDIR 0x8 +;define UAC_CLEARERRFLAG 0x10 +!macro UAC_AsUser_Call type name flags +push $0 +Get${type}Address $0 ${name} +!verbose push +!verbose ${UAC_VERBOSE} +!insertmacro _UAC_ParseDefineFlagsToInt _UAC_AsUser_Call__flags ${flags} +!verbose pop +StrCpy $0 "1$0:${_UAC_AsUser_Call__flags}" +!undef _UAC_AsUser_Call__flags +Exch $0 +UAC::_ +!macroend + + + +/* +** UAC_AsUser_GetSection +*/ +!macro UAC_AsUser_GetSection secprop secidx outvar +!insertmacro _UAC_AsUser_GenOp ${outvar} SectionGet${secprop} ${secidx} "" +!macroend + + + +/* +** UAC_AsUser_GetGlobalVar +** UAC_AsUser_GetGlobal +*/ +!macro UAC_AsUser_GetGlobalVar var +!insertmacro _UAC_AsUser_GenOp ${var} StrCpy "" ${var} +!macroend +!macro UAC_AsUser_GetGlobal outvar srcvar +!insertmacro _UAC_AsUser_GenOp ${outvar} StrCpy "" ${srcvar} +!macroend + + + +/* +** UAC_AsUser_ExecShell +** +** Call ExecShell in the user process instance. +** +*/ +!macro UAC_AsUser_ExecShell verb command params workdir show +!insertmacro _UAC_IncL +goto _UAC_L_E_${__UAC_L} +_UAC_L_F_${__UAC_L}: +ExecShell "${verb}" "${command}" '${params}' ${show} +return +_UAC_L_E_${__UAC_L}: +!if "${workdir}" != "" + push $outdir + SetOutPath "${workdir}" +!endif +!insertmacro UAC_AsUser_Call Label _UAC_L_F_${__UAC_L} ${UAC_SYNCREGISTERS}|${UAC_SYNCOUTDIR}|${UAC_SYNCINSTDIR} #|${UAC_CLEARERRFLAG} +!if "${workdir}" != "" + pop $outdir + SetOutPath $outdir +!endif +!macroend + + + +!macro _UAC_MakeLL_Cmp cmpop cmp pluginparams +!insertmacro _LOGICLIB_TEMP +UAC::_ ${pluginparams} +pop $_LOGICLIB_TEMP +!insertmacro ${cmpop} $_LOGICLIB_TEMP ${cmp} `${_t}` `${_f}` +!macroend +!macro _UAC_definemath def val1 op val2 +!define /math _UAC_definemath "${val1}" ${op} ${val2} +!ifdef ${def} + !undef ${def} +!endif +!define ${def} "${_UAC_definemath}" +!undef _UAC_definemath +!macroend +!macro _UAC_ParseDefineFlags_orin parse outflags +!searchparse /noerrors ${${parse}} "" _UAC_ParseDefineFlags_orin_f1 "|" _UAC_ParseDefineFlags_orin_f2 +!define _UAC_ParseDefineFlags_orin_this ${_UAC_ParseDefineFlags_orin_f1} +!undef ${parse} +!define ${parse} ${_UAC_ParseDefineFlags_orin_f2} +!define _UAC_ParseDefineFlags_orin_saveout ${${outflags}} +!undef ${outflags} +!define /math ${outflags} "${_UAC_ParseDefineFlags_orin_saveout}" | "${_UAC_ParseDefineFlags_orin_this}" +!undef _UAC_ParseDefineFlags_orin_saveout +!undef _UAC_ParseDefineFlags_orin_this +!ifdef _UAC_ParseDefineFlags_orin_f1 + !undef _UAC_ParseDefineFlags_orin_f1 + !undef _UAC_ParseDefineFlags_orin_f2 +!endif +!macroend +!macro _UAC_ParseDefineFlags_Begin _outdef _in +!define _UAC_PDF${_outdef}_parse "${_in}" +!define _UAC_PDF${_outdef}_flags "" +!define _UAC_PDF${_outdef}_r 0 +!insertmacro _UAC_ParseDefineFlags_orin _UAC_PDF${_outdef}_parse _UAC_PDF${_outdef}_flags ;0x1 +!insertmacro _UAC_ParseDefineFlags_orin _UAC_PDF${_outdef}_parse _UAC_PDF${_outdef}_flags ;0x2 +!insertmacro _UAC_ParseDefineFlags_orin _UAC_PDF${_outdef}_parse _UAC_PDF${_outdef}_flags ;0x4 +!insertmacro _UAC_ParseDefineFlags_orin _UAC_PDF${_outdef}_parse _UAC_PDF${_outdef}_flags ;0x8 +!insertmacro _UAC_ParseDefineFlags_orin _UAC_PDF${_outdef}_parse _UAC_PDF${_outdef}_flags ;0x10 +!macroend +!macro _UAC_ParseDefineFlags_End _outdef +!define ${_outdef} ${_UAC_PDF${_outdef}_r} +!undef _UAC_PDF${_outdef}_r +!undef _UAC_PDF${_outdef}_flags +!undef _UAC_PDF${_outdef}_parse +!macroend +!macro _UAC_ParseDefineFlags_IncludeFlag _outdef flag +!if ${_UAC_PDF${_outdef}_flags} & ${flag} + !insertmacro _UAC_definemath _UAC_PDF${_outdef}_r ${_UAC_PDF${_outdef}_r} | ${flag} +!endif +!macroend +!macro _UAC_ParseDefineFlagsToInt _outdef _in +!insertmacro _UAC_ParseDefineFlags_Begin _UAC_ParseDefineFlagsToInt_tmp "${_in}" +!define ${_outdef} ${_UAC_PDF_UAC_ParseDefineFlagsToInt_tmp_flags} +!insertmacro _UAC_ParseDefineFlags_End _UAC_ParseDefineFlagsToInt_tmp +!undef _UAC_ParseDefineFlagsToInt_tmp +!macroend +!macro _UAC_IncL +!insertmacro _UAC_definemath __UAC_L "${__UAC_L}" + 1 +!macroend +!macro _UAC_AsUser_GenOp outvar op opparam1 opparam2 +!define _UAC_AUGOGR_ID _UAC_AUGOGR_OP${outvar}${op}${opparam1}${opparam2} +!ifndef ${_UAC_AUGOGR_ID} ;Has this exact action been done before? + !if ${outvar} == $0 + !define ${_UAC_AUGOGR_ID} $1 + !else + !define ${_UAC_AUGOGR_ID} $0 + !endif + !if "${opparam1}" == "" + !define _UAC_AUGOGR_OPP1 ${${_UAC_AUGOGR_ID}} + !define _UAC_AUGOGR_OPP2 ${opparam2} + !else + !define _UAC_AUGOGR_OPP1 ${opparam1} + !define _UAC_AUGOGR_OPP2 ${${_UAC_AUGOGR_ID}} + !endif + goto ${_UAC_AUGOGR_ID}_C + ${_UAC_AUGOGR_ID}_F: + ${op} ${_UAC_AUGOGR_OPP1} ${_UAC_AUGOGR_OPP2} + return + ${_UAC_AUGOGR_ID}_C: + !undef _UAC_AUGOGR_OPP1 + !undef _UAC_AUGOGR_OPP2 +!endif +push ${${_UAC_AUGOGR_ID}} +!insertmacro UAC_AsUser_Call Label ${_UAC_AUGOGR_ID}_F ${UAC_SYNCREGISTERS} +StrCpy ${outvar} ${${_UAC_AUGOGR_ID}} +pop ${${_UAC_AUGOGR_ID}} +!undef _UAC_AUGOGR_ID +!macroend + + + +!verbose pop +!endif /* UAC_HDR__INC */ \ No newline at end of file diff --git a/src/windows/installer.nsi b/src/windows/installer.nsi index 407726cb2..783b7ef65 100644 --- a/src/windows/installer.nsi +++ b/src/windows/installer.nsi @@ -100,6 +100,72 @@ Section $(inst_startmenu) ;"Create Start Menu Shortcut" SectionEnd +Section $(inst_torrent) ;"Open .torrent files with qBittorrent" + + ReadRegStr $0 HKLM "Software\Classes\.torrent" "" + + StrCmp $0 "qBittorrent" clear_errors 0 + ;Check if empty string + StrCmp $0 "" clear_errors 0 + ;Write old value to OpenWithProgIds + WriteRegStr HKLM "Software\Classes\.torrent\OpenWithProgIds" $0 "" + + clear_errors: + ClearErrors + + WriteRegStr HKLM "Software\Classes\.torrent" "" "qBittorrent" + WriteRegStr HKLM "Software\Classes\.torrent" "Content Type" "application/x-bittorrent" + + !insertmacro UAC_AsUser_Call Function inst_torrent_user ${UAC_SYNCREGISTERS}|${UAC_SYNCOUTDIR}|${UAC_SYNCINSTDIR} + + System::Call 'Shell32::SHChangeNotify(i ${SHCNE_ASSOCCHANGED}, i ${SHCNF_IDLIST}, i 0, i 0)' + +SectionEnd + +Function inst_torrent_user + + ReadRegStr $0 HKCU "Software\Classes\.torrent" "" + + StrCmp $0 "qBittorrent" clear_errors 0 + ;Check if empty string + StrCmp $0 "" clear_errors 0 + ;Write old value to OpenWithProgIds + WriteRegStr HKCU "Software\Classes\.torrent\OpenWithProgIds" $0 "" + + clear_errors: + ClearErrors + + WriteRegStr HKCU "Software\Classes\.torrent" "" "qBittorrent" + WriteRegStr HKCU "Software\Classes\.torrent" "Content Type" "application/x-bittorrent" + +FunctionEnd + +Section $(inst_magnet) ;"Open magnet links with qBittorrent" + + WriteRegStr HKLM "Software\Classes\magnet" "" "URL:Magnet link" + WriteRegStr HKLM "Software\Classes\magnet" "Content Type" "application/x-magnet" + WriteRegStr HKLM "Software\Classes\magnet" "URL Protocol" "" + WriteRegStr HKLM "Software\Classes\magnet\DefaultIcon" "" '"$INSTDIR\qbittorrent.exe",1' + WriteRegStr HKLM "Software\Classes\magnet\shell" "" "open" + WriteRegStr HKLM "Software\Classes\magnet\shell\open\command" "" '"$INSTDIR\qbittorrent.exe" "%1"' + + !insertmacro UAC_AsUser_Call Function inst_magnet_user ${UAC_SYNCREGISTERS}|${UAC_SYNCOUTDIR}|${UAC_SYNCINSTDIR} + + System::Call 'Shell32::SHChangeNotify(i ${SHCNE_ASSOCCHANGED}, i ${SHCNF_IDLIST}, i 0, i 0)' + +SectionEnd + +Function inst_magnet_user + + WriteRegStr HKCU "Software\Classes\magnet" "" "URL:Magnet link" + WriteRegStr HKCU "Software\Classes\magnet" "Content Type" "application/x-magnet" + WriteRegStr HKCU "Software\Classes\magnet" "URL Protocol" "" + WriteRegStr HKCU "Software\Classes\magnet\DefaultIcon" "" '"$INSTDIR\qbittorrent.exe",1' + WriteRegStr HKCU "Software\Classes\magnet\shell" "" "open" + WriteRegStr HKCU "Software\Classes\magnet\shell\open\command" "" '"$INSTDIR\qbittorrent.exe" "%1"' + +FunctionEnd + Section $(inst_firewall) DetailPrint $(inst_firewallinfo) @@ -109,22 +175,29 @@ SectionEnd ;-------------------------------- -Function .onInit - - !insertmacro MUI_LANGDLL_DISPLAY +Function .onInit + + !insertmacro Init "installer" + !insertmacro MUI_LANGDLL_DISPLAY FunctionEnd Function check_instance - check: - FindProcDLL::FindProc "qbittorrent.exe" - StrCmp $R0 "1" 0 notfound - MessageBox MB_RETRYCANCEL|MB_ICONEXCLAMATION $(inst_warning) IDRETRY check IDCANCEL done + check: + FindProcDLL::FindProc "qbittorrent.exe" + StrCmp $R0 "1" 0 notfound + MessageBox MB_RETRYCANCEL|MB_ICONEXCLAMATION $(inst_warning) IDRETRY check IDCANCEL done + + done: + Abort + + notfound: + +FunctionEnd + +Function PageFinishRun + + !insertmacro UAC_AsUser_ExecShell "" "$INSTDIR\qbittorrent.exe" "" "" "" - done: - Abort - - notfound: - FunctionEnd diff --git a/src/windows/nsis plugins/UAC Unicode.zip b/src/windows/nsis plugins/UAC Unicode.zip new file mode 100644 index 0000000000000000000000000000000000000000..f3c6d6628f3bc4851628fb1e52d6ce704fd221b6 GIT binary patch literal 8189 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 X{0~==hlTr3Q&9h^^&hg3{)hc9zrU*> literal 0 HcmV?d00001 diff --git a/src/windows/nsis plugins/UAC.zip b/src/windows/nsis plugins/UAC.zip new file mode 100644 index 0000000000000000000000000000000000000000..4e205d4104525b0eb1424e6f42f7ed9e9d354b92 GIT binary patch literal 51315 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 QBRJjEGg*{A9h~xSKYF%lqW}N^ literal 0 HcmV?d00001 diff --git a/src/windows/options.nsi b/src/windows/options.nsi index 384043b0a..1f476ed18 100644 --- a/src/windows/options.nsi +++ b/src/windows/options.nsi @@ -7,7 +7,8 @@ SetCompressor /SOLID LZMA SetCompressorDictSize 64 XPStyle on -!include "MUI.nsh" +!include "MUI.nsh" +!include "UAC.nsh" !include "FileFunc.nsh" ;For the file association @@ -19,7 +20,8 @@ XPStyle on !define CSIDL_LOCALAPPDATA '0x1C' ;Local Application Data path !define PROG_VERSION "3.2.0" -!define MUI_FINISHPAGE_RUN "$INSTDIR\qbittorrent.exe" +!define MUI_FINISHPAGE_RUN +!define MUI_FINISHPAGE_RUN_FUNCTION PageFinishRun !define MUI_FINISHPAGE_RUN_TEXT $(launch_qbt) ; The name of the installer @@ -31,7 +33,7 @@ OutFile "qbittorrent_${PROG_VERSION}_setup.exe" ;Installer Version Information VIAddVersionKey "ProductName" "qBittorrent" VIAddVersionKey "CompanyName" "The qBittorrent project" -VIAddVersionKey "LegalCopyright" "Copyright ©2006-2013 The qBittorrent project" +VIAddVersionKey "LegalCopyright" "Copyright ©2006-2014 The qBittorrent project" VIAddVersionKey "FileDescription" "qBittorrent - A Bittorrent Client" VIAddVersionKey "FileVersion" "${PROG_VERSION}" @@ -45,7 +47,7 @@ InstallDir $PROGRAMFILES\qBittorrent InstallDirRegKey HKLM Software\qbittorrent InstallLocation ; Request application privileges for Windows Vista -RequestExecutionLevel admin +RequestExecutionLevel user ;-------------------------------- ;General Settings @@ -81,3 +83,29 @@ RequestExecutionLevel admin !insertmacro MUI_RESERVEFILE_LANGDLL ReserveFile "${NSISDIR}\Plugins\x86-unicode\FindProcDLL.dll" +ReserveFile "${NSISDIR}\Plugins\x86-unicode\UAC.dll" + +!macro Init thing +uac_tryagain: +!insertmacro UAC_RunElevated +${Switch} $0 +${Case} 0 + ${IfThen} $1 = 1 ${|} Quit ${|} ;we are the outer process, the inner process has done its work, we are done + ${IfThen} $3 <> 0 ${|} ${Break} ${|} ;we are admin, let the show go on + ${If} $1 = 3 ;RunAs completed successfully, but with a non-admin user + MessageBox mb_YesNo|mb_IconExclamation|mb_TopMost|mb_SetForeground "This ${thing} requires admin privileges, try again" /SD IDNO IDYES uac_tryagain IDNO 0 + ${EndIf} + ;fall-through and die +${Case} 1223 + MessageBox mb_IconStop|mb_TopMost|mb_SetForeground "This ${thing} requires admin privileges, aborting!" + Quit +${Case} 1062 + MessageBox mb_IconStop|mb_TopMost|mb_SetForeground "Logon service not running, aborting!" + Quit +${Default} + MessageBox mb_IconStop|mb_TopMost|mb_SetForeground "Unable to elevate , error $0" + Quit +${EndSwitch} + +SetShellVarContext all +!macroend diff --git a/src/windows/uninstaller.nsi b/src/windows/uninstaller.nsi index 7d64294f4..9615d4abf 100644 --- a/src/windows/uninstaller.nsi +++ b/src/windows/uninstaller.nsi @@ -49,6 +49,42 @@ Section "un.$(remove_shortcuts)" ;"un.Remove shortcuts" Delete "$DESKTOP\qBittorrent.lnk" SectionEnd +Section "un.$(remove_associations)" ;"un.Remove file associations" + SectionIn RO + ReadRegStr $0 HKLM "Software\Classes\.torrent" "" + StrCmp $0 "qBittorrent" 0 torrent_end + DetailPrint "$(uninst_tor_warn) $0" + DeleteRegValue HKLM "Software\Classes\.torrent" "" + DeleteRegKey /ifempty HKLM "Software\Classes\.torrent" + + torrent_end: + ReadRegStr $0 HKLM "Software\Classes\magnet\shell\open\command" "" + StrCmp $0 '"$INSTDIR\qbittorrent.exe" "%1"' 0 magnet_end + DetailPrint "$(uninst_mag_warn) $0" + DeleteRegKey HKLM "Software\Classes\magnet" + + magnet_end: + !insertmacro UAC_AsUser_Call Function un.remove_associations_user ${UAC_SYNCREGISTERS}|${UAC_SYNCOUTDIR}|${UAC_SYNCINSTDIR} + + System::Call 'Shell32::SHChangeNotify(i ${SHCNE_ASSOCCHANGED}, i ${SHCNF_IDLIST}, i 0, i 0)' +SectionEnd + +Function un.remove_associations_user + ReadRegStr $0 HKCU "Software\Classes\.torrent" "" + StrCmp $0 "qBittorrent" 0 torrent_end + DetailPrint "$(uninst_tor_warn) $0" + DeleteRegValue HKCU "Software\Classes\.torrent" "" + DeleteRegKey /ifempty HKCU "Software\Classes\.torrent" + + torrent_end: + ReadRegStr $0 HKCU "Software\Classes\magnet\shell\open\command" "" + StrCmp $0 '"$INSTDIR\qbittorrent.exe" "%1"' 0 magnet_end + DetailPrint "$(uninst_mag_warn) $0" + DeleteRegKey HKCU "Software\Classes\magnet" + + magnet_end: +FunctionEnd + Section "un.$(remove_registry)" ;"un.Remove registry keys" SectionIn RO ; Remove registry keys @@ -68,23 +104,36 @@ SectionEnd Section /o "un.$(remove_conf)" ;"un.Remove configuration files" - System::Call 'shell32::SHGetSpecialFolderPath(i $HWNDPARENT, t .r1, i ${CSIDL_APPDATA}, i0)i.r0' - RMDir /r "$1\qBittorrent" - + !insertmacro UAC_AsUser_Call Function un.remove_conf_user ${UAC_SYNCREGISTERS}|${UAC_SYNCOUTDIR}|${UAC_SYNCINSTDIR} + SectionEnd -Section /o "un.$(remove_cache)" - +Function un.remove_conf_user + + System::Call 'shell32::SHGetSpecialFolderPath(i $HWNDPARENT, t .r1, i ${CSIDL_APPDATA}, i0)i.r0' + RMDir /r "$1\qBittorrent" + +FunctionEnd + +Section /o "un.$(remove_cache)" + + !insertmacro UAC_AsUser_Call Function un.remove_cache_user ${UAC_SYNCREGISTERS}|${UAC_SYNCOUTDIR}|${UAC_SYNCINSTDIR} + +SectionEnd + +Function un.remove_cache_user + System::Call 'shell32::SHGetSpecialFolderPath(i $HWNDPARENT, t .r1, i ${CSIDL_LOCALAPPDATA}, i0)i.r0' RMDir /r "$1\qBittorrent\" - -SectionEnd + +FunctionEnd ;-------------------------------- ;Uninstaller Functions Function un.onInit + !insertmacro Init "uninstaller" !insertmacro MUI_UNGETLANGUAGE FunctionEnd