Skip to content

Instantly share code, notes, and snippets.

@qwerty12
Created November 7, 2016 06:16
Show Gist options
  • Save qwerty12/2b7b9876081f72c65fc290f806550e79 to your computer and use it in GitHub Desktop.
Save qwerty12/2b7b9876081f72c65fc290f806550e79 to your computer and use it in GitHub Desktop.
Stop VS from keeping the US layout loaded and only intercept Alt+`
#include "avrf.h"
typedef HKL(WINAPI *P_LOADKEYBOARDLAYOUTW)(LPCWSTR, UINT);
HKL WINAPI LoadKeyboardLayoutWHook(LPCWSTR, UINT);
//typedef BOOL(WINAPI *P_REGISTERHOTKEY)(HWND, INT, UINT, UINT);
BOOL WINAPI RegisterHotKeyHook(HWND, INT, UINT, UINT);
typedef UINT(WINAPI *P_MAPVIRTUALKEYEXW)(UINT, UINT, HKL);
UINT WINAPI MapVirtualKeyExWHook(UINT, UINT, HKL);
static RTL_VERIFIER_THUNK_DESCRIPTOR aThunks[] = { { "LoadKeyboardLayoutW", NULL, (PVOID)(ULONG_PTR)LoadKeyboardLayoutWHook }, { "RegisterHotKey", NULL, (PVOID)(ULONG_PTR)RegisterHotKeyHook }, { "MapVirtualKeyExW", NULL, (PVOID)(ULONG_PTR)MapVirtualKeyExWHook }, { NULL, NULL, NULL } };
static RTL_VERIFIER_DLL_DESCRIPTOR aDlls[] = { { L"user32.dll", 0, NULL, aThunks }, { NULL, 0, NULL, NULL } };
static RTL_VERIFIER_PROVIDER_DESCRIPTOR avrfDescriptor = { sizeof(RTL_VERIFIER_PROVIDER_DESCRIPTOR), aDlls };
HKL WINAPI LoadKeyboardLayoutWHook(LPCWSTR pwszKLID, UINT Flags)
{
return ((P_LOADKEYBOARDLAYOUTW)(ULONG_PTR)(aThunks[0].ThunkOldAddress))(pwszKLID, Flags | KLF_NOTELLSHELL | KLF_SETFORPROCESS);
//return GetKeyboardLayout(0);
}
BOOL
WINAPI
RegisterHotKeyHook(
HWND hWnd,
INT id,
UINT fsModifiers,
UINT vk)
{
return TRUE; // ((P_REGISTERHOTKEY)(ULONG_PTR)(aThunks[1].ThunkOldAddress))(hWnd, id, fsModifiers, vk);
}
UINT
WINAPI
MapVirtualKeyExWHook(
UINT uCode,
UINT uMapType,
HKL dwhkl)
{
if (uCode != VK_OEM_3)
return 0;
UINT ret = ((P_MAPVIRTUALKEYEXW)(ULONG_PTR)(aThunks[2].ThunkOldAddress))(uCode, uMapType, dwhkl);
UnloadKeyboardLayout(dwhkl);
return ret;
}
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, PRTL_VERIFIER_PROVIDER_DESCRIPTOR *pAvrfDescriptor)
{
switch (fdwReason)
{
case DLL_PROCESS_ATTACH:
__security_init_cookie();
DisableThreadLibraryCalls(hinstDLL);
break;
case DLL_PROCESS_DETACH:
break;
case DLL_PROCESS_VERIFIER:
*pAvrfDescriptor = &avrfDescriptor;
break;
default:
break;
}
return TRUE;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment