VC 實現Win200直接讀寫磁碟扇區

2021-04-13 09:03:49 字數 2327 閱讀 2799

vc++實現win200直接讀寫磁碟扇區

出處:www.csdn.net

引言

由於windows 作業系統在很大程度上採取了訪問安全保護機制(例如,在windows作業系統下不能直接訪問物理記憶體、不能使用各種dos、bios中斷等等),使得廣 大程式設計人員在長時間的開發過程中不知不覺地逐漸養成了這樣的潛意識——在windows作業系統下直接操縱硬體裝置是極端困難和非常煩瑣的,並將其看 作windows程式設計的乙個禁區。儘管在大多數場合下這樣的論斷還算是貼切,但也並非對所有的硬體裝置訪問都那麼困難。其實windows在採取「實保 護」措施的同時也提供了另外的一種有別於在dos下訪問硬體裝置的方法,即把所有的硬體裝置全部看做「檔案」,並允許按照對檔案的讀寫方式來對其進行資料 訪問訪問。撰寫本文的另外乙個目的也就是幫助讀者打消在windows環境下對硬體程式設計的恐懼心理。

對磁碟扇區資料的訪問

前面已經提過,在windows 下把所有的裝置當作檔案進行操作。如果對串列埠進行程式設計或許不少讀者還比較熟悉:對於串列埠1、2,可以用」com1」、」com2」作為引數呼叫 createfile()函式,這裡的」com1」、」com2」即以檔案存放路徑的方式指出了要操作的硬體裝置。但是如果需要對磁碟的某個扇區進行讀 寫,可能不少讀者不會想到使用createfile()函式或是不知如何使用。其實,與對串列埠的訪問類似,需要用與檔案存放路徑相類似的方式指出要操 作的硬體裝置(硬碟)。但是這裡並不是用「disk1」、「disk2」等去標識某一塊物理存在的硬碟。由於邏輯扇區是存在於邏輯分割槽上的,因此這裡需要 以某種特定的格式來指定需要訪問的磁碟邏輯分割槽。對於邏輯分割槽x,其格式為」//./x:」。

handle createfile( lpctstr lpfilename,

dword dwdesiredaccess,

dword dwsharemode,

lpsecurity_attributes lpsecurityattributes,

dword dwcreationdisposition,

dword dwflagsandattributes,

handle htemplatefile );

createfile()函式原型如上所示,由於訪問的是事實上已經存在的磁碟扇區,因此只能以open_existing標誌設定dwcreationdisposition引數指出將要開啟已經存在的檔案(裝置)。至於其他引數的使用與操作普通檔案時的用法相同。

通過createfile()開啟的是整個磁碟邏輯分割槽,而要操作的是該分割槽的某些扇區,因此還要通過setfilepointer()函式以檔案操作的方式把指標移到要操作的磁碟扇區開始處。setfilepointer()函式原型為:

dword setfilepointer(handle hfile,

long ldistancetomove,

plong lpdistancetomovehigh,

dword dwmovemethod);

引數hfile為createfile()返回的檔案(裝置)控制代碼;ldistancetomove和lpdistancetomovehigh指出了 要設定偏移量的低端和高階部分;dwmovemethod指出檔案指標從何處開始移動,可能的選項有file_start(從檔案開始)、 file_end(從檔案結尾)和file_current(從檔案當前位置)。

在定位到要訪問的扇區開始位置後就可以通過 readfile()或writefile()函式實施相應的讀寫訪問了,具體操作與檔案讀寫並沒有什麼太大的差別。最後,在完成訪問操作後以 closehandle()關閉檔案控制代碼釋放資源,從而完成一次完整的磁碟扇區資料訪問操作。下面給出具體的讀、寫處理過程:

bool cdirectaccesshddlg::writesectors(byte bdrive, dword dwstartsector, word wsectors, lpbyte lpsectbuff)

// 對磁碟扇區資料的寫入

bool cdirectaccesshddlg::readsectors(byte bdrive, dword dwstartsector, word wsectors, lpbyte lpsectbuff)

// 對磁碟扇區資料的讀取  

vc禁用win鍵 alt tab鍵

最近專案需要,要動態開關win鍵和alt tab鍵。遮蔽這兩個系統熱鍵需要全域性hook底層鍵盤,捕獲這兩個系統熱鍵。dll 如下 include hhook g hkeyboard null 底層鍵盤系統呼叫,過濾alt tab和win鍵 lresult callback keyboardproc...

VC 實現全屏

今天我在網上看到了實現全屏的文法,但實踐起來有一定的問題。於是我加以修改,寫成了乙個函式,其思想來自網上 請參照原文 函式如下 void fullscan if m wndstatusbar.iswindowvisible 隱藏選單欄 cmenu poldmenu getmenu m orgmenu...

VC開發小技巧20個

vc開發小技巧20個 一 開啟cd rom mcisendstring set cdaudio door open wait null,0,null 二 關閉cd rom mcisendstring set cdaudio door closed wait null,0,null 三 關閉計算機 o...