windows下讀取磁盤扇區數據

   在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;
}
經過上面的操做能夠獲取到磁盤指定扇區的512字節數據。
相關文章
相關標籤/搜索