Textractor/host/pipe.cc

62 lines
1.8 KiB
C++
Raw Normal View History

// pipe.cc
// 8/24/2013 jichi
// Branch IHF/pipe.cpp, rev 93
2018-07-19 00:46:52 -04:00
#include "pipe.h"
2018-07-17 17:01:56 -04:00
#include "host.h"
2018-08-23 11:53:23 -04:00
#include "defs.h"
#include "const.h"
2018-08-23 11:53:23 -04:00
void CreatePipe()
{
2018-08-21 22:43:30 -04:00
std::thread([]()
2018-05-20 13:11:55 -04:00
{
2018-08-17 13:20:45 -04:00
HANDLE hookPipe = CreateNamedPipeW(ITH_TEXT_PIPE, PIPE_ACCESS_INBOUND, PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE, PIPE_UNLIMITED_INSTANCES, PIPE_BUFFER_SIZE, PIPE_BUFFER_SIZE, MAXDWORD, NULL);
2018-08-21 22:43:30 -04:00
HANDLE hostPipe = CreateNamedPipeW(ITH_COMMAND_PIPE, PIPE_ACCESS_OUTBOUND, PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE, PIPE_UNLIMITED_INSTANCES, PIPE_BUFFER_SIZE, PIPE_BUFFER_SIZE, MAXDWORD, NULL);
2018-08-17 13:20:45 -04:00
ConnectNamedPipe(hookPipe, nullptr);
2018-05-20 13:11:55 -04:00
2018-08-17 13:20:45 -04:00
// jichi 9/27/2013: why recursion?
2018-08-21 22:43:30 -04:00
// Artikash 5/20/2018: Easy way to create a new pipe for another process
2018-08-23 11:53:23 -04:00
CreatePipe();
2018-05-20 13:11:55 -04:00
2018-08-17 13:20:45 -04:00
BYTE buffer[PIPE_BUFFER_SIZE + 1] = {};
DWORD bytesRead, processId;
ReadFile(hookPipe, &processId, sizeof(processId), &bytesRead, nullptr);
RegisterProcess(processId, hostPipe);
while (ReadFile(hookPipe, buffer, PIPE_BUFFER_SIZE, &bytesRead, nullptr))
2018-08-23 11:53:23 -04:00
switch (*(int*)buffer)
{
//case HOST_NOTIFICATION_NEWHOOK: // Artikash 7/18/2018: Useless for now, but could be used to implement smth later
//break;
case HOST_NOTIFICATION_RMVHOOK:
{
auto info = *(HookRemovedNotif*)buffer;
RemoveThreads([](auto one, auto two) { return one.pid == two.pid && one.hook == two.hook; }, { processId, info.address });
}
break;
case HOST_NOTIFICATION_TEXT:
{
auto info = *(ConsoleOutputNotif*)buffer;
USES_CONVERSION;
Host::AddConsoleOutput(A2W(info.message));
}
break;
default:
{
ThreadParam tp = *(ThreadParam*)buffer;
DispatchText(tp, buffer + sizeof(tp), bytesRead - sizeof(tp));
}
break;
}
2018-05-20 13:11:55 -04:00
2018-08-17 13:20:45 -04:00
DisconnectNamedPipe(hookPipe);
DisconnectNamedPipe(hostPipe);
UnregisterProcess(processId);
CloseHandle(hookPipe);
CloseHandle(hostPipe);
2018-08-21 22:43:30 -04:00
}).detach();
}
// EOF