-1

我尝试将 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

C:

#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();
}

编辑

我更改了代码但没有

我尝试使用像MSDN 示例一样的“\.\C:” ,但没有:(

并且错误从“if(buff[3] == 'N')”开始,我不知道 ReadFile 是失败还是“if”?

Mid 用于驱动器.. "C:\" 或 "C:" 如 "\.\C:" 或 "\.\C:\"

4

1 回答 1

0

如果您想检查文件系统类型,请检查建议使用 GetVolumeInformation() 的相关问题。

于 2014-01-29T13:51:52.867 回答