青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

極品垃圾

初學VC ,就是把每天所看到的整理到博客,慢慢消化這些內容。見證我的學習之路吧。很多都是轉載。

公告

初學VC ,就是把每天所看到的整理到博客,慢慢消化這些內容。見證我的學習之路吧。很多都是轉載。
<2025年11月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456

統計

  • 隨筆 - 0
  • 文章 - 61
  • 評論 - 1
  • 引用 - 0

常用鏈接

留言簿(2)

隨筆分類

文章分類(55)

文章檔案(61)

搜索

  •  

最新評論

VC++完成Win2000下直接讀寫磁盤扇區
由于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)

// 對磁盤扇區數據的寫入

{

 if (bDrive == 0) return 0;

 char devName[] = "\\\\.\\A:";

 devName[4] ='A' + bDrive - 1;

 HANDLE hDev = CreateFile(devName, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);

 if (hDev == INVALID_HANDLE_VALUE) return 0;

 SetFilePointer(hDev, 512 * dwStartSector, 0, FILE_BEGIN);

 DWORD dwCB;

 BOOL bRet = WriteFile(hDev, lpSectBuff, 512 * wSectors, &dwCB, NULL);

 CloseHandle(hDev);

 return bRet;

}

BOOL CDirectAccessHDDlg::ReadSectors(BYTE bDrive, DWORD dwStartSector, WORD wSectors, LPBYTE lpSectBuff)

// 對磁盤扇區數據的讀取

{

 if (bDrive == 0) return 0;

 char devName[] = "\\\\.\\A:";

 devName[4] ='A' + bDrive - 1;

 HANDLE hDev = CreateFile(devName, GENERIC_READ, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);

 if (hDev == INVALID_HANDLE_VALUE) return 0;

 SetFilePointer(hDev, 512 * dwStartSector, 0, FILE_BEGIN);

 DWORD dwCB;

 BOOL bRet = ReadFile(hDev, lpSectBuff, 512 * wSectors, &dwCB, NULL);

 CloseHandle(hDev);

 return bRet;

}


磁盤扇區數據直接讀寫技術的應用

上一步實現了對磁盤扇區數據進行讀寫訪問的核心處理過程。在此基礎上可以完成一些有實用價值的應用,例如,可以實現對指定磁盤分區中指定起止扇區的內容查看:

if (ReadSectors(uDiskID, m_uFrom, (UINT)dwSectorNum, bBuf) == FALSE) {

 MessageBox("所選磁盤分區不存在!", "錯誤", MB_OK | MB_IConERROR);

 return;

}


為了方便數據的顯示,可做如下處理以完成格式轉換等工作:

for (DWORD i = 0; i < dwSectorNum * 512; i++) {

 sprintf(cBuf, "%s%02X ", cBuf, bBuf[i]);

 if ((i % 512) == 511)

sprintf(cBuf, "%s\r\n第%d扇區\r\n", cBuf, (int)(i / 512) + m_uFrom);

 if ((i % 16) == 15)

sprintf(cBuf, "%s\r\n", cBuf);

 else if ((i % 16) == 7)

sprintf(cBuf, "%s- ", cBuf);

}




顯示結果如上圖所示。另外一種應用與之類似,即對磁盤扇區內容的備份與恢復處理。不少防病毒軟件都提供這樣的功能:對硬盤引導區內容的備份,一旦硬盤引導扇區被病毒破壞后能夠通過對備份數據的寫入實現恢復。備份操作與前面的數據顯示操作類似,只是把讀取的內容不經格式處理而直接保存到指定的文件中即可:

file.Open(fileDlg.GetPathName(), Cfile::modeCreate | Cfile::modeReadWrite);

……

if (ReadSectors(uDiskID, m_uFrom, (UINT)dwSectorNum, bBuf) == FALSE) {

 MessageBox("所選磁盤分區不存在!", "錯誤", MB_OK | MB_IConERROR);

 return;

}

file.Write(bBuf, dwSectorNum * 512);

file.Close();


數據的恢復處理正好與之相反,首先打開備份文件并根據文件長度計算要寫的扇區數,然后讀取其內容到緩存,最后將其寫入到指定扇區完成數據的恢復:

file.Open(fileDlg.GetPathName(), Cfile::modeReadWrite);

DWORD dwSectorNum = file.GetLength();

if (dwSectorNum % 512 != 0) return;

 dwSectorNum /= 512;

 unsigned char* bBuf = new unsigned char[dwSectorNum * 512];

 file.Read(bBuf, dwSectorNum * 512);

 if (WriteSectors(uDiskID, m_uFrom, (UINT)dwSectorNum, bBuf) == FALSE) {

MessageBox("所選磁盤分區不存在!", "錯誤", MB_OK | MB_IConERROR);

return;

 }

 file.Close();

 delete[] bBuf;


面將要給出的最后一個應用是對磁盤數據的安全擦除。眾所周知,在操作系統下是通過文件管理系統實現對文件訪問管理的。當刪除一個文件時,該文件的全部內容并沒有發生任何損壞,如果沒有外部數據的覆蓋,完全可以通過各種數據恢復軟件將先前刪除的文件恢復出來。但在軍工、政府等特殊的涉密行業、部門中,要求的是數據的徹底刪除,即經刪除過的數據是不可進行再恢復處理的。為了確保磁盤數據的可靠清空,可以對每一個扇區寫入全1后再寫入全0。之所以多次寫入數據,是因為一次寫入只能防止數據恢復軟件的恢復處理。如果覆蓋次數不多的化,通過一種被稱做“磁盤放大鏡”的特殊儀器仍能夠以物理的方法將先前刪除的數據恢復出來,因此這里需要對扇區多次重復寫入數據,反復次數越多擦除效果越好。下面是這部分的具體實現代碼:

unsigned char bBuf[512];

UINT i = 0;

BOOL bRet = TRUE;

while (m_bAllDisk){

 memset(bBuf, 0xFF, sizeof(bBuf));

 bRet = WriteSectors(uDiskID, i, 1, bBuf);

 memset(bBuf, 0, sizeof(bBuf));

 bRet = WriteSectors(uDiskID, i, 1, bBuf);

 if (bRet == FALSE){

if (i == 0)

 MessageBox("所選磁盤分區不存在!", "錯誤", MB_OK | MB_IConERROR);

else

 MessageBox("磁盤數據擦除完畢!", "錯誤", MB_OK | MB_IConERROR);

 return;

 }

 i++;

}


小結

本文僅對磁盤扇區內容的直接讀寫方法做了介紹并給出了扇區數據內容的顯示、備份與恢復、磁盤數據的徹底擦除等幾個主要的應用作了介紹。讀者可以根據需要實現其他的應用如利用磁盤扇區內容進行身份認證、數據隱藏、磁盤刪除數據的恢復等。本文所述程序代碼在Windows 2000 Professional + SP4下由Microsoft Visual C++ 6.0編譯通過。

posted on 2009-05-21 22:19 極品垃圾 閱讀(368) 評論(0)  編輯 收藏 引用 所屬分類: vc

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久噜噜噜精品国产亚洲综合| 亚洲国产高清aⅴ视频| 亚洲一区二区欧美| 99精品久久久| 亚洲天堂免费观看| 欧美一区二区三区电影在线观看| 欧美在线视频a| 久久综合网色—综合色88| 狼狼综合久久久久综合网| 欧美福利专区| 国产精品白丝黑袜喷水久久久| 国产精品亚洲美女av网站| 精品av久久707| 一本一道久久综合狠狠老精东影业| 亚洲在线日韩| 欧美91精品| 一本色道久久99精品综合 | 亚洲欧美激情一区二区| 亚洲一区二区在线播放| 久久久国产精品亚洲一区| 欧美精品18+| 国产亚洲精品久久久| 亚洲激情婷婷| 欧美一区免费视频| 亚洲国产精品一区二区第一页| 亚洲国产精品高清久久久| 亚洲一区二区三区四区视频 | 免费人成精品欧美精品| 欧美午夜a级限制福利片| 国自产拍偷拍福利精品免费一| 亚洲片区在线| 久久久久.com| 亚洲视屏在线播放| 欧美激情精品久久久久久| 国产视频久久久久久久| 亚洲精品久久久久久久久久久久久 | 日韩视频在线你懂得| 久久精品1区| 亚洲视频二区| 欧美喷水视频| 亚洲国产美国国产综合一区二区| 久久精品99无色码中文字幕 | 中日韩视频在线观看| 女人香蕉久久**毛片精品| 国产欧美日韩一区二区三区| 一区二区三区国产在线| 欧美国产高清| 久久久蜜桃精品| 国产一区二区日韩精品| 久久9热精品视频| 亚洲小说欧美另类婷婷| 欧美小视频在线观看| 日韩手机在线导航| 亚洲第一精品夜夜躁人人爽| 久久久久久久综合色一本| 国产一区二区成人久久免费影院| 亚洲欧美久久| 亚洲桃花岛网站| 欧美视频在线视频| 99一区二区| 99国产精品久久久| 欧美日韩在线播放三区四区| 一区二区三区成人精品| 日韩午夜三级在线| 欧美午夜精品久久久| 亚洲专区一区二区三区| 中文精品视频一区二区在线观看| 欧美午夜精品久久久久免费视 | 午夜久久福利| 在线一区视频| 国产精品久久99| 欧美在现视频| 久久爱91午夜羞羞| 在线观看不卡| 亚洲日本aⅴ片在线观看香蕉| 欧美精品国产精品| 亚洲网站视频| 亚洲综合精品| 好吊妞**欧美| 亚洲国产精品一区制服丝袜| 欧美日韩精品免费观看| 欧美影院视频| 免费成人网www| 亚洲影院高清在线| 久久福利资源站| 日韩视频一区二区三区在线播放免费观看 | 亚洲人人精品| 国产精品久久久久高潮| 欧美在线地址| 免费观看成人鲁鲁鲁鲁鲁视频 | 一区二区三区高清视频在线观看| 亚洲欧美成人网| 亚洲国产成人午夜在线一区| 亚洲六月丁香色婷婷综合久久| 国产精品色婷婷久久58| 蜜臀91精品一区二区三区| 欧美日韩在线视频观看| 麻豆国产精品777777在线| 国产精品扒开腿做爽爽爽视频| 快播亚洲色图| 国产精品女主播一区二区三区| 免播放器亚洲一区| 国产精品日韩专区| 亚洲激情成人| 在线视频观看日韩| 亚洲欧美日韩精品久久久| 亚洲美女在线观看| 久久久久久久成人| 亚洲欧美一区二区视频| 你懂的国产精品永久在线| 欧美一级专区| 欧美日韩成人在线播放| 久久天天躁狠狠躁夜夜av| 国产精品wwwwww| 亚洲欧洲日韩综合二区| 精品成人在线| 欧美一区二区大片| 香蕉成人伊视频在线观看| 欧美日韩成人在线播放| 亚洲欧洲中文日韩久久av乱码| 在线观看欧美| 久久久999| 久久综合中文字幕| 国模套图日韩精品一区二区| 午夜精彩视频在线观看不卡| 亚洲一区二区免费| 欧美激情精品久久久久久大尺度| 久久精品人人爽| 欧美在线一级va免费观看| 欧美视频观看一区| 亚洲久久一区二区| 亚洲欧洲视频在线| 女人香蕉久久**毛片精品| 欧美黄色免费网站| 亚洲欧洲三级| 欧美日韩国产在线看| 日韩一二三区视频| 亚洲一区二区三区乱码aⅴ蜜桃女 亚洲一区二区三区乱码aⅴ | 欧美午夜电影网| 一区二区日韩伦理片| 亚洲视频精选| 国产精品久久久久久久久久久久久 | 亚洲视频狠狠| 国产精品久久久久久户外露出| 亚洲一区二区三区色| 久久精品国产精品亚洲综合| 国产一区二区三区黄| 欧美一区二区三区在线免费观看| 久久精品亚洲一区二区三区浴池| 国产亚洲综合精品| 狂野欧美激情性xxxx欧美| 亚洲人成亚洲人成在线观看图片| 一区二区三区|亚洲午夜| 国产精品亚洲一区| 久久久99久久精品女同性| 欧美激情一区二区久久久| 亚洲图片在线观看| 国产一区在线视频| 欧美电影打屁股sp| 在线午夜精品| 久久久久久国产精品一区| 亚洲高清久久网| 欧美视频久久| 久久久噜噜噜久噜久久| 日韩午夜电影| 欧美 日韩 国产 一区| 正在播放亚洲| 国内成人精品2018免费看| 欧美不卡一区| 欧美一区二区成人6969| 亚洲欧洲日产国码二区| 久久精品二区亚洲w码| 亚洲精品亚洲人成人网| 国产精品欧美精品| 蜜桃av噜噜一区二区三区| 亚洲少妇最新在线视频| 欧美大片在线观看一区| 午夜久久久久久| 亚洲美女在线视频| 一区二区三区在线不卡| 国产精品二区三区四区| 欧美成人国产一区二区| 欧美一区二区视频在线观看| 亚洲精品国产视频| 久热精品视频在线观看一区| 亚洲一区二区三区在线观看视频 | 欧美日韩在线观看一区二区三区| 午夜精品偷拍| 理论片一区二区在线| 欧美日韩久久不卡| 久久嫩草精品久久久久| 亚洲一区二区在线观看视频| 亚洲日本电影| 欧美激情一区在线| 久久久久这里只有精品| 亚洲男女毛片无遮挡| 亚洲免费观看高清在线观看| 尤物yw午夜国产精品视频明星| 国产精品一级在线| 国产精品xvideos88|