private WindowsBrowser getBrowserFromRegistryEntry(
     Regor regor, int key, String subKey, String exeKey, Map exesToBrowserObjs)
     throws RegistryErrorException {
   WindowsBrowser winBrowser = null;
   int key2 = regor.openKey(key, subKey);
   List values = regor.listValueNames(key2);
   // boolean fndPath = false;
   for (int x = 0; values != null && x < values.size() && winBrowser == null; x++) {
     byte[] buf = regor.readValue(key2, (String) values.get(x));
     String path = buf != null ? Regor.parseValue(buf) : "";
     String lpath = path.toLowerCase();
     if (lpath.endsWith(exeKey)) {
       winBrowser = (WindowsBrowser) exesToBrowserObjs.get(exeKey);
       // get path to exe and set it in winBrowser object
       StringTokenizer tokenizer = new StringTokenizer(path, "\\", false);
       StringBuffer pathBuf = new StringBuffer();
       int tokCnt = tokenizer.countTokens();
       // we want to ignore the last token
       for (int idx = 1; idx < tokCnt; idx++) {
         pathBuf.append(tokenizer.nextToken());
         pathBuf.append('\\');
       }
       winBrowser.setPathToExe(pathBuf.toString());
     }
   }
   return winBrowser;
 }
 /**
  * Secondary method for browser discovery.
  *
  * <p>Uses IE to get the path to the Program Files directory; then gets a list of the sub dirs and
  * checks them against the remaining browsers.
  *
  * @param iePath String
  * @param browsersAvailable Map
  * @param tmpBrowsersToCheck List
  */
 private Map processFilePathsForBrowsers(List tmpBrowsersToCheck) {
   logger.debug("finding available browsers in program files path");
   logger.debug("browsers to check: " + tmpBrowsersToCheck);
   Map browsersAvailable = new HashMap();
   File progFilesPath = getProgramFilesPath();
   if (progFilesPath != null) {
     logger.debug("program files path: " + progFilesPath.getPath());
     File[] subDirs = progFilesPath.listFiles(new DirFileFilter());
     int subDirsCnt = subDirs != null ? subDirs.length : 0;
     // create and populate map of dir names to win browser objects
     Iterator iter = tmpBrowsersToCheck.iterator();
     Map dirNameToBrowser = new HashMap();
     while (iter.hasNext()) {
       WindowsBrowser wBrowser = (WindowsBrowser) iter.next();
       dirNameToBrowser.put(wBrowser.getSubDirName(), wBrowser);
     }
     // iterate over subdirs and compare to map entries
     for (int idx = 0; idx < subDirsCnt && !tmpBrowsersToCheck.isEmpty(); idx++) {
       if (dirNameToBrowser.containsKey(subDirs[idx].getName())) {
         WindowsBrowser wBrowser = (WindowsBrowser) dirNameToBrowser.get(subDirs[idx].getName());
         // need to search folder and sub-folders for exe to find
         // the full path
         String exeName = wBrowser.getBrowserApplicationName() + ".exe";
         File fullPathToExe = findExeFilePath(subDirs[idx], exeName);
         if (fullPathToExe != null) {
           logger.debug(
               "Adding browser " + wBrowser.getBrowserDisplayName() + " to available list.");
           wBrowser.setPathToExe(fullPathToExe.getPath());
           logger.debug(wBrowser.getPathToExe());
           // adding display and exe for backward compatibility and
           // ease of use if someone passes in the name of an exe
           browsersAvailable.put(wBrowser.getBrowserDisplayName(), wBrowser);
           browsersAvailable.put(wBrowser.getBrowserApplicationName(), wBrowser);
           tmpBrowsersToCheck.remove(wBrowser);
         }
       }
     }
   }
   return browsersAvailable;
 }