硬盤讀寫功能主要運用在三個方面,分別是MBR操作,數據恢復以及繞過Windows安全機制。以下是私藏多年的硬盤讀寫功能封裝的代碼。爲了效率起見,讀寫最好一次性讀/寫512字節,也就是一磁道爲佳。
#include <Windows.h>
#include <string>
const wchar_t wDisk[22] = L"\\\\.\\PhysicalDrive0";
const wchar_t wDrev[10] = L"\\\\.\\A:";
//讀盤
BOOL WINAPI Disk_ReadSectors(int iDisk, DWORD dwStart, DWORD dwStartHigh, DWORD dwOffsetSectors, DWORD dwSize, LPBYTE lpReadBuff)
{
//整理數據
unsigned __int64 _64OffsetBase = (dwStart + dwStartHigh*0x100000000)*512+dwOffsetSectors;
dwStart = (DWORD)_64OffsetBase;
dwStartHigh = (DWORD)_64OffsetBase/0x100000000;
//初始化字符串參數
std::wstring wBuff = ::wDisk;
wBuff[17] = (wchar_t)(iDisk + L'0');
//開始讀盤
HANDLE hDisk = CreateFileW(wBuff.c_str(), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if(INVALID_HANDLE_VALUE == hDisk)
return FALSE;
SetFilePointer(hDisk, dwStart, (PLONG)&dwStartHigh, FILE_BEGIN);
BOOL bRet = ReadFile(hDisk, lpReadBuff, dwSize, &dwOffsetSectors, NULL);
CloseHandle(hDisk);
return bRet;
}
//寫盤
BOOL WINAPI Disk_WriteSectors(int iDisk, DWORD dwStart, DWORD dwStartHigh, DWORD dwOffsetSectors, DWORD dwSize, LPBYTE lpWriteBuff)
{
//整理數據
unsigned __int64 _64OffsetBase = (dwStart + dwStartHigh*0x100000000)*512+dwOffsetSectors;
dwStart = (DWORD)_64OffsetBase;
dwStartHigh = (DWORD)_64OffsetBase/0x100000000;
//初始化字符串參數
std::wstring wBuff = ::wDisk;
wBuff[17] = (wchar_t)(iDisk + L'0');
//開始寫盤
HANDLE hDisk = CreateFileW(wBuff.c_str(), GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if(INVALID_HANDLE_VALUE == hDisk)
return FALSE;
SetFilePointer(hDisk, dwStart, (PLONG)&dwStartHigh, FILE_BEGIN);
BOOL bRet = WriteFile(hDisk, lpWriteBuff, dwSize, &dwOffsetSectors, NULL);
CloseHandle(hDisk);
return bRet;
}
//讀驅動器
BOOL WINAPI Drev_ReadSectors(wchar_t wDrev, DWORD dwStart, DWORD dwStartHigh, DWORD dwOffsetSectors, DWORD dwSize, LPBYTE lpReadBuff)
{
//整理數據
unsigned __int64 _64OffsetBase = (dwStart + dwStartHigh*0x100000000)*512+dwOffsetSectors;
dwStart = (DWORD)_64OffsetBase;
dwStartHigh = (DWORD)_64OffsetBase/0x100000000;
//初始化字符串參數
std::wstring wBuff = ::wDrev;
wBuff[4] = wDrev;
//開始讀盤
HANDLE hDrev = CreateFileW(wBuff.c_str(), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
if(INVALID_HANDLE_VALUE == hDrev)
return FALSE;
SetFilePointer(hDrev, dwStart, (PLONG)&dwStartHigh, FILE_BEGIN);
BOOL bRet = ReadFile(hDrev, lpReadBuff, dwSize, &dwOffsetSectors, NULL);
CloseHandle(hDrev);
return bRet;
}
//寫驅動器
BOOL WINAPI Drev_WriteSectors(wchar_t wDrev, DWORD dwStart, DWORD dwStartHigh, DWORD dwOffsetSectors, DWORD dwSize, LPBYTE lpWriteBuff)
{
//整理數據
unsigned __int64 _64OffsetBase = (dwStart + dwStartHigh*0x100000000)*512+dwOffsetSectors;
dwStart = (DWORD)_64OffsetBase;
dwStartHigh = (DWORD)_64OffsetBase/0x100000000;
//初始化字符串參數
std::wstring wBuff = ::wDrev;
wBuff[4] = wDrev;
//開始寫盤
HANDLE hDrev = CreateFileW(wBuff.c_str(), GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
if(INVALID_HANDLE_VALUE == hDrev)
return FALSE;
SetFilePointer(hDrev, dwStart, (PLONG)&dwStartHigh, FILE_BEGIN);
BOOL bRet = WriteFile(hDrev, lpWriteBuff, dwSize, &dwOffsetSectors, NULL);
CloseHandle(hDrev);
return bRet;
}