Exemple #1
0
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;
}