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