UIntN ThermalRelationshipTable::countTrtRows(UInt32 size, UInt8* data) { IntN bytesRemaining = size; UIntN rows = 0; struct EsifDataBinaryTrtPackage* currentRow = reinterpret_cast<struct EsifDataBinaryTrtPackage*>(data); while (bytesRemaining > 0) { bytesRemaining -= sizeof(struct EsifDataBinaryTrtPackage); throwIfOutOfRange(bytesRemaining); bytesRemaining -= currentRow->sourceDevice.string.length; throwIfOutOfRange(bytesRemaining); data += currentRow->sourceDevice.string.length; currentRow = reinterpret_cast<struct EsifDataBinaryTrtPackage*>(data); bytesRemaining -= currentRow->targetDevice.string.length; throwIfOutOfRange(bytesRemaining); data += currentRow->targetDevice.string.length; currentRow = reinterpret_cast<struct EsifDataBinaryTrtPackage*>(data); // The math done here will vary based on the number of strings in the BIOS object rows++; data += sizeof(struct EsifDataBinaryTrtPackage); currentRow = reinterpret_cast<struct EsifDataBinaryTrtPackage*>(data); } return rows; }
UIntN ActiveRelationshipTable::countArtRows(UInt32 size, UInt8* data) { IntN bytesRemaining = size; UIntN rows = 0; // Remove revision field esif_data_variant* revision = reinterpret_cast<esif_data_variant*>(data); if ((revision->type == esif_data_type::ESIF_DATA_UINT32) || (revision->type == esif_data_type::ESIF_DATA_UINT64)) { data += sizeof(esif_data_variant); bytesRemaining -= sizeof(esif_data_variant); } else { throw dptf_exception("Revision Field is Missing. (ART)"); } throwIfOutOfRange(bytesRemaining); struct EsifDataBinaryArtPackage* currentRow = reinterpret_cast<struct EsifDataBinaryArtPackage*>(data); while (bytesRemaining > 0) { bytesRemaining -= sizeof(struct EsifDataBinaryArtPackage); throwIfOutOfRange(bytesRemaining); bytesRemaining -= currentRow->sourceDevice.string.length; throwIfOutOfRange(bytesRemaining); data += currentRow->sourceDevice.string.length; currentRow = reinterpret_cast<struct EsifDataBinaryArtPackage*>(data); bytesRemaining -= currentRow->targetDevice.string.length; throwIfOutOfRange(bytesRemaining); data += currentRow->targetDevice.string.length; currentRow = reinterpret_cast<struct EsifDataBinaryArtPackage*>(data); // The math done here will vary based on the number of strings in the BIOS object rows++; data += sizeof(struct EsifDataBinaryArtPackage); currentRow = reinterpret_cast<struct EsifDataBinaryArtPackage*>(data); } return rows; }