def detectGames(workingDir=u''): """Detect which supported games are intalled. - First, read the windows registry, checking for the install keys for the games. - Next, check for a valid game at "workingDir" - Finally, also look one directory up from the cwd.""" #--First: Find all supported games via the registry import pkgutil import game as _game foundGames = {} allGames = {} # Detect the known games for importer,modname,ispkg in pkgutil.iter_modules(_game.__path__): # Equivalent of "from game import <modname>" try: module = __import__('game',globals(),locals(),[modname],-1) except: deprint(u'Error in game support file:', modname, traceback=True) continue submod = getattr(module,modname) if not hasattr(submod,'name') or not hasattr(submod,'exe'): continue allGames[submod.name.lower()] = submod #--Get this game's install path for hkey in (_winreg.HKEY_CURRENT_USER, _winreg.HKEY_LOCAL_MACHINE): for wow6432 in (u'',u'Wow6432Node\\'): for (subkey,entry) in submod.regInstallKeys: try: key = _winreg.OpenKey(hkey, u'Software\\%s%s' % (wow6432,subkey)) value = _winreg.QueryValueEx(key,entry) except: continue if value[1] != _winreg.REG_SZ: continue installPath = GPath(value[0]) if not installPath.exists(): continue exePath = installPath.join(submod.exe) if not exePath.exists(): continue foundGames[submod.name.lower()] = installPath del module # unload some modules del pkgutil del _game deprint(u'Detected the following supported games via Windows Registry:') for foundName in foundGames: deprint(u' %s:' % foundName, foundGames[foundName]) #--Second: Detect what game is installed on directory up from Mopy path = Path.getcwd() if path.cs[-4:] == u'mopy': path = GPath(path.s[:-5]) installPaths = [path] #--Third: Detect what game is installed at the specified "workingDir" if workingDir != u'': path = GPath(workingDir) if not path.isabs(): path = Path.getcwd().join(path) installPaths.insert(0,path) deprint(u'Detecting games via relative path and the -o argument:') name = None for path in installPaths: _name = path.tail.cs if _name in allGames: # We have a config for that game deprint(u' %s:' % _name, path) foundGames[_name] = path name = _name break else: # Folder name wasn't found, try looking by exe name for file in path.list(): for _name in allGames: if allGames[_name].exe == file: # Must be this game deprint(u' %s:' % _name, path) name = _name foundGames[name] = path break else: continue break else: continue break return foundGames,allGames,name
def exit(): try: os.close(lockfd) os.remove(pidpath.s) except OSError as e: print e # Cleanup temp installers directory import tempfile tempDir = GPath(tempfile.tempdir) for file in tempDir.list(): if file.cs.startswith(u'wryebash_'): file = tempDir.join(file) try: if file.isdir(): file.rmtree(safety=file.stail) else: file.remove() except: pass if basherImported: from basher import appRestart from basher import uacRestart if appRestart: if not hasattr(sys,'frozen'): exePath = GPath(sys.executable) sys.argv = [exePath.stail] + sys.argv if u'--restarting' not in sys.argv: sys.argv += [u'--restarting'] #--Assume if we're restarting that they don't want to be # prompted again about UAC if u'--no-uac' not in sys.argv: sys.argv += [u'--no-uac'] def updateArgv(args): if isinstance(args,(list,tuple)): if len(args) > 0 and isinstance(args[0],(list,tuple)): for arg in args: updateArgv(arg) else: found = 0 for i in xrange(len(sys.argv)): if not found and sys.argv[i] == args[0]: found = 1 elif found: if found < len(args): sys.argv[i] = args[found] found += 1 else: break else: sys.argv.extend(args) updateArgv(appRestart) try: if uacRestart: if not hasattr(sys,'frozen'): sys.argv = sys.argv[1:] import win32api if hasattr(sys,'frozen'): win32api.ShellExecute(0,'runas',sys.argv[0],u' '.join('"%s"' % x for x in sys.argv[1:]),None,True) else: args = u' '.join([u'%s',u'"%s"'][u' ' in x] % x for x in sys.argv) win32api.ShellExecute(0,'runas',exePath.s,args,None,True) return else: import subprocess if hasattr(sys,'frozen'): subprocess.Popen(sys.argv,close_fds=bolt.close_fds) else: subprocess.Popen(sys.argv, executable=exePath.s, close_fds=bolt.close_fds) #close_fds is needed for the one instance checker except Exception as error: print error print u'Error Attempting to Restart Wrye Bash!' print u'cmd line: %s %s' %(exePath.s, sys.argv) print raise