Win32 CopyFile(W) 是否曾经引发 (SEH) 异常?

Does or DID Win32 CopyFile(W) ever raise a (SEH) exception?

提问人:Martin Ba 提问时间:2/3/2023 更新时间:2/4/2023 访问量:85

问:

Windows API CopyFile 函数相当简单:

BOOL CopyFileW(
  [in] LPCWSTR lpExistingFileName,
  [in] LPCWSTR lpNewFileName,
  [in] BOOL    bFailIfExists
);

...

如果函数失败,则返回值为零。获取扩展错误 信息,致电.GetLastError

但是,我在我们的 C++ 源代码中发现了这个宝石,可以追溯到:Oct / 2006

try {       //Exception, if the file already exists and is write protected
    bCopyOK = CopyFile(csSourceFile, csDestinationFile, bFailIfExists);
} catch (...) { 
    bCopyOK = FALSE;
}

我什至找到了旧的票证标题(当然没有细节):“如果目标受写保护,函数'CopyFile'会抛出异常,捕获异常”:-)

即使在今天,我们仍然使用 进行编译,因此这会捕获任何引发的 SEH 异常。/EHa

现在,在这个时间点,我们将在 Windows XP 上使用 Visual Studio 6,并且该版本有各种怪癖,但仍然: 我很难想象这个函数会引发异常(除了无效/空参数等)。

WinAPI Windows-XP 可视化工作室-6

评论

0赞 Martin Ba 2/3/2023
旁注:啊哈:也许它当时就被钩住了,就像这里提到的 stackoverflow.com/questions/51951586/......
0赞 IInspectable 2/3/2023
很少有 API 调用被记录在案,以引发 SEH 异常,但这并不意味着它们不会或阻止外部代码中引发的 SEH 异常通过。处理此问题的最佳方法是让进程终止,并设置 WER 以收集诊断信息。任何抑制异常的尝试都只会产生一个虚假失败的应用程序,没有人会发现这背后的原因。
0赞 RbMm 2/3/2023
CopyFile从不引发软件异常(SEH - 这不是执行类型,而是异常处理程序的类型)。如果文件名指向无效的内存位置,则只能是硬件异常。但这不能通过 try/catch(...) 来解决问题,而只能通过 __try/__except 来解决问题。代码片段错误且毫无意义
0赞 IInspectable 2/3/2023
@RbMm /EHa 编译器标志允许捕获C++异常和结构化异常。catch(...)
0赞 RbMm 2/3/2023
@IInspectable - 好的。我在这一点上犯了错误。

答:

2赞 RbMm 2/3/2023 #1

Win32 CopyFile(W) 是否曾经引发 (SEH) 异常?

起初根本不存在 SEH 例外。SEH 这是异常处理程序的类型,但不是异常类型。另一种类型的处理程序(不是异常)是 VEH

异常可以引发,也可以通过调用 RaiseException / / 或由 CPU 引发。当然,可以引发 CPU 异常 alwas(在 case 或 for instanse 指向无效内存的情况下),但绝不能调用 - 通过事实和文档。RtlRaiseExceptionZwRaiseExceptionlpExistingFileNamelpNewFileNameCopyFileWRaiseException

例外,如果文件已存在且受写保护

那么在什么问题呢?创建写保护文件并调用和测试结果。将返回异常或错误代码lpNewFileNameCopyFile

评论

0赞 Martin Ba 2/4/2023
谢谢你的提醒。“测试结果” - 在带有 VC6 的 Windows XP 盒子上很难做到这一点,因为我认为我们不再没有这样的盒子了:-)
0赞 RbMm 2/4/2023
@MartinBa - 这里没有任何不同 - XP 或 Win11。可以在任何组合上对此进行测试
-1赞 Martin Ba 2/4/2023 #2

自我回答,有历史的眼光。

没有记录抛出异常,从上面链接的当前文档中可以明显看出。

另一个答案以及例如,DeleteFile() 或 CopyFile() 是否抛出异常? 非常肯定地断言不应该提出任何例外。

但是,正如评论中提到的:

很少有 API 调用被记录在案,以引发 SEH 异常,但这并不意味着它们不会或阻止 SEH 异常在 外来代码通过。

在链接的问题中:

评论:。。。摆脱已安装的反恶意软件产品可以挽救它的一些可能性,ymmv。...

答:那是......企业信息安全系统,反恶意软件等产品。

很有可能原始开发人员实际上可以在他的机器上重现这种行为,并且吞下错误“修复”了它。

从那时起,情况有所改善。鉴于在当前代码中不可能进行复制,并且这仅适用于任何时候,try-catch 是清理的候选者。/EHa