From 25f89966fb888793c8ca6e4ab8cbcdecdf850cc7 Mon Sep 17 00:00:00 2001 From: mbirth Date: Fri, 25 Aug 2006 19:59:50 +0000 Subject: [PATCH] Initial import --- U3Helper.ahk | 386 +++++++++++++++++++++++++++++++++++++++++++++++ U3Helper.ico | Bin 0 -> 25214 bytes U3Helperex.ini | 36 +++++ mb_IniTools.ahk | 57 +++++++ mb_TextTools.ahk | 31 ++++ 5 files changed, 510 insertions(+) create mode 100644 U3Helper.ahk create mode 100644 U3Helper.ico create mode 100644 U3Helperex.ini create mode 100644 mb_IniTools.ahk create mode 100644 mb_TextTools.ahk diff --git a/U3Helper.ahk b/U3Helper.ahk new file mode 100644 index 0000000..6d78513 --- /dev/null +++ b/U3Helper.ahk @@ -0,0 +1,386 @@ +#NoTrayIcon +#NoEnv +#Include mb_IniTools.ahk +#Include mb_TextTools.ahk + +EnvGet U3_DEVICE_SERIAL, U3_DEVICE_SERIAL ; serial number of device (copy protection) +EnvGet U3_DEVICE_PATH, U3_DEVICE_PATH ; drive letter to device (F:) +EnvGet U3_DEVICE_DOCUMENT_PATH, U3_DEVICE_DOCUMENT_PATH ; path to documents (F:\Documents) +EnvGet U3_DEVICE_VENDOR, U3_DEVICE_VENDOR ; vendor +EnvGet U3_DEVICE_PRODUCT, U3_DEVICE_PRODUCT ; product name string +EnvGet U3_DEVICE_VENDOR_ID, U3_DEVICE_VENDOR_ID ; vendor id (decimal!! 2284 = 0x08ec) +EnvGet U3_APP_DATA_PATH, U3_APP_DATA_PATH ; data path for app (on device) +EnvGet U3_HOST_EXEC_PATH, U3_HOST_EXEC_PATH ; path to exe on host +EnvGet U3_DEVICE_EXEC_PATH, U3_DEVICE_EXEC_PATH ; path to needed files on device +EnvGet U3_ENV_VERSION, U3_ENV_VERSION ; should be 1.0 +EnvGet U3_ENV_LANGUAGE, U3_ENV_LANGUAGE ; language id of LaunchPad +EnvGet U3_IS_UPGRADE, U3_IS_UPGRADE ; can be "false" or "true" +EnvGet U3_IS_DEVICE_AVAILABLE, U3_IS_DEVICE_AVAILABLE ; "true"/"false" +EnvGet U3_IS_AUTORUN, U3_IS_AUTORUN ; is this an autorun-launch? "true"/"false" +EnvGet U3_DAPI_CONNECT_STRING, U3_DAPI_CONNECT_STRING ; who needs this? +EnvGet eALLUSERSPROFILE, ALLUSERSPROFILE ; C:\Documents and Settings\All Users +EnvGet eAPPDATA, APPDATA ; C:\Doc...\\Application Data +EnvGet eCommonProgramFiles, CommonProgramFiles ; C:\Program Files\Common Files +EnvGet eHOMEPATH, HOMEPATH ; C:\Documents and Settings\ +EnvGet eProgramFiles, ProgramFiles ; C:\Program Files +EnvGet eSystemRoot, SystemRoot ; C:\WINDOWS +EnvGet eUSERPROFILE, USERPROFILE ; C:\Documents and Settings\ +EnvGet eTEMP, TEMP ; C:\DOCUME~1\\LOCALS~1\Temp +EnvGet ewindir, windir ; C:\WINDOWS + +SplitPath A_ScriptFullPath, null, ScrDir, null, ScrFile, ScrDrive +INIFile = %ScrDir%\%ScrFile%.ini +IniRead AppName, %INIFile%, U3Helper, AppName, unknown +IniRead AppExe, %INIFile%, U3Helper, AppExe, cmd.exe +IniRead Unattended, %INIFile%, U3Helper, Unattended, 0 +IniGetKeys("regsvr", INIFile, "regsvr32") +IniGetKeys("datexe", INIFile, "DataToExecDir") +IniGetKeys("regbak", INIFile, "RegBackup") +IniGetKeys("regdel", INIFile, "RegDelete") +IniGetKeys("fildel", INIFile, "FileDelete") + +Status(msg) +{ + global AppName + if (StrLen(msg) > 0) + { + ToolTip %AppName%`n%msg% + } + Else + { + ToolTip + } +} + +If 1 = config +{ + ; ########################################################################## + ; ### ### + ; ### hostConfigure ### + ; ### ### + ; ########################################################################## + + Menu Tray, Icon + TrayTip Preparing %AppName% ..., U3Helper`n(c)2006 Markus Birth`nmbirth@webwriters.de, 3, 1 + + Status("Checking registry settings...") + keycount = 0 + ;Registry stuff + Loop %regbak0% + { + CurBranch := regbak%A_Index% + SplitFirst(RegRoot, RegSub, CurBranch, "\") + Loop %RegRoot%, %RegSub%, 1, 1 + { + keycount += 1 + } + If (keycount > 0) + { + Status("Backing up registry settings #" . A_Index . " ...") + RunWait regedit /E "%U3_HOST_EXEC_PATH%\U3Hregbak%A_Index%.reg" "%CurBranch%" + Status("Cleaning registry settings #" . A_Index . " ...") + RegDelete %RegRoot%, %RegSub% + } + } + + If (keycount > 0) + { + Status("") + IniWrite 1, %INIFile%, U3Helper, KeepSettings + If (Unattended = "0") + { + MsgBox 4132, %AppName%: Duplicate settings, Settings for %AppName% were already found on this PC. Do you want to use them?`n`nIf you select NO, the local settings will be overwritten by those saved on your U3 stick.`n(They have been backed up and can be restored upon eject of the stick.) + IfMsgBox Yes + { + IniWrite 1, %INIFile%, U3Helper, ForeignSettings + } + } + } + IniRead ForeignSettings, %INIFile%, U3Helper, ForeignSettings, 0 + If (ForeignSettings = "0") + { + Loop %regbak0% + { + Status("Importing registry settings #" . A_Index . " ...") + RunWait regedit /S "%U3_APP_DATA_PATH%\regdata%A_Index%.reg" + } + IfExist %U3_APP_DATA_PATH%\regdataX.reg + { + Status("Importing special registry settings ...") + RunWait regedit /S "%U3_APP_DATA_PATH%\regdataX.reg" + } + Loop %regbak0% + { + Status("Translating paths in registry #" . A_Index . " ...") + CurBranch := regbak%A_Index% + SplitFirst(RegRoot, RegSub, CurBranch, "\") + Loop %RegRoot%, %RegSub%, 0, 1 + { + If (A_LoopRegType = "REG_SZ" or A_LoopRegType = "REG_EXPAND_SZ" or A_LoopRegType = "REG_MULTI_SZ") + { + RegRead RegValue + StringReplace NewRegValue, RegValue, % "%U3_HOST_EXEC_PATH%", %U3_HOST_EXEC_PATH%, A + StringReplace NewRegValue, NewRegValue, % "%U3_APP_DATA_PATH%", %U3_APP_DATA_PATH%, A + StringReplace NewRegValue, NewRegValue, % "%U3_DEVICE_EXEC_PATH%", %U3_DEVICE_EXEC_PATH%, A + StringReplace NewRegValue, NewRegValue, % "%U3_DEVICE_DOCUMENT_PATH%", %U3_DEVICE_DOCUMENT_PATH%, A + StringReplace NewRegValue, NewRegValue, % "%TEMP%", %eTEMP%, A + StringReplace NewRegValue, NewRegValue, % "%SystemRoot%", %eSystemRoot%, A + StringReplace NewRegValue, NewRegValue, % "%WINDIR%", %ewindir%, A + StringReplace NewRegValue, NewRegValue, % "%APPDATA%", %eAPPDATA%, A + StringReplace NewRegValue, NewRegValue, % "%USERPROFILE%", %eUSERPROFILE%, A + StringReplace NewRegValue, NewRegValue, % "%ALLUSERSPROFILE%", %eALLUSERSPROFILE%, A + StringReplace NewRegValue, NewRegValue, % "%CommonProgramFiles%", %eCommonProgramFiles%, A + StringReplace NewRegValue, NewRegValue, % "%ProgramFiles%", %eProgramFiles%, A + If (NewRegValue <> RegValue) + { + RegWrite %NewRegValue% + } + } + } + } + } + + ;Copy data files + Loop %datexe0% + { + CurFile := datexe%A_Index% + FileGetAttrib FilAttr, %U3_APP_DATA_PATH%\%CurFile% + IfInString FilAttr, D + { + Status("Copying data directory " . CurFile . " ...") + FileCopyDir %U3_APP_DATA_PATH%\%CurFile%, %U3_HOST_EXEC_PATH%\%CurFile%, 1 + } + Else + { + Status("Copying data file " . CurFile . " ...") + FileCopy %U3_APP_DATA_PATH%\%CurFile%, %U3_HOST_EXEC_PATH%\%CurFile%, 1 + } + } + + ; regsvr32 stuff + IniRead KeepSettings, %INIFile%, U3Helper, KeepSettings, 0 + If (KeepSettings = "0") + { + Loop %regsvr0% + { + CurDLL := regsvr%A_Index% + Status("Registering file " . CurDLL . " ...") + RunWait regsvr32 /S "%U3_HOST_EXEC_PATH%\%CurDLL%" + } + } + Status("") +} +Else If 1 = unconfig +{ + ; ########################################################################## + ; ### ### + ; ### hostCleanUp ### + ; ### ### + ; ########################################################################## + + If (U3_IS_DEVICE_AVAILABLE <> "true") + { + ; U3 stick not plugged in!! + MsgBox 4112, U3 Device Not Available, Your U3 Device seems to be disconnected. The settings cannot be saved!`n`nAll your changes made since plugging in the U3 Device are likely to be lost. Try to manually save them now.`n`nAfter pressing OK, registry entries will be removed. + } + Else + { + ; U3 stick plugged in + IniRead ForeignSettings, %INIFile%, U3Helper, ForeignSettings, 0 + If (ForeignSettings <> "0") + { + MsgBox 4132, %AppName%: Foreign settings, You chose to use the settings previously stored on this PC for %AppName%.`n`nDo you want to copy them to your U3 stick so that you have these settings available the next time? + IfMsgBox Yes + { + IniDelete %INIFile%, U3Helper, ForeignSettings + } + } + IniRead ForeignSettings, %INIFile%, U3Helper, ForeignSettings, 0 + If (ForeignSettings = "0") + { + Loop %regbak0% + { + Status("Translating paths in registry #" . A_Index . " ...") + CurBranch := regbak%A_Index% + SplitFirst(RegRoot, RegSub, CurBranch, "\") + Loop %RegRoot%, %RegSub%, 0, 1 + { + If (A_LoopRegType = "REG_SZ" or A_LoopRegType = "REG_EXPAND_SZ" or A_LoopRegType = "REG_MULTI_SZ") + { + RegRead RegValue + StringReplace NewRegValue, RegValue, %U3_HOST_EXEC_PATH%, % "%U3_HOST_EXEC_PATH%", A + StringReplace NewRegValue, NewRegValue, %U3_APP_DATA_PATH%, % "%U3_APP_DATA_PATH%", A + StringReplace NewRegValue, NewRegValue, %U3_DEVICE_EXEC_PATH%, % "%U3_DEVICE_EXEC_PATH%", A + StringReplace NewRegValue, NewRegValue, %U3_DEVICE_DOCUMENT_PATH%, % "%U3_DEVICE_DOCUMENT_PATH%", A + StringReplace NewRegValue, NewRegValue, %eTEMP%, % "%TEMP%", A + StringReplace NewRegValue, NewRegValue, %eSystemRoot%, % "%SystemRoot%", A + StringReplace NewRegValue, NewRegValue, %eAPPDATA%, % "%APPDATA%", A + StringReplace NewRegValue, NewRegValue, %eUSERPROFILE%, % "%USERPROFILE%", A + StringReplace NewRegValue, NewRegValue, %eALLUSERSPROFILE%, % "%ALLUSERSPROFILE%", A + StringReplace NewRegValue, NewRegValue, %eCommonProgramFiles%, % "%CommonProgramFiles%", A + StringReplace NewRegValue, NewRegValue, %eProgramFiles%, % "%ProgramFiles%", A + If (NewRegValue <> RegValue) + { + RegWrite %NewRegValue% + } + } + } + } + Loop %regbak0% + { + CurBranch := regbak%A_Index% + Status("Saving registry settings #" . A_Index . " ...") + RunWait regedit /E "%U3_APP_DATA_PATH%\regdata%A_Index%.reg" "%CurBranch%" + } + } + + ;Copy data files + Loop %datexe0% + { + CurFile := datexe%A_Index% + FileGetAttrib FilAttr, %U3_HOST_EXEC_PATH%\%CurFile% + IfInString FilAttr, D + { + Status("Saving data directory " . CurFile . " ...") + FileCopyDir %U3_HOST_EXEC_PATH%\%CurFile%, %U3_APP_DATA_PATH%\%CurFile%, 1 + } + Else + { + Status("Saving data file " . CurFile . " ...") + FileCopy %U3_HOST_EXEC_PATH%\%CurFile%, %U3_APP_DATA_PATH%\%CurFile%, 1 + } + } + } + + IniRead KeepSettings, %INIFile%, U3Helper, KeepSettings, 0 + RevertSettings := "0" + If (KeepSettings <> "0") + { + If (Unattended = "0") + { + MsgBox 4132, %AppName%: Foreign settings, Do you want to keep the changed settings for %AppName%?`n`n(Select No to revert to the former settings.) + IfMsgBox No + { + RevertSettings := "1" + } + } + Else + { + RevertSettings := "1" + } + } + If (KeepSettings = "0" or RevertSettings = "1") + { + Loop %regbak0% + { + Status("Removing registry settings #" . A_Index . " from host system ...") + CurBranch := regbak%A_Index% + SplitFirst(RegRoot, RegSub, CurBranch, "\") + RegDelete %RegRoot%, %RegSub% + If (RevertSettings = "1") + { + Status("Restoring registry settings #" . A_Index . " from backup ...") + RunWait regedit /S "%U3_HOST_EXEC_PATH%\U3Hregbak%A_Index%.reg" + } + } + } + If (KeepSettings = "0") + { + Loop %regdel0% + { + Status("Removing add. registry settings #" . A_Index . " from host system ...") + CurBranch := regdel%A_Index% + SplitFirst(RegRoot, RegSub, CurBranch, "\") + RegDelete %RegRoot%, %RegSub% + } + + ; regsvr32 stuff + Loop %regsvr0% + { + CurDLL := regsvr%A_Index% + Status("Unregistering file " . CurDLL . " ...") + RunWait regsvr32 /S /U "%U3_HOST_EXEC_PATH%\%CurDLL%" + } + + ; remove files + Loop %fildel0% + { + CurFile := fildel%A_Index% + StringReplace CurFile, CurFile, % "%ALLUSERSPROFILE%", %eALLUSERSPROFILE%, A + StringReplace CurFile, CurFile, % "%APPDATA%", %eAPPDATA%, A + StringReplace CurFile, CurFile, % "%CommonProgramFiles%", %eCommonProgramFiles%, A + StringReplace CurFile, CurFile, % "%HOMEPATH%", %eHOMEPATH%, A + StringReplace CurFile, CurFile, % "%ProgramFiles%", %eProgramFiles%, A + StringReplace CurFile, CurFile, % "%SystemRoot%", %eSystemRoot%, A + StringReplace CurFile, CurFile, % "%USERPROFILE%", %eUSERPROFILE%, A + StringReplace CurFile, CurFile, % "%WINDIR%", %ewindir%, A + StringReplace CurFile, CurFile, % "%TEMP%", %eTEMP%, A + StringReplace CurFile, CurFile, % "%U3_APP_DATA_PATH%", %U3_APP_DATA_PATH%, A + StringReplace CurFile, CurFile, % "%U3_DEVICE_DOCUMENT_PATH%", %U3_DEVICE_DOCUMENT_PATH%, A + StringReplace CurFile, CurFile, % "%U3_DEVICE_EXEC_PATH%", %U3_DEVICE_EXEC_PATH%, A + FileGetAttrib FilAttr, %CurFile% + IfInString FilAttr, D + { + Status("Removing directory #" . A_Index . " from host system ...") + FileRemoveDir %CurFile%, 1 + } + Else + { + Status("Removing file #" . A_Index . " from host system ...") + FileDelete %CurFile% + } + } + } + + Status("") + If (U3_IS_DEVICE_AVAILABLE = "true") + { + IniDelete %INIFile%, U3Helper, ForeignSettings + IniDelete %INIFile%, U3Helper, KeepSettings + } +} +Else If 1 = appstart +{ + EnvSet USERPROFILE, %U3_APP_DATA_PATH% + EnvSet HOMEPATH, %U3_APP_DATA_PATH% + EnvSet APPDATA, %U3_APP_DATA_PATH%\Application Data + IfNotExist %APPDATA% + { + FileCreateDir %APPDATA% + } + cmdl := AppExe + Loop %0% + { + If (A_Index > 1) + { + cmdl := cmdl . " " . %A_Index% + } + } + RunWait %cmdl% +} +Else If 1 = appstop +{ + Counter = 0 + + ToolTip Closing %AppName% ... + + TryClose: + Process Exist, %AppExe% + If ErrorLevel + ProgPID = %ErrorLevel% + Else + Goto CloseDone + + WinClose ahk_pid %ProgPID%, , 0.5 + If Counter >= 10 + Process Close, %ProgPID% + Counter += 1 + Goto TryClose + + CloseDone: + ToolTip +} +Else +{ + MsgBox No parameter given. +} diff --git a/U3Helper.ico b/U3Helper.ico new file mode 100644 index 0000000000000000000000000000000000000000..4a51776726f55333aa84560753f38f00488ee847 GIT binary patch literal 25214 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 0) + { + Inside = 0 + Break + } + StringLeft cp, TrimLine, 1 + If (cp = ";") + { + ; It's a comment line + Continue + } + If (Inside = 1 and StrLen(TrimLine) > 0) + { + SplitFirst(Key, Value, A_LoopReadLine, "=") + %Result%%i% = %Key% + i++ + } + } + %Result%0 := i-1 + return i-1 +} + +; Check whether Probe is something like [blabla] and return "blabla" +; if it's no section, return an empty string +IniGetSectFromLine(Probe) +{ + result := "" + Probe = %Probe% ; trim whitespaces or tabs + StringLeft ls, Probe, 1 + StringRight rs, Probe, 1 + If (ls = "[" and rs = "]") + { + sl := StrLen(Probe) - 2 + StringMid result, Probe, 2, %sl% + } + return result +} diff --git a/mb_TextTools.ahk b/mb_TextTools.ahk new file mode 100644 index 0000000..240e51a --- /dev/null +++ b/mb_TextTools.ahk @@ -0,0 +1,31 @@ +SplitFirst(ByRef OutLeft, ByRef OutRight, InpText, InpSep) +{ + StringGetPos SepPos, InpText, %InpSep%, L + If (SepPos >= 0) + { + StringLeft OutLeft, InpText, %SepPos% + RemChars := StrLen(InpText)-SepPos-1 + StringRight OutRight, InpText, %RemChars% + } + Else + { + OutLeft := InpText + OutRight := "" + } +} + +SplitLast(ByRef OutLeft, ByRef OutRight, InpText, InpSep) +{ + StringGetPos SepPos, InpText, %InpSep%, R + If (SepPos >= 0) + { + StringLeft OutLeft, InpText, %SepPos% + RemChars := StrLen(InpText)-SepPos-1 + StringRight OutRight, InpText, %RemChars% + } + Else + { + OutLeft := "" + OutRight := InpText + } +}