=import os import subprocess import time try: import _winreg except ImportError: import winreg as _winreg def find_freemake_uninst(): reg_paths = [ (r"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall", _winreg.KEY_READ | _winreg.KEY_WOW64_32KEY), (r"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall", _winreg.KEY_READ | _winreg.KEY_WOW64_64KEY), ] for reg_path, flags in reg_paths: try: key = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, reg_path, 0, flags) i = 0 while True: try: subkey_name = _winreg.EnumKey(key, i) subkey = _winreg.OpenKey(key, subkey_name) try: dn = _winreg.QueryValueEx(subkey, "DisplayName")[0] if "Freemake Video Converter" in dn: us = _winreg.QueryValueEx(subkey, "UninstallString")[0] _winreg.CloseKey(subkey) _winreg.CloseKey(key) us = us.strip() if us.startswith('"'): exe = us[1:us.index('"', 1)] else: exe = us.split()[0] return exe, subkey_name except: pass _winreg.CloseKey(subkey) i += 1 except WindowsError: break _winreg.CloseKey(key) except: pass return None, None def kill_freemake_processes(): subprocess.call(['Taskkill', '/IM', 'FreemakeVC.exe', '/F'], stdout=open(os.devnull, 'w'), stderr=open(os.devnull, 'w')) subprocess.call(['Taskkill', '/IM', 'unins000.exe', '/F'], stdout=open(os.devnull, 'w'), stderr=open(os.devnull, 'w')) subprocess.call(['Taskkill', '/F', '/FI', 'WINDOWTITLE eq Setup/Uninstall*'], stdout=open(os.devnull, 'w'), stderr=open(os.devnull, 'w')) time.sleep(2) def force_delete_folder(folder): if os.path.exists(folder): subprocess.call(['cmd', '/c', 'rd', '/s', '/q', folder]) time.sleep(2) if os.path.exists(folder): subprocess.call(['takeown', '/f', folder, '/r', '/d', 'y'], stdout=open(os.devnull, 'w'), stderr=open(os.devnull, 'w')) subprocess.call(['icacls', folder, '/grant', 'administrators:F', '/t'], stdout=open(os.devnull, 'w'), stderr=open(os.devnull, 'w')) subprocess.call(['cmd', '/c', 'rd', '/s', '/q', folder]) def delete_registry_key(subkey_name): for flags in [_winreg.KEY_WOW64_32KEY, _winreg.KEY_WOW64_64KEY]: try: key = _winreg.OpenKey( _winreg.HKEY_LOCAL_MACHINE, r"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall", 0, _winreg.KEY_ALL_ACCESS | flags ) _winreg.DeleteKey(key, subkey_name) _winreg.CloseKey(key) except: pass # dir: string -> directory where installer exist # args: string -> which includes all parameters with space delimiter def spm_install(dir, args): os.chdir(dir) argslist = args.split() try: subprocess.check_call(argslist) time.sleep(60) kill_freemake_processes() print 'retcode' + str(0) + 'retcode' except subprocess.CalledProcessError as e: print 'retcode' + str(e.returncode) + 'retcode' # dir: string -> directory where installer exist # args: string -> which includes all parameters with space delimiter def spm_uninstall(dir, args): # Step 1: Kill all Freemake processes kill_freemake_processes() uninst_exe, reg_subkey = find_freemake_uninst() # Fallback paths if uninst_exe is None or not os.path.exists(uninst_exe): for p in [ r"C:\Program Files (x86)\Freemake\Freemake Video Converter\Uninstall\unins000.exe", r"C:\Program Files\Freemake\Freemake Video Converter\Uninstall\unins000.exe", ]: if os.path.exists(p): uninst_exe = p break # Step 2: Run uninstaller with timeout (30 sec max) if uninst_exe and os.path.exists(uninst_exe): try: proc = subprocess.Popen([ uninst_exe, '/VERYSILENT', '/SUPPRESSMSGBOXES', '/NORESTART', '/SP-' ]) timeout = 30 elapsed = 0 while elapsed < timeout: if proc.poll() is not None: break time.sleep(1) elapsed += 1 if proc.poll() is None: # Stuck — kill it proc.terminate() time.sleep(2) kill_freemake_processes() except: pass time.sleep(3) # Step 3: Force delete folders for folder in [ r"C:\Program Files (x86)\Freemake", r"C:\Program Files\Freemake", ]: force_delete_folder(folder) # Step 4: Delete registry key if reg_subkey: delete_registry_key(reg_subkey) # Step 5: Folder gone = success freemake_gone = ( not os.path.exists(r"C:\Program Files (x86)\Freemake") and not os.path.exists(r"C:\Program Files\Freemake") ) if freemake_gone: print 'retcode' + str(0) + 'retcode' else: print 'retcode' + str(1) + 'retcode' # dir: string -> directory where installer exist # args: string -> which includes all parameters with space delimiter def spm_update(dir, args): os.chdir(dir) argslist = args.split() try: subprocess.check_call(argslist) time.sleep(60) kill_freemake_processes() print 'retcode' + str(0) + 'retcode' except subprocess.CalledProcessError as e: print 'retcode' + str(e.returncode) + 'retcode'