阅读:3931回复:8
cm007请进,关于word无法保存由于权限问题
在网上看到很少有人碰到这个word权限问题,不知道是不是我的方式有问题,我现在将更名的操作提交到应用层hook做,在明文打开修改保存是成功的,并且加密了,但是当我打开密文再保存就出现了word权限错误的问题,我跟踪过最后的tmp文件,是成功的,也就是说就差最后的将tmp文件更名为doc文件,不知道这个问题是因为什么造成的?word真是复杂
|
|
沙发#
发布于:2008-04-23 23:34
一个很奇怪的现象,现在我每次都在MJ_create的时候都CcFlushCache,如果我把这个函数去掉,则会造成明文保存也出现没有权限的问题,另外就是我密文保存失败,可是另存为的时候却是成功的,
综合分析我怀疑是不是因为我的文件缓存中的对象与实际的文件长度不匹配或者是别的什么原因,但是如果是这样的话我的临时文件的产生却是没有问题的,我现在已经昏了,请高手赐教! |
|
板凳#
发布于:2008-04-24 08:03
你的想法是对的:)
缓冲长不对造成的,需要同步操作 |
|
|
地板#
发布于:2008-04-24 10:31
WORD最后保存时,有2个改名操作
1.DOC文件先改为~WRL0000.tmp 2.~WRDXXXX.tmp改为DOC文件 我曾经碰到过.如果是许可权错误 . 1.检查对Temp里的文件处理,正确应该是不处理,否则就许可权错误了 2.检查你是否写了WRL0000.tmp,这个文件处理也可以,不处理也可以. 一点愚见.不足参考 |
|
地下室#
发布于:2008-04-24 10:32
多谢指教,请问如何能够达到同步操作,是否使用PFSRTL_COMMON_FCB_HEADER里的资源锁,我现在想这样做,每次我设置文件长度的时候,都调用一下CcSetFileSize,这个函数看似可以通知缓存管理器当前的文件大小,这样是否可以达到文件长度的同步?
|
|
5楼#
发布于:2008-04-24 10:41
to liio:
你说的Temp是不是系统目录下的Temp文件夹,我跟踪了一下,winword没有在里面做什么样.WRL0000.tmp这个文件我没有处理,直接就是明文。 |
|
6楼#
发布于:2008-04-24 10:43
winword会在系统temp里产生~DFXXXX.tmp的临时文件,大小大约是512字节.这个不处理最好
稍等.我发我的日志 上来你就明白了 |
|
7楼#
发布于:2008-04-24 10:45
Microsoft Word On Connection
ConnectMode = 1 Custom(1) = 1 App Version = 11.0 gbIsValidLangSetting = True gbBootLoad = True Microsoft Word On AddInsUpdate Microsoft Word On StartupComplete lParam = 262145, wParam = 51,nCode =0 GetIMECompositionStringLength ImmGetCompositionString lParam = 540540929, wParam = 18,nCode =0 GetIMECompositionStringLength ImmGetCompositionString lParam = 540934145, wParam = 115,nCode =0 GetIMECompositionStringLength ImmGetCompositionString lParam = 3735553, wParam = 32,nCode =0 GetIMECompositionStringLength ImmGetCompositionString sfilter!SfWrite: Encrypt E:\~WRD0000.tmp ,81524000,F9F0E000 sfilter!SfWrite: Encrypt E:\~WRD0000.tmp ,8150C000,F9F10000 iCell!WriteContext:Offset:5632,Information:00000000,00001638 ,Status:00000000,00000038 WriteFileContext :E:\~WRD0000.tmp winword.exe-winword.exe,11,11 svchost.exe-winword.exe,11,11 winword.exe-winword.exe,11,11 svchost.exe-winword.exe,11,11 sfilter!SfWrite: Encrypt E:\~WRD0001.tmp ,81446000,F9D5C000 sfilter!SfWrite: Encrypt E:\~WRD0001.tmp ,81476000,F9D64000 iCell!WriteContext:Offset:18944,Information:00000000,00004A38 ,Status:00000000,00000038 WriteFileContext :E:\~WRD0001.tmp winword.exe-winword.exe,11,11 svchost.exe-winword.exe,11,11 sfilter!SfRead: Decrypt E:\~WRD0001.tmp sfilter!SfWrite: Encrypt E:\~WRD0001.tmp ,8156C000,FA07B000 sfilter!SfWrite: Encrypt E:\~WRD0001.tmp ,8147E000,FA07C000 sfilter!SfWrite: Encrypt E:\~WRD0001.tmp ,8147E000,FA07D000 sfilter!SfWrite: Encrypt E:\~WRD0001.tmp ,817A2000,FA07F000 iCell!WriteContext:Offset:19968,Information:00000000,00004E38 ,Status:00000000,00000038 WriteFileContext :E:\~WRD0001.tmp winword.exe-winword.exe,11,11 svchost.exe-winword.exe,11,11 winword.exe-winword.exe,11,11 svchost.exe-winword.exe,11,11 winword.exe-winword.exe,11,11 svchost.exe-winword.exe,11,11 TargetFileName = E:\tst.doc,\??\E:\~WRL0002.tmp TargetFileName = E:\~WRD0001.tmp,\??\E:\tst.doc winword.exe-winword.exe,11,11 sfilter!SfRead: Decrypt E:\tst.doc Microsoft Word On BeginShutdown Microsoft Word On Disconnection RemoveMode = 0 winword.exe-explorer.exe,11,12 winword.exe-explorer.exe,11,12 |
|
8楼#
发布于:2008-04-24 12:54
老实说,我也搞了很久,反复监测了create, cleanup, close,read,write, 最后终于解决了。我在postcreate,precleanup 中清了缓存,在postread,prewrite中只针对noncache ,pagingio 进行过滤加密读写,就没有权限的问题了。并没有设计到你说的同步问题。还有我的是文件夹加密,也就是对任何文件(包括tmp)都加密。
PS:我监测到在新建一个word时,监测到系统有如下写操作:首先是一个irp写,irpflag为0x00000a00,这个写操作是产生word文件的文件头(我猜word有个文件头,且格式是固定的);然后接着是好几个fastio的写,irpflag为0x00000000,这个写操作是产生文档中实际的内容的(我猜实际的内容是附在word文件头的后面);最后就是n个noncache的pageio写,当且仅当过滤noncache pageio写的时候,word文件才能保存成功,否则提示文件权限错误,保存失败;有意思的是,过滤不同的irpflag,word文件的不同的部分就被加密。 估计这些都不是新东西了,希望对你有帮助。 |
|