Для тех кому интересно в кратце объясню что к чему в данном коде:
( за точность сильно не бейте, поскольку давно было дело с асмом)
Code:
.text:004DB810 sub_4DB810 proc near ; CODE XREF: sub_454360+8Fp
.text:004DB810 ; strstreambuf::strstreambuf(char *,int,char *)+A4p ...
.text:004DB810
.text:004DB810 arg_0 = dword ptr 4
.text:004DB810 arg_4 = dword ptr 8
Функции передаются 2 аргумента , которые забиты в уо кфг.
Далее
Помещаем в еах ( регистр ) 1 аргумент
Code:
.text:004DB810
.text:004DB810 mov eax, [esp+arg_0]
Помещаем в едх ( регистр) число 640
Code:
.text:004DB814 mov edx, 280h
Сравниваем эти 2 регистра , при этом в данном случае у нас есть флаг JNZ которая выполняет команду – перейти, если меньше или равно.
Code:
.text:004DB819 cmp eax, edx
Помещаем в регистр есх цифру 480
Code:
.text:004DB81B mov ecx, 1E0h
JNE/JNZ – перейти, если меньше или равно. , то прыгаем на смещение 4DB837( а там у нас сравнивается с 800 х 600
Code:
.text:004DB820 jnz short loc_4DB837
Вот этот момент сам не понял зачем 2 параметр пишем в еах
Code:
.text:004DB822 mov eax, [esp+arg_4]
Далее пишем в смещение dword_5AA40C и dword_5AA40C ( по видимому которые связаны с формированием окна винды ) Соответственно наши циферки 640 480
Code:
.text:004DB826
.text:004DB826 loc_4DB826: ; CODE XREF: sub_4DB810+2Cj
.text:004DB826 ; sub_4DB810+3Bj
.text:004DB826 mov dword_5AA40C, edx
.text:004DB82C mov dword_5AA410, ecx
Дальше идет сравнение на 800 600 Идентично
Только если у нас сравнение числа 800 с параметром из уо кфг не совпадает то прыгает на loc_4DB826, где прописывается 640 480
Code:
.text:004DB832
.text:004DB832 loc_4DB832: ; CODE XREF: sub_4DB810+4Cj
.text:004DB832 jmp sub_47AF10
.text:004DB837 ; ---------------------------------------------------------------------------
.text:004DB837
.text:004DB837 loc_4DB837: ; CODE XREF: sub_4DB810+10j
.text:004DB837 cmp eax, 320h
.text:004DB83C jnz short loc_4DB826
.text:004DB83E push esi
.text:004DB83F mov esi, [esp+4+arg_4]
.text:004DB843 mov eax, 258h
.text:004DB848 cmp esi, eax
.text:004DB84A pop esi
.text:004DB84B jnz short loc_4DB826
.text:004DB84D mov dword_5AA40C, 320h
.text:004DB857 mov dword_5AA410, eax
.text:004DB85C jmp short loc_4DB832
.text:004DB85C sub_4DB810 endp
Ну а это уже IDA постаралась:) но время ее работы того не стояло:)
А это что стало
Итак пишем в уо кфг наше разрешение, функция забирает эти значения и подставляет сразу в смещение где формируется окно винды.
Code:
.text:004DB810 sub_4DB810 proc near ; CODE XREF: sub_454360+8Fp
.text:004DB810 ; strstreambuf::strstreambuf(char *,int,char *)+A4p ...
.text:004DB810
.text:004DB810 arg_0 = dword ptr 4
.text:004DB810 arg_4 = dword ptr 8
.text:004DB810
.text:004DB810 mov eax, [esp+arg_0]
.text:004DB814 mov dword_5AA40C, eax
.text:004DB819 mov eax, [esp+arg_4]
.text:004DB81D mov dword_5AA410, eax
.text:004DB822 jmp sub_47AF10
.text:004DB822 sub_4DB810 endp
Как то так , при чем при этом замечу что помещать в dword_5AA40C Сразу параметры нелья, а обязательно через регистры.
Остальные тонкости вы найдете в учебнике Асма.
Смещение это адрес в оперативной памяти относительно начала программы , это значит что когда компилируется программа , создается ЕХЕ Файл (ком файл), в котором весь ваш язык программирования ( паскаль си и тп ) преобразуется в язык машинных команд (команд процессора). -то что вы видите выше.
при этом каждая команда машинная имеет свой адрес, грубо говоря от 0 до хх.
и когда файл запускается то в Оперативную память помещаются все эти команды последовательно и процессор последовательно начинает выполнять команды от 0 до хх
Но как он их нахохит? благодаря смещению относительно начала.
--
Пс я не спец в этом поэтому гдето могу наврать , читайте учебник.