c#直接讀寫物理硬盤引導區

其實讀寫硬盤引導區和是不是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);
            }
        }
    }
}



 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章