HyperDbg/hyperdbg/libhyperdbg/code/debugger/commands/meta-commands/switch.cpp

103 lines
2.6 KiB
C++
Raw Permalink Normal View History

/**
* @file switch.cpp
* @author Sina Karvandi (sina@hyperdbg.org)
* @brief .switch command
* @details
* @version 0.1
* @date 2022-01-31
*
* @copyright This project is released under the GNU Public License v3.
*
*/
#include "pch.h"
/**
2023-07-13 16:05:42 +09:00
* @brief help of the .switch command
*
* @return VOID
*/
VOID
CommandSwitchHelp()
{
2022-04-10 22:24:56 +04:30
ShowMessages(".switch : shows the list of active debugging threads and switches "
"between processes and threads in VMI Mode.\n\n");
2022-02-13 03:38:24 +03:30
ShowMessages("syntax : \t.switch \n");
2022-02-09 02:16:58 +03:30
ShowMessages("syntax : \t.switch [pid ProcessId (hex)]\n");
ShowMessages("syntax : \t.switch [tid ThreadId (hex)]\n");
ShowMessages("\n");
ShowMessages("\t\te.g : .switch\n");
ShowMessages("\t\te.g : .switch list\n");
ShowMessages("\t\te.g : .switch pid b60 \n");
ShowMessages("\t\te.g : .switch tid b60 \n");
}
/**
* @brief .switch command handler
*
2024-07-30 15:47:35 +09:00
* @param CommandTokens
* @param Command
2024-07-30 15:47:35 +09:00
*
* @return VOID
*/
VOID
CommandSwitch(vector<CommandToken> CommandTokens, string Command)
{
UINT32 PidOrTid = NULL;
if (CommandTokens.size() > 3)
{
2024-07-30 15:47:35 +09:00
ShowMessages("incorrect use of the '%s'\n\n",
GetCaseSensitiveStringFromCommandToken(CommandTokens.at(0)).c_str());
CommandSwitchHelp();
return;
}
//
// Perform switching or listing the threads
//
if (CommandTokens.size() == 1 || (CommandTokens.size() == 2 && CompareLowerCaseStrings(CommandTokens.at(1), "list")))
{
2022-02-13 03:38:24 +03:30
UdShowListActiveDebuggingProcessesAndThreads();
}
2024-07-30 15:47:35 +09:00
else if (CompareLowerCaseStrings(CommandTokens.at(1), "pid"))
{
2024-07-30 15:47:35 +09:00
if (!ConvertTokenToUInt32(CommandTokens.at(2), &PidOrTid))
{
ShowMessages("please specify a correct hex value for process id\n\n");
return;
}
//
// Switch by pid
//
if (UdSetActiveDebuggingThreadByPidOrTid(PidOrTid, FALSE))
{
ShowMessages("switched to process id: %x\n", PidOrTid);
}
}
2024-07-30 15:47:35 +09:00
else if (CompareLowerCaseStrings(CommandTokens.at(1), "tid"))
{
2024-07-30 15:47:35 +09:00
if (!ConvertTokenToUInt32(CommandTokens.at(2), &PidOrTid))
{
ShowMessages("please specify a correct hex value for thread id\n\n");
return;
}
//
// Switch by tid
//
if (UdSetActiveDebuggingThreadByPidOrTid(PidOrTid, TRUE))
{
ShowMessages("switched to thread id: %x\n", PidOrTid);
}
}
else
{
ShowMessages("err, couldn't resolve error at '%s'\n",
2024-07-30 15:47:35 +09:00
GetCaseSensitiveStringFromCommandToken(CommandTokens.at(1)).c_str());
return;
}
}