;NSIS-Installer für alle Windowstreiber ;Geschrieben von Florian Janßen ; ; Offene Punkte: ; - Uninstaller ; - bislang keine Abfrage ob Autostart ; ; Status: ; - Installiert kbdneo (mit und ohne Zustatzskript) ; - Fällt bei Bedarf auf NeoVars-Installation zurück ; - Erkennt 32- und 64bit Systeme und wählt entsprechenden Treiber aus. ; - Kann auf die 64bit Registry und 64bit-Systemordner von Vista und 7 zugreifen ; - Rechteverwaltung bei XP, Vista und 7 ; - Autostart wird angelegt ;-------------------------------- ;MUI Oberfläche ;Nur eine Section auswählbar ;64bit Zauberei ;bisschen Logik ;Benutzerkontensteuerung !include "MUI2.nsh" !include "Sections.nsh" !include "x64.nsh" !include "LogicLib.nsh" !include "UAC.nsh" !include "WinVer.nsh" ;-------------------------------- ;Allgemeines ;Name und Name der Datei !define /date ZEIT "%y%m%d.%H" Name "Neo 2.0 - Das ergonomische Tastaturlayout" OutFile "Neo2.0_setup.exe" ;Standardordner (für AHK) InstallDir "$PROGRAMFILES\Neo2" ;Mal sehen ob Neo schon mal da war InstallDirRegKey HKCU "Software\Neo 2.0" "" ;Rechte anfordern RequestExecutionLevel user ;Muss „user“ sein, Admin wird nachträglich gerufen ;Zeige was geschieht ShowInstDetails show ;Warnung bei Abbruch !define MUI_ABORTWARNING ;Warnt falls Installations abgebrochen wird Var pre_sel Var DlgItem ;-------------------------------- ;Seiten des Installers !define WELCOME_TITLE "Willkommen zum Installations- Assistenten für Neo 2.0" !define UNWELCOME_TITLE "Willkommen zum Deinstallations- Assistenten für Neo 2.0" !define FINISH_TITLE "Die Installation von Neo 2.0 wurde erfolgreich beendet." !define UNFINISH_TITLE "Die Deinstallation von Neo 2.0 wurde erfolgreich beendet." !define MUI_COMPONENTSPAGE_SMALLDESC !define MUI_ICON "kbdneo2\Treiber\AHK_für_kbdneo2\neo_enabled.ico" !define MUI_HEADERIMAGE !define MUI_HEADERIMAGE_RIGHT !define MUI_HEADERIMAGE_BITMAP logo.bmp !define MUI_WELCOMEPAGE_TITLE "${WELCOME_TITLE}" !define MUI_WELCOMEPAGE_TITLE_3LINES ;3 Zeilen für den Titel !define MUI_PAGE_CUSTOMFUNCTION_PRE preAdmin1 !insertmacro MUI_PAGE_WELCOME ;!insertmacro MUI_PAGE_LICENSE "lizenz.txt" !define MUI_PAGE_CUSTOMFUNCTION_PRE preComp !define MUI_PAGE_CUSTOMFUNCTION_LEAVE leaveComp !insertmacro MUI_PAGE_COMPONENTS !define MUI_PAGE_CUSTOMFUNCTION_PRE preDir !insertmacro MUI_PAGE_DIRECTORY !define MUI_PAGE_CUSTOMFUNCTION_LEAVE leaveInst !insertmacro MUI_PAGE_INSTFILES !define MUI_FINISHPAGE_TITLE "${FINISH_TITLE}" !define MUI_FINISHPAGE_TITLE_3LINES ;!define MUI_FINISHPAGE_RUN "$INSTDIR\neo20.exe" !insertmacro MUI_PAGE_FINISH ;Deutsche Oberfläche !insertmacro MUI_LANGUAGE "German" ;--------------------------------- ;Ein paar Variablen !define KLF_REORDER 8 !define KLF_ACTIVATE 1 ;-------------------------------- ;Installer Sections ;Verschiedene Installationstypen InstType "Vollständig" InstType "Nur Teiber kein Skript" InstType "Nur NeoVars" ;InstType /NOCUSTOM ;Die eigentlichen Sections Section /o "Neo-2.0-Treiber" installiereKbdneoOhneAHK SectionIn 2 SetOutPath "$SYSDIR" ${If} ${RunningX64} SetRegView 64 WriteRegStr HKEY_LOCAL_MACHINE "SYSTEM\CurrentControlSet\Control\Keyboard Layouts\b0000407" "Layout Text" "Deutsch (Neo 2.0 ergonomisch)" WriteRegStr HKEY_LOCAL_MACHINE "SYSTEM\CurrentControlSet\Control\Keyboard Layouts\b0000407" "Layout File" "kbdneo2.dll" WriteRegStr HKEY_LOCAL_MACHINE "SYSTEM\CurrentControlSet\Control\Keyboard Layouts\b0000407" "Layout Id" "00c0" WriteRegStr HKEY_LOCAL_MACHINE "SYSTEM\CurrentControlSet\Control\Keyboard Layouts\b0000407" "Layout Display Name" "@%SystemRoot%\system32\kbdneo2.dll,-1000" WriteRegStr HKEY_LOCAL_MACHINE "SYSTEM\CurrentControlSet\Control\Keyboard Layouts\b0000407" "Custom Language Name" "German (Germany)" WriteRegStr HKEY_LOCAL_MACHINE "SYSTEM\CurrentControlSet\Control\Keyboard Layouts\b0000407" "Custom Language Display Name" "@%SystemRoot%\system32\kbdneo2.dll,-1100" SetRegView 32 WriteRegStr HKEY_LOCAL_MACHINE "SYSTEM\CurrentControlSet\Control\Keyboard Layouts\b0000407" "Layout Text" "Deutsch (Neo 2.0 ergonomisch)" WriteRegStr HKEY_LOCAL_MACHINE "SYSTEM\CurrentControlSet\Control\Keyboard Layouts\b0000407" "Layout File" "kbdneo2.dll" WriteRegStr HKEY_LOCAL_MACHINE "SYSTEM\CurrentControlSet\Control\Keyboard Layouts\b0000407" "Layout Id" "00c0" WriteRegStr HKEY_LOCAL_MACHINE "SYSTEM\CurrentControlSet\Control\Keyboard Layouts\b0000407" "Layout Display Name" "@%SystemRoot%\system32\kbdneo2.dll,-1000" WriteRegStr HKEY_LOCAL_MACHINE "SYSTEM\CurrentControlSet\Control\Keyboard Layouts\b0000407" "Custom Language Name" "German (Germany)" WriteRegStr HKEY_LOCAL_MACHINE "SYSTEM\CurrentControlSet\Control\Keyboard Layouts\b0000407" "Custom Language Display Name" "@%SystemRoot%\system32\kbdneo2.dll,-1100" ${DisableX64FSRedirection} file kbdneo2\Treiber\64bit_Windows\System32\kbdneo2.dll ${EnableX64FSRedirection} file kbdneo2\Treiber\64bit_Windows\SysWOW64\kbdneo2.dll ${Else} SetRegView 32 WriteRegStr HKEY_LOCAL_MACHINE "SYSTEM\CurrentControlSet\Control\Keyboard Layouts\b0000407" "Layout Text" "Deutsch (Neo 2.0 ergonomisch)" WriteRegStr HKEY_LOCAL_MACHINE "SYSTEM\CurrentControlSet\Control\Keyboard Layouts\b0000407" "Layout File" "kbdneo2.dll" WriteRegStr HKEY_LOCAL_MACHINE "SYSTEM\CurrentControlSet\Control\Keyboard Layouts\b0000407" "Layout Id" "00c0" WriteRegStr HKEY_LOCAL_MACHINE "SYSTEM\CurrentControlSet\Control\Keyboard Layouts\b0000407" "Layout Display Name" "@%SystemRoot%\system32\kbdneo2.dll,-1000" WriteRegStr HKEY_LOCAL_MACHINE "SYSTEM\CurrentControlSet\Control\Keyboard Layouts\b0000407" "Custom Language Name" "German (Germany)" WriteRegStr HKEY_LOCAL_MACHINE "SYSTEM\CurrentControlSet\Control\Keyboard Layouts\b0000407" "Custom Language Display Name" "@%SystemRoot%\system32\kbdneo2.dll,-1100" ${EnableX64FSRedirection} file kbdneo2\Treiber\32bit_Windows\kbdneo2.dll ${EndIf} ;!insertmacro UAC_AsUser_Call Function makeKBDactive ${UAC_SYNCREGISTERS} SectionEnd Section /o "Neo-2.0-Treiber und AHK-Erweiterung" installiereKbdneoPlusAHK SectionIn 1 SetOutPath "$INSTDIR" ;Zustatz Skript kopieren (immer als 32bit) file kbdneo2\Treiber\AHK_für_kbdneo2\kbdneo_ahk.exe ;Erstellt eine Verknüpfung im Autostart-Ordner !insertmacro UAC_AsUser_Call Function goUserDir ${UAC_SYNCREGISTERS} SetOutPath "$SYSDIR" ${If} ${RunningX64} SetRegView 64 WriteRegStr HKEY_LOCAL_MACHINE "SYSTEM\CurrentControlSet\Control\Keyboard Layouts\b0000407" "Layout Text" "Deutsch (Neo 2.0 ergonomisch)" WriteRegStr HKEY_LOCAL_MACHINE "SYSTEM\CurrentControlSet\Control\Keyboard Layouts\b0000407" "Layout File" "kbdneo2.dll" WriteRegStr HKEY_LOCAL_MACHINE "SYSTEM\CurrentControlSet\Control\Keyboard Layouts\b0000407" "Layout Id" "00c0" WriteRegStr HKEY_LOCAL_MACHINE "SYSTEM\CurrentControlSet\Control\Keyboard Layouts\b0000407" "Layout Display Name" "@%SystemRoot%\system32\kbdneo2.dll,-1000" WriteRegStr HKEY_LOCAL_MACHINE "SYSTEM\CurrentControlSet\Control\Keyboard Layouts\b0000407" "Custom Language Name" "German (Germany)" WriteRegStr HKEY_LOCAL_MACHINE "SYSTEM\CurrentControlSet\Control\Keyboard Layouts\b0000407" "Custom Language Display Name" "@%SystemRoot%\system32\kbdneo2.dll,-1100" SetRegView 32 WriteRegStr HKEY_LOCAL_MACHINE "SYSTEM\CurrentControlSet\Control\Keyboard Layouts\b0000407" "Layout Text" "Deutsch (Neo 2.0 ergonomisch)" WriteRegStr HKEY_LOCAL_MACHINE "SYSTEM\CurrentControlSet\Control\Keyboard Layouts\b0000407" "Layout File" "kbdneo2.dll" WriteRegStr HKEY_LOCAL_MACHINE "SYSTEM\CurrentControlSet\Control\Keyboard Layouts\b0000407" "Layout Id" "00c0" WriteRegStr HKEY_LOCAL_MACHINE "SYSTEM\CurrentControlSet\Control\Keyboard Layouts\b0000407" "Layout Display Name" "@%SystemRoot%\system32\kbdneo2.dll,-1000" WriteRegStr HKEY_LOCAL_MACHINE "SYSTEM\CurrentControlSet\Control\Keyboard Layouts\b0000407" "Custom Language Name" "German (Germany)" WriteRegStr HKEY_LOCAL_MACHINE "SYSTEM\CurrentControlSet\Control\Keyboard Layouts\b0000407" "Custom Language Display Name" "@%SystemRoot%\system32\kbdneo2.dll,-1100" ${DisableX64FSRedirection} file kbdneo2\Treiber\64bit_Windows\System32\kbdneo2.dll ${EnableX64FSRedirection} file kbdneo2\Treiber\64bit_Windows\SysWOW64\kbdneo2.dll ${Else} SetRegView 32 WriteRegStr HKEY_LOCAL_MACHINE "SYSTEM\CurrentControlSet\Control\Keyboard Layouts\b0000407" "Layout Text" "Deutsch (Neo 2.0 ergonomisch)" WriteRegStr HKEY_LOCAL_MACHINE "SYSTEM\CurrentControlSet\Control\Keyboard Layouts\b0000407" "Layout File" "kbdneo2.dll" WriteRegStr HKEY_LOCAL_MACHINE "SYSTEM\CurrentControlSet\Control\Keyboard Layouts\b0000407" "Layout Id" "00c0" WriteRegStr HKEY_LOCAL_MACHINE "SYSTEM\CurrentControlSet\Control\Keyboard Layouts\b0000407" "Layout Display Name" "@%SystemRoot%\system32\kbdneo2.dll,-1000" WriteRegStr HKEY_LOCAL_MACHINE "SYSTEM\CurrentControlSet\Control\Keyboard Layouts\b0000407" "Custom Language Name" "German (Germany)" WriteRegStr HKEY_LOCAL_MACHINE "SYSTEM\CurrentControlSet\Control\Keyboard Layouts\b0000407" "Custom Language Display Name" "@%SystemRoot%\system32\kbdneo2.dll,-1100" ${EnableX64FSRedirection} file kbdneo2\Treiber\32bit_Windows\kbdneo2.dll ${EndIf} ;!insertmacro UAC_AsUser_Call Function makeKBDactive ${UAC_SYNCREGISTERS} SectionEnd Section /o "Eigenständiges Neo2.0-AHK-Skript (NeoVars)" installiereAHK SectionIn 3 SetOutPath "$INSTDIR" file neo-vars\out\neo20.exe createShortCut "$SMPROGRAMS\Startup\Neo2.0 (AHK).lnk" "$INSTDIR\neo20.exe" WriteRegStr HKCU "Software\Neo 2.0" "" $INSTDIR SectionEnd ;-------------------------------- ; Functions Function .onInit StrCpy $pre_sel ${installiereKbdneoPlusAHK} FunctionEnd ;nur ein Installationszweig auswählbar Function .onSelChange !insertmacro StartRadioButtons $pre_sel !insertmacro RadioButton ${installiereKbdneoOhneAHK} !insertmacro RadioButton ${installiereKbdneoPlusAHK} !insertmacro RadioButton ${installiereAHK} !insertmacro EndRadioButtons FunctionEnd ;Durch Erwerb der Adminrechte neu gestartet, dann Willkommens_Seite überspringen Function preAdmin1 ${IfNot} ${AtLeastWinVista} goto noSkip ${EndIf} userInfo::getAccountType pop $R0 strCmp $R0 "Admin" +2 goto noSkip StrCpy $pre_sel ${installiereKbdneoPlusAHK} Abort noSkip: FunctionEnd ;UAC Zauberei Function preComp uac_tryagain: !insertmacro UAC_RunElevated ;MessageBox mb_TopMost "0=$0 1=$1 2=$2 3=$3" ${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_IconExclamation|mb_TopMost|mb_SetForeground "Dieser Installationsassistent benötigt Adminrechte, bitte erneut versuchen." /SD IDNO IDOK uac_tryagain IDNO 0 ${EndIf} ;fall-through and die ${Case} 1223 ;hier kommt der Ausstieg falls der User keine Adminrechte erwerben kann. ;MessageBox MB_YESNO|mb_IconStop|mb_TopMost|mb_SetForeground "Für die Installation des Windowstreibers werden Adminrechte benötigt. Mit NeoVars kann jedoch auch ohne Adminrechte das Neo2.0-Tastaturlayout installiert werden. Bitte die Hinweise auf der Website beachten. Soll Neo-Vars gestartet werden?" IDYES gogogo ;ExecShell "open" "http://neo-layout.org/windows" ;Quit ;gogogo: ExecShell "open" http://neo-layout.org/windows goto end ${Case} 1062 MessageBox mb_IconStop|mb_TopMost|mb_SetForeground "Logon-Dienst nicht verfügbar, Abbruch!" Quit ${Default} MessageBox mb_IconStop|mb_TopMost|mb_SetForeground "Ups , Error $0" Quit ${EndSwitch} end: ;Sperrt ohne Adminrechte alles außer NeoVars GetDlgItem $DlgItem $HWNDPARENT 3 ; Back button EnableWindow $DlgItem 0 userInfo::getAccountType pop $R0 strCmp $R0 "Admin" +6 ;falls Admin hüpf 6 Commandozeilen weiter ;wenn kein Admin wird das hier angezeigt: messageBox MB_OK "Nur $R0-Rechte. Ohne Adminrechte ist nur der NeoVars-Treiber verfügbar." SectionSetFlags ${installiereKbdneoPlusAHK} ${SF_RO} ;Installationsarten mit Adminrechten werden gesperrt SectionSetFlags ${installiereKbdneoOhneAHK} ${SF_RO} ;Installationsarten mit Adminrechten werden gesperrt SectionSetFlags ${installiereAHK} ${SF_SELECTED} return ;messageBox MB_OK "Wir sind Admin" FunctionEnd ;Überspringt die Directory-Seite falls kein AHK installiert wird Function leaveComp SectionGetFlags ${installiereKbdneoOhneAHK} $0 IntOp $1 $0 & ${SF_SELECTED} IntCmp $1 0 showDir push "skip components" ;schiebt es auf den Stack showDir: FunctionEnd Function preDir pop $R0 ;holt es sich vom Stack zurück StrCmp "$R0" "skip components" 0 end ;vergleicht es und springt zu Ende wenn es nicht passt abort ;hat gepasst, Components-Seite wird übersprungen. end: FunctionEnd ;Verschafft etwas Zeit zum Kucken Function leaveInst sleep 1500 ;Ein bisschen Pause, damit man was sieht. FunctionEnd ;Layout beim User Aktivieren (hoffentlich ;) ;Function makeKBDactive ; System::Call "user32::LoadKeyboardLayout(t "b0000407",i 0x00000001) i .r1 ?e" ; Pop $2 ; MessageBox mb_TopMost "0:$0 1:$1 2:$2 3:$3" ;FunctionEnd ;Datei beim User schreiben, obwohl als Admin eingeloggt Function goUserDir createShortCut "$SMPROGRAMS\Startup\AHK für kbdneo.lnk" "$INSTDIR\kbdneo_ahk.exe" FunctionEnd ;-------------------------------- ;Beschreibung der Installationstypen ;LangsStrings (nur Deutsch) LangString DESC_installiereKbdneoPlusAHK ${LANG_GERMAN} "System32-Test und bel. Ordner (hier sollten immer Adminrechte angefordert werden)" LangString DESC_installiereKbdneoOhneAHK ${LANG_GERMAN} "nur System32-Test (hier sollten immer Adminrechte angefordert werden)" LangString DESC_installiereAHK ${LANG_GERMAN} "Installiert den Neo2.0-AHK-Standalone-Treiber Neo-Vars (keine Adminrechte nötig)" ;LangsStrings den Sections zuordnen !insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN !insertmacro MUI_DESCRIPTION_TEXT ${installiereKbdneoPlusAHK} $(DESC_installiereKbdneoPlusAHK) !insertmacro MUI_DESCRIPTION_TEXT ${installiereKbdneoOhneAHK} $(DESC_installiereKbdneoOhneAHK) !insertmacro MUI_DESCRIPTION_TEXT ${installiereAHK} $(DESC_installiereAHK) !insertmacro MUI_FUNCTION_DESCRIPTION_END ;--------------------------------- ;Dateieigenschaften des Installers VIAddVersionKey /LANG=${LANG_GERMAN} "ProductName" "Neo 2.0" VIAddVersionKey /LANG=${LANG_GERMAN} "Comments" "Buy me a Caffè /;)" VIAddVersionKey /LANG=${LANG_GERMAN} "FileDescription" "Neo 2.0 Installationsassistent" VIAddVersionKey /LANG=${LANG_GERMAN} "FileVersion" "${ZEIT}" VIProductVersion "2.0.${ZEIT}"