Textractor_test/texthook/pipe.cc

86 lines
2.4 KiB
C++
Raw Normal View History

// pipe.cc
// 8/24/2013 jichi
// Branch IHF/pipe.cpp, rev 93
2018-07-19 12:46:52 +08:00
#include "pipe.h"
2018-07-18 05:01:56 +08:00
#include "host.h"
2018-07-21 04:26:27 +08:00
#include "../vnrhook/include/defs.h"
#include "../vnrhook/include/const.h"
2018-05-21 01:11:55 +08:00
#include <atlbase.h>
struct Pipes
{
HANDLE hookPipe;
HANDLE hostPipe;
};
void CreateNewPipe()
{
2018-07-18 05:01:56 +08:00
CloseHandle(CreateThread(nullptr, 0, TextReceiver, new Pipes
{
CreateNamedPipeW(ITH_TEXT_PIPE, PIPE_ACCESS_INBOUND, PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE, PIPE_UNLIMITED_INSTANCES, PIPE_BUFFER_SIZE, PIPE_BUFFER_SIZE, MAXDWORD, NULL),
CreateNamedPipeW(ITH_COMMAND_PIPE, PIPE_ACCESS_OUTBOUND, 0, PIPE_UNLIMITED_INSTANCES, PIPE_BUFFER_SIZE, PIPE_BUFFER_SIZE, MAXDWORD, NULL)
},
2018-07-18 05:01:56 +08:00
0, nullptr));
}
2018-05-21 01:11:55 +08:00
DWORD WINAPI TextReceiver(LPVOID lpThreadParameter)
{
Pipes* pipes = (Pipes*)lpThreadParameter;
ConnectNamedPipe(pipes->hookPipe, nullptr);
2018-05-21 01:11:55 +08:00
BYTE buffer[PIPE_BUFFER_SIZE] = {};
2018-05-21 01:11:55 +08:00
DWORD bytesRead, processId;
ReadFile(pipes->hookPipe, &processId, sizeof(processId), &bytesRead, nullptr);
2018-07-24 03:25:02 +08:00
RegisterProcess(processId, pipes->hostPipe);
2018-05-21 01:11:55 +08:00
// jichi 9/27/2013: why recursion?
// Artikash 5/20/2018: To create a new pipe for another process
CreateNewPipe();
2018-07-18 05:01:56 +08:00
while (true)
2018-05-21 01:11:55 +08:00
{
2018-07-18 05:01:56 +08:00
if (!ReadFile(pipes->hookPipe, buffer, PIPE_BUFFER_SIZE, &bytesRead, nullptr)) break;
2018-05-21 01:11:55 +08:00
buffer[bytesRead] = 0;
buffer[bytesRead + 1] = 0;
2018-07-18 05:01:56 +08:00
if (*(DWORD*)buffer == HOST_NOTIFICATION)
2018-05-21 01:11:55 +08:00
{
2018-08-03 05:17:54 +08:00
switch (*(DWORD*)(buffer + sizeof(DWORD))) // Artikash 7/17/2018: Notification type
2018-05-21 01:11:55 +08:00
{
2018-07-19 11:40:44 +08:00
case HOST_NOTIFICATION_NEWHOOK: // Artikash 7/18/2018: Useless for now, but could be used to implement smth later
break;
2018-08-03 05:17:54 +08:00
case HOST_NOTIFICATION_RMVHOOK:
RemoveThreads([](auto one, auto two) { return one.pid == two.pid && one.hook == two.hook; },
{ processId, *(DWORD*)(buffer + sizeof(DWORD) * 2) }); // Address
break;
2018-05-21 01:11:55 +08:00
case HOST_NOTIFICATION_TEXT:
2018-08-03 05:17:54 +08:00
USES_CONVERSION;
2018-07-24 03:25:02 +08:00
Host::AddConsoleOutput(A2W((LPCSTR)(buffer + sizeof(DWORD) * 2))); // Text
2018-05-21 01:11:55 +08:00
break;
}
}
else
{
2018-07-24 03:25:02 +08:00
DispatchText(processId,
*(DWORD*)buffer, // Hook address
*(DWORD*)(buffer + sizeof(DWORD)), // Return address
*(DWORD*)(buffer + sizeof(DWORD) * 2), // Split
2018-07-19 12:46:52 +08:00
buffer + HEADER_SIZE, // Data
bytesRead - HEADER_SIZE // Data size
);
2018-05-21 01:11:55 +08:00
}
}
DisconnectNamedPipe(pipes->hookPipe);
DisconnectNamedPipe(pipes->hostPipe);
2018-07-24 03:25:02 +08:00
UnregisterProcess(processId);
2018-07-18 05:01:56 +08:00
CloseHandle(pipes->hookPipe);
CloseHandle(pipes->hostPipe);
delete pipes;
2018-05-21 01:11:55 +08:00
return 0;
}
// EOF