Skip to content

Instantly share code, notes, and snippets.

@Aetopia
Last active August 5, 2023 14:32
Show Gist options
  • Save Aetopia/347e7329158aa2c69df97bdf0b761d6f to your computer and use it in GitHub Desktop.
Save Aetopia/347e7329158aa2c69df97bdf0b761d6f to your computer and use it in GitHub Desktop.
Shell Hook Monitor: A tool to monitor shell hook messages.
#define _WIN32_WINNT _WIN32_WINNT_WIN10
#include <windows.h>
int printf(const char *__format, ...);
LPWSTR ShellHookMessageToStringW(WPARAM wParam)
{
switch (wParam)
{
case HSHELL_WINDOWCREATED:
return L"HSHELL_WINDOWCREATED";
break;
case HSHELL_WINDOWDESTROYED:
return L"HSHELL_WINDOWDESTROYED";
break;
case HSHELL_ACTIVATESHELLWINDOW:
return L" HSHELL_ACTIVATESHELLWINDOW";
break;
case HSHELL_WINDOWACTIVATED:
return L"HSHELL_WINDOWACTIVATED";
case HSHELL_GETMINRECT:
return L"HSHELL_GETMINRECT";
break;
case HSHELL_REDRAW:
return L"HSHELL_REDRAW";
break;
case HSHELL_TASKMAN:
return L"HSHELL_TASKMAN";
break;
case HSHELL_LANGUAGE:
return L"HSHELL_LANGUAGE";
break;
case HSHELL_SYSMENU:
return L"HSHELL_SYSMENU";
break;
case HSHELL_ENDTASK:
return L"HSHELL_ENDTASK";
break;
case HSHELL_ACCESSIBILITYSTATE:
return L"HSHELL_ACCESSIBILITYSTATE";
break;
case HSHELL_APPCOMMAND:
return L"HSHELL_APPCOMMAND";
break;
case HSHELL_WINDOWREPLACED:
return L"HSHELL_WINDOWREPLACED";
break;
case HSHELL_WINDOWREPLACING:
return L"HSHELL_WINDOWREPLACING";
break;
case HSHELL_MONITORCHANGED:
return L"HSHELL_MONITORCHANGED";
break;
case HSHELL_HIGHBIT:
return L"HSHELL_HIGHBIT";
break;
case HSHELL_FLASH:
return L"HSHELL_FLASH";
break;
case HSHELL_RUDEAPPACTIVATED:
return L"HSHELL_RUDEAPPACTIVATED";
break;
}
return NULL;
}
LRESULT WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
static UINT uShellHookMessage = WM_NULL;
if (uMsg == WM_CREATE)
{
uShellHookMessage = RegisterWindowMessageW(L"SHELLHOOK");
RegisterShellHookWindow(hWnd);
}
else if (uMsg == uShellHookMessage)
{
HWND hShellWnd = NULL;
INT nMaxCount = 0;
WCHAR *lpClassName = NULL, *lpString = NULL;
if (wParam != HSHELL_GETMINRECT)
hShellWnd = (HWND)lParam;
else
hShellWnd = ((SHELLHOOKINFO *)lParam)->hwnd;
if (hShellWnd)
{
nMaxCount = GetWindowTextLengthW(hShellWnd) + 1;
lpString = _malloca(sizeof(WCHAR) * nMaxCount);
lpClassName = _malloca(sizeof(WCHAR) * 256);
GetClassNameW(hShellWnd, lpClassName, 256);
GetWindowTextW(hShellWnd, lpString, nMaxCount);
if (!wcslen(lpClassName))
lpClassName = NULL;
if (!wcslen(lpString))
lpString = NULL;
}
printf("Message: \"%ls\" | uMsg: %ld | LPARAM: %ld | Class Name: \"%ls\" | Window Text: \"%ls\"\n", ShellHookMessageToStringW(wParam), wParam, hShellWnd, lpClassName, lpString);
}
return DefWindowProcW(hWnd, uMsg, wParam, lParam);
}
INT WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, INT nShowCmd)
{
MSG msg = {0};
if (!RegisterClassExW(&((WNDCLASSEXW){.cbSize = sizeof(WNDCLASSEXW), .lpszClassName = L"Shell Hook Monitor", .lpfnWndProc = WndProc, .hInstance = hInstance})) ||
!CreateWindowExW(0, L"Shell Hook Monitor", NULL, 0, 0, 0, 0, 0, HWND_MESSAGE, NULL, hInstance, NULL))
return EXIT_FAILURE;
while (GetMessageW(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessageW(&msg);
}
return EXIT_SUCCESS;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment