原作者题:前些日子在用DISM操作映像的时候遇到了拒绝访问的问题(详见:http://blog.163.com/silence_night/blog/static/24347908120151264914357),那时根据日志以为真的是权限问题,最近闲下来又开始研究这个问题。
还是从日志着手:
1 | 2015-02-02 15:00:45, Error DISM DISM WIM Provider: PID=9528 G:\Windows\WinSxS\amd64_microsoft-windows-i..l-keyboard-00000807_31bf3856ad364e35_10.0.9926.0_none_c4cb587719c7f0c9\KBDSG.DLL (HRESULT=0x80070005) - CWimManager::WimProviderMsgLogCallback |
我大致浏览了一下C:\WINDOWS\WINSXS文件夹,发现里面有很多类似amd64_microsoft-windows-i..l-keyboard-00000807_31bf3856ad364e35_10.0.9926.0_none_c4cb587719c7f0c9这样的文件夹,每个文件夹中都有一个DLL文件,都是以KBD开头,KBD明显是keyboard的缩写,所以这些个DLL肯定是类似键盘驱动的文件。
而查看文件属性里的详细信息也证实了这一点:
看来是瑞典和德国的键盘布局链接库文件。
之前一直是把目光放到后面的拒绝访问上面,后来一想,肯定不是权限问题,因为我最后动用了TrustedInstaller权限却还是提示拒绝访问,所以肯定是因为这个文件被占用了导致拒绝访问的,那如果我把这个文件删掉看看呢?当然直接删除肯定是不明智的,于是先尝试用超级命令行来备份出来。
复制也是一样拒绝访问,看来这个文件时时刻刻在内存中。
没办法了,直接进入PE然后复制出来并删除掉源文件。
然后重启之后尝试mount一个7601的WIM,结果成功了。
看来还真的是这个KBDSG.DLL搞的鬼,但是为什么呢?我们平时用的都是KBDUS.DLL,即美式键盘布局,所以这个KBDSG.DLL平时应该是用不到的,但是不能删除就证明这个文件其实一直都在内存之中,所以这里还有一点疑问。
另外一点疑问就是,虽然操作7601的WIM会因为拒绝访问而失败,但是操作9600的WIM却没有任何问题(DISM版本就是9600.17031),9600的DISM操作9600和9600之前的WIM所调用的东西是不一样的,言外之意就是,这个KBDSG.DLL是DISM处理旧版本WIM的组件之一,然后因为实时加载在内存中导致DISM无法直接调用而提示拒绝访问,不过为什么要调用这个KBDSG.DLL,还是不得而知。
参考资料
- 原作者:silence_night,来源已无法追寻。
- 疑似原作者:silence_night (lofter.com)