MCPcopy Create free account
hub / github.com/Vector35/binaryninja-api / DemangleString

Method DemangleString

demangler/msvc/demangle_msvc.cpp:1056–1202  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1054
1055
1056TypeBuilder Demangle::DemangleString()
1057{
1058 m_logger->LogDebug("%s: '%s'\n", __FUNCTION__, reader.GetRaw());
1059 // ??_C@_<length><crc32>@<name>
1060 if (reader.Peek() != '_')
1061 {
1062 throw DemangleException("Invalid mangled string name");
1063 }
1064 reader.Consume();
1065
1066 // Wide char flag (1 yes / 0 no)
1067 bool isWideChar = false;
1068 switch (reader.Peek())
1069 {
1070 case '1':
1071 isWideChar = true;
1072 break;
1073 case '0':
1074 break;
1075 default:
1076 throw DemangleException("Invalid mangled string name");
1077 }
1078 reader.Consume();
1079
1080 // Length is just a number
1081
1082 int64_t lengthRaw;
1083 DemangleNumber(lengthRaw);
1084 if (lengthRaw < 0)
1085 {
1086 throw DemangleException("Invalid mangled string name");
1087 }
1088 uint64_t length = (uint64_t)lengthRaw;
1089
1090 m_logger->LogDebug("%s: Before CRC32 '%s'\n", __FUNCTION__, reader.GetRaw());
1091
1092 // CRC32 (ignored)
1093 while (reader.Peek() != '@')
1094 {
1095 // Usually 8 bytes but I've seen it be 7 for some ungodly reason
1096 reader.Consume();
1097 }
1098
1099 reader.Consume();
1100
1101 bool truncated = false;
1102 string name = "";
1103 TypeBuilder type;
1104
1105 // String bytes
1106 if (isWideChar)
1107 {
1108 m_logger->LogDebug("%s: Wide string '%s'\n", __FUNCTION__, reader.GetRaw());
1109 string utf8name;
1110 truncated = (length > 64);
1111 while (reader.Peek() != '@')
1112 {
1113 uint16_t wch;

Callers

nothing calls this directly

Calls 11

ArrayTypeClass · 0.85
WideCharTypeClass · 0.85
IntegerTypeClass · 0.85
LogDebugMethod · 0.80
push_backMethod · 0.80
DemangleExceptionClass · 0.70
GetRawMethod · 0.45
PeekMethod · 0.45
ConsumeMethod · 0.45
dataMethod · 0.45
sizeMethod · 0.45

Tested by

no test coverage detected