Перейти к содержанию

keng

Ветераны
  • Постов

    1 635
  • Зарегистрирован

  • Посещение

  • Победитель дней

    55

Весь контент keng

  1. В каком смысле? Ставишь брейкпоинт на ее вызов и все. При вылете смотришь, что она вернула, а дальше в MSDN читаешь расшифровку кода ошибки.
  2. Я хочу посмотреть на твой первый трейнер, нет, серьезно.
  3. Да пустяки, рад стараться. Ты лучше благодари, когда у тебя проблема с кодом решится.
  4. Привет! GetWindowRect принимает handle окна, а не процесса. Отныне твои лучшие друзья - это EnumWindows и GetWindowThreadProcessId. Первая возвращает тебе список идентификаторов всех окон процесса, вторая - pID, к которому окно подцеплено. pID ты уже знаешь через свой код.
  5. Предлагаю @helldrg переводить потихоньку в разработчики. PS: Никогда бы не подумал, что в моем нике можно ошибиться.
  6. Привет! Достаточно открыть MSDN на тему WaitForSingleObject и во второй же строчке описания увидеть ответ на твой вопрос.
  7. Учти, что мой код - в dll, так что я нахожусь в одном адресном пространстве с игрой. Следовательно, мне нужно просто рассчитать два смещения - туда и обратно. И все. Извне делать такие штуки тоже можно, но на пару действий больше понадобится.
  8. @helldrg это ручное создание хуков, аля Microsoft Detours. Имеем на входе два адреса - адрес исходной функции и адрес конечной (хука). Выделяем 5 байт. Копируем начало функции из исходной в выделенные 5 байт. Дальше в 0-й байт выделенной памяти записываем опкод JMP. После этого рассчитываем, на сколько байт нам нужно прыгнуть, а в начало исходной функции записываем такой же массив вида "JMP *выделенные_5_байт*". Итого: Было: Стало: Типа того. Нужно просто несколько раз в отладчике посмотреть, чтобы понять, как это работает. Отладчик - твой друг! Я сам дня 2-3 ломал голову, когда писал это все.
  9. В общем, как видишь, в моем примере принцип копирования примерно тот же, так что он явно имеет право на жизнь. Каноничнее, конечно, воспользоваться memcpy, но у нее есть два недостатка - она медленная и она медленная. С другой стороны, обычно подобные операции проводятся один раз в рамках игровой сессии, так что можно и подзабить. В-третьих, маньяков вроде меня, считающих байты кода и такты процессора - крайне мало, так что я бы советовал лишний раз не заморачиваться. Плюс в таком подходе один (помимо скорости) - резко возрастает понимание того, что делаешь.
  10. Не очень понимаю, зачем массив байт делать указателем - он типа и так указатель уже. Я обычно просто 0-й байт присваивал опкоду jmp\call, а остальные 4 (8) - нужному адресу. И все.
  11. У меня бсоды были, но обычно я сам же их и устраивал. А винда эволюционировала примерно так: 3.11 -> 95 -> 98 -> XP -> 7 -> 10.
  12. Плоская память - это про виртуальную. Сам бинарник мапится на физическую память согласно секциям, которые не могут быть больше 4Гб. Вот как раз при расчете адреса для прыжка между секциями (или между модулями бинарника, если это надо) и будет short или far. Плоская память позволяет адресануться гигов за 10 и винда не подавится, иначе бы пришлось пересчитывать все смещения.
  13. У меня первый компьютер тоже был под DOS, а вот спектрум я, к сожалению, не застал.
  14. Вот пример: Можно переделать в: И тогда не нужно объявлять label. CE умеет такую магию JMP @f и JMP @b - forward и back. А метка - просто @@.
  15. Я люблю всякое старье, да. У соседа два компьютера - 95 и 98. Почту на них проверяет, а я время от времени захожу их чуток починить.
  16. Распространенный миф. Я так-то мак для работы использую, а музыку слушаю онлайн уже много лет - у меня нет оборудования, чтобы слушать ее в хорошем качестве (причина хранения).
  17. У меня пока никаких обновлений не накатывалось. Я сегодня на рабочем ноуте завел Win98 под QEMU и очень долго грустил, пытаясь установить хоть что-нибудь. В ОС из коробки банально нет поддержки даже формата zip. Пошел качать 7zip - он в msi, который тоже не поддерживается. В итоге удалось найти какую-то древнюю версию far manager, а под него - плагин. Приключение то еще. Пойду себе спокойно обратно на мак.
  18. keng

    cmp строки

    @helldrg бабахни отладчик на инструкцию и сделай действия из скрипта руками, глядя в memory dump. Берешь значение ECX, прибавляешь смещение, переходишь по получившемуся в memory dump. Смотришь, что там. Если то, что ожидалось, тогда еще проблема может быть в доступе (?) или все-таки там несколько типов структур. Или смещение динамическое, но это уже изврат. Можешь дать полное зазвание игры? У меня руки зачесались, хочу тоже потыкать.
  19. keng

    cmp строки

    Есть мнение, что инструкция работает с разными структурами.
  20. keng

    cmp строки

    Не, у меня компьютера сейчас нет, чтобы играть. Последнее, что проходил - DooM.
  21. keng

    cmp строки

    Погоди, в первом Painkiller и движок был свой - Painengine. Он разве на основе UE? 0_o
  22. Short - это динозавр, который позволяет прыгать только на 8 бит (???). Near - +-127 байт, т.е. 8, 16 или 32 бита. Far - дальше или в другой сегмент. У меня тут возник вопрос - какой будет опкод, если прыгать надо недалеко (до 127), но в соседний сегмент? Far?
  23. keng

    cmp строки

    Да оно понятно, просто очень редко встречаются игры, где какая-то логика завязана именно на строках - это действительно неслабо бьет по производительности и причин так делать всего несколько - скажем, скриптовый движок или же просто криворукость разработчиков. Следовательно, в 99% оставшихся игр используются айдишники или (реже) указатели, так что ищущий да обрящет.
  24. keng

    cmp строки

    @Dino - готовой функцией проще, само собой, но лично я не очень доверяю таким решениям. Скажем, в игру на каком-нибудь чудо-языке может быть не подгружен стандартный сишный рантайм, так что функции этой там не окажется. Руками эта функция пишется очень просто, так что лучше уж свою написать, если так хочется.
×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.