Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
尝试使用MFT与Java和JNA列出所有文件和目录_Java_Windows_Jna_Ntfs_Kernel32 - Fatal编程技术网

尝试使用MFT与Java和JNA列出所有文件和目录

尝试使用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_

我试图使用Java和JNA列出MFT的内容。我已经正确设置了
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_数据的文档没有明确说明必须这样做……但文档并不总是详尽无遗