реклама
Программное обеспечение

Недокументированные особенности Win9x/WinNT/Win2000

Автор: Ашот Оганесян

Некоторое время тому назад, я писал очередное расширение для моего Remote Task Manager и когда встала проблема определить состояние того или иного приложения, как это делает стандартный виндузовый менеджер задач, я крепко призадумался.

С одной стороны что может быть проще - использовать обычную функцию SendMessageTimeout для отправки окну приложения какого-то контрольного сообщения и если ф-ция выходит по таймауту, то считать, что приложение "висит". Однако хитрый и коварный системный программист, писавший Windows думал иначе (и конечно он был прав!) то, что окно (оконная ф-ция) не реагирует на внешние сообщения не может однозначно определять состояние "зависа", поэтому я решил запустить свой любимый дизассемблер и узнать очередную порцию правды о Windows.

Как всегда, все оказалось очень просто - библиотека User32.dll содержит специальную ф-цию для определения состояния приложения. Единственная трудность только в том, что эта ф-ция имеет разные названия и разный синтаксис в Windows NT/2000 и в Windows 9x. В NT ф-ция называется IsHungAppWindow, а в 9x - IsHungThread, попробую немного прояснить ситуацию с их использованием:

BOOL IsHungAppWindow (
HWND hWnd, // описатель главного окна приложения
);

BOOL IsHungThread (
DWORD dwThreadId, // идентификатор потока, которому принадлежит главное окно приложения
);

Так как эти ф-ции являются недокументированными, то Микрософт не включило их экспортные символы в User32.lib, но это не должно стать нам преградой - используем динамическую загрузку:

typedef BOOL (WINAPI *PROCISHUNGAPPWINDOW) (HWND);
typedef BOOL (WINAPI *PROCISHUNGTHREAD) (DWORD);

PROCISHUNGAPPWINDOW IsHungAppWindow;
PROCISHUNGTHREAD IsHungThread;

HMODULE hUser32 = GetModuleHandle("user32");

IsHungAppWindow = (PROCISHUNGAPPWINDOW)
GetProcAddress(hUser32,"IsHungAppWindow");

IsHungThread = (PROCISHUNGTHREAD)
GetProcAddress(hUser32,"IsHungThread");

Ну что же, теперь мы все можем и все умеем, осталось только написать маленький работающий пример: ishung.zip (15Kb)

Оригинал этой статьи на английском языке лежит здесь: Trick 1

Не документированные ф-ции Windows NT и Windows 95/98 и описания на английском языке: www.codepile.com

 
 
Если Вы заметили ошибку — выделите ее мышью и нажмите CTRL+ENTER.
window-new
Soft
Hard
Тренды 🔥
Картинки в стиле Ghibli перегрузили серверы OpenAI — выпуск новых функций замедлен 7 ч.
У Ubisoft пока нет чёткого плана работы новой компании с Tencent — инвесторы и сотрудники нервничают 8 ч.
«Загрузки быстрее, чем в Doom (2016)»: эксперт Digital Foundry остался в восторге от Doom: The Dark Ages 9 ч.
Консоли задержат релиз постапокалиптического стелс-экшена Steel Seed от создателей Close to the Sun — объявлена новая дата выхода 11 ч.
ИИ-модель Llama запустили на ПК из прошлого тысячелетия на базе Windows 98 12 ч.
Telegram продал виртуальных первоапрельских кирпичей почти на 100 млн рублей 12 ч.
Nintendo подтвердила рекордную продолжительность презентации Switch 2 и устроит две демонстрации игр для консоли 12 ч.
ChatGPT остаётся самым популярным чат-ботом с ИИ, но у конкурентов аудитория тоже растёт 13 ч.
Google сделает сквозное шифрование в Gmail доступным для всех 13 ч.
Антиутопия на колёсах: новый геймплейный трейлер раскрыл дату выхода приключения Beholder: Conductor про кондуктора легендарного поезда 14 ч.