From 7d0cd4700f1d4e2b2c0f0d7d5c6cdb592e7323b4 Mon Sep 17 00:00:00 2001
From: mbirth <mbirth>
Date: Thu, 12 Apr 2007 18:42:34 +0000
Subject: [PATCH] + added mb_EnvTools.ahk for everything with environment
 variables * implemented ProgressBar on appStop * use appStop routine in
 appStart-onExit + added RunBeforeStop + added RunBeforeEject * handled all
 EnvVar-replacements through mb_EnvTools.ahk

---
 U3H_appStart.ahk      |  47 +++-------------
 U3H_appStop.ahk       |  30 +++++++++--
 U3H_hostCleanUp.ahk   |  35 +++++-------
 U3H_hostConfigure.ahk |  13 +----
 U3Helper.ahk          |  37 ++++---------
 U3Helperex.ini        |   6 +++
 mb_EnvTools.ahk       | 121 ++++++++++++++++++++++++++++++++++++++++++
 mb_EnvTools.txt       |  24 +++++++++
 readme.txt            |  27 ++++++++++
 9 files changed, 233 insertions(+), 107 deletions(-)
 create mode 100644 mb_EnvTools.ahk
 create mode 100644 mb_EnvTools.txt
 create mode 100644 readme.txt

diff --git a/U3H_appStart.ahk b/U3H_appStart.ahk
index 7ec98c3..dd9acef 100644
--- a/U3H_appStart.ahk
+++ b/U3H_appStart.ahk
@@ -1,6 +1,6 @@
-EnvSet USERPROFILE, %U3_APP_DATA_PATH%
-EnvSet HOMEPATH, %U3_APP_DATA_PATH%
-EnvSet APPDATA, %U3_APP_DATA_PATH%\Application Data
+EnvSet USERPROFILE, % EnvValue("U3_APP_DATA_PATH")
+EnvSet HOMEPATH, % EnvValue("U3_APP_DATA_PATH")
+EnvSet APPDATA, % EnvValue("U3_APP_DATA_PATH") . "\Application Data"
 
 ; add custom PATH directories
 EnvGet ePATH, PATH
@@ -8,24 +8,13 @@ IniGetKeys("envdir", INIFile, "EnvPath")
 Loop %envdir0%
 {
   CurPath := envdir%A_Index%
-  StringReplace CurPath, CurPath, % "%ALLUSERSPROFILE%", %eALLUSERSPROFILE%, A
-  StringReplace CurPath, CurPath, % "%APPDATA%", %eAPPDATA%, A
-  StringReplace CurPath, CurPath, % "%CommonProgramFiles%", %eCommonProgramFiles%, A
-  StringReplace CurPath, CurPath, % "%HOMEPATH%", %eHOMEPATH%, A
-  StringReplace CurPath, CurPath, % "%ProgramFiles%", %eProgramFiles%, A
-  StringReplace CurPath, CurPath, % "%SystemRoot%", %eSystemRoot%, A
-  StringReplace CurPath, CurPath, % "%USERPROFILE%", %eUSERPROFILE%, A
-  StringReplace CurPath, CurPath, % "%WINDIR%", %ewindir%, A
-  StringReplace CurPath, CurPath, % "%TEMP%", %eTEMP%, A
-  StringReplace CurPath, CurPath, % "%U3_APP_DATA_PATH%", %U3_APP_DATA_PATH%, A
-  StringReplace CurPath, CurPath, % "%U3_DEVICE_DOCUMENT_PATH%", %U3_DEVICE_DOCUMENT_PATH%, A
-  StringReplace CurPath, CurPath, % "%U3_DEVICE_EXEC_PATH%", %U3_DEVICE_EXEC_PATH%, A
-  StringReplace CurPath, CurPath, % "%U3_HOST_EXEC_PATH%", %U3_HOST_EXEC_PATH%, A
-  
+  CurPath := EnvParseStr(CurPath)
+
   ePATH := CurPath . ";" . ePATH
 }
 EnvSet PATH, %ePATH%
 
+EnvGet APPDATA, APPDATA
 IfNotExist %APPDATA%
 {
   FileCreateDir %APPDATA%
@@ -41,27 +30,3 @@ Loop %0%
 }
 OnExit ASOnExit
 RunWait %cmdl%
-Goto ASCloseDone
-
-ASOnExit:
-Counter = 0
-ToolTip Closing %AppName% ...
-
-SplitPath AppExe, AppFile, null, null, null, null
-
-ASTryClose:
-Process Exist, %AppFile%
-If ErrorLevel
-  ProgPID = %ErrorLevel%
-Else
-  ExitApp
-
-WinClose ahk_pid %ProgPID%, , 0.5
-If Counter >= 10
-  Process Close, %ProgPID%
-Counter += 1
-Sleep 200
-Goto ASTryClose
-
-ASCloseDone:
-Tooltip
diff --git a/U3H_appStop.ahk b/U3H_appStop.ahk
index 28bf049..a207614 100644
--- a/U3H_appStop.ahk
+++ b/U3H_appStop.ahk
@@ -1,10 +1,29 @@
-Counter = 0
+ASOnExit:
 
-ToolTip Closing %AppName% ...
+StepsAll = 1
+If (StrLen(RunBeforeStop) > 0)
+  StepsAll++
+StepsStep := 100/StepsAll
+StepsPos = 0
+
+Progress b2 x%PL% y%PT% w%PW% m FM%PFM% FS%PFS%, U3Helper %U3HVer% - (c)2006-2007 Markus Birth <mbirth@webwriters.de>, Cleaning up %AppName% ..., AHKProgress-%AppName%
+WinSet Transparent, %PTrans%, AHKProgress-%AppName%
+
+If (StrLen(RunBeforeStop) > 0)
+{
+  Progress % StepsPos*StepsStep, Running stop command ...
+  RunBeforeStop := EnvParseStr(RunBeforeStop)
+  RunWait %RunBeforeStop%
+  StepsPos++
+}
 
 SplitPath AppExe, AppFile, null, null, null, null
 
+Counter = 0
+CounterMax = 10
+
 TryClose:
+Progress % StepsPos*StepsStep+StepsStep*Counter/CounterMax, Stopping %AppName% ...
 Process Exist, %AppFile%
 If ErrorLevel
   ProgPID = %ErrorLevel%
@@ -12,10 +31,13 @@ Else
   Goto CloseDone
 
 WinClose ahk_pid %ProgPID%, , 0.5
-If Counter >= 10
+If Counter >= %CounterMax%
+{
+  Progress 100, Killing %AppName% ...
   Process Close, %ProgPID%
+}
 Counter += 1
 Goto TryClose
 
 CloseDone:
-ToolTip
+Progress 100, appStop done.
diff --git a/U3H_hostCleanUp.ahk b/U3H_hostCleanUp.ahk
index f931058..0fcf91a 100644
--- a/U3H_hostCleanUp.ahk
+++ b/U3H_hostCleanUp.ahk
@@ -5,6 +5,8 @@
 ; ##########################################################################
  
 StepsAll = 0
+If (StrLen(RunBeforeEject) > 0)
+  StepsAll++
 If regsvr0 > 0
   StepsAll++
 If datexe0 > 0
@@ -23,6 +25,14 @@ StepsPos = 0
 Progress b2 x%PL% y%PT% w%PW% m FM%PFM% FS%PFS%, U3Helper %U3HVer% - (c)2006-2007 Markus Birth <mbirth@webwriters.de>, Cleaning up %AppName% ..., AHKProgress-%AppName%
 WinSet Transparent, %PTrans%, AHKProgress-%AppName%
 
+If (StrLen(RunBeforeEject) > 0)
+{
+  Progress % StepsPos*StepsStep, Running shutdown command ...
+  RunBeforeEject := EnvParseStr(RunBeforeEject)
+  RunWait %RunBeforeEject%
+  StepsPos++
+}
+
 If (U3_IS_DEVICE_AVAILABLE <> "true")
 {
   ; U3 stick not plugged in!!
@@ -57,17 +67,7 @@ Else
         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
+          NewRegValue := EnvUnparseStr(RegValue)
           If (NewRegValue <> RegValue)
           {
             RegWrite %NewRegValue%
@@ -224,18 +224,7 @@ If (KeepSettings = "0" or Unattended = "1")
   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
+    CurFile := EnvParseStr(CurFile)
     FileGetAttrib FilAttr, %CurFile%
     IfInString FilAttr, D
     {
diff --git a/U3H_hostConfigure.ahk b/U3H_hostConfigure.ahk
index 7de58e0..c93fa27 100644
--- a/U3H_hostConfigure.ahk
+++ b/U3H_hostConfigure.ahk
@@ -82,18 +82,7 @@ If (ForeignSettings = "0")
       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
+        NewRegValue := EnvParseStr(RegValue)
         If (NewRegValue <> RegValue)
         {
           RegWrite %NewRegValue%
diff --git a/U3Helper.ahk b/U3Helper.ahk
index 8eb01b5..34b8539 100644
--- a/U3Helper.ahk
+++ b/U3Helper.ahk
@@ -1,45 +1,27 @@
 #NoTrayIcon
 #NoEnv
+#Include mb_EnvTools.ahk
 #Include mb_IniTools.ahk
 #Include mb_TextTools.ahk
-U3HVer = 1.6
-
-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...\<username>\Application Data
-EnvGet eCommonProgramFiles, CommonProgramFiles               ; C:\Program Files\Common Files
-EnvGet eHOMEPATH, HOMEPATH                                   ; C:\Documents and Settings\<username>
-EnvGet eProgramFiles, ProgramFiles                           ; C:\Program Files
-EnvGet eSystemRoot, SystemRoot                               ; C:\WINDOWS
-EnvGet eUSERPROFILE, USERPROFILE                             ; C:\Documents and Settings\<username>
-EnvGet eTEMP, TEMP                                           ; C:\DOCUME~1\<username8.3>\LOCALS~1\Temp
-EnvGet ewindir, windir                                       ; C:\WINDOWS
+U3HVer = 1.7
 
 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
+IniRead RunBeforeStop, %INIFile%, U3Helper, RunBeforeStop, %A_Space%
+IniRead RunBeforeEject, %INIFile%, U3Helper, RunBeforeEject, %A_Space%
 IniGetKeys("regsvr", INIFile, "regsvr32")
 IniGetKeys("datexe", INIFile, "DataToExecDir")
 IniGetKeys("regbak", INIFile, "RegBackup")
 IniGetKeys("regdel", INIFile, "RegDelete")
 IniGetKeys("fildel", INIFile, "FileDelete")
 
+U3_APP_DATA_PATH := EnvValue("U3_APP_DATA_PATH")
+U3_HOST_EXEC_PATH := EnvValue("U3_HOST_EXEC_PATH")
+U3_DEVICE_EXEC_PATH := EnvValue("U3_DEVICE_EXEC_PATH")
+
 WinGetPos,Tx,Ty,Tw,Th,ahk_class Shell_TrayWnd,,,
 ; Tw>Th: horizontal taskbar (top or bottom)
 ; Tw<Th: vertical taskbar (left or right)
@@ -121,5 +103,6 @@ Else If 1 = appstop
 }
 Else
 {
-  MsgBox No parameter given.
+  MsgBox 48, U3Helper %U3HVer%, No parameter given.`n`nSee http://www.autohotkey.com/forum/topic11839.html for info.`n`n(c)2006-2007 Markus Birth <mbirth@webwriters.de>
+  MsgBox 64, U3Helper %U3HVer% - Debug info, % EnvList(), 30
 }
diff --git a/U3Helperex.ini b/U3Helperex.ini
index 42e8e19..7239c8a 100644
--- a/U3Helperex.ini
+++ b/U3Helperex.ini
@@ -1,6 +1,12 @@
 [U3Helper]
 AppName=PC OnPoint
 AppExe=PConPoint.exe
+
+; enter commandlines to run before stopping the application and before
+; ejecting the device. All variables mentioned under [FileDelete] work.
+RunBeforeStop=
+RunBeforeEject=
+
 ; set Unattended to 1 to suppress settings-related questions
 ; this way, previously existing settings on the host always get
 ; replaced by the U3's settings and restored on eject
diff --git a/mb_EnvTools.ahk b/mb_EnvTools.ahk
new file mode 100644
index 0000000..e020c52
--- /dev/null
+++ b/mb_EnvTools.ahk
@@ -0,0 +1,121 @@
+#NoEnv
+
+EnvVars0 = 0
+EnvVals0 = 0
+
+; initial list of EnvVars to load
+EnvVarsAll := "U3_DEVICE_SERIAL,U3_DEVICE_PATH,U3_DEVICE_DOCUMENT_PATH,U3_DEVICE_VENDOR,U3_DEVICE_PRODUCT,U3_DEVICE_VENDOR_ID"
+EnvVarsAll .= ",U3_APP_DATA_PATH,U3_HOST_EXEC_PATH,U3_DEVICE_EXEC_PATH,U3_ENV_VERSION,U3_ENV_LANGUAGE,U3_IS_UPGRADE"
+EnvVarsAll .= ",U3_IS_DEVICE_AVAILABLE,U3_IS_AUTORUN,U3_DAPI_CONNECT_STRING"
+EnvVarsAll .= ",ALLUSERSPROFILE,APPDATA,CommonProgramFiles,HOMEPATH,ProgramFiles,SystemRoot,USERPROFILE,TEMP,windir"
+
+StringSplit EnvVarsx, EnvVarsAll, `,%A_Space%
+
+; Load EnvVar-Values and store in EnvVals-array
+Loop %EnvVarsx0%
+{
+  EnvName := EnvVarsx%A_Index%
+  EnvGet EnvValsx%A_Index%, %EnvName%
+}
+EnvValsx0 = %EnvVarsx0%
+
+; Sort EnvVar-Values by StrLen() for re-replacement (value to var)
+; and clean out empty vars
+CurIndex = 1
+Loop %EnvVarsx0%
+{
+  MaxIndex = -1
+  MaxLen = -1
+  Loop %EnvValsx0%
+  {
+    CurNam := EnvVarsx%A_Index%
+    CurVal := EnvValsx%A_Index%
+    If ((StrLen(CurVal) >= MaxLen) and (StrLen(CurNam) > 0))
+    {
+      MaxLen := StrLen(CurVal)
+      MaxIndex := A_Index
+    }
+  }
+  If (StrLen(EnvValsx%MaxIndex%) > 0)
+  {
+    EnvVars%CurIndex% := EnvVarsx%MaxIndex%
+    EnvVals%CurIndex% := EnvValsx%MaxIndex%
+    CurIndex++
+  }
+  EnvVarsx%MaxIndex% := ""
+  EnvValsx%MaxIndex% := ""
+}
+
+EnvVars0 := CurIndex-1
+EnvVals0 := CurIndex-1
+
+; Debugging stuff:
+;MsgBox % "comspec:" . EnvValue("comspec")
+;MsgBox % EnvList()
+;MsgBox % EnvParseStr("This is a %temp% test running %comspec%!")
+
+
+
+
+EnvList()
+{
+  global
+  local result
+  result := ""
+  Loop %EnvVars0%
+  {
+    result .= EnvVars%A_Index% . " = " . EnvVals%A_Index% . "`n"
+  }
+  return result
+}
+
+EnvValue(envname)
+{
+  global
+  local result
+  result := ""
+  Loop %EnvVars0%
+  {
+    If (EnvVars%A_Index% = envname)
+    {
+      return EnvVals%A_Index%
+    }
+  }
+  ; EnvVar not in list - try to catch it
+  EnvGet result, %envname%
+  If (StrLen(result) > 0)
+  {
+    ; seems like a result ~~> add to list
+    MyPointer := ++EnvVars0
+    EnvVars%MyPointer% := envname
+    EnvVals%MyPointer% := result
+    EnvVals0++
+  }
+  return result
+}
+
+EnvParseStr(instring)
+{
+  global
+  local ReplFrom, ReplTo
+  Loop %EnvVars0%
+  {
+    ReplFrom := "%" . EnvVars%A_Index% . "%"
+    ReplTo := EnvVals%A_Index%
+    StringReplace instring, instring, %ReplFrom%, %ReplTo%, A
+  }
+  return instring
+}
+
+EnvUnparseStr(instring)
+{
+  global
+  local ReplFrom, ReplTo
+  Loop %EnvVals0%
+  {
+    ReplFrom := EnvVals%A_Index%
+    ReplTo := "%" . EnvVars%A_Index% . "%"
+    StringReplace instring, instring, %ReplFrom%, %ReplTo%, A
+  }
+  return instring
+}
diff --git a/mb_EnvTools.txt b/mb_EnvTools.txt
new file mode 100644
index 0000000..5517e5a
--- /dev/null
+++ b/mb_EnvTools.txt
@@ -0,0 +1,24 @@
+EnvAdd("U3_DEVICE_SERIAL")                    ; serial number of device (copy protection)
+EnvAdd("U3_DEVICE_PATH")                      ; drive letter to device (F:)
+EnvAdd("U3_DEVICE_DOCUMENT_PATH")             ; path to documents (F:\Documents)
+EnvAdd("U3_DEVICE_VENDOR")                    ; vendor
+EnvAdd("U3_DEVICE_PRODUCT")                   ; product name string
+EnvAdd("U3_DEVICE_VENDOR_ID")                 ; vendor id (decimal!! 2284 = 0x08ec)
+EnvAdd("U3_APP_DATA_PATH")                    ; data path for app (on device)
+EnvAdd("U3_HOST_EXEC_PATH")                   ; path to exe on host
+EnvAdd("U3_DEVICE_EXEC_PATH")                 ; path to needed files on device
+EnvAdd("U3_ENV_VERSION")                      ; should be 1.0
+EnvAdd("U3_ENV_LANGUAGE")                     ; language id of LaunchPad
+EnvAdd("U3_IS_UPGRADE")                       ; can be "false" or "true"
+EnvAdd("U3_IS_DEVICE_AVAILABLE")              ; "true"/"false"
+EnvAdd("U3_IS_AUTORUN")                       ; is this an autorun-launch? "true"/"false"
+EnvAdd("U3_DAPI_CONNECT_STRING")              ; who needs this?
+EnvAdd("ALLUSERSPROFILE")                     ; C:\Documents and Settings\All Users
+EnvAdd("APPDATA")                             ; C:\Doc...\<username>\Application Data
+EnvAdd("CommonProgramFiles")                  ; C:\Program Files\Common Files
+EnvAdd("HOMEPATH")                            ; C:\Documents and Settings\<username>
+EnvAdd("ProgramFiles")                        ; C:\Program Files
+EnvAdd("SystemRoot")                          ; C:\WINDOWS
+EnvAdd("USERPROFILE")                         ; C:\Documents and Settings\<username>
+EnvAdd("TEMP")                                ; C:\DOCUME~1\<username8.3>\LOCALS~1\Temp
+EnvAdd("windir")                              ; C:\WINDOWS
diff --git a/readme.txt b/readme.txt
new file mode 100644
index 0000000..f540e7c
--- /dev/null
+++ b/readme.txt
@@ -0,0 +1,27 @@
+U3Helper
+(c)2006-2007 by Markus Birth <mbirth@webwriters.de>
+
+Some words for the manifest.u3i:
+
+If your app doesn't store anything inside %USERPROFILE% or such, then just call it directly
+inside the <appStart> - such as:
+
+  <appStart workingdir="%U3_APP_DATA_PATH%" cmd="%U3_HOST_EXEC_PATH%\WebMon.exe">-prefs "%U3_APP_DATA_PATH%\WebMon.ini" -pages "%U3_APP_DATA_PATH%\pages\WebPages.dat"</appStart>
+
+BUT: If you app DOES store some stuff inside %USERPROFILE% (mostly noticeable if there appears something under
+     C:\Documents and Settings\<Username>\Application Data\<somewhat>\<something>), call it as follows:
+
+  <appStart workingdir="%U3_APP_DATA_PATH%" cmd="%U3_HOST_EXEC_PATH%\U3Helper.exe">appstart</appStart>
+
+This way, the environment variables %USERPROFILE% and a bunch of other related will be set to point to the
+data directory on the U3-stick and therefore those app will store its data there instead of on the host system.
+
+
+
+
+Take a look at the U3Helperex.ini as there are all supported settings mentioned. You'll get the idea of the expected
+format.
+
+U3Helper Forum: http://vanilla.birth-online.de/3/
+U3Helper English info: http://www.autohotkey.com/forum/topic11839.html
+U3Helper German info: http://blog.birth-online.de/archives/164-Programme-U3-faehig-machen.html