Program Listing for File MainProcess_windows.cpp

Return to documentation for file (include/input/trashbin/MainProcess_windows.cpp)

#include "MainProcess.hpp"
#include "PSKPipe.hpp"
#include "ipc_util.hpp"
namespace PDJE_IPC {
using namespace MAINPROC;
static bool
PDJE_OpenProcess(const fs::path       &pt,
                 Importants           &imps,
                 PDJE_CRYPTO::PSKPipe &pipe)
{
    imps.start_up_info    = STARTUPINFOW{};
    imps.process_info     = PROCESS_INFORMATION{};
    imps.start_up_info.cb = sizeof(imps.start_up_info);
    try {
        HANDLE FileLocker =
            CreateFileW(pt.wstring().c_str(),
                        GENERIC_READ,
                        FILE_SHARE_READ,
                        nullptr,
                        OPEN_EXISTING,
                        FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN,
                        nullptr);
        if (FileLocker == INVALID_HANDLE_VALUE) {
            critlog("failed to lock subprocess exe file");
            return false;
        }
        if (!PDJE_IPC::HashCompare(pt)) {
            CloseHandle(FileLocker);
            critlog("hash not matched. maybe Under Attack.");
            return false;
        }
        HANDLE readHdl                = pipe.Gen();
        imps.start_up_info.dwFlags    = STARTF_USESTDHANDLES;
        imps.start_up_info.hStdInput  = readHdl;
        imps.start_up_info.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE);
        imps.start_up_info.hStdError  = GetStdHandle(STD_ERROR_HANDLE);
        auto cmd                      = pt.wstring();
        BOOL ok                       = CreateProcessW(nullptr,
                                 cmd.data(),
                                 nullptr,
                                 nullptr,
                                 TRUE,
                                 CREATE_NO_WINDOW,
                                 nullptr,
                                 nullptr,
                                 &imps.start_up_info,
                                 &imps.process_info);

        CloseHandle(FileLocker);
        CloseHandle(readHdl);
        if (!ok) {
            critlog("failed to create child process. Err:");
            critlog(GetLastError());
            return false;
        }
    } catch (const std::exception &e) {
        critlog("exception on creating child process. Err:");
        critlog(e.what());
        return false;
    }
    return true;
}

TXRXTransport::~TXRXTransport()
{
    WaitForSingleObject(imp.process_info.hProcess, INFINITE);
    DWORD exitCode = 0;
    GetExitCodeProcess(imp.process_info.hProcess, &exitCode);
    if (exitCode != 0) {
        critlog("child process exit code is not zero. ErrCode: ");
        critlog(exitCode);
        return;
    }
    CloseHandle(imp.process_info.hThread);
    CloseHandle(imp.process_info.hProcess);
}

TXRXTransport::TXRXTransport()
{

    auto path = GetValidProcessExecutor();
    auto pipe = PDJE_CRYPTO::PSKPipe();

    if (!PDJE_OpenProcess(path, imp, pipe)) {
        critlog("failed to open child process. Err:");
        critlog(GetLastError());
        return;
    }
    if (!psk.Gen()) {
        return;
    }
    PDJE_CRYPTO::RANDOM_GEN rg;
    PDJE_IPC::MNAME         mfirst  = rg.Gen("PDJE_TXRX_F_");
    PDJE_IPC::MNAME         lfirst  = rg.Gen("PDJE_TXRX_LOCK_F_");
    PDJE_IPC::MNAME         msecond = rg.Gen("PDJE_TXRX_S_");
    PDJE_IPC::MNAME         lsecond = rg.Gen("PDJE_TXRX_LOCK_S_");

    txrx.emplace(psk, mfirst, lfirst, msecond, lsecond, true);
    SetTXRX_Features();
    std::stringstream ss;

    ss << psk.Encode();
    ss << " ";
    ss << mfirst.string();
    ss << " ";
    ss << lfirst.string();
    ss << " ";
    ss << msecond.string();
    ss << " ";
    ss << lsecond.string();
    pipe.Send(ss.str());
    txrx->Listen();
    if (!CheckHealth()) {
        critlog("Check Health Failed on MainProcess init.");
    }
}
bool
TXRXTransport::EndTransmission()
{
    TXRX_RESPONSE.STOP.emplace();
    auto resp = TXRX_RESPONSE.STOP->get_future();
    bool res  = txrx->Send(PDJE_CRYPTO::TXRXHEADER::TXRX_STOP, "");
    if (res) {
        res = resp.get();
    }
    TXRX_RESPONSE.STOP.reset();
    txrx.reset();
    return res;
}

bool
TXRXTransport::SendInputTransfer(PDJE_Input_Transfer &trsf)
{

    try {
        TXRX_RESPONSE.SEND_INPUT_TRANSFER_SHMEM.emplace();
        auto resp = TXRX_RESPONSE.SEND_INPUT_TRANSFER_SHMEM->get_future();
        bool res =
            txrx->Send(PDJE_CRYPTO::TXRXHEADER::SEND_INPUT_TRANSFER_SHMEM,
                       trsf.GetMetaDatas());

        if (res) {
            res = resp.get();
        }

        TXRX_RESPONSE.SEND_INPUT_TRANSFER_SHMEM.reset();
        if (res) {
            return true;
        } else {
            critlog("failed to send ipc shared memory.");
            return false;
        }
    } catch (const std::exception &e) {
        critlog("failed to send ipc shared memory. Why:");
        critlog(e.what());
        return false;
    }
}

}; // namespace PDJE_IPC