Win API NTFS OpenFileByID抛出AccessViolationException

时间:2015-03-22 00:51:15

标签: c# winapi visual-studio-2013 ntfs interopservices

test()中的OpenFileByID行给了我System.AccessViolationException Attempted to read or write protected memory. This is often an indication that other memory is corrupt.

我正在尝试复制this code example(请参阅答案),我正在Visual Studio Express 2013 for Windows Desktop中运行。但这个例子对我来说似乎并不适用。它在test()中打破了OpenFileByID行。

简而言之,我正在获取文件的ID,然后尝试从该ID创建文件句柄。稍后我打算使用该句柄来获取有关该文件的信息。我使用ID的原因是我可以修复损坏的链接,因为目标文件的GUID比它的假定位置更可靠。帮助赞赏!

编辑:我正在尝试打开的文件是我桌面上的普通文本文件,没什么特别的。

1 个答案:

答案 0 :(得分:0)

你没有检查你是否有一个有效的音量句柄 - 你可能不是。可能是你的a / v的来源。

当您打开根目录时,文档说您不应该将FILE_ATTRIBUTE_NORMAL与任何其他标志一起使用 - 但是您将其与FILE_FLAG_BACKUP_SEMANTICS一起使用。要使用FILE_FLAG_BACKUP_SEMANTICS,您必须获得SE_BACKUP_NAME的权限。您必须是管理员或备份操作员才能这样做。我无法想象你需要那面旗帜。

您可以通过打开“\\。\ C:”(例如)...来获取卷句柄,这与根文件夹的句柄不同。我通常使用GenericRead打开它,但如果你需要它只是OpenFileById,你可以指定0进行访问。

此外 - 不需要向文件添加对象ID - 文件引用号(FRN)是文件的主文件表标识符 - 它是您可以在FILE_ID_DESCRIPTOR中传递的“其他”ID。你可以从一个调用GetFileInformationByHandle的打开文件句柄中获取它 - 它是nFileindexHigh和nFileIndexLow成为一个long int。移动文件时,FRN保持不变(只有它的父FRN更改)。此外,重命名文件时,FRN不会更改。使用它而不是ObjectID的好处是你不是为了跟踪文件而改变音量......你不必使用DeviceIOControl - 这是一个互操作的梦想。

还有一个想法 - OpenFileByID直到Vista和Windows Server 2008才出现。你在那里,对吗?