Форум HeroesWorld-а - Показать сообщение отдельно - [ПРОБЛЕМА] Heroes3 на двухядерном процессоре
Показать сообщение отдельно
#14
Старый 06.11.2007, 23:07
  #14
^
ezhfan
📖
Регистрация: 02.09.2007
Сообщения: 14
Регистрация: 02.09.2007
Сообщения: 14
По умолчанию
Re: [ВОПРОС] 100% Загрузка процессора в героях.

По просьбам трудящихся опишу процесс поподробнее.
Оговорюсь сразу, что полученный продукт имеет полное право завесить винду, и, кто не закрыл документ MS Office или кто прописал гадость сию в автозагрузку - я не виноват :-)
Безобразие я переписал, т.к. в оригинальном варианте сие предназначалось для конкретной версии 3-х Героев. Много кода надёргал с wasm.ru, в особенности из http://wasm.ru/article.php?article=apihook_1

Как оно работает? Всё просто. приложение prog.exe дёргает функцию set_hook из библиотеки syshook.dll. Это могло быть любое приложение, имеющее очередь обратотки сообщений windows.
Далее, функция set_hook, находящаяся в dll-ке (требование MSDN для системных хуков), ставит хук на WH_CBT. Это мог быть любой другой системный хук. События по данному хуку обрабатываются функцией-заглушкой SysMsgProc. Почему так? А потому что нам нужен не хук - нам нужно подгрузится в адресное пространство всех приложений с окнами, особенно Героев :-)
Можно было прописать эту dll-ку в реестр, чтобы она автоматически ко всем приложениям подсасывалась, однако, я не идеален и, думаю, понаделал кучу ошибок. В-общем, чтобы система не падала, лучше так не делать.

DLL-ка при подгрузке ищет в папке, откуда был запущен процесс, файл syshook.ini. В первой строчке этого файла должно быть регулярное выражение, соответствующее имени запускаемого файла, во второй строчке - через сколько раз вызывать sleep(1) при вызовах IsIconic.

Про механизм внедрения рассказывать тут не буду - читайте статью, там всё понятно.

Если кто скажет, что главная процедура DLL-ки должна была бы и выгрузку корректно обработать, то замечу, что мне хотелось, чтобы программа компилировалась у всех под Delphi 6, а там ошибка в system.pas, которая не позволяет корректно обрабатывать события загрузки/выгрузки. Стек сломали-с.

Итак, как оно работает. В папке с Героями должен лежать syshook.ini (в архиве прилагается пример). Запускаем программу (prog.exe), ждём 3 секунды, она должна что-то написать, затем запускаем героев. Программу не закрываем :-).

P.S.: можно было бы сделать более лёгкое и менее кривое решение - исправить exe-шник Героев, но это уже процесс творческий и индивидуальный для каждой конкретной версии Героев.

P.P.S.: в архиве помимо бинарников приложены исходники, дабы желающие могли компилировать вволю. В Delphi открывать dpr-файлы, я компилировал в Delphi 6, можно открыть и скомпилить в Delphi 7.
Dll-ка и exe-шник компилятся отдельно.

Извините за сумбурное описание и хреновый стиль программирования - мало спал %<
Вложения
Тип файла: zip heroes_cpu.zip (461.5 Кбайт, 144 просмотров)
ezhfan вне форума
Ответить с цитированием