MODULE UsbUtils; IMPORT SYSTEM, WinApi, Strings, ComTools, Log := StdLog; CONST HK_LM_JRE_Key = "SOFTWARE\javaSoft\Java Runtime Environment"; HK_LM_JRE_CurrentVersion_value = "CurrentVersion"; HK_LM_JRE_JavaHome_value = "JavaHome"; HK_LM_PATH_Key = "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; HK_CU_PATH_Key = "Environment"; PATH_value = "PATH"; PROCEDURE RegLMQuery* (IN subKey, valueName: ARRAY OF SHORTCHAR; OUT qValue: ARRAY OF SHORTCHAR): BOOLEAN; VAR res, length: INTEGER; hKey: WinApi.HKEY; BEGIN qValue := ""; res := WinApi.RegOpenKeyEx(WinApi.HKEY_LOCAL_MACHINE, subKey, 0, WinApi.KEY_QUERY_VALUE, hKey); IF res # WinApi.ERROR_SUCCESS THEN RETURN FALSE ELSE length := LEN(qValue); res := WinApi.RegQueryValueEx(hKey, valueName, NIL, NIL, qValue[0], length); IF res # WinApi.ERROR_SUCCESS THEN RETURN FALSE END END; res := WinApi.RegCloseKey(hKey); RETURN TRUE; END RegLMQuery; PROCEDURE RegCUQuery* (IN subKey, valueName: ARRAY OF SHORTCHAR; OUT qValue: ARRAY OF SHORTCHAR): BOOLEAN; VAR res, length: INTEGER; hKey: WinApi.HKEY; BEGIN qValue := ""; res := WinApi.RegOpenKeyEx(WinApi.HKEY_CURRENT_USER, subKey, 0, WinApi.KEY_QUERY_VALUE, hKey); IF res # WinApi.ERROR_SUCCESS THEN RETURN FALSE ELSE length := LEN(qValue); res := WinApi.RegQueryValueEx(hKey, valueName, NIL, NIL, qValue[0], length); IF res # WinApi.ERROR_SUCCESS THEN RETURN FALSE END END; res := WinApi.RegCloseKey(hKey); RETURN TRUE; END RegCUQuery; PROCEDURE RegCUCreateKeyAndSetValue* (IN subKey, valueName: ARRAY OF SHORTCHAR; newValue: ARRAY OF SHORTCHAR): BOOLEAN; VAR res, length, lpdwDisposition: INTEGER; hKey: WinApi.HKEY; BEGIN res := WinApi.RegCreateKeyEx(WinApi.HKEY_CURRENT_USER, subKey, 0, NIL, WinApi.REG_OPTION_NON_VOLATILE, WinApi.KEY_ALL_ACCESS, NIL, hKey, lpdwDisposition); IF res # WinApi.ERROR_SUCCESS THEN RETURN FALSE END; res := WinApi.RegSetValueEx(hKey, valueName, 0, WinApi.REG_SZ, newValue[0], LEN(newValue$)); IF res # WinApi.ERROR_SUCCESS THEN RETURN FALSE END; res := WinApi.RegCloseKey(hKey); RETURN TRUE END RegCUCreateKeyAndSetValue; PROCEDURE CheckAndSetPath*; CONST PATH_Pattern = "\bin\client"; SMTO_ABORTIFHUNG = {1} (* 2 in C *); HWND_BROADCAST = 0FFFFH; VAR jreHome, regValue, tmpRegValue: ARRAY 2048 OF SHORTCHAR; pos, result: INTEGER; noUserPathValue, success, found: BOOLEAN; environment: WinApi.PtrSTR; BEGIN (* get jre home path *) IF ~RegLMQuery(HK_LM_JRE_Key, HK_LM_JRE_CurrentVersion_value, tmpRegValue) (* e.g. "1.5" *) THEN Log.String("UsbUtils: Error getting " + HK_LM_JRE_Key + "! Is Java installed?"); Log.Ln; RETURN END; IF ~RegLMQuery(HK_LM_JRE_Key + "\" + tmpRegValue, HK_LM_JRE_JavaHome_value, jreHome) THEN Log.String("UsbUtils: Error getting " + HK_LM_JRE_Key + "\" + tmpRegValue + "! Is Java installed?"); Log.Ln; RETURN END; (* look for %javahome%\bin\client on system and user path*) regValue := jreHome + PATH_Pattern; found := RegLMQuery(HK_LM_PATH_Key, "Path", tmpRegValue); Strings.Find(LONG(tmpRegValue), LONG(regValue), 0, pos); found := pos >= 0; IF found THEN Log.String("the PATH system variable " + regValue + " is already set"); Log.Ln; RETURN END; tmpRegValue := ""; noUserPathValue := ~RegCUQuery(HK_CU_PATH_Key, PATH_value, tmpRegValue); Strings.Find(LONG(tmpRegValue), PATH_Pattern, 0, pos); found := pos >= 0; IF ~found THEN (* insert registry key into user PATH variable *) IF tmpRegValue = "" THEN tmpRegValue := regValue; ELSE tmpRegValue := tmpRegValue + ";" + regValue END; IF RegCUCreateKeyAndSetValue(HK_CU_PATH_Key, PATH_value, tmpRegValue) THEN IF noUserPathValue THEN (* create user PATH value first *) Log.String("user value PATH created"); Log.Ln; END; Log.String(regValue + " added to user PATH"); Log.Ln; ELSE Log.String("UsbUtils: Error on CreateKey with value " + tmpRegValue); Log.Ln; END; (* Notify windows about Environment Change (if this is not done, the changes will only take effect after reboot) *) Log.String("Updating Environment - this may take some seconds..."); Log.Ln; environment := ComTools.NewSString("Environment"); result := WinApi.SendMessageTimeout(HWND_BROADCAST, WinApi.WM_SETTINGCHANGE, 0, SYSTEM.VAL(INTEGER, environment), SMTO_ABORTIFHUNG, 2000, result); Log.String("Please restart Blackbox"); Log.Ln; ELSE Log.String("the PATH user variable " + regValue + " is already set"); Log.Ln; END END CheckAndSetPath; END UsbUtils.