
Сообщение от
nzeemin
Выяснил алгоритм подсчёта CRC для HDD home block, ... в переложении на C/С++:
Код:
static DWORD GetHomeBlockChecksum(void* buffer)
{
WORD* p = (WORD*) buffer;
DWORD crc = 0;
for (int i = 0; i < 255; i++)
{
crc += (DWORD) *p;
p++;
}
crc += ((DWORD)*p) << 16;
return crc;
}
Насколько я понял - предложенная Вами функция возвращает не 32-разрядную контрольную сумму первых 254 слов блока, а инвертированный признак её корректности ( т.е. "ноль", если 32-разрядная контрольная сумма первых 254 слов совпадает со значением последних 2-х слов, рассматриваемых как 32-разрядное целое, и "не ноль" в иных случаях ).
Значение контрольной суммы вычисляет (как я понял) следующая функция:
Код:
DWORD CalculateHomeBlockChecksum(void* buffer)
{
DWORD crc = 0;
for (int i = 0; i < 254; i++)
{
crc += ( (WORD*) buffer )[i];
}
return crc * (-1);
}
Сохранённое в блоке значение контрольной суммы возвращает (если не ошибаюсь) следующая функция:
Код:
DWORD GetHomeBlockChecksum(void* buffer)
{
return ( (DWORD*) buffer )[127];
}
---------- Post added at 12:58 ---------- Previous post was at 12:25 ----------
Новая версия DSK-плагина для Total Commander якобы должна работать с образами винчестеров УКНЦ.
Работа проверялась с единственным образом WDC170inv_P.img, поэтому дополнительная проверка не помешает :)