reimplement immune keys

This commit is contained in:
walker0643 2018-02-23 21:31:05 -05:00
parent 0e5ed7a305
commit 06d5080b42
2 changed files with 34 additions and 23 deletions

View File

@ -20,7 +20,6 @@
#include "platform/MSWindowsDesks.h" #include "platform/MSWindowsDesks.h"
#include "platform/MSWindowsScreen.h" #include "platform/MSWindowsScreen.h"
#include "platform/ImmuneKeysReader.h"
#include "barrier/IScreenSaver.h" #include "barrier/IScreenSaver.h"
#include "barrier/XScreen.h" #include "barrier/XScreen.h"
#include "mt/Lock.h" #include "mt/Lock.h"
@ -89,17 +88,6 @@
// enable; <unused> // enable; <unused>
#define BARRIER_MSG_FAKE_INPUT BARRIER_HOOK_LAST_MSG + 12 #define BARRIER_MSG_FAKE_INPUT BARRIER_HOOK_LAST_MSG + 12
static const std::string ImmuneKeysPath = ArchFileWindows().getProfileDirectory() + "\\ImmuneKeys.txt";
static std::vector<DWORD> immune_keys_list()
{
std::vector<DWORD> keys;
std::string badLine;
if (!ImmuneKeysReader::get_list(ImmuneKeysPath.c_str(), keys, badLine))
LOG((CLOG_ERR "Reading immune keys stopped at: %s", badLine.c_str()));
return keys;
}
// //
// MSWindowsDesks // MSWindowsDesks
// //
@ -126,8 +114,6 @@ MSWindowsDesks::MSWindowsDesks(
m_events(events), m_events(events),
m_stopOnDeskSwitch(stopOnDeskSwitch) m_stopOnDeskSwitch(stopOnDeskSwitch)
{ {
LOG((CLOG_DEBUG "Immune Keys Path: %s", ImmuneKeysPath.c_str()));
m_cursor = createBlankCursor(); m_cursor = createBlankCursor();
m_deskClass = createDeskWindowClass(m_isPrimary); m_deskClass = createDeskWindowClass(m_isPrimary);
m_keyLayout = GetKeyboardLayout(GetCurrentThreadId()); m_keyLayout = GetKeyboardLayout(GetCurrentThreadId());
@ -657,11 +643,6 @@ MSWindowsDesks::deskThread(void* vdesk)
MSWindowsHook::uninstallScreenSaver(); MSWindowsHook::uninstallScreenSaver();
MSWindowsHook::installScreenSaver(); MSWindowsHook::installScreenSaver();
} }
// populate immune keys list in the DLL's shared memory
// before the hooks are activated
auto list = immune_keys_list();
LOG((CLOG_DEBUG "Found %u immune keys", list.size()));
//m_setImmuneKeys(list.data(), list.size());
if (!MSWindowsHook::install()) { if (!MSWindowsHook::install()) {
// we won't work on this desk // we won't work on this desk
LOG((CLOG_DEBUG "Cannot hook on this desk")); LOG((CLOG_DEBUG "Cannot hook on this desk"));

View File

@ -19,6 +19,7 @@
#include "platform/MSWindowsHook.h" #include "platform/MSWindowsHook.h"
#include "platform/MSWindowsHookResource.h" #include "platform/MSWindowsHookResource.h"
#include "platform/ImmuneKeysReader.h"
#include "barrier/protocol_types.h" #include "barrier/protocol_types.h"
#include "barrier/XScreen.h" #include "barrier/XScreen.h"
#include "base/Log.h" #include "base/Log.h"
@ -49,6 +50,28 @@ static LPARAM g_deadLParam = 0;
static BYTE g_deadKeyState[256] = { 0 }; static BYTE g_deadKeyState[256] = { 0 };
static BYTE g_keyState[256] = { 0 }; static BYTE g_keyState[256] = { 0 };
static bool g_fakeServerInput = false; static bool g_fakeServerInput = false;
static std::vector<DWORD> g_immuneKeys;
static const std::string ImmuneKeysPath = ArchFileWindows().getProfileDirectory() + "\\ImmuneKeys.txt";
static std::vector<DWORD> immune_keys_list()
{
std::vector<DWORD> keys;
std::string badLine;
if (!ImmuneKeysReader::get_list(ImmuneKeysPath.c_str(), keys, badLine))
LOG((CLOG_ERR "Reading immune keys stopped at: %s", badLine.c_str()));
return keys;
}
inline static
bool is_immune_key(DWORD target)
{
for (auto key : g_immuneKeys) {
if (key == target)
return true;
}
return false;
}
void void
MSWindowsHook::setSides(UInt32 sides) MSWindowsHook::setSides(UInt32 sides)
@ -378,9 +401,11 @@ static
LRESULT CALLBACK LRESULT CALLBACK
keyboardLLHook(int code, WPARAM wParam, LPARAM lParam) keyboardLLHook(int code, WPARAM wParam, LPARAM lParam)
{ {
if (code >= 0) { // decode the message
// decode the message KBDLLHOOKSTRUCT* info = reinterpret_cast<KBDLLHOOKSTRUCT*>(lParam);
KBDLLHOOKSTRUCT* info = reinterpret_cast<KBDLLHOOKSTRUCT*>(lParam);
// do not filter non-action events nor immune keys
if (code == HC_ACTION && !is_immune_key(info->vkCode)) {
WPARAM wParam = info->vkCode; WPARAM wParam = info->vkCode;
LPARAM lParam = 1; // repeat code LPARAM lParam = 1; // repeat code
lParam |= (info->scanCode << 16); // scan code lParam |= (info->scanCode << 16); // scan code
@ -510,7 +535,8 @@ static
LRESULT CALLBACK LRESULT CALLBACK
mouseLLHook(int code, WPARAM wParam, LPARAM lParam) mouseLLHook(int code, WPARAM wParam, LPARAM lParam)
{ {
if (code >= 0) { // do not filter non-action events
if (code == HC_ACTION) {
// decode the message // decode the message
MSLLHOOKSTRUCT* info = reinterpret_cast<MSLLHOOKSTRUCT*>(lParam); MSLLHOOKSTRUCT* info = reinterpret_cast<MSLLHOOKSTRUCT*>(lParam);
SInt32 x = static_cast<SInt32>(info->pt.x); SInt32 x = static_cast<SInt32>(info->pt.x);
@ -536,6 +562,10 @@ MSWindowsHook::install()
// reset fake input flag // reset fake input flag
g_fakeServerInput = false; g_fakeServerInput = false;
// setup immune keys
g_immuneKeys = immune_keys_list();
LOG((CLOG_DEBUG "Found %u immune keys in %s", g_immuneKeys.size(), ImmuneKeysPath.c_str()));
#if NO_GRAB_KEYBOARD #if NO_GRAB_KEYBOARD
// we only need the mouse hook // we only need the mouse hook
if (!g_hkMouse.set(WH_MOUSE_LL, &mouseLLHook, NULL, 0)) if (!g_hkMouse.set(WH_MOUSE_LL, &mouseLLHook, NULL, 0))