Привет всем! Я в основном пишу трейнеры для игрушек. Вот недавно написал для себя один. Затем дал попользоваться другу. У него трейнер работать отказывается. У меня Win7 64 бит, а у друга WinXP 32 бита. Подскажите кто в теме, может знаете какие принципиальные отличия такого рода софта под различные версии ОС? p.s. В своих трейнерах я предусматриваю работу с DMA. То есть адреса определяются нормально. Также использую функции SendMessage, PostMessage, Read/WriteProcessMemory. Может в них дело?!
собственно нужно знать, основное различие между 32-х битными процессорами и 64-х битными. Смысл в том, что процессор работает не по отдельности с каждой цыфрой в бите, а с пакетами битов. За одну рабочую операцию, процессор обрабатывает пакеты битов. Современные процессоры обрабатывают за одну операцию пакет из 32 бит ( 32-х битные процессоры), либо пакет из 64 бит(64-битные). Собственно это определенная техническая характеристика процессора, от которой напрямую зависит скорость обработки информации. При запуске программы, система переводит весь код программы, в машинный код, и делит на пакеты для обработки информации. Вот поэтому, при деленнии эти пакеты делатся по 64 бита, и у тебя работает все отлично, а у друга процессор не принимает такие пакеты данных. Соответственно в при компиляции ПО нужно указывать такой параметр. Обычно в средах программирования можно выбирать 32 -х битная програма или 64-х битная. В твоем случае, паблик версию делать 32-х битную, т.к. 64-х битные процессоры все равно работают с пакетами на 32 бита. Но для более гибкой работы программы следует так же иметь и 64-х битную версию.
Очень позновательно, спасибо! Бывает и такое: программируешь, а сам толком не знаешь тонкостей системы... У меня вот только вопрос еще. Я пишу на Delphi , собственно никогда не ползал в настройки компилятора, использовал стандартные. Компилятор Delphi мог разве скомпилировать код под мою ОС? Мне казалось, что он всегда по умолчанию компилирует для 32 - бит. (юзаю Delphi 7). А код имеет принципиальные отличия? где-то мельком видел, что адреса, по которым идет патчинг пишутся в этих версиях ОС по-разному?!
В ООП языках в которых есть garbage collector, программный код абсолютно идентичный. На низком уровне программирования, при написании это учитывается. Хотя я подозреваю, что у твоего друга просто неустановлена соответствующая версия framework. Если ты используешь ее в приложении.
Ну и трешняк вы тут все несете, наркоманы... Пакеты битов, дотнет фреймворк в дельфи 7, что еще вы придумаете?..
У меня как раз-таки не используется framework Самые простые программки пишу на Delphi 7. Первый раз столкнулся с этим. То что программа рабочая 100%, пробовал везде где Win7 64 бита. А вот на Win XP не работает ( закрывает игру с ошибкой) Есть что-то конструктивное сказать?
ну я вообще обдумал все возможные варианты, мало ли, что, но если, что-то умное напишешь с удовольствием почитаю
Так тебе уже давно сказали "конструктивное" - посмотри в help компилятора, и разберись какие аргументы задаются, чтобы он компилировал код для 32 бит систем. Лень что ли?
Именно это я первым делом и сделал. Генерирует код для 32-битных систем. Проблема не исчезла тем неменее. Пожалуй соглашись и с GRRRL Power. Дело все таки не в этом, а в том как используется память в 32 битных и 64 битных ОС. Возможно править нужно код, а не настройки компилятора.
В любом случае, ничто не мешает в программу дописать код, чтобы она вела какой-то лог файл с описанием того, что делает. Тогда можно было бы более-менее точно определить, в каком месте происходит падение на компьютере без отладчика. Заодно сделать, чтобы она в этот лог-файл писала важную информацю, например, адреса, которые читает и по которым пишет.
Приму к сведению, поможет решить проблемы. Понимаю относительно. То есть знаний хватает для того, чтобы писать трейнеры и всегда получалось без проблем. Но не писал никогда кроссплатформенных приложений и учитывающих разную архитектуру ОС. Вообщем писал только для себя.
Он об этом : Виртуальная память - http://ru.wikipedia.org/wiki/%D0%92%D0%B8%D1%80%D1%82%D1%83%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%BF%D0%B0%D0%BC%D1%8F%D1%82%D1%8C edit: блин, че за фигня со ссылками. Просто в бей википедю - Виртуальная память
Да уж, тебе что, главное попонтоваться, о том чего не знаешь? Вот если ты не что-то умное, а полезное напишешь я тоже почитаю.
_nic, послушай, у меня тоже кстати появился вопрос. Если выключить рандомизацию, то VA адреса переменных в программе должны быть всегда одинаковые после компилировании, так? Просто подумал об этом, где-то полгода назад тоже проходили Сегментацию и Виртуальную память. Согласен. EDIT: Выключил рандомизацию - мое предположение было правильно.
Похоже ТС ты абсолютно ничего не понимаешь.В PE32 файлах адреса чего либо в виртуально адресном пространстве записанны в переменные размером в 4байта.Из за ограничения в 32битных виндах вирт.адр. пространства в 4гигабайта.В 64 битных оно ессно больше 4х гигов.И для адресации там используются переменные больше чем 4 байта.
Заявлю как экстрансенс - да не те байты в памяти патчит ваш трейнер вот и все. Почему - ищите и обрящете. Поди все адреса захардкорены.
С переходом на Win7 64 - бита я пишу программы точно также как писал , когда у меня была XP 32 бита. Поэтому для хранения адресов и некоторых значений использую именно 4 байта. Так что в 64 - битных все то же самое. p.s. нашёл в чем была ошибка. Проблема оказалась в том, что я использую функцию SymEnumerateModules из ImageHlp.dll, видимо она зависима так от разрядности ОС...