public ZephyrThread(ZephyrThreadProvider provider, ulong threadObjectAddress, IGlobalExpressionEvaluator evaluator, bool isCurrentlyExecuting = false) { IsCurrentlyExecuting = isCurrentlyExecuting; _Provider = provider; _ThreadObjectAddress = threadObjectAddress; _Evaluator = evaluator; UniqueID = (int)threadObjectAddress; var name = evaluator.EvaluateStringExpression($"(char *)&(((struct k_thread *)0x{threadObjectAddress:x8})->name)"); if (!string.IsNullOrEmpty(name)) { Name = name; } else { var sym = evaluator.TryGetMeaningulSymbolName(threadObjectAddress); if (sym.Symbol != null && sym.Offset == 0) { Name = sym.Symbol; } else { Name = $"0x{threadObjectAddress:x8}"; } } }
public RTXThread(RTXThreadProvider provider, ulong threadObjectAddress, IGlobalExpressionEvaluator evaluator, bool isCurrentlyExecuting = false) { IsCurrentlyExecuting = isCurrentlyExecuting; _Provider = provider; _ThreadObjectAddress = threadObjectAddress; _Evaluator = evaluator; UniqueID = (int)threadObjectAddress; //RTX threads don't have meaningful sequential IDs Name = evaluator.EvaluateStringExpression(GetFieldExpression("name")) ?? "(unnamed)"; }