MCPcopy Create free account
hub / github.com/HoShiMin/Kernel-Bridge / DumpSymbol

Method DumpSymbol

User-Bridge/API/SymParser.cpp:201–256  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

199
200
201BOOL SymParser::DumpSymbol(LPCWSTR SymbolName, OUT SYM_INFO& SymInfo) {
202 SymInfo = {};
203
204 // Obtaining root symbol:
205 const ULONG SymNameLength = 128;
206 const ULONG SymInfoSize = sizeof(SYMBOL_INFO) + SymNameLength * sizeof(WCHAR);
207 std::vector<BYTE> RootSymbolInfoBuffer(SymInfoSize);
208 auto RootSymbolInfo = reinterpret_cast<PSYMBOL_INFO>(&RootSymbolInfoBuffer[0]);
209 RootSymbolInfo->SizeOfStruct = SymInfoSize;
210 BOOL Status = SymGetTypeFromName(hProcess, ModuleBase, SymbolName, RootSymbolInfo);
211 if (!Status) return FALSE;
212
213 ULONG RootIndex = RootSymbolInfo->Index;
214
215 SymInfo.Name = GetSymName(RootIndex);
216 SymInfo.Size = GetSymSize(RootIndex);
217 SymInfo.Offset = GetSymOffset(RootIndex, &Status);
218 if (!Status) SymInfo.Offset = GetSymAddressOffset(RootIndex);
219
220 // Obtaining root symbol children count:
221 ULONG ChildrenCount = 0;
222 Status = SymGetTypeInfo(hProcess, ModuleBase, RootIndex, TI_GET_CHILDRENCOUNT, &ChildrenCount);
223 if (!Status) return FALSE;
224
225 SymInfo.Name = SymbolName;
226 SymGetTypeInfo(hProcess, ModuleBase, RootIndex, TI_GET_LENGTH, &SymInfo.Size);
227
228 if (ChildrenCount) {
229 // Obtaining children indices:
230 std::vector<BYTE> FindChildrenParamsBuffer(sizeof(TI_FINDCHILDREN_PARAMS) + ChildrenCount * sizeof(ULONG));
231 auto Children = reinterpret_cast<TI_FINDCHILDREN_PARAMS*>(&FindChildrenParamsBuffer[0]);
232 Children->Count = ChildrenCount;
233 Status = SymGetTypeInfo(hProcess, ModuleBase, RootIndex, TI_FINDCHILDREN, Children);
234 if (!Status) return FALSE;
235
236 for (unsigned int i = 0; i < ChildrenCount; i++) {
237 SYM_CHILD_ENTRY Entry = {};
238 ULONG ChildIndex = Children->ChildId[i];
239 ULONG TypeId = GetSymTypeId(ChildIndex);
240 Entry.Name = GetSymName(ChildIndex);
241 Entry.Size = GetSymSize(TypeId);
242 Entry.Offset = GetSymOffset(ChildIndex);
243 Entry.BitPosition = GetSymBitPosition(ChildIndex, &Entry.IsBitField);
244 UINT64 BaseTypeSize = 0;
245 Entry.TypeName = GetSymTypeName(TypeId, &BaseTypeSize);
246 Entry.ElementsCount = BaseTypeSize != 0 ? Entry.Size / BaseTypeSize : 1;
247
248 if (Entry.Name.empty()) Entry.Name = L"UNKNOWN_NAME";
249 if (Entry.TypeName.empty()) Entry.TypeName = L"UNKNOWN_TYPE";
250
251 SymInfo.Entries.emplace_back(Entry);
252 }
253 }
254
255 return TRUE;
256}

Callers

nothing calls this directly

Calls

no outgoing calls

Tested by

no test coverage detected