利用Win32 api 讀寫硬盤扇區(qū)

調(diào)用API函數(shù)即可完成對扇區(qū)的讀寫操作


[DllImport("Kernel32.dll")]
extern static IntPtr CreateFile(string fileName, uint accessFlag, uint shareMode, IntPtr security, uint createFlag, uint attributeFlag, IntPtr tempfile);

首先要創(chuàng)建文件

[DllImport("Kernel32.dll", SetLastError = true)]
extern static uint SetFilePointer(IntPtr handle, uint offset, [In, Out] ref uint lpDistanceToMoveHigh, uint flag);

設(shè)置文件指針
如果不設(shè)置第三個參數(shù)(null),系統(tǒng)會把第二個參數(shù)offset當(dāng)作一個有符號整數(shù)(32位)劫瞳,最多偏移2GB倘潜。
設(shè)置后會把第三個參數(shù)當(dāng)作64有符號數(shù)的高32位,第二個參數(shù)當(dāng)作低32位志于。
(要注意的是第三個參數(shù)是引用類型)

[DllImport("Kernel32.dll")]
extern static bool WriteFile(IntPtr handle, [In] byte[] buffer, uint bufferLength, ref uint length, IntPtr overLapped);
[DllImport("Kernel32.dll")]
extern static bool ReadFile(IntPtr handle, [Out] byte[] buffer, uint bufferLength, ref uint length, IntPtr overLapped);

然后開始你的操作涮因。
Win32 api中返回值為為零寫入成功,不為零錯誤伺绽。對應(yīng)到這里就是返回false和true
第三個參數(shù)保存的是寫入了多少字節(jié)养泡。

[DllImport("Kernel32.dll")]
extern static bool CloseHandle(IntPtr handle);

最后要記得關(guān)閉句柄


參數(shù)設(shè)置,具體含義見MSDN: 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;

例子:

        /// <summary>
        /// 寫入內(nèi)容 需為扇區(qū)整數(shù)倍奈应,不然寫不進(jìn)去
        /// </summary>
        /// <param name="drivename">驅(qū)動器名</param>
        /// <param name="sector">扇區(qū)</param>
        /// <param name="buffer">寫入內(nèi)容</param>
        /// <returns></returns>
        static public bool write(string drivename, UInt32 sector, byte[] buffer)
        {
            IntPtr DiskHandle = CreateFile(drivename, GENERIC_WRITE, 0, IntPtr.Zero, OPEN_EXISTING, 0, IntPtr.Zero);
            uint length = 0;
            UInt64 distance = sector ;//偏移量
            distance = distance << 9;
            UInt32 distancehigh = (UInt32)(distancehigh>> 32);
            var i=SetFilePointer(DiskHandle, (uint)distance, ref distancehigh, FILE_BEGIN);
            if (i == 0xffffffff)//返回值是低32位地址澜掩,返回-1時getlastwin32error查看錯誤
            {
                var errCode=Marshal.GetLastWin32Error();
                IntPtr tempptr = IntPtr.Zero;
                string msg = null;
                FormatMessage(0x1300, ref tempptr, errCode, 0, ref msg, 255, ref tempptr);
            }
            var res=WriteFile(DiskHandle, buffer, (uint)buffer.Length, ref length, IntPtr.Zero);
            CloseHandle(DiskHandle);
            return res;
        }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市钥组,隨后出現(xiàn)的幾起案子输硝,更是在濱河造成了極大的恐慌,老刑警劉巖程梦,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件点把,死亡現(xiàn)場離奇詭異,居然都是意外死亡屿附,警方通過查閱死者的電腦和手機(jī)郎逃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來挺份,“玉大人褒翰,你說我怎么就攤上這事≡炔矗” “怎么了优训?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長各聘。 經(jīng)常有香客問我揣非,道長,這世上最難降的妖魔是什么躲因? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任早敬,我火速辦了婚禮忌傻,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘搞监。我一直安慰自己水孩,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布琐驴。 她就那樣靜靜地躺著俘种,像睡著了一般。 火紅的嫁衣襯著肌膚如雪棍矛。 梳的紋絲不亂的頭發(fā)上安疗,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天,我揣著相機(jī)與錄音够委,去河邊找鬼荐类。 笑死,一個胖子當(dāng)著我的面吹牛茁帽,可吹牛的內(nèi)容都是我干的玉罐。 我是一名探鬼主播,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼潘拨,長吁一口氣:“原來是場噩夢啊……” “哼吊输!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起铁追,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤季蚂,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后琅束,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體扭屁,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年涩禀,在試婚紗的時候發(fā)現(xiàn)自己被綠了料滥。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡艾船,死狀恐怖葵腹,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情屿岂,我是刑警寧澤践宴,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站爷怀,受9級特大地震影響阻肩,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜霉撵,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一磺浙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧徒坡,春花似錦撕氧、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至锦溪,卻和暖如春不脯,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背刻诊。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工防楷, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人则涯。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓复局,卻偏偏與公主長得像,于是被迫代替她去往敵國和親粟判。 傳聞我的和親對象是個殘疾皇子亿昏,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,627評論 2 350

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)档礁,斷路器角钩,智...
    卡卡羅2017閱讀 134,637評論 18 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,841評論 25 707
  • Ubuntu的發(fā)音 Ubuntu易迹,源于非洲祖魯人和科薩人的語言宰衙,發(fā)作 oo-boon-too 的音。了解發(fā)音是有意...
    螢火蟲de夢閱讀 99,215評論 9 467
  • 圖文 龔華超 編者按:芬蘭的純凈睹欲,就像是白樺樹枝葉上晨露的閃爍供炼,折射出創(chuàng)新的智慧。芬蘭之行窘疮,對于拉酷袋哼,對于我,都是...
    龔華超閱讀 701評論 0 2
  • 今早一不小心睡過頭了闸衫,起床一看六點五十五了涛贯。我趕緊催兒子起床,王爸就進(jìn)廚房作雞蛋餅蔚出,作點稀飯弟翘。他感覺比我干活快虫腋,他...
    文皓文文媽媽閱讀 121評論 0 5