如果 SFC 和 DISM 失败,如何修复 Windows 10 中损坏的 opencl.dll?

如果 SFC 和 DISM 失败,如何修复 Windows 10 中损坏的 opencl.dll?

我花了几个小时才解决这个问题,因为本地组件存储已损坏,并且计算机正在访问本地 WSUS 服务器,而不是 Microsoft 的公共更新服务器(而且因为我很少使用 Dism)。为了参考并帮助其他遇到同样问题的人,我将写下问题描述并提供解决方案。

自从升级到 Windows 10 Pro 版本 1511(内部版本 10586)以来,我遇到了文件损坏的问题opencl.dll在多个地点。

我尝试过sfc.exe /scannow,但未能解决问题。错误消息包括:

2015-12-08 08:50:43, Info                  CSI    00003c3a Hashes for file member \SystemRoot\WinSxS\wow64_microsoft-windows-r..xwddmdriver-wow64-c_31bf3856ad364e35_10.0.10586.0_none_3dae054b56911c22\opencl.dll do not match actual file [l:10]"opencl.dll" :
  Found: {l:32 g2VAunZ6/2J1G3oL7kf9fjInPUA9VYeiJcl9VKgizaY=} Expected: {l:32 9rnAnuwzPjMQA7sW63oNAVhckspIngsqJXKYSUeQ5Do=}
2015-12-08 08:50:43, Info                  CSI    00003c3b [SR] Cannot repair member file [l:10]"opencl.dll" of microsoft-windows-RemoteFX-clientVM-RemoteFXWDDMDriver-WOW64-C, version 10.0.10586.0, arch Host= amd64 Guest= x86, nonSxS, pkt {l:8 b:31bf3856ad364e35} in the store, hash mismatch
2015-12-08 08:50:43, Info                  CSI    00003c3c [SR] This component was referenced by [l:125]"Microsoft-Windows-RemoteFX-VM-Setup-Package~31bf3856ad364e35~amd64~~10.0.10586.0.RemoteFX clientVM and UMTS files and regkeys"
2015-12-08 08:50:43, Info                  CSI    00003c3d Hashes for file member \??\C:\WINDOWS\SysWOW64\opencl.dll do not match actual file [l:10]"opencl.dll" :
  Found: {l:32 g2VAunZ6/2J1G3oL7kf9fjInPUA9VYeiJcl9VKgizaY=} Expected: {l:32 9rnAnuwzPjMQA7sW63oNAVhckspIngsqJXKYSUeQ5Do=}
2015-12-08 08:50:43, Info                  CSI    00003c3e Hashes for file member \SystemRoot\WinSxS\wow64_microsoft-windows-r..xwddmdriver-wow64-c_31bf3856ad364e35_10.0.10586.0_none_3dae054b56911c22\opencl.dll do not match actual file [l:10]"opencl.dll" :
  Found: {l:32 g2VAunZ6/2J1G3oL7kf9fjInPUA9VYeiJcl9VKgizaY=} Expected: {l:32 9rnAnuwzPjMQA7sW63oNAVhckspIngsqJXKYSUeQ5Do=}
2015-12-08 08:50:43, Info                  CSI    00003c3f [SR] Could not reproject corrupted file [l:23 ml:24]"\??\C:\WINDOWS\SysWOW64"\[l:10]"opencl.dll"; source file in store is also corrupted

好的,现在问题已经清楚了。不幸的是,证监会无法解决损坏问题,因为本地组件存储也已损坏。不幸的是,我丢失了指示组件存储损坏的错误消息。

所以我尝试了,Dism /Online /Cleanup-Image /RestoreHealth但无济于事。它失败并显示错误0x800f081f,表明源文件存在另一个问题。

2015-12-08 08:57:35, Info                  CBS    Exec: Download qualification evaluation, business scenario: Manual Corruption Repair
2015-12-08 08:57:35, Info                  CBS    Exec: Clients specified using Windows Update.
2015-12-08 08:57:35, Info                  CBS    WU: Update service is not default AU service, skip. URL: https://fe2.update.microsoft.com/v6/, Name: Microsoft Update
2015-12-08 08:57:35, Info                  CBS    WU: Update service is not default AU service, skip. URL: https://fe2.ws.microsoft.com/v6/, Name: Windows Store
2015-12-08 08:57:35, Info                  CBS    WU: Update service is not default AU service, skip. URL: https://fe3.delivery.mp.microsoft.com/, Name: Windows Store (DCat Prod)
2015-12-08 08:57:35, Info                  CBS    WU: WSUS service is the default, URL: (null), Name: Windows Server Update Service
2015-12-08 08:57:35, Info                  CBS    DWLD:Search is done, set download progress to 20 percent.
2015-12-08 08:57:35, Info                  CBS    Nothing to download, unexpected
2015-12-08 08:57:35, Info                  CBS    Failed to collect payload and there is nothing to repair. [HRESULT = 0x800f081f - CBS_E_SOURCE_MISSING]
2015-12-08 08:57:35, Info                  CBS    Failed to repair store. [HRESULT = 0x800f081f - CBS_E_SOURCE_MISSING]

查看错误消息,很明显 Windows 设置为使用我们的本地 WSUS 服务器,因此 Dism 无法从存储库中检索有效文件。虽然我确信我可以以某种方式配置 WSUS 以提供必要的文件,但我不知道如何配置,我需要快速修复。(如果有人知道如何相应地配置 WSUS,请提供信息)。

通过添加参数来限制对本地存储的访问/LimitAccess是无用的,因为如前所述,本地组件存储也已损坏。

我在两台机器上都遇到了这个问题。刷新Windows 10 并未修复该问题。

答案1

要解决此问题,您需要拥有已安装的精确版本的 ISO。

  1. 挂载 ISO 映像。
  2. 创建一个临时目录来挂载 Windows 映像文件 (WIM)。
    mkdir C:\WIM
  3. 挂载 WIM 文件。
    Dism /Mount-Wim /WimFile:D:\sources\install.wim /index:1 /MountDir:C:\WIM /ReadOnly
  4. 使用以下参数运行 Dism。
    Dism /Online /Cleanup-Image /RestoreHealth /Source:C:\WIM\Windows /LimitAccess
  5. 完成后,卸载映像并删除文件夹
    Dism /Unmount-Wim /MountDir:C:\WIM /Discard rmdir C:\WIM
  6. 必须重新启动计算机,否则 SFC 和 DISM 仍会显示错误。

这应该可以解决问题。

编辑
正如评论中指出的那样,可能存在更直接的方法。TL;DR 是指,它对我不起作用,因此我的方法更详细。但是,如果您对直接方法有任何问题,我很感兴趣。请发表评论。

答案2

我从互联网上的各种论坛中整理了以下修复程序:

  1. 从以下位置下载 MediaCreationToolhttp://go.microsoft.com/fwlink/?LinkId=691209
  2. MediaCreationTool.exe下载Windows 10 Pro ISOc:\temp\windows.iso
  3. 使用 7-zip 将文件解压c:\temp\windows.iso到文件夹c:\temp\windows
  4. 转换install.esdinstall.wim

    Dism /Export-Image /SourceImageFile:c:\temp\windows\sources\install.esd /SourceIndex:1 /DestinationImageFile:c:\temp\windows\sources\install.wim /compress:max

  5. 检查.wim文件
    -索引中的索引和 Windows 版本用于参数中的下一个 Dism 命令/Source:wim:path_to_wim:[index]

    Dism /Get-WimInfo /wimFile:c:\temp\windows\sources\install.wim

  6. 从下载并转换的 Windows 映像 (wim) 中恢复健康 Windows 组件:

    Dism /Online /Cleanup-Image /RestoreHealth /Source:wim:c:\temp\windows\sources\install.wim:1 /LimitAccess

  7. 修复损坏的文件:

    sfc /scannow

    它将修复损坏的文件 - 成功消息:Windows Resource Protection found corrupt files and successfully repaired them.

  8. 重新启动 Windows
  9. 再次检查系统文件以确保修复成功:

    sfc /scannow

    扫描后的成功消息:Windows Resource Protection did not find any integrity violations.

答案3

ESD 不是“加密的” WIM,而是经过高度打包/重新编码(方式非常不同,结构更复杂)的 WIM。

WIM 只是使用快速 Huffmann 压缩,以 4KB 或 16KB 为不可分割的单位进行“快速”压缩。ESD 使用更先进的基于 LZ 的压缩,没有块大小限制。这种压缩不允许以读写模式打开图像,因为压缩是全局的(档案中的每个文件不再单独压缩,多个逻辑文件可以共享段的实际存储,以达到更高的压缩级别,特别是当有许多小文件具有共同的标题部分时,例如图标集合,或其数字签名数据的部分、版权声明、HTML 标题、嵌入式脚本等)。

SWM 是多部分 WIM,它被分割成多个较小的文件,并且具有(粗略的)最大大小,但它仍然可以写入,并且可以存储在多张 DVD 上。

CBS 提供程序允许 DISM 支持的多种存档格式,包括 WIM、CAB、ZIP、VHD、VHDX、多会话 ISO...但 Windows 附带了两个用于 WIM 和 ESD 格式的内置提供程序(ESD 是 Windows 10 的新功能,Windows 8 仅支持 WIM 格式,但图像更大)

ESD 格式已经过调整,允许将 Windows 10 的完整多语言分发版放在小于 3GB 的单张 DVD 上...

您可以将 ESD 转换为 WIM,但结果文件会大得多。也可以进行逆向转换(以便您可以在扩展的 WIM 中读写),将其再次打包到新的 ESD 中。将 ESD 解压为 WIM 相对较快,但将 WIM 压缩为 ESD 需要大量 CPU 资源,而且时间更长(这就是为什么您不能直接在 ESD 中读写,但您可以在 CPU 使用率适中的 WIM 中轻松做到这一点)。

当您使用 DISM“安装”ESD 时,它首先会将 ESD 扩展为临时存储,并像对待 WIM 一样对其进行操作,以便您可以更新此本地存储中的文件。卸载它需要两个步骤:重新创建 WIM(相当快),然后将其再次打包到 ESD 中(非常慢)。

答案4

我花了几天时间研究这些方法,终于找到了适合我的情况的解决方案。我正在运行 Windows 10 版本 1511 Build 10586.545。以下是我的进展:

  1. 这对我来说是由于 Windows 更新失败(错误 0x800705b4)引起的。
  2. 然后,我通过 Windows 更新疑难解答、WUResets、禁用防病毒软件等方式追踪此错误。 此链接是一篇很好的文章,为这个问题提供了解决方案(尽管它们对我没有帮助)
  3. 然后我进入了 DISM 和 SFC 路径。这篇 ServerFault 帖子对这次尝试非常有帮助。不幸的是,这些选项都没有帮助。我不断被告知我的 opencl.dll 文件已损坏,并且运行各种 DISM /RestoreHealth 变体都不起作用。我一直收到 0x800f081f(无法找到源文件)
  4. 接下来,我尝试将 opencl.dll 从干净的 ISO 手动复制到 C:\Windows\SysWOW64。这根本行不通,即使在尝试获取所有权等之后也是如此。我最终在设备管理器中禁用了 NVIDIA GeForce GPU 驱动程序(留下一个仍然启用显示的英特尔驱动程序),并能够将干净的 opencl.dll 复制到 C:\Windows\SysWOW64。

从这里开始,Windows 更新重新开始工作。

总而言之,如果您正在努力解决这些错误并且似乎没有任何效果,请尝试禁用 NVIDIA GeForce 驱动程序,然后尝试其中一些步骤(或手动复制 DLL 的干净版本)。

相关内容