尝试使用MFT与Java和JNA列出所有文件和目录
我试图使用Java和JNA列出MFT的内容。我已经正确设置了尝试使用MFT与Java和JNA列出所有文件和目录,java,windows,jna,ntfs,kernel32,Java,Windows,Jna,Ntfs,Kernel32,我试图使用Java和JNA列出MFT的内容。我已经正确设置了kernel32.dll库,并且能够使用windows API中的CreateFile()方法检索文件句柄。但是,当尝试使用DeviceIoControl和FSCTL_ENUM_USN_DATA代码枚举所有条目时,我收到错误代码5-拒绝访问。我做错了什么?该程序以管理员权限运行 相关代码段 public final Kernel32 libinstance = Kernel32.INSTANCE; int FSCTL_ENUM_USN_
kernel32.dll
库,并且能够使用windows API中的CreateFile()
方法检索文件句柄。但是,当尝试使用DeviceIoControl
和FSCTL_ENUM_USN_DATA
代码枚举所有条目时,我收到错误代码5-拒绝访问。我做错了什么?该程序以管理员权限运行
相关代码段
public final Kernel32 libinstance = Kernel32.INSTANCE;
int FSCTL_ENUM_USN_DATA = WinioctlUtil.CTL_CODE(Winioctl.FILE_DEVICE_FILE_SYSTEM, Winioctl.FILE_ANY_ACCESS, 44, Winioctl.METHOD_NEITHER);
int FSCTL_GET_RETRIEVAL_POINTERS = WinioctlUtil.CTL_CODE(Winioctl.FILE_DEVICE_FILE_SYSTEM, Winioctl.FILE_ANY_ACCESS, 28, Winioctl.METHOD_NEITHER);
MFTEnumData med = new MFTEnumData();
WinNT.HANDLE handle = libinstance.CreateFile("\\\\.\\PhysicalDrive0",
GENERIC_READ,
FILE_SHARE_READ | FILE_SHARE_WRITE,
null,
WinNT.OPEN_EXISTING,
FILE_FLAG_BACKUP_SEMANTICS,
null);
int lastError = libinstance.GetLastError();
Pointer pData = new Memory(WinDef.DWORDLONG.SIZE + 0x10000); // 64 kB
IntByReference cb = new IntByReference(0);
boolean r = libinstance.DeviceIoControl(handle, FSCTL_ENUM_USN_DATA, med.getPointer(), Native.getNativeSize(MFTEnumData.class), pData, (int)((Memory) pData).size(), cb, null);
// after this call the lastError is 5
lastError = libinstance.GetLastError();
libinstance.CloseHandle(handle);
如果您能帮助我遍历MFT并列出所有文件,我将不胜感激。在这项任务中,性能对我来说是最重要的,基于
文件的正常解决方案太慢了。我认为MFTEnumData可能是您的问题。您需要将HighUSN成员设置为UsnJournal的NextUSN…否则,您将要求从USNs 0到0的枚举
我写了一个描述如何阅读MFT的答案…但它是用C#。我希望/相信这不是一个可怕的Java翻译问题
我注意到我做了一件事…你没有…而且可能是必要的…就是在打开卷句柄时添加ACCESS\u SYSTEM\u安全性。FSCTL_ENUM_USN_数据的文档没有明确说明必须这样做……但文档并不总是详尽无遗