marinovsoft, Это не верно! Из IA-32

marinovsoft,

Цитата:
Все микрокоды имеют размер 2048 байт, из которых 48 байт представляют заголовок файла, а оставшиеся 2000 байт – непосредственно обновляемый микрокод.

Это не верно! Из IA-32 Intel® Architecture Software Developer’s Manual Volume 3: System Programming Guide раздел 9.11 MICROCODE UPDATE FACILITIES:
поле DataSize -
Цитата:
Specifies the size of the encrypted data in bytes, and must be a multiple of DWORDs. If this value is 00000000H, then the microcode update encrypted data is 2000 bytes (or 500 DWORDs).

На практике следующее, если DataSize = 0, то размер блока с микрокодом 2000 bytes, в противном случае = DataSize.
А ещё интересный момент заключается в том, что за блоком микрокода встречаются нули, о чем свидетельствует разница TotalSize - DataSize (обычно 400h, в моём случае ещё 8 нулей в конце модуля).
Кстати у меня AMI BIOS от P5Q3.

Модуль этот для AMI можно получить при помощи MMTool, ID = 11 - P6 Micro Code.
Мой скрипт для IDA, для структурирования:

#include <idc.idc>
/*
Анализ 11 модуля Microcode Update
*/

static main(void) 
{
	auto index, lSegEnd, idStruct, offDataSize, offTotalSize, DataSize, TotalSize, USize;
	
	lSegEnd = SegEnd(100) - 1;
	
	MakeUnknown(0, lSegEnd, 0);
	MakeUnknown(0, lSegEnd, 1);
	MakeUnknown(0, lSegEnd, 2);
	
	index = 0;
	
	CheckStructure();
	
	idStruct = GetStrucIdByName("microcodeHeader");
	offDataSize = GetMemberOffset(idStruct, "DataSize");
	offTotalSize = GetMemberOffset(idStruct, "TotalSize");
	
	while(index < lSegEnd) 
	{
		if (Dword(index) == 0) 
		{
			MakeArray(index, 1024);
			index = index + 1024;
		}
		MakeStructEx(index, -1, "microcodeHeader");
		
		DataSize = long(Dword(index + offDataSize));
		TotalSize = long(Dword(index + offTotalSize));
		
		Message("> index=0x%04X | DSize=%d | TSize=%d | \n", index, DataSize, TotalSize);
		
		MakeQword(index + 48);
		
		if (DataSize == 0) DataSize = 2000;
		
		MakeArray(index + 48, DataSize / 8);
		
		index = ItemEnd(index + 48);
	}
	
	return;
}

//Добавляем структуру для дальнейшего использования
static CheckStructure()
{
	if (GetStrucIdByName("microcodeHeader") == BADADDR)
	{
		auto sMicrocodeHeader;

		AddStrucEx(BADADDR, "microcodeHeader", 0); //BADADDR = -1 добавить структуру в конец списка структур.

		sMicrocodeHeader = GetStrucIdByName("microcodeHeader");

		AddStrucMember(sMicrocodeHeader, "HeaderVer", -1, FF_DWRD, -1, 4);
		AddStrucMember(sMicrocodeHeader, "UpdRev", -1, FF_DWRD, -1, 4);
		AddStrucMember(sMicrocodeHeader, "Date", -1, FF_DWRD, -1, 4);
		AddStrucMember(sMicrocodeHeader, "ProcSign", -1, FF_DWRD, -1, 4);
		AddStrucMember(sMicrocodeHeader, "CRC", -1, FF_DWRD, -1, 4);
		AddStrucMember(sMicrocodeHeader, "LoaderRev", -1, FF_DWRD, -1, 4);
		AddStrucMember(sMicrocodeHeader, "ProcFlags", -1, FF_DWRD, -1, 4);
		AddStrucMember(sMicrocodeHeader, "DataSize", -1, FF_DWRD, -1, 4);
		AddStrucMember(sMicrocodeHeader, "TotalSize", -1, FF_DWRD, -1, 4);
		AddStrucMember(sMicrocodeHeader, "Reserved0", -1, FF_DWRD, -1, 4);
		AddStrucMember(sMicrocodeHeader, "Reserved1", -1, FF_DWRD, -1, 4);
		AddStrucMember(sMicrocodeHeader, "Reserved2", -1, FF_DWRD, -1, 4);
	}
}

Если есть замечания с удовольствием выслушаю.