mirror of
https://github.com/NohamR/Reclass.git
synced 2026-05-10 19:59:21 +00:00
fix: replace QList::append({}) with push_back/emplaceBack for Qt 6.8
Qt 6.8's stricter QList rejects brace-enclosed initializer lists in append(). Fixed 43 call sites across 13 files.
This commit is contained in:
@@ -396,7 +396,7 @@ uint64_t PdbCtx::importEnum(uint32_t typeIndex) {
|
||||
field->data.LF_ENUMERATE.value,
|
||||
field->data.LF_ENUMERATE.lfEasy.kind);
|
||||
if (eName)
|
||||
s.enumMembers.append({QString::fromUtf8(eName), val});
|
||||
s.enumMembers.emplaceBack(QString::fromUtf8(eName), val);
|
||||
|
||||
i += static_cast<size_t>(eName - reinterpret_cast<const char*>(field));
|
||||
i += strnlen(eName, maxSize - i - 1) + 1;
|
||||
@@ -880,7 +880,7 @@ void PdbCtx::importMemberType(uint32_t typeIndex, int offset, const QString& nam
|
||||
n.name = name;
|
||||
n.parentId = parentId;
|
||||
n.offset = offset;
|
||||
n.bitfieldMembers.append({name, bitPos, bitLen});
|
||||
n.bitfieldMembers.push_back(BitfieldMember{name, bitPos, bitLen});
|
||||
tree.addNode(n);
|
||||
break;
|
||||
}
|
||||
@@ -943,6 +943,118 @@ struct PdbFile {
|
||||
}
|
||||
};
|
||||
|
||||
// ── Public API: extractPdbSymbols ──
|
||||
|
||||
PdbSymbolResult extractPdbSymbols(const QString& pdbPath, QString* errorMsg) {
|
||||
auto setErr = [&](const QString& msg) { if (errorMsg) *errorMsg = msg; };
|
||||
|
||||
MappedFile mapped;
|
||||
if (!QFile::exists(pdbPath)) {
|
||||
setErr(QStringLiteral("PDB file not found: ") + pdbPath);
|
||||
return {};
|
||||
}
|
||||
if (!mapped.open(pdbPath)) {
|
||||
setErr(QStringLiteral("Failed to memory-map PDB file: ") + pdbPath);
|
||||
return {};
|
||||
}
|
||||
if (PDB::ValidateFile(mapped.base, mapped.size) != PDB::ErrorCode::Success) {
|
||||
setErr(QStringLiteral("Invalid PDB file: ") + pdbPath);
|
||||
return {};
|
||||
}
|
||||
|
||||
PDB::RawFile rawFile = PDB::CreateRawFile(mapped.base);
|
||||
if (PDB::HasValidDBIStream(rawFile) != PDB::ErrorCode::Success) {
|
||||
setErr(QStringLiteral("PDB has no valid DBI stream: ") + pdbPath);
|
||||
return {};
|
||||
}
|
||||
|
||||
const PDB::DBIStream dbiStream = PDB::CreateDBIStream(rawFile);
|
||||
|
||||
// Validate required sub-streams
|
||||
if (dbiStream.HasValidSymbolRecordStream(rawFile) != PDB::ErrorCode::Success ||
|
||||
dbiStream.HasValidPublicSymbolStream(rawFile) != PDB::ErrorCode::Success ||
|
||||
dbiStream.HasValidImageSectionStream(rawFile) != PDB::ErrorCode::Success) {
|
||||
setErr(QStringLiteral("PDB DBI stream missing required sub-streams"));
|
||||
return {};
|
||||
}
|
||||
|
||||
const PDB::ImageSectionStream imageSectionStream = dbiStream.CreateImageSectionStream(rawFile);
|
||||
const PDB::CoalescedMSFStream symbolRecordStream = dbiStream.CreateSymbolRecordStream(rawFile);
|
||||
|
||||
PdbSymbolResult result;
|
||||
|
||||
// Derive module name from PDB filename (e.g. "ntoskrnl.pdb" → "ntoskrnl")
|
||||
QFileInfo fi(pdbPath);
|
||||
result.moduleName = fi.completeBaseName();
|
||||
|
||||
// Read public symbols (S_PUB32)
|
||||
const PDB::PublicSymbolStream publicSymbolStream = dbiStream.CreatePublicSymbolStream(rawFile);
|
||||
{
|
||||
const PDB::ArrayView<PDB::HashRecord> hashRecords = publicSymbolStream.GetRecords();
|
||||
const size_t count = hashRecords.GetLength();
|
||||
result.symbols.reserve(static_cast<int>(count));
|
||||
|
||||
for (const PDB::HashRecord& hashRecord : hashRecords) {
|
||||
const PDB::CodeView::DBI::Record* record =
|
||||
publicSymbolStream.GetRecord(symbolRecordStream, hashRecord);
|
||||
if (record->header.kind != PDB::CodeView::DBI::SymbolRecordKind::S_PUB32)
|
||||
continue;
|
||||
|
||||
const uint32_t rva = imageSectionStream.ConvertSectionOffsetToRVA(
|
||||
record->data.S_PUB32.section, record->data.S_PUB32.offset);
|
||||
if (rva == 0u)
|
||||
continue;
|
||||
|
||||
result.symbols.push_back(PdbSymbol{QString::fromUtf8(record->data.S_PUB32.name), rva});
|
||||
}
|
||||
}
|
||||
|
||||
// Read global symbols (S_GDATA32, S_GTHREAD32, S_LDATA32, S_LTHREAD32, S_GPROC32, S_LPROC32)
|
||||
if (dbiStream.HasValidGlobalSymbolStream(rawFile) == PDB::ErrorCode::Success) {
|
||||
const PDB::GlobalSymbolStream globalSymbolStream = dbiStream.CreateGlobalSymbolStream(rawFile);
|
||||
const PDB::ArrayView<PDB::HashRecord> hashRecords = globalSymbolStream.GetRecords();
|
||||
|
||||
result.symbols.reserve(result.symbols.size() + static_cast<int>(hashRecords.GetLength()));
|
||||
|
||||
for (const PDB::HashRecord& hashRecord : hashRecords) {
|
||||
const PDB::CodeView::DBI::Record* record =
|
||||
globalSymbolStream.GetRecord(symbolRecordStream, hashRecord);
|
||||
|
||||
const char* name = nullptr;
|
||||
uint32_t rva = 0u;
|
||||
|
||||
if (record->header.kind == PDB::CodeView::DBI::SymbolRecordKind::S_GDATA32) {
|
||||
name = record->data.S_GDATA32.name;
|
||||
rva = imageSectionStream.ConvertSectionOffsetToRVA(
|
||||
record->data.S_GDATA32.section, record->data.S_GDATA32.offset);
|
||||
} else if (record->header.kind == PDB::CodeView::DBI::SymbolRecordKind::S_GTHREAD32) {
|
||||
name = record->data.S_GTHREAD32.name;
|
||||
rva = imageSectionStream.ConvertSectionOffsetToRVA(
|
||||
record->data.S_GTHREAD32.section, record->data.S_GTHREAD32.offset);
|
||||
} else if (record->header.kind == PDB::CodeView::DBI::SymbolRecordKind::S_LDATA32) {
|
||||
name = record->data.S_LDATA32.name;
|
||||
rva = imageSectionStream.ConvertSectionOffsetToRVA(
|
||||
record->data.S_LDATA32.section, record->data.S_LDATA32.offset);
|
||||
} else if (record->header.kind == PDB::CodeView::DBI::SymbolRecordKind::S_LTHREAD32) {
|
||||
name = record->data.S_LTHREAD32.name;
|
||||
rva = imageSectionStream.ConvertSectionOffsetToRVA(
|
||||
record->data.S_LTHREAD32.section, record->data.S_LTHREAD32.offset);
|
||||
}
|
||||
|
||||
if (rva == 0u)
|
||||
continue;
|
||||
if (!name || name[0] == '\0')
|
||||
continue;
|
||||
|
||||
result.symbols.push_back(PdbSymbol{QString::fromUtf8(name), rva});
|
||||
}
|
||||
}
|
||||
|
||||
qDebug() << "[PDB] extractPdbSymbols:" << result.symbols.size() << "symbols from"
|
||||
<< result.moduleName;
|
||||
return result;
|
||||
}
|
||||
|
||||
// ── Public API: enumeratePdbTypes ──
|
||||
|
||||
QVector<PdbTypeInfo> enumeratePdbTypes(const QString& pdbPath, QString* errorMsg) {
|
||||
@@ -1126,6 +1238,11 @@ NodeTree importPdb(const QString& pdbPath, const QString& structFilter, QString*
|
||||
|
||||
namespace rcx {
|
||||
|
||||
PdbSymbolResult extractPdbSymbols(const QString&, QString* errorMsg) {
|
||||
if (errorMsg) *errorMsg = QStringLiteral("PDB import requires Windows");
|
||||
return {};
|
||||
}
|
||||
|
||||
QVector<PdbTypeInfo> enumeratePdbTypes(const QString&, QString* errorMsg) {
|
||||
if (errorMsg) *errorMsg = QStringLiteral("PDB import requires Windows");
|
||||
return {};
|
||||
|
||||
@@ -294,7 +294,7 @@ NodeTree importReclassXml(const QString& filePath, QString* errorMsg, int pointe
|
||||
|
||||
// Defer ref resolution if array references a class
|
||||
if (!arrayClassName.isEmpty()) {
|
||||
pendingRefs.append({arrId, arrayClassName});
|
||||
pendingRefs.push_back(PendingRef{arrId, arrayClassName});
|
||||
}
|
||||
|
||||
childOffset += nodeSize > 0 ? nodeSize : 0;
|
||||
@@ -321,7 +321,7 @@ NodeTree importReclassXml(const QString& filePath, QString* errorMsg, int pointe
|
||||
n.collapsed = true; // Start collapsed to avoid recursive expansion freeze
|
||||
int nodeIdx = tree.addNode(n);
|
||||
uint64_t nodeId = tree.nodes[nodeIdx].id;
|
||||
pendingRefs.append({nodeId, ptrClass});
|
||||
pendingRefs.push_back(PendingRef{nodeId, ptrClass});
|
||||
childOffset += nodeSize > 0 ? nodeSize : sizeForKind(kind);
|
||||
continue;
|
||||
}
|
||||
@@ -335,7 +335,7 @@ NodeTree importReclassXml(const QString& filePath, QString* errorMsg, int pointe
|
||||
if (!n.structTypeName.isEmpty()) {
|
||||
int nodeIdx = tree.addNode(n);
|
||||
uint64_t nodeId = tree.nodes[nodeIdx].id;
|
||||
pendingRefs.append({nodeId, n.structTypeName});
|
||||
pendingRefs.push_back(PendingRef{nodeId, n.structTypeName});
|
||||
} else {
|
||||
tree.addNode(n);
|
||||
}
|
||||
|
||||
@@ -200,10 +200,10 @@ struct Tokenizer {
|
||||
case '=': tk = TokKind::Equals; break;
|
||||
default: tk = TokKind::Other; break;
|
||||
}
|
||||
tokens.append({tk, QString(c), line});
|
||||
tokens.push_back(Token{tk, QString(c), line});
|
||||
pos++;
|
||||
}
|
||||
tokens.append({TokKind::Eof, {}, line});
|
||||
tokens.push_back(Token{TokKind::Eof, {}, line});
|
||||
}
|
||||
|
||||
private:
|
||||
@@ -241,7 +241,7 @@ private:
|
||||
bool ok;
|
||||
int val = m.captured(1).toInt(&ok, 16);
|
||||
if (ok) {
|
||||
offsets.append({commentLine, val});
|
||||
offsets.push_back(LineOffset{commentLine, val});
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -259,7 +259,7 @@ private:
|
||||
void parseIdent() {
|
||||
int start = pos;
|
||||
while (pos < src.size() && (src[pos].isLetterOrNumber() || src[pos] == '_')) pos++;
|
||||
tokens.append({TokKind::Ident, src.mid(start, pos - start), line});
|
||||
tokens.push_back(Token{TokKind::Ident, src.mid(start, pos - start), line});
|
||||
}
|
||||
|
||||
void parseNumber() {
|
||||
@@ -276,7 +276,7 @@ private:
|
||||
// Skip integer suffixes (U, L, LL, ULL, etc.)
|
||||
while (pos < src.size() && (src[pos] == 'u' || src[pos] == 'U' ||
|
||||
src[pos] == 'l' || src[pos] == 'L')) pos++;
|
||||
tokens.append({TokKind::Number, src.mid(start, pos - start), line});
|
||||
tokens.push_back(Token{TokKind::Number, src.mid(start, pos - start), line});
|
||||
}
|
||||
};
|
||||
|
||||
@@ -1034,7 +1034,7 @@ struct Parser {
|
||||
}
|
||||
}
|
||||
|
||||
ps.enumValues.append({memberName, memberValue});
|
||||
ps.enumValues.emplaceBack(memberName, memberValue);
|
||||
nextValue = memberValue + 1;
|
||||
|
||||
// Skip comma between members
|
||||
@@ -1312,7 +1312,7 @@ static void buildFields(BuildContext& ctx, uint64_t parentId, int baseOffset,
|
||||
|
||||
if (!field.pointerTarget.isEmpty() &&
|
||||
field.pointerTarget != QStringLiteral("void")) {
|
||||
ctx.pendingRefs.append({nodeId, field.pointerTarget});
|
||||
ctx.pendingRefs.push_back(PendingRef{nodeId, field.pointerTarget});
|
||||
}
|
||||
|
||||
computedOffset = fieldOffset + ctx.ptrSize;
|
||||
@@ -1342,7 +1342,7 @@ static void buildFields(BuildContext& ctx, uint64_t parentId, int baseOffset,
|
||||
n.offset = fieldOffset;
|
||||
int nodeIdx = ctx.tree.addNode(n);
|
||||
uint64_t nodeId = ctx.tree.nodes[nodeIdx].id;
|
||||
ctx.pendingRefs.append({nodeId, field.typeName});
|
||||
ctx.pendingRefs.push_back(PendingRef{nodeId, field.typeName});
|
||||
computedOffset = fieldOffset + elemSize;
|
||||
}
|
||||
continue;
|
||||
@@ -1461,7 +1461,7 @@ static void buildFields(BuildContext& ctx, uint64_t parentId, int baseOffset,
|
||||
|
||||
int nodeIdx = ctx.tree.addNode(n);
|
||||
uint64_t nodeId = ctx.tree.nodes[nodeIdx].id;
|
||||
ctx.pendingRefs.append({nodeId, field.typeName});
|
||||
ctx.pendingRefs.push_back(PendingRef{nodeId, field.typeName});
|
||||
if (elemSize > 0)
|
||||
computedOffset = fieldOffset + totalElements * elemSize;
|
||||
continue;
|
||||
@@ -1477,7 +1477,7 @@ static void buildFields(BuildContext& ctx, uint64_t parentId, int baseOffset,
|
||||
|
||||
int nodeIdx = ctx.tree.addNode(n);
|
||||
uint64_t nodeId = ctx.tree.nodes[nodeIdx].id;
|
||||
ctx.pendingRefs.append({nodeId, field.typeName});
|
||||
ctx.pendingRefs.push_back(PendingRef{nodeId, field.typeName});
|
||||
if (elemSize > 0)
|
||||
computedOffset = fieldOffset + elemSize;
|
||||
continue;
|
||||
|
||||
Reference in New Issue
Block a user