Комментарии 23
Если вам это поможет в вашей деятельности, то могу предоставить исходные коды игры
+17
Конечно! Хоть конкретно эту проблему я и решил, в будущем исходники могут очень пригодиться. Буду очень признателен, если скинете в личку ссылку.
+5
Может на github их залить, а?
Жаль что этого не будет. Хотя древняя версия игры на продажи новой версии вряд ли повлияет.
Жаль что этого не будет. Хотя древняя версия игры на продажи новой версии вряд ли повлияет.
+8
Поддержу просьбу про гитхаб.
0
Гитхаб!
0
Спасибо вам большое!
0
Какой ад… Простите, не удержался. Снимаю шляпу перед отчаянными людьми, которые поддерживали этот код.
+1
Да, по всему проекту около 250 ассемблерных вставок. Суровая оптимизация из 2000-ых. А ещё некоторые статические библиотеки ссылаются на канувшие в лету функции стандартных библиотек. Так, например, пришлось переписать отрывок в IChat/Chat/chatSocket.c и заменить в Peer.lib объект chatSocket.obj, чтобы убрать из линковки ссылку на устаревшую vsprintf() и хотя бы собрать этого динозавра в VS2015 :)
+1
Вообще, с асм-вставки в реализации понятно. В 2000-ом году не было восьмиядерных компов. Но, с другой стороны, интерфейс-то тут тоже жутковат. Или это код, полученные реверс-инжениренгом?
+1
НЛО прилетело и опубликовало эту надпись здесь
C исходными кодами это ведь уже совсей другой род деятельности! Другие позы, так сказать.
0
Т.е. проблема в том что в многопоточном приложении пренебрегли синхроназиацией при доступе к общим данным?
+3
Всё указывает на это. Сложно сказать, где собака зарыта, т.к. DirectPlay сам по себе многопоточен, а помимо него используется и свой протокол на основе UDP. Может, мне просто «повезло» наткнуться на эту ошибку, т.к. в сети описание именно такого поведения я не нашёл.
0
Описанная в конце статьи функция определена в Mplayer.cpp:3106.
При этом, например, grep PSET | grep free показывает, что кроме деструктора этот регион памяти освобождается и в функции ClearPingInfo() в Mplayer.cpp:3124. Также есть и несколько вызовов realloc(). А какой-либо синхронизации я нигде не увидел…
Тело функции
int PingSumm::CheckPlayer(DWORD DPID){
for(int i=0;i<NPL;i++){
if(PSET[i].DPID==DPID)return PSET[i].NPings;
};
return 0;
};
При этом, например, grep PSET | grep free показывает, что кроме деструктора этот регион памяти освобождается и в функции ClearPingInfo() в Mplayer.cpp:3124. Также есть и несколько вызовов realloc(). А какой-либо синхронизации я нигде не увидел…
0
Год-полтора назад я попытался поиграть с моим другом по интернету, но мы никак не могли соединиться. Выбирали прямое соединение по IP, но зачастую игру друга просто не было видно. А если видно, то не удается соединиться. Порты точно были открыты, поэтому все подозрения пали на то, что игра делалась еще для Win98 / Win2000, а у нас был Windows 7.
Сейчас еще подумал, что проблема могла быть в пиратской версии казаков.
Может, есть еще возможные причины?
Сейчас еще подумал, что проблема могла быть в пиратской версии казаков.
Может, есть еще возможные причины?
0
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Реверс-инжиниринг «Казаков», часть третья: напёрстки в LAN