其實讀寫硬盤引導區和是不是c#沒有關係,只要能用windows api的語言都可以。
原理就是用createfile這個api,獲得物理硬盤的handle,然後用FileStream讀取就可以了,FileStream有幾個構造函數是以句柄方式初始化的。
\\.\PHYSICALDRIVE0 就是第一個物理硬盤了,其他的就是1、2、3……
using System;
using System.IO;
using System.Runtime.InteropServices;
namespace test
{
class test
{
[DllImport("kernel32", SetLastError = true)]
static extern IntPtr CreateFile(
string FileName,
FileAccess DesiredAccess,
FileShare ShareMode,
IntPtr SecurityAttributes,
FileMode CreationDisposition,
int FlagsAndAttributes,
IntPtr hTemplate
);
public const int FILE_FLAG_NO_BUFFERING = 0x20000000;
public static void Main()
{
IntPtr handle = CreateFile(@"\\.\PHYSICALDRIVE0", FileAccess.Read, FileShare.None, IntPtr.Zero, FileMode.Open, FILE_FLAG_NO_BUFFERING, IntPtr.Zero);
FileStream disk = new FileStream(handle, FileAccess.Read);
byte[] outBuffer = new byte[512];
byte[] inBuffer = new byte[512];
outBuffer[0] = 1;
outBuffer[1] = 0;
outBuffer[2] = 1;
disk.Seek(0, SeekOrigin.Begin);
for (int i = 0; i < 512; i++)
{
inBuffer[i] = (byte)disk.ReadByte();
}
for (int i = 0; i < 512; i++)
{
Console.Write(inBuffer[i].ToString("x2")+" ");
}
Console.Read();
}
}
}
當然不只是可以讀取引導區,整個硬盤都可以啊。
另外,既然獲得了硬盤的FileStream了,那麼就不止可以Read了,當然也可以Write了,不過FileAccess什麼的就得改改了。
乾脆把改寫的也貼上吧,我在虛擬機裏實驗的,運行後就這樣了,沒敢在真機試,有興趣的同學可以在真機運行一下以下代碼。
using System;
using System.IO;
using System.Runtime.InteropServices;
namespace test
{
class test
{
[DllImport("kernel32", SetLastError = true)]
static extern IntPtr CreateFile(
string FileName,
uint DesiredAccess,
uint ShareMode,
IntPtr SecurityAttributes,
uint CreationDisposition,
int FlagsAndAttributes,
IntPtr hTemplate
);
public const int FILE_FLAG_NO_BUFFERING = 0x20000000;
public static void Main()
{
IntPtr handle = CreateFile(@"\\.\PHYSICALDRIVE0", 0x40000000|0x80000000, 0 , IntPtr.Zero, 3, FILE_FLAG_NO_BUFFERING, IntPtr.Zero);
Console.WriteLine(handle.ToString());
FileStream disk = new FileStream(handle,FileAccess.ReadWrite);
byte[] bt = new byte[512];
Random rnd = new Random();
rnd.NextBytes(bt);
for (int i = 0; i < bt.Length; i++)
{
Console.Write(bt[i].ToString("x2") + " ");
}
disk.Seek(0, SeekOrigin.Begin);
try
{
disk.Write(bt, 0, 512);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}