1.通過CreateFile系列來完成
讀寫扇區可以通過CreateFile打開磁盤邏輯分區,還要通過SetFilePointer以文件操作的方式把指針移到要操作的磁盤扇區開始處,在定位到要訪問的扇區開始位置后就可以通過ReadFile或WriteFile函數實施相應的讀寫訪問了,具體操作與文件讀寫并沒有什么太大的差別。
示例代碼:
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;
}
2.通過ReadSectors直接讀寫磁盤扇區數據
示例代碼:
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, "%srn第%d扇區rn", cBuf, (int)(i / 512) + m_uFrom);
if ((i % 16) == 15)
sprintf(cBuf, "%srn", cBuf);
else if ((i % 16) == 7)
sprintf(cBuf, "%s- ", cBuf);
}