VC硬盤讀寫功能封裝

硬盤讀寫功能主要運用在三個方面,分別是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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章