import os import subprocess import ctypes import ssl import time from urllib2 import Request, urlopen FOTOSIZER_INSTALLER_URL = "https://cdn-patchportal-one.comodo.com/portal/packages/spm/Fotosizer/x64/fsSetup321.exe" class disable_file_system_redirection: _disable = ctypes.windll.kernel32.Wow64DisableWow64FsRedirection _revert = ctypes.windll.kernel32.Wow64RevertWow64FsRedirection def __enter__(self): self.old_value = ctypes.c_long() self.success = self._disable(ctypes.byref(self.old_value)) def __exit__(self, type, value, traceback): if self.success: self._revert(self.old_value) def ecmd(command): with disable_file_system_redirection(): process = subprocess.Popen( command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE ) out, err = process.communicate() return out.strip() + err.strip() def get_fotosizer_uninstall_string(): reg_paths = [ r'HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Fotosizer', r'HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\Fotosizer' ] for reg_path in reg_paths: cmd = 'reg query "%s" /v UninstallString' % reg_path result = ecmd(cmd) if "UninstallString" in result: parts = result.split("REG_SZ") if len(parts) > 1: return parts[1].strip() return None def spm_uninstall(dir, args): uninstall_string = get_fotosizer_uninstall_string() if not uninstall_string: return if uninstall_string.startswith('"'): uninstall_exe = uninstall_string.split('"')[1] else: uninstall_exe = uninstall_string uninstall_cmd = '"%s" /S' % uninstall_exe process = subprocess.Popen( uninstall_cmd, shell=True ) process.wait() time.sleep(30) ecmd(r'reg delete "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Fotosizer" /f') ecmd(r'reg delete "HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\Fotosizer" /f') def download_installer(file_path, url): headers = {'User-Agent': 'Mozilla/5.0'} request = Request(url, headers=headers) try: context = ssl._create_unverified_context() response = urlopen(request, context=context) with open(file_path, 'wb') as f: while True: chunk = response.read(1024 * 100) if not chunk: break f.write(chunk) return True except: return False def spm_install(dir, args): temp_path = os.environ.get("TEMP", "C:\\Windows\\Temp") file_name = "fsSetup321.exe" local_path = os.path.join(temp_path, file_name) if not os.path.exists(local_path): if not download_installer(local_path, FOTOSIZER_INSTALLER_URL): raise Exception("Failed to download installer") install_cmd = 'start /wait "" "%s" /S' % local_path exit_code = subprocess.call( install_cmd, shell=True ) if exit_code != 0: raise Exception("Installation failed") time.sleep(60) def spm_update(dir, args): spm_uninstall(None, None) time.sleep(20) spm_install(None, None)