You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

排查杀毒软件代码中的错误-1073740791(0xC0000409)

杀毒软件扫描崩溃问题:错误码0xC0000409排查与修复

问题概述

开发的杀毒软件执行标准扫描时崩溃,触发错误提示:Process finished with exit code -1073740791 (0xC0000409)。此前通过引入线程解决了程序无响应问题,但当前扫描功能触发该崩溃错误,以下是针对代码的问题分析和修复建议。

关键代码问题分析

1. 扫描线程核心方法命名错误

ScanThread类中定义了run1()方法,但QThread启动时默认调用的是run()方法,导致扫描线程启动后没有实际执行扫描逻辑,同时后续进度更新的错误会直接引发崩溃。

2. 进度更新逻辑严重错误

在run1()方法中,进度更新代码为:

self.progress_updated.emit(self.progress_updated.value() + self.progress_updated.value() + 1)

progress_updated是pyqtSignal对象,没有value()方法,执行这行代码会直接抛出AttributeError,导致线程崩溃,进而触发进程级错误码。

3. 实时检测的病毒判断逻辑完全颠倒

在RealtimeCheckThread的进程扫描部分:

if process_hash and process_hash not in mongo_hashes:
    print(f"Processo {proc_info['pid']} ({proc_info['name']}) com hash não correspondente: {process_hash}")
else:
    self.result_obtained.emit(f"Arquivo infectado encontrado, matando processo e deletando o arquivo.")
    p = psutil.Process(proc_info['pid'])
    p.terminate()
    os.remove(proc_info['exe'])

逻辑完全反转:当进程哈希不在病毒库时判定为安全,反之则判定为病毒,但代码中写反了条件,会误杀正常进程、删除系统关键文件,这极可能导致系统异常,引发进程崩溃。

4. 命令字符串语法错误

在实时检测的进程终止命令打印部分:

print(comando_final.replace("'%" call terminate", "\"\""))

字符串拼接语法错误,call terminate未被包裹在字符串中,会直接抛出SyntaxError,导致线程异常。

5. 异常捕获不充分

在文件哈希计算、进程操作、文件删除等环节,仅捕获了部分特定异常,遇到权限不足、文件被占用、文件不存在等情况时,未做处理会导致线程崩溃,进而引发整体进程错误。

6. 多线程资源冲突

实时检测线程和扫描线程同时对文件进行操作(如实时线程删除文件,扫描线程同时读取该文件),会触发IO异常,导致线程崩溃。

修复建议

1. 修正扫描线程核心方法

将ScanThread类中的run1()重命名为run(),确保线程启动后执行扫描逻辑:

def run(self):
    arquivos_infectados = []
    count = 0
    for root, _, files in os.walk(self.drive_path):
        for file in files:
            count += 1
            file_path = os.path.join(root, file)
            if self.check_for_virus(file_path):
                arquivos_infectados.append(file_path)
                try:
                    os.remove(file_path)
                    self.file_infected.emit(file_path)
                except OSError as e:
                    print(f"无法删除文件 {file_path}: {e}")
            self.progress_updated.emit(count)
    self.finished.emit(arquivos_infectados)

2. 修复进度更新逻辑

使用独立计数器变量跟踪扫描进度,替代错误的信号对象调用:

# 在run方法内初始化计数器
count = 0
# 每处理一个文件计数器+1,然后发送进度
count += 1
self.progress_updated.emit(count)

3. 修正实时检测的病毒判断逻辑

颠倒条件判断,确保哈希在病毒库中时才执行查杀操作:

if process_hash and process_hash in mongo_hashes:
    self.result_obtained.emit(f"发现感染文件,终止进程并删除文件: {proc_info['exe']}")
    try:
        p = psutil.Process(proc_info['pid'])
        p.terminate()
        os.remove(proc_info['exe'])
    except (psutil.NoSuchProcess, OSError) as e:
        print(f"查杀失败: {e}")
else:
    print(f"进程 {proc_info['pid']} ({proc_info['name']}) 安全")

4. 修复命令字符串语法错误

修正打印语句的字符串拼接,或直接正确构造终止命令:

# 正确构造终止命令
comando_final = f'wmic process where "commandline like \'%{caminho.replace("\\", "\\\\")}%\'" call terminate'
# 直接打印命令即可,无需错误替换
print(f"执行命令: {comando_final}")

5. 增强异常捕获

在文件操作、进程操作环节增加全面的异常捕获,避免单个错误导致线程崩溃:

# 以哈希计算函数为例
def calcular_sha256(arquivo):
    hasher = hashlib.sha256()
    try:
        with open(arquivo, 'rb') as f:
            while (chunk := f.read(8192)):
                hasher.update(chunk)
        return hasher.hexdigest()
    except (PermissionError, FileNotFoundError, OSError) as e:
        print(f"计算哈希失败 {arquivo}: {e}")
        return None

6. 避免多线程资源冲突

可以通过以下方式协调两个线程:

  • 给文件操作加锁,同一时间仅允许一个线程操作文件
  • 扫描时跳过正在被实时线程处理的文件
  • 实时检测线程在扫描期间暂停执行,扫描完成后恢复

7. 运行权限要求

确保程序以管理员权限运行,避免因权限不足导致的进程终止、文件删除失败等问题。

内容的提问来源于stack exchange,提问作者Arcadegame frame

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 23:19:52