Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.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
C++ 我能';t读取mft并将VB.net转换为C_C++_C_Vb.net_File Io_Ntfs Mft - Fatal编程技术网

C++ 我能';t读取mft并将VB.net转换为C

C++ 我能';t读取mft并将VB.net转换为C,c++,c,vb.net,file-io,ntfs-mft,C++,C,Vb.net,File Io,Ntfs Mft,我尝试将VB.NET源代码转换为C。它的目的是告诉我我的硬盘是否是NTFS 假设读取MFT并可以比较第三个字节,如果是78位小数(N)和84位小数(T),等等…返回0表示“真”,但我不能这样做;我的代码不起作用 我怎样才能修好它 VB.net: Public Function IsNFTSDrive(ByVal strDrive As String) As Boolean Dim Hnd As Integer, nRead As Integer Dim ret As UInt32

我尝试将VB.NET源代码转换为C。它的目的是告诉我我的硬盘是否是NTFS

假设读取MFT并可以比较第三个字节,如果是78位小数(N)和84位小数(T),等等…返回0表示“真”,但我不能这样做;我的代码不起作用

我怎样才能修好它

VB.net:

Public Function IsNFTSDrive(ByVal strDrive As String) As Boolean
    Dim Hnd As Integer, nRead As Integer
    Dim ret As UInt32
    Dim Buffer(1024) As Byte
    Hnd = CreateFile("\\.\" & Mid(strDrive, 1, 2), GENERIC_READ Or GENERIC_WRITE, FILE_SHARE_READ Or FILE_SHARE_WRITE, _
    Nothing, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL Or FILE_FLAG_OVERLAPPED, IntPtr.Zero)
    If (Hnd <> INVALID_HANDLE_VALUE) Then
        ret = ReadFile(Hnd, Buffer, 1024, nRead, New System.Threading.NativeOverlapped)
    Else
        Return False
    End If
    If ret = 0 Then
        ret = WaitForSingleObject(Hnd, INFINITE)
        Select Case ret
            Case WAIT_OBJECT_0
            Case WAIT_TIMEOUT
        End Select
    Else
        Return False
    End If
    CloseHandle(Hnd)
    Return Buffer(3) = 78 And Buffer(4) = 84 And Buffer(5) = 70 And Buffer(6) = 83
End Function
公共函数IsNFTSDrive(ByVal strDrive作为字符串)作为布尔值
Dim Hnd为整数,nRead为整数
尺寸ret As UInt32
Dim缓冲区(1024)作为字节
Hnd=CreateFile(“\\.\”&Mid(strDrive,1,2),泛型读取或泛型写入,文件共享读取或文件共享写入_
无,打开\现有,文件\属性\正常或文件\标志\重叠,IntPtr.Zero)
如果(Hnd无效句柄值),则
ret=ReadFile(Hnd、缓冲区、1024、nRead、新System.Threading.NativeOverlapped)
其他的
返回错误
如果结束
如果ret=0,则
ret=WaitForSingleObject(Hnd,无限)
选择案例ret
案例等待对象0
案例等待超时
结束选择
其他的
返回错误
如果结束
闭合手柄(Hnd)
返回缓冲区(3)=78,缓冲区(4)=84,缓冲区(5)=70,缓冲区(6)=83
端函数
C:

#包括
#包括
#包括
#包括
#定义zwpath L“\\.\\PhysicalDrive0”
int main(int argc,char*argv[]){
处理设备;
重叠;
字节buff[1024];
DWORD数字字节=0;
UINT32 ret;
零内存(&overlapped,sizeof(overlapped));
hDevice=CreateFileW(zwpath,通用读取,通用写入,文件共享读取,文件共享写入,NULL,打开,文件属性正常,文件标志重叠,NULL);
if(hDevice!=无效的句柄值){
ret=读取文件(hDevice、buff、1024和numerobyte以及重叠);
}否则
{
返回NULL;
}
如果(ret==0){
ret=WaitForSingleObject(hDevice,无限);
开关(ret)
{
案例等待对象0:中断;
案例等待超时:中断;
违约:
打破
}
}
其他的
{
返回NULL;
}
闭合手柄(hDevice);
如果(buff[3]=“N”){
printf(“N”);
}
getchar();
}
编辑

我更改了密码,但什么也没做

我试过“\。\C:”像,但没有:(

错误开始于“if(buff[3]=='N')”,我不知道ReadFile是否失败,或者是“if”


Mid用于驱动器。“C:\”或“C:”如“\.\C:”或“\.\C:\”

如果要检查建议使用GetVolumeInformation()的文件系统类型检查。

代码不起作用?调试时会发生什么?
字节缓冲区[1024]
等同于
Dim缓冲区(1024)作为字节
为什么是1024*1024,为什么你
malloc
?哪一步失败了?在VB中,你给了
Mid(strDrive,1,2)
,大小是2个字符,但在c中你给了
“PhysicalDrive0”
更长。也许这就是原因?我修改了代码,但仍然不起作用。
#include <Windows.h>
#include <winioctl.h>
#include <stdio.h>
#include <stdlib.h>


#define zwpath L"\\\\.\\PhysicalDrive0"

int main(int argc, char *argv[]){

    HANDLE hDevice;
    OVERLAPPED overlapped;
    BYTE buff[1024];
    DWORD numerobyte = 0;
    UINT32 ret;
    ZeroMemory(&overlapped, sizeof(OVERLAPPED));

    hDevice = CreateFileW(zwpath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING,  FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL);

    if(hDevice != INVALID_HANDLE_VALUE){

        ret = ReadFile(hDevice, buff, 1024, &numerobyte, &overlapped);

    }else
    {
        return NULL;
    }

    if(ret == 0){

        ret = WaitForSingleObject(hDevice,INFINITE );

        switch (ret)
        {
        case WAIT_OBJECT_0:break;
        case WAIT_TIMEOUT:break;
        default:
            break;
        }
    }
    else
    {
        return NULL;
    }

    CloseHandle(hDevice);

    if(buff[3] == 'N'){

        printf("N");
    }

    getchar();
}