当我注意到它时,我正在编写一个自定义写锁定类。我的班级没有理由真正写入文件,只是为了拒绝别人写作的能力,所以我自然而然地尝试了这个:
lockHandle = CreateFileW(fileName, 0, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
如您所见,我设置了dwDesiredAccess=0
和dwShareMode=FILE_SHARE_READ
。但是其他进程仍然可以写入该文件。我花了一些时间才意识到我需要设置dwDesiredAccess=GENERIC_WRITE
,否则我的dwShareMode
无效。
似乎只有在我将这些权限授予自己的情况下,我才能拒绝其他人的权限。那是对的吗?如果是这样,为什么会这样?
答案 0 :(得分:1)
您是否需要请求您尝试“不共享”的访问权限;例如,GENERIC_READ和FILE_SHARE_READ将成功阻止写访问 - 这是一种非常常见的情况,也是必不可少的情况。但是,您所请求的访问权限似乎需要“足够重要”才能统计共享模式。
事实证明,所有这些访问权限不被认为是重要的:READ_CONTROL,WRITE_DAC,WRITE_OWNER,FILE_READ_ATTRIBUTES,FILE_READ_EA,FILE_WRITE_ATTRIBUTES和FILE_WRITE_EA。
所有这些访问权限 都被视为重要:DELETE,FILE_EXECUTE,FILE_APPEND_DATA,FILE_READ_DATA和FILE_WRITE_DATA。
为了统计共享模式,您需要从“重要”列表中请求至少一个访问权限。这意味着您可以选择FILE_EXECUTE,这对句柄没有实际影响;如果您不小心尝试从文件中读取,则呼叫将失败。但是,由于此行为似乎没有记录,我不建议您依赖它。相反,在您的方案中,打开GENERIC_READ和FILE_SHARE_READ的文件,因为这可以依赖于工作。
如果你绝对需要一个没有GENERIC_READ访问权限的文件的句柄(我想不出任何好的理由,但可能有边缘情况)你可以使用DuplicateHandle创建一个没有访问权限的新句柄权利。在原始句柄关闭后,这甚至可以继续工作,但是再次,这是没有记录的,所以我建议不要依赖它。
注意:
在Windows 7 x64 SP1上测试,在NTFS上。
我只测试了几个实际上不适用于文件的访问权限,SYNCHRONIZE和FILE_DELETE_CHILD;两者都没有被认为是重要的。
猜测,两个列表之间的区别在于“重要”权利都适用于文件本身,而“无关紧要”权利适用于元数据或根本不适用。
这可能是因为“无关紧要”的权利不需要NTFS来打开底层文件对象,这就是共享模式实际应用的内容。请注意,那是纯粹的猜测。