#include "stdafx.h"
#include "HDIStuff.h"

static SYS_SECTOR g_sys_sector =
{
	0x045a, //0
	0,      //1
	0xc837, //2
	0,      //3
	0,      //4
	0,      //5
	0,      //6
	{0},    //7,8,9
	{0},    //10
	1,      //20
	1,      //21
	4,      //22
	{0},    //23
	{0},    //27
	0x8001, //47
	0,      //48
	0x200,  //49
	0x4000, //50
	{0},    //51
	0,      //57,58
	0,      //59
	0,      //60,61
	{0}     //62-255
};

CString GenerateSerialNumber()
{
	// тут будет генерация серийного номера Серийный номер такого типа
	// BK-AAAADDDDDDDD, где A - буква, D - цифра.
	CString strSerialNumber = _T("BK-AAAADDDDDDDD");
	TCHAR ch;

	for (int i = 3; i < 7; ++i)
	{
		ch = _T('A') + (TCHAR)((double)rand() / (RAND_MAX + 1) * (_T('Z') - _T('A')));
		strSerialNumber.SetAt(i, ch);
	}

	for (int i = 7; i < 15; ++i)
	{
		ch = _T('0') + (TCHAR)((double)rand() / (RAND_MAX + 1) * (_T('9') - _T('0')));
		strSerialNumber.SetAt(i, ch);
	}

	return strSerialNumber;
}

//копирование строки в системный сектор.
void CopyString2Sys(BYTE *dst, const CString &str, int max_len)
{
	int sizeOfString = str.GetLength();
	LPSTR lpszAscii = new CHAR[sizeOfString]; //а потом, необходимо самим делать delete [] использованных строк

	if (lpszAscii)
	{
		int t_len = WideCharToMultiByte(CP_ACP, 0, str, -1, lpszAscii, sizeOfString, NULL, NULL);

		for (int i = 0; i < max_len; ++i)
		{
			if (i < sizeOfString)
			{
				dst[i] = lpszAscii[i];
			}
			else
			{
				dst[i] = ' ';
			}
		}

		delete [] lpszAscii;

		//а теперь по традиции переставим байты в словах
		for (int i = 0; i < max_len; i += 2)
		{
			std::swap(dst[i], dst[i + 1]);
		}
	}
	else
	{
		for (int i = 0; i < max_len; ++i)
		{
			dst[i] = ' ';
		}
	}
}

void CreateHDISector(IMGFormat *imgf, BYTE *bufSector)
{
	SYS_SECTOR sector0;
	memcpy(&sector0, &g_sys_sector, sizeof(SYS_SECTOR));
	sector0.cylinders = imgf->C;
	sector0.heads = imgf->H;
	sector0.sectors = imgf->S;
	sector0.raw_bytes_per_sector = SECTOR_SIZEB;
	sector0.raw_bytes_per_track = SECTOR_SIZEB * imgf->S;
	int nTotalSectors = imgf->C * imgf->H * imgf->S; //произведение максимальных значений влазит в 32 бита
	sector0.total_used_sectors = nTotalSectors;
	sector0.capacity_in_sectors = nTotalSectors + 1;
	CopyString2Sys(sector0.serial_number, GenerateSerialNumber(), 20);
	CopyString2Sys(sector0.model_name, _T("BKEMU HARD DRIVE IMAGE"), 40);
	CopyString2Sys(sector0.fw_version, _T("v1.0.0.0"), 8);
	//сформируем контрольную сумму
	BYTE cs = 0;
	BYTE *pSector0 = (BYTE *)&sector0;
	pSector0[510] = 0xA5;

	for (int i = 0; i < 511; ++i)
	{
		cs += pSector0[i];
	}

	cs = -cs;
	pSector0[511] = cs;
	//возвращаем результат
	memcpy(bufSector, &sector0, SECTOR_SIZEB);
}
