105 lines
2.6 KiB
C++
Raw Normal View History

// pipe.cc
// 8/24/2013 jichi
// Branch IHF/pipe.cpp, rev 93
// 8/24/2013 TODO: Clean up this file
2018-07-17 17:01:56 -04:00
#include "host.h"
#include "hookman.h"
#include "vnrhook/include/defs.h"
#include "vnrhook/include/const.h"
#include <stdio.h>
2018-05-20 13:11:55 -04:00
#include "growl.h"
#include <atlbase.h>
2018-07-17 17:01:56 -04:00
extern HookManager* man;
struct Pipes
{
HANDLE hookPipe;
HANDLE hostPipe;
};
2018-07-17 17:01:56 -04:00
DWORD WINAPI TextReceiver(LPVOID lpThreadParameter);
void CreateNewPipe()
{
2018-07-17 17:01:56 -04: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-17 17:01:56 -04:00
0, nullptr));
}
2018-05-20 13:11:55 -04:00
DWORD WINAPI TextReceiver(LPVOID lpThreadParameter)
{
Pipes* pipes = (Pipes*)lpThreadParameter;
ConnectNamedPipe(pipes->hookPipe, nullptr);
2018-05-20 13:11:55 -04:00
BYTE buffer[PIPE_BUFFER_SIZE] = {};
2018-05-20 13:11:55 -04:00
DWORD bytesRead, processId;
// Artikash 5/20/2018: Shouldn't Windows automatically close the handles when the host process stops running?
//if (!::running) {
// NtClose(hookPipe);
// return 0;
//}
ReadFile(pipes->hookPipe, &processId, sizeof(processId), &bytesRead, nullptr);
man->RegisterProcess(processId, pipes->hostPipe);
2018-05-20 13:11:55 -04:00
// jichi 9/27/2013: why recursion?
// Artikash 5/20/2018: To create a new pipe for another process
CreateNewPipe();
2018-07-17 17:01:56 -04:00
while (true)
2018-05-20 13:11:55 -04:00
{
2018-07-17 17:01:56 -04:00
if (!ReadFile(pipes->hookPipe, buffer, PIPE_BUFFER_SIZE, &bytesRead, nullptr)) break;
2018-05-20 13:11:55 -04:00
buffer[bytesRead] = 0;
buffer[bytesRead + 1] = 0;
2018-07-17 17:01:56 -04:00
if (*(DWORD*)buffer == HOST_NOTIFICATION)
2018-05-20 13:11:55 -04:00
{
2018-07-17 17:01:56 -04:00
switch (*(DWORD*)(buffer + 4)) // Artikash 7/17/2018: Notification type
2018-05-20 13:11:55 -04:00
{
2018-07-17 17:01:56 -04:00
case HOST_NOTIFICATION_NEWHOOK:
{
break;
2018-07-17 17:01:56 -04:00
}
2018-05-20 13:11:55 -04:00
case HOST_NOTIFICATION_TEXT:
USES_CONVERSION;
man->AddConsoleOutput(A2W((LPCSTR)(buffer + 8)));
break;
}
}
else
{
2018-07-17 17:01:56 -04:00
DWORD hook = *(DWORD*)buffer;
DWORD retn = *(DWORD*)(buffer + 4);
DWORD split = *(DWORD*)(buffer + 8);
2018-05-20 13:11:55 -04:00
// jichi 9/28/2013: Debug raw data
//ITH_DEBUG_DWORD9(RecvLen - 0xc,
// buffer[0xc], buffer[0xd], buffer[0xe], buffer[0xf],
// buffer[0x10], buffer[0x11], buffer[0x12], buffer[0x13]);
2018-07-17 17:01:56 -04:00
const BYTE *data = buffer + HEADER_SIZE; // th
int dataLength = bytesRead - HEADER_SIZE;
2018-06-17 21:04:04 -04:00
man->DispatchText(processId, data, hook, retn, split, dataLength);
2018-05-20 13:11:55 -04:00
}
}
DisconnectNamedPipe(pipes->hookPipe);
DisconnectNamedPipe(pipes->hostPipe);
2018-05-20 13:11:55 -04:00
man->UnRegisterProcess(processId);
2018-07-17 17:01:56 -04:00
CloseHandle(pipes->hookPipe);
CloseHandle(pipes->hostPipe);
2018-05-20 13:11:55 -04:00
delete pipes;
2018-05-20 13:11:55 -04:00
return 0;
}
// EOF