lxvincent
驱动牛犊
驱动牛犊
  • 注册日期2006-10-08
  • 最后登录2012-05-21
  • 粉丝1
  • 关注0
  • 积分12分
  • 威望40点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
阅读:3931回复:8

cm007请进,关于word无法保存由于权限问题

楼主#
更多 发布于:2008-04-23 23:19
在网上看到很少有人碰到这个word权限问题,不知道是不是我的方式有问题,我现在将更名的操作提交到应用层hook做,在明文打开修改保存是成功的,并且加密了,但是当我打开密文再保存就出现了word权限错误的问题,我跟踪过最后的tmp文件,是成功的,也就是说就差最后的将tmp文件更名为doc文件,不知道这个问题是因为什么造成的?word真是复杂
lxvincent
驱动牛犊
驱动牛犊
  • 注册日期2006-10-08
  • 最后登录2012-05-21
  • 粉丝1
  • 关注0
  • 积分12分
  • 威望40点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2008-04-23 23:34
一个很奇怪的现象,现在我每次都在MJ_create的时候都CcFlushCache,如果我把这个函数去掉,则会造成明文保存也出现没有权限的问题,另外就是我密文保存失败,可是另存为的时候却是成功的,
综合分析我怀疑是不是因为我的文件缓存中的对象与实际的文件长度不匹配或者是别的什么原因,但是如果是这样的话我的临时文件的产生却是没有问题的,我现在已经昏了,请高手赐教!
znsoft
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2023-10-25
  • 粉丝300
  • 关注6
  • 积分910分
  • 威望14796点
  • 贡献值7点
  • 好评度2410点
  • 原创分5分
  • 专家分100分
  • 社区居民
  • 最爱沙发
  • 社区明星
板凳#
发布于:2008-04-24 08:03
你的想法是对的:)

缓冲长不对造成的,需要同步操作
http://www.zndev.com 免费源码交换网 ----------------------------- 软件创造价值,驱动提供力量! 淡泊以明志,宁静以致远。 ---------------------------------- 勤用搜索,多查资料,先搜再问。
liio
驱动小牛
驱动小牛
  • 注册日期2005-12-24
  • 最后登录2022-06-16
  • 粉丝4
  • 关注1
  • 积分24分
  • 威望343点
  • 贡献值0点
  • 好评度171点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2008-04-24 10:31
WORD最后保存时,有2个改名操作
1.DOC文件先改为~WRL0000.tmp
2.~WRDXXXX.tmp改为DOC文件
我曾经碰到过.如果是许可权错误 .
1.检查对Temp里的文件处理,正确应该是不处理,否则就许可权错误了
2.检查你是否写了WRL0000.tmp,这个文件处理也可以,不处理也可以.

一点愚见.不足参考
lxvincent
驱动牛犊
驱动牛犊
  • 注册日期2006-10-08
  • 最后登录2012-05-21
  • 粉丝1
  • 关注0
  • 积分12分
  • 威望40点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2008-04-24 10:32
多谢指教,请问如何能够达到同步操作,是否使用PFSRTL_COMMON_FCB_HEADER里的资源锁,我现在想这样做,每次我设置文件长度的时候,都调用一下CcSetFileSize,这个函数看似可以通知缓存管理器当前的文件大小,这样是否可以达到文件长度的同步?
lxvincent
驱动牛犊
驱动牛犊
  • 注册日期2006-10-08
  • 最后登录2012-05-21
  • 粉丝1
  • 关注0
  • 积分12分
  • 威望40点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2008-04-24 10:41
to liio:
       你说的Temp是不是系统目录下的Temp文件夹,我跟踪了一下,winword没有在里面做什么样.WRL0000.tmp这个文件我没有处理,直接就是明文。
liio
驱动小牛
驱动小牛
  • 注册日期2005-12-24
  • 最后登录2022-06-16
  • 粉丝4
  • 关注1
  • 积分24分
  • 威望343点
  • 贡献值0点
  • 好评度171点
  • 原创分0分
  • 专家分0分
  • 社区居民
6楼#
发布于:2008-04-24 10:43
winword会在系统temp里产生~DFXXXX.tmp的临时文件,大小大约是512字节.这个不处理最好

稍等.我发我的日志 上来你就明白了
liio
驱动小牛
驱动小牛
  • 注册日期2005-12-24
  • 最后登录2022-06-16
  • 粉丝4
  • 关注1
  • 积分24分
  • 威望343点
  • 贡献值0点
  • 好评度171点
  • 原创分0分
  • 专家分0分
  • 社区居民
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
cm007
驱动牛犊
驱动牛犊
  • 注册日期2007-10-31
  • 最后登录2009-11-04
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望38点
  • 贡献值0点
  • 好评度21点
  • 原创分0分
  • 专家分0分
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文件的不同的部分就被加密。
估计这些都不是新东西了,希望对你有帮助。
游客

返回顶部