1
0
Fork 0

added isbitfield field

This commit is contained in:
snow 2025-03-12 02:12:04 -04:00 committed by Pidgey
parent 792b5fbaff
commit 3934a9ff96
No known key found for this signature in database
GPG Key ID: 1C7AB1C86292593A
3 changed files with 35 additions and 31 deletions

View File

@ -348,24 +348,29 @@ struct PrintVisitor : TypeManager::Visitor
} }
String valueStr; String valueStr;
size_t byteSize = (type->offset % 8 + type->size + 7) / 8; Memory<unsigned char*> data((type->size + 7) / 8);
Memory<unsigned char*> data(byteSize);
if(MemRead(type->addr + (type->offset / 8), data(), data.size())) if(MemRead(type->addr + (type->offset / 8), data(), data.size()))
{ {
if(type->reverse) if(type->reverse)
std::reverse(data(), data() + data.size()); std::reverse(data(), data() + data.size());
size_t bitOffset = type->offset % 8; size_t bitsFromRead = type->offset % 8;
if(bitOffset != 0) if(bitsFromRead != 0) // have to shift the data over
{ {
uint64_t extractedValue = 0; uint8_t currentCarry = 0;
memcpy(&extractedValue, data(), std::min(sizeof(extractedValue), data.size())); for(size_t i = data.size(); i > 0; i--)
extractedValue >>= bitOffset; {
extractedValue &= (1ULL << type->size) - 1; uint8_t newCarry = data()[i - 1] << (8 - bitsFromRead);
data()[i - 1] = (data()[i - 1] >> bitsFromRead) | currentCarry;
currentCarry = newCarry;
}
}
memset(data(), 0, data.size()); size_t bitsOverread = data.size() * 8 - type->size;
memcpy(data(), &extractedValue, std::min(sizeof(extractedValue), data.size())); if(bitsOverread)
{
// Clear the overread bits
data()[data.size() - 1] &= (1 << (type->size % 8)) - 1;
} }
switch(Primitive(type->id)) switch(Primitive(type->id))
@ -559,7 +564,7 @@ struct PrintVisitor : TypeManager::Visitor
} }
else else
{ {
if(member.bitSize != type.sizeFUCK) if(member.bitfield)
tname = StringUtils::sprintf("%s %s : %d", type.name.c_str(), member.name.c_str(), member.bitSize); tname = StringUtils::sprintf("%s %s : %d", type.name.c_str(), member.name.c_str(), member.bitSize);
else else
tname = StringUtils::sprintf("%s %s", type.name.c_str(), member.name.c_str()); tname = StringUtils::sprintf("%s %s", type.name.c_str(), member.name.c_str());
@ -596,7 +601,10 @@ struct PrintVisitor : TypeManager::Visitor
td.addr = mAddr; td.addr = mAddr;
td.offset = mOffset; td.offset = mOffset;
td.id = type.primitive; td.id = type.primitive;
td.size = member.bitSize != -1 ? member.bitSize : type.sizeFUCK; td.size = member.bitSize;
if(td.size == -1)
__debugbreak();
td.callback = cbPrintPrimitive; td.callback = cbPrintPrimitive;
td.userdata = nullptr; td.userdata = nullptr;
mNode = GuiTypeAddNode(mParents.empty() ? nullptr : parent().node, &td); mNode = GuiTypeAddNode(mParents.empty() ? nullptr : parent().node, &td);

View File

@ -109,7 +109,7 @@ bool TypeManager::AddEnumMember(const std::string & parent, const std::string &
return true; return true;
} }
bool TypeManager::AddStructMember(const std::string & parent, const std::string & type, const std::string & name, int arrsize, int bitOffset, int bitSize) bool TypeManager::AddStructMember(const std::string & parent, const std::string & type, const std::string & name, int arrsize, int bitOffset, int bitSize, bool isBitfield)
{ {
if(!isDefined(type) && !validPtr(type)) if(!isDefined(type) && !validPtr(type))
return false; return false;
@ -118,7 +118,7 @@ bool TypeManager::AddStructMember(const std::string & parent, const std::string
return false; return false;
// cannot have bit field array // cannot have bit field array
if(bitSize % 8 != 0 && arrsize != 0) if(isBitfield && arrsize != 0)
return false; return false;
// cannot be pointer and bitfield // cannot be pointer and bitfield
@ -140,20 +140,12 @@ bool TypeManager::AddStructMember(const std::string & parent, const std::string
int typeSize; int typeSize;
if(arrsize != 0) if(arrsize != 0)
{
// is an array
typeSize = Sizeof(type) * arrsize; typeSize = Sizeof(type) * arrsize;
}
else
{
if(bitSize != -1)
typeSize = bitSize;
else else
typeSize = Sizeof(type); typeSize = Sizeof(type);
}
// cannot have a bitfield greater than typeSize // cannot have a bitfield greater than typeSize
if(bitSize != -1 && bitSize > typeSize) if(isBitfield && bitSize > typeSize)
return false; return false;
Member m; Member m;
@ -162,7 +154,8 @@ bool TypeManager::AddStructMember(const std::string & parent, const std::string
m.type = type; m.type = type;
m.assignedType = type; m.assignedType = type;
m.offsetFUCK = bitOffset; m.offsetFUCK = bitOffset;
m.bitSize = m.bitSize != typeSize ? bitSize : typeSize; m.bitSize = isBitfield ? bitSize : typeSize;
m.bitfield = isBitfield;
if(bitOffset >= 0 && !s.isUnion) //user-defined offset if(bitOffset >= 0 && !s.isUnion) //user-defined offset
{ {
@ -180,7 +173,7 @@ bool TypeManager::AddStructMember(const std::string & parent, const std::string
} }
else else
{ {
s.sizeFUCK += typeSize; s.sizeFUCK += m.bitSize;
} }
s.members.push_back(m); s.members.push_back(m);
@ -189,7 +182,7 @@ bool TypeManager::AddStructMember(const std::string & parent, const std::string
bool TypeManager::AppendStructMember(const std::string & type, const std::string & name, int arrsize, int offset) bool TypeManager::AppendStructMember(const std::string & type, const std::string & name, int arrsize, int offset)
{ {
return AddStructMember(laststruct, type, name, arrsize, offset, -1); return AddStructMember(laststruct, type, name, arrsize, offset, -1, false);
} }
bool TypeManager::AppendStructPadding(const std::string & parent, int targetOffset) bool TypeManager::AppendStructPadding(const std::string & parent, int targetOffset)
@ -225,6 +218,7 @@ bool TypeManager::AppendStructPadding(const std::string & parent, int targetOffs
{ {
Member pad; Member pad;
pad.type = "char"; pad.type = "char";
pad.bitSize = bitPadding;
pad.arrsize = bitPadding / 8; pad.arrsize = bitPadding / 8;
// can just add byte padding // can just add byte padding
@ -632,7 +626,7 @@ bool AddUnion(const std::string & owner, const std::string & name)
bool AddMember(const std::string & parent, const std::string & type, const std::string & name, int arrsize, int offset) bool AddMember(const std::string & parent, const std::string & type, const std::string & name, int arrsize, int offset)
{ {
EXCLUSIVE_ACQUIRE(LockTypeManager); EXCLUSIVE_ACQUIRE(LockTypeManager);
return typeManager.AddStructMember(parent, type, name, arrsize, offset, -1); return typeManager.AddStructMember(parent, type, name, arrsize, offset, -1, false);
} }
bool AppendMember(const std::string & type, const std::string & name, int arrsize, int offset) bool AppendMember(const std::string & type, const std::string & name, int arrsize, int offset)
@ -751,6 +745,7 @@ static void loadStructUnions(const JSON suroot, std::vector<StructUnion> & struc
curMember.name = name; curMember.name = name;
curMember.arrsize = json_default_int(valj, "arrsize", 0); curMember.arrsize = json_default_int(valj, "arrsize", 0);
curMember.bitSize = json_default_int(valj, "bitSize", -1); curMember.bitSize = json_default_int(valj, "bitSize", -1);
curMember.bitfield = json_boolean_value(json_object_get(valj, "bitfield"));
curMember.offsetFUCK = json_default_int(valj, "offset", -1); curMember.offsetFUCK = json_default_int(valj, "offset", -1);
if(curMember.offsetFUCK != -1) if(curMember.offsetFUCK != -1)
@ -922,7 +917,7 @@ void LoadModel(const std::string & owner, Model & model)
const auto suggestedSize = su.sizeFUCK; const auto suggestedSize = su.sizeFUCK;
for(auto & member : su.members) for(auto & member : su.members)
{ {
auto success = typeManager.AddStructMember(su.name, member.type, member.name, member.arrsize, member.offsetFUCK, member.bitSize); auto success = typeManager.AddStructMember(su.name, member.type, member.name, member.arrsize, member.offsetFUCK, member.bitSize, member.bitfield);
if(!success) if(!success)
{ {
//TODO properly handle errors //TODO properly handle errors

View File

@ -44,6 +44,7 @@ namespace Types
int arrsize = 0; //Number of elements if Member is an array int arrsize = 0; //Number of elements if Member is an array
int bitSize = -1; //Bitfield size int bitSize = -1; //Bitfield size
bool bitfield = false;
int offsetFUCK = -1; //Member offset (only stored for reference) int offsetFUCK = -1; //Member offset (only stored for reference)
}; };
@ -113,7 +114,7 @@ namespace Types
bool AddUnion(const std::string & owner, const std::string & name, int constantSize = -1); bool AddUnion(const std::string & owner, const std::string & name, int constantSize = -1);
bool AddEnum(const std::string & owner, const std::string & name, bool isFlags, uint8_t size); bool AddEnum(const std::string & owner, const std::string & name, bool isFlags, uint8_t size);
bool AddEnumMember(const std::string & parent, const std::string & name, uint64_t value); bool AddEnumMember(const std::string & parent, const std::string & name, uint64_t value);
bool AddStructMember(const std::string & parent, const std::string & type, const std::string & name, int arrsize, int bitOffset, int bitSize); bool AddStructMember(const std::string & parent, const std::string & type, const std::string & name, int arrsize, int bitOffset, int bitSize, bool isBitfield);
bool AppendStructMember(const std::string & type, const std::string & name, int arrsize = 0, int offset = -1); bool AppendStructMember(const std::string & type, const std::string & name, int arrsize = 0, int offset = -1);
bool AppendStructPadding(const std::string & type, int targetOffset); bool AppendStructPadding(const std::string & type, int targetOffset);
bool AddFunction(const std::string & owner, const std::string & name, CallingConvention callconv = Cdecl, bool AddFunction(const std::string & owner, const std::string & name, CallingConvention callconv = Cdecl,