일단 알아둘 것은 하드디스크는 섹터 단위이기 때문에, 512바이트씩 읽어 들여야 한다. 자신이 20바이트만 썼다고 해서 20바이트만 읽는것이 아닌 512바이트를 읽은 후에 20바이트부분만 분석하면 되는 것이다.
1섹터 단위로 읽어 들이는 함수이다.
DWORD ReadSector(LPCTSTR pDriveName, DWORD dwStartLBA, DWORD dwNumberOfSector, LPBYTE pBuffer, DWORD dwBufferSize)
{
DWORD dwByteRead = 0;
DWORD dwByteRequest;
HANDLE hDevice;
BOOL bResult;
DWORD i;
// Check Input Parameters
dwByteRequest = dwNumberOfSector * 512; //512 is BYTE BY SECTOR
if (dwBufferSize < (dwByteRequest))
{
return 0;
}
// Get Device Handle
hDevice = CreateFile (pDriveName,
GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL, OPEN_EXISTING, 0, NULL);
if (INVALID_HANDLE_VALUE == hDevice)
{
return 0;
}
// Setting the pointer to point to the start of the sector we want to read ..
long nHighByte = (dwStartLBA >> 23); // (32 - 9)
// long nLowByte = (dwStartLBA & 0x007FFFFF) << 9;
long nLowByte = (dwStartLBA) << 9;
i = SetFilePointer (hDevice, nLowByte, &nHighByte, FILE_BEGIN);
// Read
BYTE *pTempBuffer = new BYTE[dwByteRequest];
ZeroMemory(pTempBuffer, dwByteRequest);
bResult = ReadFile (hDevice, pTempBuffer, dwByteRequest, &dwByteRead, NULL);
CloseHandle (hDevice);
if (FALSE == bResult)
{
delete pTempBuffer;
return 0;
}
// Byte Exchange
for (i=0; i<dwByteRead; i+=2)
{
pBuffer[i+1] = pTempBuffer[i];
pBuffer[i] = pTempBuffer[i+1];
}
//memcpy(pBuffer, pTempBuffer, dwByteRead);
delete pTempBuffer;
return dwByteRead;
}
위 코드는 그다지 어렵지는 않다. 우선 첫번째 파라미터는 하드디스크의 이름(넘버), 두번째는 읽어들이고자 하는 시작 LBA(파일시스템이 없는 데이터를 읽어 쓰고 읽을 경우 LBA로 하는 경우가 있다. 이 경우가 아니라도 LBA를 계산해서 이 함수를 써도 좋다.), 세번째는 읽어 드릴 섹터, 네번째는 읽은 데이터를 리턴받을 버퍼, 다섯번째는 읽어드릴 바이트의 수이다. 세번째 파라미터가 1이라면 다섯번째는 512가 되어야 한다.
이 함수의 마지막 부분에는 Byte Exchange라고 있는데, 이건 윈도우에서 읽어 드리는 방식이 리틀엔디안 방식이기 때문이다. 만약 윈도우에서 기록한 데이터를 이 함수를 통해 읽어 드린다면 이 부분을 필요가 없을 것이다.
지금 쓰는 arm코어는 빅엔디안 방식으로써 이렇게 해야할 필요가 있다.
저렇게 해서 데이터를 읽었다면, 자신이 원하는 방식으로 변환을 해야한다.
memcpy((void*)&tempRecInfo, buff, sizeof(recInfo_t));
tempRecInfo는 어떠한 구조체의 인스턴스이고, buff는 위의 ReadSector에서 읽어드린 데이터이다.
tempRecInfo의 주소를 넘겨줘야하기 때문에 당연히 앞에 &(dereference)를 붙여주고.
이렇게 읽어드린 데이터를 사용하면 되는 것이다.
댓글 없음:
댓글 쓰기