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

極品垃圾

初學(xué)VC ,就是把每天所看到的整理到博客,慢慢消化這些內(nèi)容。見證我的學(xué)習(xí)之路吧。很多都是轉(zhuǎn)載。

公告

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

統(tǒng)計(jì)

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

常用鏈接

留言簿(2)

隨筆分類

文章分類(55)

文章檔案(61)

搜索

  •  

最新評論

VC++完成Win2000下直接讀寫磁盤扇區(qū)
由于Windows 操作系統(tǒng)在很大程度上采取了訪問安全保護(hù)機(jī)制(例如,在Windows操作系統(tǒng)下不能直接訪問物理內(nèi)存、不能使用各種DOS、BIOS中斷等等),使得廣大程序設(shè)計(jì)人員在長時(shí)間的開發(fā)過程中不知不覺地逐漸養(yǎng)成了這樣的潛意識——在Windows操作系統(tǒng)下直接操縱硬件設(shè)備是極端困難和非常煩瑣的,并將其看作Windows編程的一個(gè)禁區(qū)。盡管在大多數(shù)場合下這樣的論斷還算是貼切,但也并非對所有的硬件設(shè)備訪問都那么困難。其實(shí)Windows在采取“實(shí)保護(hù)”措施的同時(shí)也提供了另外的一種有別于在DOS下訪問硬件設(shè)備的方法,即把所有的硬件設(shè)備全部看做“文件”,并允許按照對文件的讀寫方式來對其進(jìn)行數(shù)據(jù)存取訪問。撰寫本文的另外一個(gè)目的也就是幫助讀者打消在Windows環(huán)境下對硬件編程的恐懼心理。

對磁盤扇區(qū)數(shù)據(jù)的訪問

前面已經(jīng)提過,在Windows 下把所有的設(shè)備當(dāng)作文件進(jìn)行操作。如果對串口進(jìn)行編程或許不少讀者還比較熟悉:對于串行端口1、2,可以用”COM1”、”COM2”作為參數(shù)調(diào)用CreateFile()函數(shù),這里的”COM1”、”COM2”即以文件存放路徑的方式指出了要操作的硬件設(shè)備。但是如果需要對磁盤的某個(gè)扇區(qū)進(jìn)行讀寫,可能不少讀者不會想到使用CreateFile()函數(shù)或是不知如何使用。其實(shí),與對串行端口的訪問類似,需要用與文件存放路徑相類似的方式指出要操作的硬件設(shè)備(硬盤)。但是這里并不是用“DISK1”、“DISK2”等去標(biāo)識某一塊物理存在的硬盤。由于邏輯扇區(qū)是存在于邏輯分區(qū)上的,因此這里需要以某種特定的格式來指定需要訪問的磁盤邏輯分區(qū)。對于邏輯分區(qū)X,其格式為”\\.\X:”。

HANDLE CreateFile( LPCTSTR lpFileName,

DWORD dwDesiredAccess,

DWORD dwShareMode,

LPSECURITY_ATTRIBUTES lpSecurityAttributes,

DWORD dwCreationDisposition,

DWORD dwFlagsAndAttributes,

HANDLE hTemplateFile );


CreateFile()函數(shù)原型如上所示,由于訪問的是事實(shí)上已經(jīng)存在的磁盤扇區(qū),因此只能以O(shè)PEN_EXISTING標(biāo)志設(shè)置dwCreationDisposition參數(shù)指出將要打開已經(jīng)存在的文件(設(shè)備)。至于其他參數(shù)的使用與操作普通文件時(shí)的用法相同。

通過CreateFile()打開的是整個(gè)磁盤邏輯分區(qū),而要操作的是該分區(qū)的某些扇區(qū),因此還要通過SetFilePointer()函數(shù)以文件操作的方式把指針移到要操作的磁盤扇區(qū)開始處。SetFilePointer()函數(shù)原型為:

DWORD SetFilePointer(HANDLE hFile,

LONG lDistanceToMove,

PLONG lpDistanceToMoveHigh,

DWORD dwMoveMethod);


參數(shù)hFile為CreateFile()返回的文件(設(shè)備)句柄;lDistanceToMove和lpDistanceToMoveHigh指出了要設(shè)置偏移量的低端和高端部分;dwMoveMethod指出文件指針從何處開始移動(dòng),可能的選項(xiàng)有FILE_START(從文件開始)、FILE_END(從文件結(jié)尾)和FILE_CURRENT(從文件當(dāng)前位置)。

在定位到要訪問的扇區(qū)開始位置后就可以通過ReadFile()或WriteFile()函數(shù)實(shí)施相應(yīng)的讀寫訪問了,具體操作與文件讀寫并沒有什么太大的差別。最后,在完成訪問操作后以CloseHandle()關(guān)閉文件句柄釋放資源,從而完成一次完整的磁盤扇區(qū)數(shù)據(jù)訪問操作。下面給出具體的讀、寫處理過程:

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

// 對磁盤扇區(qū)數(shù)據(jù)的寫入

{

 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)

// 對磁盤扇區(qū)數(shù)據(jù)的讀取

{

 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;

}


磁盤扇區(qū)數(shù)據(jù)直接讀寫技術(shù)的應(yīng)用

上一步實(shí)現(xiàn)了對磁盤扇區(qū)數(shù)據(jù)進(jìn)行讀寫訪問的核心處理過程。在此基礎(chǔ)上可以完成一些有實(shí)用價(jià)值的應(yīng)用,例如,可以實(shí)現(xiàn)對指定磁盤分區(qū)中指定起止扇區(qū)的內(nèi)容查看:

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

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

 return;

}


為了方便數(shù)據(jù)的顯示,可做如下處理以完成格式轉(zhuǎn)換等工作:

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扇區(qū)\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);

}




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

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

……

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

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

 return;

}

file.Write(bBuf, dwSectorNum * 512);

file.Close();


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

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("所選磁盤分區(qū)不存在!", "錯(cuò)誤", MB_OK | MB_IConERROR);

return;

 }

 file.Close();

 delete[] bBuf;


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

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("所選磁盤分區(qū)不存在!", "錯(cuò)誤", MB_OK | MB_IConERROR);

else

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

 return;

 }

 i++;

}


小結(jié)

本文僅對磁盤扇區(qū)內(nèi)容的直接讀寫方法做了介紹并給出了扇區(qū)數(shù)據(jù)內(nèi)容的顯示、備份與恢復(fù)、磁盤數(shù)據(jù)的徹底擦除等幾個(gè)主要的應(yīng)用作了介紹。讀者可以根據(jù)需要實(shí)現(xiàn)其他的應(yīng)用如利用磁盤扇區(qū)內(nèi)容進(jìn)行身份認(rèn)證、數(shù)據(jù)隱藏、磁盤刪除數(shù)據(jù)的恢復(fù)等。本文所述程序代碼在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>
            亚洲欧美国产毛片在线| 尤物精品国产第一福利三区 | 国产一区二区按摩在线观看| 国产精品xvideos88| 欧美日韩在线免费观看| 国产精品久久久久婷婷| 国产在线欧美| 日韩五码在线| 欧美一级成年大片在线观看| 美女黄毛**国产精品啪啪| 欧美激情免费观看| 亚洲三级视频在线观看| 亚洲韩国日本中文字幕| 亚洲网站啪啪| 欧美在线二区| 欧美成人一品| 亚洲午夜小视频| 久久视频免费观看| 欧美日韩123| 国产一区二区三区在线观看视频| 亚洲福利视频二区| 亚洲一区二区综合| 久久一区二区三区四区| 日韩午夜三级在线| 久久久久9999亚洲精品| 欧美日韩精品在线观看| 国产在线不卡精品| 亚洲网友自拍| 亚洲国产美女| 亚洲欧美春色| 欧美日韩成人网| 精品电影在线观看| 亚洲欧美伊人| 亚洲国产欧美另类丝袜| 香蕉久久夜色| 欧美日韩一区二区视频在线观看| 激情综合色综合久久综合| 亚洲字幕在线观看| 91久久夜色精品国产九色| 欧美一区永久视频免费观看| 欧美色图天堂网| 亚洲精品资源| 欧美丰满少妇xxxbbb| 久久本道综合色狠狠五月| 亚洲欧美国产三级| 亚洲精品在线电影| 久久亚洲春色中文字幕| 国产亚洲欧美一区| 欧美在线电影| 午夜精品美女自拍福到在线| 欧美三级韩国三级日本三斤| 99精品国产热久久91蜜凸| 欧美岛国在线观看| 美女成人午夜| 亚洲福利免费| 亚洲高清一二三区| 欧美黄色视屏| 在线亚洲精品| 99av国产精品欲麻豆| 欧美伦理a级免费电影| 亚洲精品自在久久| 亚洲精品久久| 国产精品国产三级国产aⅴ浪潮| 一本色道久久综合亚洲91| 日韩视频不卡| 国产精品夫妻自拍| 午夜在线一区二区| 销魂美女一区二区三区视频在线| 国产日产高清欧美一区二区三区| 久久成人精品一区二区三区| 欧美亚洲一区在线| 久久久亚洲精品一区二区三区| 国内精品美女在线观看| 麻豆精品传媒视频| 欧美大色视频| 亚洲一级在线| 欧美一级黄色录像| 伊人影院久久| 亚洲精品在线三区| 国产欧美日韩综合一区在线观看| 久久精品国产精品| 久久综合成人精品亚洲另类欧美| 亚洲精品乱码| 亚洲综合色婷婷| 在线观看欧美日韩国产| 亚洲精品国产品国语在线app| 欧美伦理91| 久久久久久久性| 欧美国产视频日韩| 亚洲欧洲av一区二区| 久久国产精品99久久久久久老狼 | 亚洲一区二区三| 午夜免费日韩视频| 99精品国产高清一区二区| 亚洲欧美另类久久久精品2019| 一区二区在线观看视频| 亚洲精品久久久久久一区二区| 国产伦精品一区二区三区视频孕妇| 久久亚洲国产精品日日av夜夜| 欧美风情在线观看| 欧美在线视频免费观看| 欧美成人首页| 久久精品综合网| 欧美激情一区二区三区成人| 欧美一区免费视频| 中文欧美在线视频| 欧美一区二区三区免费观看视频 | 午夜精品久久久久久久蜜桃app | 久久一区国产| 亚洲欧美在线aaa| 欧美激情在线| 麻豆av一区二区三区久久| 欧美日韩八区| 亚洲大片av| 亚洲第一视频网站| 欧美一区二区三区免费看 | 亚洲日本成人| 亚洲成色精品| 久久九九99| 久久精品二区| 国产精品国产三级国产aⅴ浪潮| 亚洲国产你懂的| 亚洲激情欧美| 老司机精品导航| 久久综合伊人77777蜜臀| 海角社区69精品视频| 久久在线免费观看| 亚洲欧美中文在线视频| 欧美黑人在线观看| 男人的天堂亚洲| 狠狠色综合一区二区| 亚洲男人的天堂在线aⅴ视频| 中文无字幕一区二区三区| 欧美成人第一页| 欧美激情一区在线| 亚洲国产婷婷香蕉久久久久久99| 久久精品99无色码中文字幕| 久久久综合免费视频| 国产一区二区三区四区hd| 久久国产主播精品| 久久精品一区二区国产| 国产乱码精品一区二区三区五月婷 | 欧美日韩午夜剧场| 亚洲精品乱码久久久久久久久| 亚洲日本视频| 欧美另类极品videosbest最新版本 | 99热在线精品观看| 夜夜嗨av一区二区三区网页| 欧美另类变人与禽xxxxx| 日韩午夜三级在线| 亚洲欧洲av一区二区| 国产一区二区在线观看免费播放| 亚洲在线视频一区| 久久精品在线免费观看| 亚洲欧洲一区二区天堂久久| 日韩亚洲综合在线| 欧美亚一区二区| 欧美一区精品| 欧美激情四色 | 国产精品午夜电影| 欧美一区深夜视频| 欧美国产成人精品| 亚洲精选视频免费看| 国产精品国产三级国产普通话99| 亚洲深夜福利视频| 美女视频黄 久久| 亚洲精品乱码久久久久久日本蜜臀| 欧美人成在线| 午夜久久久久久久久久一区二区| 久久综合电影| 亚洲一区二区三区中文字幕 | 亚洲激情综合| 国产精品进线69影院| 久久久在线视频| 亚洲免费观看高清完整版在线观看熊| 亚洲综合色婷婷| 亚洲国产成人久久综合一区| 欧美日韩国产综合新一区| 欧美制服丝袜| 日韩视频―中文字幕| 久久国产精品久久久久久电车| 91久久综合| 国内成+人亚洲+欧美+综合在线| 欧美国产亚洲精品久久久8v| 性伦欧美刺激片在线观看| 久久久亚洲一区| 亚洲欧洲精品一区| 精品动漫3d一区二区三区| 欧美黑人国产人伦爽爽爽| 午夜国产精品视频| 亚洲日本在线观看| 免费看亚洲片| 欧美中文字幕第一页| 亚洲美女在线国产| 狠狠干综合网| 国产伦精品一区二区三区免费| 欧美精品一区二区三区很污很色的 | 亚洲精品一区二区三区蜜桃久| 久久亚洲综合色| 久久精品一二三|