【问题标题】:SHFileOperation: randomly raises exceptions when deleting filesSHFileOperation:删除文件时随机引发异常
【发布时间】:2017-10-16 22:44:16
【问题描述】:

我正在使用 SHFileOperation() 从特定路径中删除目录。它是在多个线程中完成的,并且被删除的目录总是不同的。

它有时会抛出异常:

在 del.exe 的 0x00007FF8AF5D9D2A (ntdll.dll) 处抛出异常: 0xC0000008:指定的句柄无效

还有这个:

在 del.exe 的 0x00007FF8ACC90A36 (shell32.dll) 处抛出异常: 0xC0000005:访问冲突读取位置0x0000000000000001。

模块:

shell32.dll 00007FF8ACBD0000-00007FF8AE0D8000 
ntdll.dll   00007FF8AF530000-00007FF8AF701000

这是代码:

SHFILEOPSTRUCTW tFileOptions = { 0 };

/* Initialize the file options structure for the deletion process */
tFileOptions.pFrom = pwstrPath;
tFileOptions.wFunc = FO_DELETE;
tFileOptions.fFlags = FOF_NOCONFIRMATION | FOF_SILENT | FOF_NOERRORUI;

/* Execute the deletions with the Shell operation */
iResult = SHFileOperationW(&tFileOptions);
if (0 != iResult)
{
    printf("WTF\n");
    goto lbl_cleanup;
}

SHChangeNotify(SHCNE_RMDIR, SHCNF_PATHW, pwstrPath, NULL);

pwstrPath 末尾有一个双空终止符。

这些异常的原因是什么?

编辑

堆栈跟踪:

【问题讨论】:

  • 如果你用 symbols 来最小化粘贴堆栈跟踪,那就太好了
  • 您的代码有缺陷。我们看不到它。
  • 更快的是堆损坏,由您的代码造成。但是没有最小的堆栈跟踪是不可能准确地说出的
  • @Olaf 关于 c++ 标签,你在这里看到不符合 c++ 的东西吗? “goto”在这里很好,因为它干净地退出了函数并清理了所有必要的资源。
  • @cydan - 很难准确地说出这里发生了什么,而不会自己调试崩溃。带有已安装 pdb 符号的堆栈跟踪(没有此跟踪几乎没用)这是强制性的最低要求。 SHFileOperationW 是令人难以置信的重型 api - 我在 win10 上查看并在内部创建了这个函数 - 76473 个内部函数调用。是的! 76k 不是指令而是函数!!

标签: c winapi shfileoperation


【解决方案1】:

从堆栈跟踪(即使没有 pdb 符号 - 会更好)可见该异常不在 Windows shell 本身内而是在第三方产品中 - dragext64.dll(这不是本机 Windows图片)这是实现Copy Hook Handler - 我建议卸载它或通过注册表项禁用

HKEY_CLASSES_ROOT
   Directory
      shellex
         CopyHookHandlers
            MyCopyHandler
               (Default) = {MyCopyHandler CLSID GUID}

并在此之后进行测试。认为异常必须消失。


看起来其他一些 shell 扩展在这里也有错误 - 在 google 中搜索 SHELL32_CallFileCopyHooks。例如 bug TortoiseGit.dll - 请注意堆栈跟踪中的此处 shell32.dll!SHELL32_CallFileCopyHooks()

所以所有这些错误都在ICopyHook::CopyCallback 方法的实现中

【讨论】:

  • 谢谢! DragExt64.dll好像属于WinSCP..我会尝试通过注册表项禁用它,看看我是否可以重现它
猜你喜欢
  • 1970-01-01
  • 2014-02-14
  • 2012-06-07
  • 2015-12-11
  • 2013-05-20
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
相关资源
最近更新 更多