Как устроен Windhawk и почему модифицировать Windows снова стало удобно

30 авг 2026
8,823
230
43
4 недели

Каждый, кто пробовал настроить Windows под свои привычки, неизбежно упирался в ограничения системы. В Windows 11 убрали привычные функции панели задач, проводник периодически меняет логику работы, а нужная мелочь в сторонней программе не настраивается штатными средствами. Раньше для каждой такой правки приходилось искать отдельные твикеры, патчить системные библиотеки или скачивать сомнительные бинарники с форумов.

Проект Windhawk подошел к задаче с другой стороны. Его идея напоминает Tampermonkey для браузеров или Magisk для смартфонов, но работает в среде классических приложений Windows.

Screenshot

Что такое Windhawk

Windhawk создал разработчик m417z, известный в сообществе системных утилит по проекту 7+ Taskbar Tweaker. В отличие от старых твикеров, которые представляли собой монолитные утилиты, здесь автор выстроил открытую платформу.

Суть проста: есть единый движок внедрения кода и каталог небольших модов. Каждый мод решает конкретную проблему — возвращает классическую панель задач, добавляет регулировку громкости колесиком мыши над треем или убирает лишние кнопки из проводника.

Реклама

Пользователь видит аккуратный графический интерфейс, где можно включить нужный фикс одним кликом. Для разработчиков же Windhawk открывает полноценную среду создания хуков на C++ прямо внутри программы, с встроенным редактором кода и мгновенной компиляцией.

Архитектура и технические детали

Главная сложность при модификации программ в Windows — сделать так, чтобы код внедрялся вовремя, работал стабильно и не ломал соседние процессы.

High level architecture diagram

В репозитории исходный код разбит на три основных компонента:

  • windhawk — системный сервис windhawk.exe, а также 32-битная и 64-битная библиотеки windhawk.dll, которые отвечают за глобальный инжект и перехват функций;
  • vscode-windhawk — бэкенд интерфейса, управляющий установкой, обновлением и конфигурацией модов;
  • vscode-windhawk-ui — фронтенд на базе веб-технологий и редактора Monaco, где настраиваются параметры и пишется код модов.

Движок использует глобальный перехват и инжекцию DLL в целевые процессы. Когда запускается программа, попадающая под правила модификации, Windhawk внедряет свою библиотеку. Эта библиотека перехватывает вызовы Win32 API или внутренние недокументированные функции приложения, заменяя их поведение на то, что описано в моде.

Такой подход защищает операционную систему от повреждений. Файлы на диске не модифицируются, системные библиотеки остаются нетронутыми, а проверка целостности sfc /scannow не выдает ошибок. Если после обновления Windows какой-то мод начинает сбоить, достаточно отключить его в интерфейсе или запустить систему в безопасном режиме.

Как пишутся моды

Для написания модификаций не требуется разворачивать тяжелый Visual Studio со всеми системными SDK. Windhawk скачивает необходимый тулчейн компилятора в фоне.

Исходный код мода представляет собой C++ файл со специальными метаданными в комментариях, похожими на юзерскрипты браузеров:

// ==WindhawkMod==
// @id              custom-window-title
// @name            Custom Window Title
// @description     Изменяет заголовок окна блокнота
// @version         1.0
// @include         notepad.exe
// ==/WindhawkMod==

#include <windhawk_api.h>

typedef HWND (WINAPI *CreateWindowExW_t)(
    DWORD dwExStyle, LPCWSTR lpClassName, LPCWSTR lpWindowName,
    DWORD dwStyle, int X, int Y, int nWidth, int nHeight,
    HWND hWndParent, HMENU hMenu, HINSTANCE hInstance, LPVOID lpParam
);

CreateWindowExW_t pOriginalCreateWindowExW;

HWND WINAPI Hook_CreateWindowExW(
    DWORD dwExStyle, LPCWSTR lpClassName, LPCWSTR lpWindowName,
    DWORD dwStyle, int X, int Y, int nWidth, int nHeight,
    HWND hWndParent, HMENU hMenu, HINSTANCE hInstance, LPVOID lpParam
) {
    if (lpWindowName && wcscmp(lpWindowName, L"Untitled - Notepad") == 0) {
        lpWindowName = L"Мой кастомный блокнот";
    }
    return pOriginalCreateWindowExW(dwExStyle, lpClassName, lpWindowName, dwStyle, X, Y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam);
}

BOOL Wh_ModInit() {
    Wh_Log(L"Инициализация мода");
    
    HMODULE hUser32 = GetModuleHandle(L"user32.dll");
    void* pCreateWindowExW = (void*)GetProcAddress(hUser32, "CreateWindowExW");
    
    Wh_SetFunctionHook(pCreateWindowExW, (void*)Hook_CreateWindowExW, (void**)&pOriginalCreateWindowExW);
    return TRUE;
}

Мод компилируется прямо в приложении. Движок отслеживает изменения в файле и перезагружает динамическую библиотеку в целевом процессе без необходимости перезапускать операционную систему.

Практическая польза

Инструмент закрывает сразу несколько сценариев, которые раньше требовали костылей.

Во-первых, тонкая настройка интерфейса проводника и панели задач. Доступны моды для изменения высоты панели, скрытия ненужных пунктов контекстного меню, переключения вкладок колесом мыши и кастомизации трея.

Во-вторых, исправление раздражающего поведения стороннего софта. Если в программе нет горячей клавиши или окно не сворачивается в трей штатно, можно написать хук для user32.dll или win32u.dll и переопределить обработку оконных сообщений.

В-третьих, это отличная база для реверс-инжиниринга. Если вы изучаете устройство приложений под Windows, Windhawk упрощает эксперименты с перехватом функций, логированием параметров и проверкой гипотез.

Нюансы и ограничения

При работе с глобальным инжектом важно учитывать особенности защитного софта. Антивирусы иногда реагируют на перехват функций в системных процессах, хотя исполняемые файлы проекта имеют валидную цифровую подпись.

Для написания сложных модов под недокументированные интерфейсы проводника все еще нужны навыки реверс-инжиниринга и понимание работы с отладчиком вроде x64dbg или IDA Pro. Интерфейсы Windows часто меняются от сборки к сборке, поэтому авторам приходится поддерживать сигнатуры функций для разных версий библиотек.

Стоит ли пробовать

Windhawk превратил разрозненный мир твиков Windows в структурированную и прозрачную среду. Проект написан на C++ и Rust, распространяется по лицензии GPL-3.0 и имеет активное сообщество разработчиков.

Если вам не хватает привычных функций в Windows 11, проект стоит установить хотя бы ради готового каталога модов. А разработчикам на C++, интересующимся низкоуровневым Win32 API, исходники репозитория покажут много практических приемов внедрения библиотек и хукинга.

🍪 Мы используем файлы cookie и сервис аналитики Яндекс.Метрика, чтобы сайт работал лучше. Продолжая пользоваться devtrends.ru, вы соглашаетесь с обработкой данных согласно Политике конфиденциальности.