c# 读磁盘 c#读扇区 c#读驱动器 c#读硬盘 c#读 MBR
网上流传的c#打开驱动器都有问题,原因是createfile的参数不对,下面是改好的,
public const uint FILE_ATTRIBUTE_NORMAL = 0x80;
public const short INVALID_HANDLE_VALUE = -1;
public const uint GENERIC_READ = 0x80000000;
public const uint GENERIC_WRITE = 0x40000000;
public const uint CREATE_NEW = 1;
public const uint CREATE_ALWAYS = 2;
public const uint OPEN_EXISTING = 3;
public const uint FILE_BEGIN = 0;
public const uint FILE_CURRENT = 1;
public const uint FILE_END = 2;
[DllImport("Kernel32.dll")]
extern static IntPtr CreateFile(string fileName, uint accessFlag, uint shareMode, IntPtr security,
uint createFlag, uint attributeFlag, IntPtr tempfile);
[DllImport("Kernel32.dll")]
extern static bool ReadFile(IntPtr handle, [Out] byte[] buffer, uint bufferLength,
ref uint length, IntPtr overLapped);
[DllImport("Kernel32.dll")]
extern static bool CloseHandle(IntPtr handle);
[DllImport("Kernel32.dll")]
extern static uint SetFilePointer(IntPtr handle, int offset, IntPtr distance, uint flag);
IntPtr DiskHandle;
string dr;
//下面的参数很重要,网上流传的都缺少参数导致出现问题
//读盘符
dr = "\\\\.\\E:";
DiskHandle = CreateFile(dr, GENERIC_READ,
OPEN_EXISTING, IntPtr.Zero, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, IntPtr.Zero);
//读物理磁盘0 注意参数
IntPtr DiskHandle = CreateFile(@"\\.\PhysicalDrive0", GENERIC_READ, 0, IntPtr.Zero, OPEN_EXISTING, 0, IntPtr.Zero);
byte[] buffer = new byte[512];
uint length = 0;
SetFilePointer(DiskHandle, 0, IntPtr.Zero, FILE_BEGIN);
ReadFile(DiskHandle, buffer, 512, ref length, IntPtr.Zero);
CloseHandle(DiskHandle);
return buffer;