-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathalpha_selector_ll.asm
168 lines (100 loc) · 6.28 KB
/
alpha_selector_ll.asm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
// Draw Hook //
//alpha_selector_ll.asm - Отлов полупрозрачной картинки (LONG LINK) на телефоны, где врезки не достают до тела патча
//(c)Dimadze
#include "drawhook.h"
EXTERN FuncDistributor_0x05
EXTERN FuncDistributor_0x17
#ifdef X75
EXTERN isCSMException
#endif
CODE16 // Врубаем режим THUMB
// Отлов всех изображений IMGHDR
RSEG PATCH_DRAWOBJECT_OBJ05:CODE
PUSH {R4-R7,LR} // Восстанавливаем затёртую команду
BLX img_05_check_j32
// Отлов всех изображений EIMGHDR
RSEG PATCH_DRAWOBJECT_OBJ17:CODE
PUSH {R4-R7,LR} // Восстанавливаем затёртую команду
BLX img_17_check_j32
// Переходы
CODE32
RSEG PATCH_DRAWOBJECT_OBJ05_J32:CODE
img_05_check_j32:
B img_05_check
RSEG PATCH_DRAWOBJECT_OBJ17_J32:CODE
img_17_check_j32:
B img_17_check
//Восстановление
RSEG PATCH_REPAIRJUMP100:CODE
B loc_jump_swi100
RSEG PATCH_REPAIRJUMP145:CODE
B loc_jump_swi145
RSEG PATCH_LOCALJUMP100:CODE
loc_jump_swi100:
RSEG PATCH_LOCALJUMP145:CODE
loc_jump_swi145:
// Ну, а это у нас процессор проверки
// Здесь происходит сортировка изображений на полупрозрачные и обычные
// Вычисление аргументов для нашей ф-ии отрисовки
RSEG PATCH_BODY:CODE
img_05_check: // Проверка на присутствии именно картинки в тексте
MOV R5, R0 // Востановление комманды
MOV R4, R1 // Востановление комманды
// R0 = SCREEN_STRUCT
// R1 = DRAWOBJ_05
PUSH {R0-R2,LR} // Теперь надо сохраниться, мало ли что ...
#ifdef X75
BL isCSMException // Посмотрим, а CSM которая "на верху" не исключение?
CMP R0, #0x01
MOV R0, R5
BEQ is_csm_exc_05 // Исключение, тогда сваливаем ...
#endif
LDR R2, [R1, #0x14] // R2 = IMGHDR *img
LDRB R2, [R2, #0x02] // R2 = img->bpnum
BIC R2, R2, #0xF0 // Очищаем 4-8 биты, т.е. любое число 0xXA будет как 0x0A
CMP R2, #0x0A // Проверяем, нет ли альфа-канала?
BNE not_alpha_05 // В зависимости от проверки уходим
// Ага, альфа-канал есть! Рисуем через спец-функцию ...
MOV R1, R0 // Возьмём адрес структуры SCREEN_STRUCT
MOV R0, R4 // Возьмём адрес структуры DRWOBJ_05
LDR R2, =FuncDistributor_0x05
BLX R2 // Пойдём на распределитель
#ifdef X75
MOV R2, #0x00 // Картинку уже нарисовали, теперь ломаем её структуру,
STR R2, [R4, #0x14] // чтобы сам телефон её снова не нарисовал
#endif
not_alpha_05:
is_csm_exc_05:
POP {R0-R2,LR} // Вот теперь грузим сохранение
CMP R0, #0x00 // Востановление комманды
BX LR
img_17_check: // Проверка картинки
SUB SP, SP, #0x14 // Востановление комманды
MOV R6, R0 // Востановление комманды
// R0 = SCREEN_STRUCT
// R1 = DRAWOBJ_17
PUSH {R0-R2,LR} // Теперь надо сохраниться, мало ли что ...
#ifdef X75
BL isCSMException // Посмотрим, а CSM которая "на верху" не исключение?
CMP R0, #0x01
MOV R0, R6
BEQ is_csm_exc_17 // Исключение, тогда сваливаем ...
#endif
LDR R2, [R1, #0x14] // R2 = EIMGHDR *eimg
LDR R2, [R2, #0x00] // R2 = eimg->bpnum
BIC R2, R2, #0xF0 // Очищаем 4-8 биты, т.е. любое число 0xXA будет как 0x0A
CMP R2, #0x0A // Проверяем, нет ли альфа-канала?
BNE not_alpha_17 // В зависимости от проверки уходим
// Ага, альфа-канал есть! Рисуем через спец-функцию ...
MOV R1, R0 // Возьмём адрес структуры SCREEN_STRUCT
MOV R0, R4 // Возьмём адрес структуры DRWOBJ_17
LDR R5, =FuncDistributor_0x17
BLX R5 // Пойдём на распределитель
#ifdef X75
MOV R2, #0x00 // Картинку уже нарисовали, теперь ломаем её структуру,
STR R2, [R4, #0x14] // чтобы сам телефон её снова не нарисовал
#endif
not_alpha_17:
is_csm_exc_17:
POP {R0-R2,PC} // Вот теперь грузим сохранение
END