Win32 WriteFile 因防病毒不返回
Posted
技术标签:
【中文标题】Win32 WriteFile 因防病毒不返回【英文标题】:Win32 WriteFile does not return because of Antivirus 【发布时间】:2012-09-25 08:45:41 【问题描述】:我的代码是用 Delphi 7 编写的,但我不认为它有什么特殊作用。
我尝试用 WriteFile 覆盖文件的内容。 除非编写“.dll”文件并且防病毒处于活动状态,否则它可以完美运行。
打开文件的句柄还是可以的。 写入被阻止:WriteFile 函数不返回!!!防病毒软件似乎可以防止覆盖该 dll。 但是,最糟糕的是我必须重新启动电脑,因为我的应用程序被阻止、任务管理器被阻止、Windows 资源管理器被阻止等等。
如何防止这种情况发生?
有什么想法吗?
【问题讨论】:
严肃地说,还有一点信息。你用的是什么杀毒软件? 抱歉,我们无法控制最终用户 PC。 Bitdefender 出现问题。 那就不要做会触发防病毒软件介入的事情。按照安装程序的方式去做。将新内容写入文件,可能没有 dll 扩展名。注册一次运行以用新内容替换 dll 并请求重新启动。 没有编译器可以在装有该 AV 软件的机器上运行。建议换AV。如果这让您没有客户,那么您可能希望联系 AV 供应商。除非您正在编写编译器,否则您的程序看起来很像恶意软件。 @DavidHeffernan:我们在工作中使用 BitDefender,它通常不会干扰 Delphi。但你是对的,这是迄今为止我见过的最烦人的 AV 解决方案。一旦当前订阅用完,我们将转向其他内容,这一次我不会相信德国 c't 杂志的 AV 测试。 【参考方案1】:除了其他人所说的如何解决防病毒问题之外,在您的代码中,您还可以使用重叠 I/O 来设置 WriteFile()
的超时时间,以确保您的代码在出现此问题时不再死锁又是它丑陋的脑袋。如果重叠操作超时,您可以通过CancelIo()
取消,然后向用户报告问题。
【讨论】:
但是 WriteFile 变成了异步的,不是吗? 是的,但这并不意味着你让你的调用代码也异步运行。您可以使用FILE_FLAG_OVERLAPPED
标志打开文件,然后声明一个OVERLAPPED
结构并用来自CreateEvent()
的等待事件填充它,然后像往常一样调用WriteFile()
,但将OVERLAPPED
传递给它,然后使用WaitForSingleObject()
等待事件发出信号。如果 WFSO 报告发出信号,则使用GetOverlappedResult()
获取写入结果,否则使用CancelIo()
中止写入并根据需要处理 WFSO 错误/超时。【参考方案2】:
如果您将数字签名添加到您的可执行文件中,触发防病毒的机会就会减少。很多delphi程序被杀毒软件误杀,D7最差。
不确定您要写入 dll 的内容。防病毒软件不喜欢 PE 之外的额外数据。
如果你只需要更新一个dll,尝试重命名旧dll,并写入一个新文件,然后删除旧的。
【讨论】:
以上是关于Win32 WriteFile 因防病毒不返回的主要内容,如果未能解决你的问题,请参考以下文章