Current time: 28.09.2024, 23:54 Hello There, Guest! (LoginRegister)
Language: english | russian  

Post Reply 
Threaded Mode | Linear Mode
Решение багов ERA/WOG
» Примеры решения багов ERA/WOG на уровне кода.
Author Message
Sav Offline

Posts: 2180
Post: #2

Я всё-таки разобрался со шрифтами.
Вот патч:
PHP Code:
// Исправляем обработку отрицательного отступа шрифта (ошибку приведения типов).
_PI->WriteByte(0x4B5349 10xB6); // (mov)zx
_PI->WriteByte(0x4B53E5 10xB6); // (mov)zx 

Ошибка эта была не в алгоритме, а в приведении типов, поэтому её не видно в выложенном мной декомпилированном коде.

Вот код, содержащий ошибку:
Code:
.text:004B5335 ; 109:             if ( *((_DWORD *)&this_v11->v_table + 3 * (symbol_v21 + 5)) < 0 )// fnt->char_sizes[symbol].width
.text:004B5335                 mov     edx, eax
.text:004B5337                 and     edx, 0FFh
.text:004B533D                 add     edx, 5
.text:004B5340                 lea     edx, [edx+edx*2]
.text:004B5343                 cmp     dword ptr [ebx+edx*4], 0
.text:004B5347
.text:004B5347 loc_4B5347:                             ; DATA XREF: 0138630Ao
.text:004B5347                 jge     short loc_4B5357
.text:004B5349 ; 110:               symbols_width_v19 = -*((_DWORD *)&this_v11->v_table + 3 * ((char)symbol_v21 + 5));// fnt->char_sizes[symbol].width
.text:004B5349                 movsx   ecx, al
.text:004B534C
.text:004B534C loc_4B534C:                             ; DATA XREF: 018ECE8Co
.text:004B534C                 add     ecx, 5
.text:004B534F                 lea     ecx, [ecx+ecx*2]
.text:004B5352                 mov     ecx, [ebx+ecx*4]
.text:004B5355                 neg     ecx
Тут левый отступ первого символа строки сравнивается с 0, а потом, если он отрицательный, ecx устанавливается в -него (чтобы потом, когда он в цикле прибавится, скомпенсировать его, чтобы таким образом игнорировать отрицательный отступ первого символа строки).
Проблема в строке ".text:004B5349 movsx ecx, al". Ведь если символ русский, al будет отрицательной и в ecx запишется отрицательное число, которое потом будет использоваться как индекс. В результате, вместо отступа будет взят мусор (например, 0xBAADF00D), из-за которого строка уползёт чёрт знает куда. Ну или там может лежать 0 и недочёт не будет заметен.
Такая же вещь с правым отступом последнего символа строки.

Патч правит movsx на movzx, в результате чего знак игнорируется и для русских букв генерируются нормальные индексы.
(This post was last modified: 06.07.2012 20:52 by Sav.)
06.07.2012 18:55
Find all posts by this user Quote this message in a reply
« Next Oldest | Next Newest »
Post Reply 


Messages In This Thread
Решение багов ERA/WOG - igrik - 21.09.2011, 22:09
RE: Решение багов ERA/WOG - igrik - 11.10.2020, 19:37
RE: Решение багов ERA/WOG - slater777 - 08.01.2023, 06:37
RE: Решение багов ERA/WOG - daemon_n - 08.01.2023, 08:22
RE: Решение багов ERA/WOG - slater777 - 08.01.2023, 09:57
Решение багов ERA/WOG - Sav - 06.07.2012 18:55
RE: ERA II - Sav - 11.07.2012, 20:36
RE: ERA II - MOP - 20.09.2012, 21:27
RE: ERA II - MOP - 28.09.2012, 07:27
RE: ERA II - Sav - 14.04.2013, 20:33
RE: ERA Scripts 1.15 Rus - gamecreator - 07.04.2015, 02:19
RE: Тема модераторов - gamecreator - 31.05.2016, 02:48
Решение багов ERA/WOG - igrik - 01.02.2019, 15:40
RE: Решение багов ERA/WOG - igrik - 01.02.2019, 17:21
RE: Решение багов ERA/WOG - igrik - 01.02.2019, 17:27
RE: Решение багов ERA/WOG - igrik - 01.02.2019, 17:40
RE: Решение багов ERA/WOG - igrik - 03.09.2019, 11:56

Forum Jump:

Powered by MyBB Copyright © 2002-2024 MyBB Group