C++ 我能';t读取mft并将VB.net转换为C
我尝试将VB.NET源代码转换为C。它的目的是告诉我我的硬盘是否是NTFS 假设读取MFT并可以比较第三个字节,如果是78位小数(N)和84位小数(T),等等…返回0表示“真”,但我不能这样做;我的代码不起作用 我怎样才能修好它 VB.net: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
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();
}