我正在编写一个使用数据库库的程序。该库使我能够访问它用于访问我的表的文件句柄。我找到了一个Windows API,允许我通过句柄检索有关该文件的信息,但我还没有找到任何方法来确定该文件的访问模式/权限。在这一点上,我确信我可能会在不知道这些信息的情况下生活,但我是顽固的诅咒,我不准备让这一个去。显然Windows知道这个信息 - 所以问题是如何从中哄骗信息?
我发现的API函数是:GetFileInformationByHandleEx,它让我靠近水坑,但不让我喝水。
文件模式信息有用的原因是我需要修改表头信息。如果文件已经处于正确模式,那么我就不必关闭表打开文件修改文件关闭文件然后重新打开表。
是的,在我告诉我可以实现目标的所有选项之前 - 我对那些不感兴趣。我只对原始问题感兴趣 - 如何确定已打开文件的模式。我期待着任何回复,我提前感谢你。
谢谢, 罗伯特米利根
答案 0 :(得分:1)
行。所以我最终得到了这一部分 - 感谢你的指导,很多MSDN研究和大量的反复试验。
有一些棘手的问题让这一切都搞清楚了。
1)ACCESS_MASK肯定没有像我预期的那样反映访问模式。文档让我期望高4位反映我打开文件的“GENERIC”模式 - 错!这些出现在“特定权利”部分。哎 - 我仍然不知道那些高4位的实际使用情况,但是对于这个练习我不需要。
2)一旦我明白了,我就不得不偶然发现文档,让我知道当我打开GENERIC_READ并将其翻译成:
FILE_GENERIC_READ
由以下内容组成:
STANDARD_RIGHTS_READ | FILE_READ_DATA | FILE_READ_ATTRIBUTES | FILE_READ_EA | SYNCHRONIZE
理解这个概念使其余部分都落实到位。现在我的理解与Process Hacker告诉我的信息有关。
3)我从UI到代码也遇到了严重的错误(读了一个错误的错误),曾经想过让整个世界摆在我的脚前。
这很好,因为我现在可以弄清楚文件打开时使用的访问模式。原来的问题回答了!
现在我希望能够确定文件所在的“共享”模式 - 如果可能的话。有什么想法吗?
再次感谢您的帮助
答案 1 :(得分:0)
我不知道是否有相应的Win32 API,但如果你真的需要它,你可以调用NtQueryObject(ObjectBasicInformation)。
答案 2 :(得分:0)
想通了吗?根据我对文档的阅读,似乎您可以通过使用dwDesiredAccess
和0
中的dwShareMode
调用ReOpenFile来识别打开句柄的原始“共享模式”查询一个(或多个?)模式,即FILE_SHARE_DELETE
,FILE_SHARE_READ
,FILE_SHARE_WRITE
。如果ReOpenFile
返回一个有效的句柄(然后可以关闭/处置),那么原始文件上是否存在共享模式?
来源:
“如果
dwDesiredAccess
为零(0),则应用程序可以在不访问设备的情况下查询设备属性。这在应用程序想要确定软盘驱动器的大小及其支持的格式而又不需要的情况下很有用。驱动器中的软盘。“
https://docs.microsoft.com/en-us/windows/desktop/api/winbase/nf-winbase-reopenfile