在Windows下,磁盤能夠看作是一個文件,其文件名爲\\\\.\\PhysicalDriveX,其中X表示磁盤的編號,例如\\\\.\\PhysicalDrive0表示的是第0號磁盤,若是須要讀取一個磁盤只須要經過對應的文件名稱獲取到磁盤的句柄,而後經過函數ReadFile讀取便可,下面是相關的代碼。函數
//經過給定磁盤的編號,獲取到磁盤的句柄
HANDLE
GetDiskHandle(
int
iDiskNo)
{
char
szDriverBuffer[128];
memset
(szDriverBuffer,0,128);
//格式化設備文件名稱
sprintf_s(szDriverBuffer,
"\\\\.\\PhysicalDrive%d"
,iDiskNo);
HANDLE
m_hDevice = NULL;
//CreateFile獲取到設備句柄
m_hDevice = CreateFileA(
szDriverBuffer,
// 設備名稱,這裏指第一塊硬盤,多個硬盤的本身修改就行了
GENERIC_READ,
// 指定讀訪問方式
FILE_SHARE_READ | FILE_SHARE_WRITE,
// 共享模式爲讀|寫,0表示不能共享
NULL,
// NULL表示該句柄不能被子程序繼承
OPEN_EXISTING,
// 打開已經存在的文件,文件不存在則函數調用失敗
NULL,
// 指定文件屬性
NULL);
if
(m_hDevice==INVALID_HANDLE_VALUE){
m_hDevice = NULL;
//無效
return
INVALID_HANDLE_VALUE;
}
//設備句柄
return
m_hDevice;
}
//經過磁盤的句柄,給定讀取的位置,獲取到扇區512字節數據返回
//readpos:扇區的邏輯地址
//lpOutBuffer512:用於返回讀取的數據
BOOL
ReadSectorData(
HANDLE
& hDevice,
UINT64
redpos,__out
char
* lpOutBuffer512 )
{
memset
(lpOutBuffer512,0,512);
LARGE_INTEGER li;
li.QuadPart = redpos*0x200;
//0x200 = 512,求出扇區的 字節地址,經過設置讀取的地址和長度進行read
SetFilePointer(hDevice,li.LowPart,&li.HighPart,FILE_BEGIN);
DWORD
DCount=0;
//計數
BOOL
bResult=ReadFile(hDevice, lpOutBuffer512,512, &DCount, NULL);
return
bResult;
}