今天在寫(xiě)個(gè)工具,功能是將一些數(shù)據(jù)寫(xiě)到磁盤(pán)的絕對(duì)扇區(qū)上.
但是發(fā)現(xiàn)ReadFile沒(méi)問(wèn)題,可是WriteFile總是報(bào)87錯(cuò)誤(參數(shù)不正確).
Google上查了一會(huì),發(fā)現(xiàn)碰到問(wèn)題的人不少,可惜沒(méi)有正確答案....
沒(méi)轍,還是啃MSDN,終于還是自己解決了~呵呵
趕緊記下來(lái),免得忘了...
其實(shí)主要是寫(xiě)入的數(shù)據(jù)大小,必須是BytesOfSector大小的倍數(shù),一般是512字節(jié),ReadFile卻無(wú)所謂...
另外,MSDN上還說(shuō),WriteFile前最好先用FSCTL_LOCK_VOLUME或者FSCTL_DISMOUNT_VOLUME將磁盤(pán)鎖定或卸載,不過(guò)我試下來(lái)好像沒(méi)什么影響...
代碼摘錄如下:
1 UINT CDevInfo::Write(LPVOID pData, UINT nSize)
2 {
3 if (!pData && nSize <= 0)
4 return 0;
5
6 TCHAR szDevName[30];
7 _stprintf(szDevName, _T("\\\\.\\PHYSICALDRIVE%d"), m_nDevNum); // DeviceNumber
8
9 HANDLE hDev = ::CreateFile(szDevName, GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, NULL, NULL);
10 if (hDev == INVALID_HANDLE_VALUE)
11 return 0;
12
13 DWORD dwCount;
14 if (!::DeviceIoControl(hDev, FSCTL_LOCK_VOLUME, NULL, 0, NULL, 0, &dwCount, NULL))
15 return 0;
16
17 DWORD dwWritten(0);
18 ::SetFilePointer(hDev, SECTOR_NUM * GetSectorSize(), NULL, FILE_BEGIN);
19 if (!::WriteFile(hDev, pData, nSize, &dwWritten, NULL))
20 dwWritten = 0;
21
22 ::DeviceIoControl(hDev, FSCTL_UNLOCK_VOLUME, NULL, 0, NULL, 0, &dwCount, NULL);
23 ::CloseHandle(hDev);
24 return dwWritten;
25 }