6
0
mirror of https://github.com/JKornev/hidden synced 2024-06-27 09:28:04 +00:00

Added hiddencli commands 'hide' and 'unhide'

This commit is contained in:
JKornev 2016-12-07 00:15:08 +03:00
parent 1358effe89
commit 93a78b2680
5 changed files with 131 additions and 8 deletions

@ -16,30 +16,37 @@ Commands::Commands(Arguments& args)
do do
{ {
bool found = false;
for (auto it = m_commandsStack.begin(); it != m_commandsStack.end(); it++) for (auto it = m_commandsStack.begin(); it != m_commandsStack.end(); it++)
{ {
if ((*it)->CompareCommand(arg)) if ((*it)->CompareCommand(arg))
{ {
(*it)->LoadArgs(args); (*it)->LoadArgs(args);
m_current = *it;
found = true;
break; break;
} }
} }
if (!found)
throw WException(-2, L"Error, unknown command, please use 'hiddencli help'");
} }
while (args.GetNext(arg)); while (args.GetNext(arg));
} }
Commands::~Commands() Commands::~Commands()
{ {
} }
void Commands::LoadCommandsStack() void Commands::LoadCommandsStack()
{ {
m_commandsStack.push_back(new CommandHide()); m_commandsStack.push_back(CommandPtr(new CommandHide()));
m_commandsStack.push_back(new CommandUnhide()); m_commandsStack.push_back(CommandPtr(new CommandUnhide()));
} }
void Commands::Perform(Connection& connection) void Commands::Perform(Connection& connection)
{ {
m_current->PerformCommand(connection);
} }

@ -2,6 +2,7 @@
#include "Helper.h" #include "Helper.h"
#include "Connection.h" #include "Connection.h"
#include <memory>
class ICommand class ICommand
{ {
@ -16,7 +17,10 @@ public:
class Commands class Commands
{ {
std::vector<ICommand*> m_commandsStack; typedef std::shared_ptr<ICommand> CommandPtr;
std::vector<CommandPtr> m_commandsStack;
CommandPtr m_current;
void LoadCommandsStack(); void LoadCommandsStack();

@ -12,7 +12,7 @@ Connection::Connection(Arguments& args) :
do do
{ {
if (arg == L"gate") if (arg == L"/gate")
{ {
args.SwitchToNext(); args.SwitchToNext();
if (!args.GetNext(m_deviceName)) if (!args.GetNext(m_deviceName))

@ -1,10 +1,11 @@
#include "Hide.h" #include "Hide.h"
#include <iostream>
using namespace std; using namespace std;
// ================= // =================
CommandHide::CommandHide() : m_command(L"hide") CommandHide::CommandHide() : m_command(L"/hide")
{ {
} }
@ -54,7 +55,32 @@ void CommandHide::LoadArgs(Arguments& args)
void CommandHide::PerformCommand(Connection& connection) void CommandHide::PerformCommand(Connection& connection)
{ {
HidStatus status;
HidObjId objId;
switch (m_hideType)
{
case EHideTypes::TypeFile:
status = Hid_AddHiddenFile(connection.GetContext(), m_path.c_str(), &objId);
break;
case EHideTypes::TypeDir:
status = Hid_AddHiddenDir(connection.GetContext(), m_path.c_str(), &objId);
break;
case EHideTypes::TypeRegKey:
status = Hid_AddHiddenRegKey(connection.GetContext(), m_regRootType, m_path.c_str(), &objId);
break;
case EHideTypes::TypeRegVal:
status = Hid_AddHiddenRegValue(connection.GetContext(), m_regRootType, m_path.c_str(), &objId);
break;
default:
throw WException(-2, L"Internal error, invalid type for command 'hide'");
}
if (!HID_STATUS_SUCCESSFUL(status))
throw WException(HID_STATUS_CODE(status), L"Error, command 'hide' rejected");
wcerr << L"Command 'hide' successful" << endl;
wcout << L"status:ok;id:" << objId << endl;
} }
HidRegRootTypes CommandHide::GetRegType(wstring& path) HidRegRootTypes CommandHide::GetRegType(wstring& path)
@ -75,8 +101,9 @@ HidRegRootTypes CommandHide::GetRegType(wstring& path)
// ================= // =================
CommandUnhide::CommandUnhide() : m_command(L"unhide") CommandUnhide::CommandUnhide() : m_command(L"/unhide")
{ {
m_targetId = 0;
} }
CommandUnhide::~CommandUnhide() CommandUnhide::~CommandUnhide()
@ -90,10 +117,92 @@ bool CommandUnhide::CompareCommand(std::wstring& command)
void CommandUnhide::LoadArgs(Arguments& args) void CommandUnhide::LoadArgs(Arguments& args)
{ {
wstring object, target;
if (!args.GetNext(object))
throw WException(-2, L"Error, mismatched argument #1 for command 'unhide'");
if (!args.GetNext(target))
throw WException(-2, L"Error, mismatched argument #2 for command 'unhide'");
if (object == L"file")
{
m_hideType = EHideTypes::TypeFile;
}
else if (object == L"dir")
{
m_hideType = EHideTypes::TypeDir;
}
else if (object == L"regkey")
{
m_hideType = EHideTypes::TypeRegKey;
}
else if (object == L"regval")
{
m_hideType = EHideTypes::TypeRegVal;
}
else
{
throw WException(-2, L"Error, invalid argument for command 'unhide'");
}
m_targetAll = (target == L"all");
if (!m_targetAll)
{
m_targetId = _wtoll(target.c_str());
if (!m_targetId)
throw WException(-2, L"Error, invalid target id for command 'unhide'");
}
} }
void CommandUnhide::PerformCommand(Connection& connection) void CommandUnhide::PerformCommand(Connection& connection)
{ {
HidStatus status;
if (m_targetAll)
{
switch (m_hideType)
{
case EHideTypes::TypeFile:
status = Hid_RemoveAllHiddenFiles(connection.GetContext());
break;
case EHideTypes::TypeDir:
status = Hid_RemoveAllHiddenDirs(connection.GetContext());
break;
case EHideTypes::TypeRegKey:
status = Hid_RemoveAllHiddenRegKeys(connection.GetContext());
break;
case EHideTypes::TypeRegVal:
status = Hid_RemoveAllHiddenRegValues(connection.GetContext());
break;
default:
throw WException(-2, L"Internal error #1, invalid type for command 'unhide'");
}
}
else
{
switch (m_hideType)
{
case EHideTypes::TypeFile:
status = Hid_RemoveHiddenFile(connection.GetContext(), m_targetId);
break;
case EHideTypes::TypeDir:
status = Hid_RemoveHiddenDir(connection.GetContext(), m_targetId);
break;
case EHideTypes::TypeRegKey:
status = Hid_RemoveHiddenRegKey(connection.GetContext(), m_targetId);
break;
case EHideTypes::TypeRegVal:
status = Hid_RemoveHiddenRegValue(connection.GetContext(), m_targetId);
break;
default:
throw WException(-2, L"Internal error #2, invalid type for command 'unhide'");
}
}
if (!HID_STATUS_SUCCESSFUL(status))
throw WException(HID_STATUS_CODE(status), L"Error, command 'hide' rejected");
wcerr << L"Command 'unhide' successful" << endl;
wcout << L"status:ok" << endl;
} }

@ -34,6 +34,9 @@ class CommandUnhide : public ICommand
{ {
const wchar_t* m_command = nullptr; const wchar_t* m_command = nullptr;
EHideTypes m_hideType;
HidObjId m_targetId;
bool m_targetAll;
public: public:
CommandUnhide(); CommandUnhide();