本文提供了一种解决方法,用于解决应用程序尝试在 Windows 中访问网络驱动器上的同一文件时冻结的问题。
适用于:Windows 10 - 所有版本原始 KB 数: 4039810
现象
假设出现了下面这种情景:
- 在服务器上创建共享文件夹,然后将文件添加到该文件夹中。
- 在运行 Windows 10、Windows 8.1 或 Windows 7 的客户端上,将共享文件夹装载为网络驱动器。
- 安装包含与应用程序关联的文件系统微型筛选器驱动程序的第三方安全软件。
- 微型筛选器同时附加到保存 %SystemRoot% 路径的本地驱动器(例如 C 驱动器)和所创建的共享文件夹的网络驱动器。
- 微型筛选器将消息(使用 FltSendMessage 函数)发送到应用程序,其中包含网络驱动器中的文件名。
- 应用程序尝试使用它收到的文件名打开该文件。
- 与微型筛选器不关联的同一计算机上的另一个应用程序尝试同时在网络驱动器上打开同一文件。
在此方案中,这两个应用程序都冻结。
原因
发生此问题的原因是 Windows 客户端缓存驱动程序(Csc.sys)持有的资源锁。 出现此问题时,Csc.sys获取文件上的资源锁,然后请求驱动程序堆栈中的驱动程序打开该文件。 这使得尝试访问文件的所有应用程序都等待。 这也使微筛选器的线程等待其关联的应用程序做出响应。
解决方法
如果此问题已发生,请重启客户端。
若要避免此问题,请使用本地组策略编辑器(gpedit.msc)禁用脱机文件。 为此,请使用计算机配置\管理模板\网络\脱机文件中的“允许”或“禁止使用脱机文件”功能组策略设置。
注意
如果必须使用 脱机文件,则没有解决方法。
Status
Microsoft已确认,这是本文开头列出的Microsoft产品中的问题。
更多信息
通常,在对文件系统的调用之间保留锁是个坏主意。 此原因记录在以下开发人员博客文章中:在微型筛选器中发出 IO:第 1 部分 - FltCreateFile
若要根据“症状”部分中所述标识附加到多个驱动器的微型筛选器,请在管理命令提示符处运行以下命令:
fltmc instances -v C:
fltmc instances -v \Device\Mup