Jump to content
Old Phone Forum
  • Login

    You are currently not logged in to the forum.

    To comment, upload files, subscribe to answers - you need to login.

MaxKis

Задаем вопросы по теме "Создание патчей, для начинающих"

Recommended Posts

FRAER, динамические окна?


Обожаю свою жену Анюточку! =)

Share this post


Link to post
Share on other sites

SantaX,

хз как их обозвать, там используются текстовые ресурсы с XXX, затем вызывается функция, которая заменяет эти XXX на строку из параметра...

Share this post


Link to post
Share on other sites

FRAER, иx Руслан назвал динамическими в уроках :idea: я вроде бы имел с ними дело когда убирал окошко "сохранено %s в %" .


Обожаю свою жену Анюточку! =)

Share this post


Link to post
Share on other sites

Парни как добавить пункт в меню. Создать с нуля одно, а вот как добавить, в частности хочу добавить пункт в меню мультимедиа и ещё один вопрос подскажите где взять сим файл на X700XEFC3 на javere не качает выдает ошибку!


Потерял U900 :(, не беда сделаем его из X700 :)

Share this post


Link to post
Share on other sites

Вот в етой статейки от Позитрона описано как добавлять меню http://OldPh.one/index.php?showtopic=44446?p=44...mp;#entry446400

Все просто.У мня со 2 раза все получилось

  • Like 2

Share this post


Link to post
Share on other sites

Привет! Можете меня проконсультировать? Хотелось бы сделать две вещи:

1) при сбросе звонка кнопкой "Отбой", что бы не выводилось сообщение о пропущенном вызове (есть патч reject call log о нем позже).

2) при сообщении о пропущеном вызове при нажатии на Вызов и звонке, после окончания звонка сообщение о пропущенном вызове убирать.

 

вообще на сколько я могу себе представить логику разрабов:

1) у экземпляра записи звонка (они, наверное, хранятся в побобии БД), если он пропущен проставляется какой- то флаг

2) на основании этого флага на рабочем столе висит сообщение о пр. звонке

3) после входа в список пропущенных флаг снимается

 

вопрос: как найти этот флаг и код который его проставляет и снимает?

Если я не прав- поправьте меня.

 

Задача минимум: портировать reject call log. Но и тут у меня ничего не вышло. Совсем непонятно как найти эквиваленты для этого патча...

Просветите меня, если кто может.

Share this post


Link to post
Share on other sites

mcc menu config 7d1d - где найти его адресс на вкладке MCC нет такого :| да, допустим добавил пункт, а как к нему ещё иконку зацепить? Про это статейка где нибудь есть? :28:


Потерял U900 :(, не беда сделаем его из X700 :)

Share this post


Link to post
Share on other sites

да, допустим добавил пункт, а как к нему ещё иконку зацепить? Про это статейка где нибудь есть? :28:

Иконка добавляется также, как и создается пункт меню. Различия - в типе, передаваемом в lk_AddMenu, ну и уже не строку нужно передавать в lk_AddMenu, а ID иконки. Статей нет, но есть патчи, откуда можно пример взять.

Share this post


Link to post
Share on other sites

-=DaNTe=-,

уверен на 100%, что в х700 нет меню-конфига с номером 0x7D, что-то ты напутал, скорее всего 0x7D - это номер самого меню-конфига в списке мсс-скриптов, а, значит, тебе нужен меню-конфиг 0x1D

  • Like 1

Share this post


Link to post
Share on other sites
-=DaNTe=-,

уверен на 100%, что в х700 нет меню-конфига с номером 0x7D, что-то ты напутал, скорее всего 0x7D - это номер самого меню-конфига в списке мсс-скриптов, а, значит, тебе нужен меню-конфиг 0x1D

Ну это я и имел ввиду например: mcc menu config 00 - его код 7D00, а у меня в проше идёт код 7D 1D ..........................

и в MCC нет mcc menu config 1D :) Теперь надеюсь понятно.

 

Так что меню (1088EE1C  7D 1D 1B00 0B00 0100 00000000 0000 0000  Меню 0x1D из 11 пунктов) кто нибудь напишет как найти код, пожалуйста!!!!!!!


Потерял U900 :(, не беда сделаем его из X700 :)

Share this post


Link to post
Share on other sites

Есть у меня в патче "Полноэкранный просмотр картинок" такой код:

 

;----------------.изменение размера очистки экрана --------------------------------------------------------------------

.equ go 0x20C69E00

.equ back 0x20A88FF8

.equ RegView 0x20BD6000

 

.start 0x20A88FEA

MOV r0, 0x0 ; изменение положения очистки

 

.start 0x20A88FF0

LDR R2, =go+1

BX R2

.data

 

;----------------очистка экрана; --------------------------------------------------------------------

 

go:

mov r1, 0x50

add r0, r7, r1

STRH R7, [R3, #40]

STRH R0, [R3, #42]

MOV R3, #0x0

MOV R2, #0x0

LDR R1, =back+1

BX R1

.data

 

;----------------увеличение времени подсветки на время показа слайд-шоу; ----------------------------------------

 

backlight:

ldr r1,=gv_backlight

ldr r3,[r4,8]

str r3,[r1]

mov r2,0

mov r1,0

mov r0,0

str r2,[sp]

bl lk4_BackLight_On

add sp,0x100

pop {r4-r7,pc}

.data

 

вставлен он сразу после всего кода патча... т.е. после той части, которую я пишу на картинке...

жирным выделена строка, которую я фактически высчитываю вручную...

вопрос у меня следующий... если я переделываю его следующим образом, то всё перестаёт работать...

 

 

;----------------очистка экрана; --------------------------------------------------------------------

 

go:

mov r1, 0x50

add r0, r7, r1

STRH R7, [R3, #40]

STRH R0, [R3, #42]

MOV R3, #0x0

MOV R2, #0x0

LDR R1, =back+1

BX R1

.data

 

;----------------увеличение времени подсветки на время показа слайд-шоу; ----------------------------------------

 

backlight:

ldr r1,=gv_backlight

ldr r3,[r4,8]

str r3,[r1]

mov r2,0

mov r1,0

mov r0,0

str r2,[sp]

bl lk4_BackLight_On

add sp,0x100

pop {r4-r7,pc}

.data

 

;----------------.изменение размера очистки экрана --------------------------------------------------------------------

 

;.equ go 0x20C69E00

.equ back 0x20A88FF8

.equ RegView 0x20BD6000

 

.start 0x20A88FEA

MOV r0, 0x0 ; изменение положения очистки

 

.start 0x20A88FF0

LDR R2, =go+1

BX R2

.data

 

т.е. вместо этой ссылки go я пишу этот кусок сразу после предыдущего текста патча...

и перестаёт работать...

 

если я делаю так, как в первом варианте, то потом в БинЭдите после применения патча вижу следующее...

 

20C69E16: A368 LDR R3, [R4, #0x8];R3 = слово по адресу [R4 + 8 байт]

20C69E18: 0B60 STR R3, [R1];слово по адресу [R1] = R3

20C69E1A: 0022 MOV R2, #0x0;R2 = 0

20C69E1C: 0021 MOV R1, #0x0;R1 = 0

20C69E1E: 0020 MOV R0, #0x0;R0 = 0

20C69E20: 0092 STR R2, [sP];слово по адресу [sP] = R2

20C69E22: FAF5DBFE BL off_20A64BDC;Переход по адресу 0x20A64BDC с сохранением адреса возврата

20C69E26: 40B0 ADD SP, SP, #0x100;SP = SP + 256

20C69E28: F0BD POP {R4-R7,PC};Загрузить регистры R4-R7,PC

20C69E2A: 0000 NOP ;Пустая команда. LSL R0,R0,0 = 0x0 (0)

20C69E2C: 28C57730 DCD 0x3077C528;Данные для команды по адресу 0x20C69E14

20C69E30: 03B4 PUSH {R0,R1};Сохранить регистры R0,R1

20C69E32: 0148 LDR R0, =0x208476AD;R0 = значение по адресу (PC + 4)=[0x20C69E38]= 0x208476AD

20C69E34: 0190 STR R0, [sP, #0x4];слово по адресу [sP + 4] = R0

20C69E36: 01BD POP {R0,PC};Загрузить регистры R0,PC

20C69E38: AD768420 DCD 0x208476AD;Данные для команды по адресу 0x20C69E32

20C69E3C: 03B4 PUSH {R0,R1};Сохранить регистры R0,R1

20C69E3E: 0148 LDR R0, =0x20847709;R0 = значение по адресу (PC + 4)=[0x20C69E44]= 0x20847709

20C69E40: 0190 STR R0, [sP, #0x4];слово по адресу [sP + 4] = R0

20C69E42: 01BD POP {R0,PC};Загрузить регистры R0,PC

20C69E44: 09778420 DCD 0x20847709;Данные для команды по адресу 0x20C69E3E

20C69E48: 03B4 PUSH {R0,R1};Сохранить регистры R0,R1

20C69E4A: 0148 LDR R0, =0x208476E3;R0 = значение по адресу (PC + 4)=[0x20C69E50]= 0x208476E3

20C69E4C: 0190 STR R0, [sP, #0x4];слово по адресу [sP + 4] = R0

20C69E4E: 01BD POP {R0,PC};Загрузить регистры R0,PC

20C69E50: E3768420 DCD 0x208476E3;Данные для команды по адресу 0x20C69E4A

20C69E54: 1F00 LSL R7, R3, #0;R7 = R3 << 0 = 0x0 (0)

20C69E56: 1F00 LSL R7, R3, #0;R7 = R3 << 0 = 0x0 (0)

20C69E58: 1F00 LSL R7, R3, #0;R7 = R3 << 0 = 0x0 (0)

20C69E5A: 1F00 LSL R7, R3, #0;R7 = R3 << 0 = 0x0 (0)

 

жирным здесь, то, что мне и надо...

а вот что это после этого появляется, зачем оно надо и почему без него патч работать не хочет?

соответственно, если я компилю второй вариант, то вот этого лишнего не появляется...

Edited by BaRsupillamy

Лучше работать завтра, чем сегодня...

Share this post


Link to post
Share on other sites

а вот что это после этого появляется, зачем оно надо и почему без него патч работать не хочет?

Потому что это редиректы. Сейчас проблем для созданий патчей практически нету. А вот раньше приходилось очень сильно извращаться. Команды bl/blx (да и вообще команды в асме) - имеют ограничения. Так например, команда mov может записывать число от нуля до 255 (0..$FF). Команды переходов b/bne/beq и т.д. имеют тоже свое ограничение - длина перехода. А также и bl/blx не может вызывать функцию, которая находится на длине, превышающей ограничение. Чтобы этого избежать, создаются редиректы. Т.е. вызывая в коде функцию, которая находится на расстоянии, превышающем ограничение - BinEdit создает редирект. Т.е. вызывается уже не my_function (что вызывали вы в коде), а ее редирект, т.е. получается так сказать вызов совсем другой функции, скажем - j_my_function, которая уже описывается в основном после патче, или если указана директива .orgbl - то в месте, где указана эта директива. Конструкция редиректа такова:

j_my_function:

push {r0,r1}

ldr r0,=my_function+1

str r0,[sp,4]

pop {r0,pc}

Вот такая вот нехитрая конструкция и позволяет вызывать функции, находящиеся на любом расстоянии.

А также перед редиректами - у тебя находяся данные для загрузки командой ldr, а т.е. gv_backlight. От этого никуда не деться. Если от редиректов можно избавиться, то от данных - нет.

 

А насчет первого блока вопросов - я ничерта не понял, что где и как. И не я один :jokingly:

  • Like 1

Share this post


Link to post
Share on other sites

ну, то что это эти самые редиректы, я в общем приблизительно догадывался... за ответ спасибо...

вопрос остался в том, почему если я убираю строку

 

.equ go 0x20C69E00

 

и просто вставляю нужный код с этого адреса, то перестаёт работать...

т.е. предыдущая часть патча заканчивается в этом месте... я применяю блок в бинэдите и смотрю, какой адрес следующий... и если просто дальше писать

 

go:

mov r1, 0x50

add r0, r7, r1

STRH R7, [R3, #40]

STRH R0, [R3, #42]

...

 

то работать перестаёт... вопрос в том, почему? и редиректы эти не появляются...

 

вот... понял... всё правильно...

просто редиректы появляются там, где я делаю врезку... и затирают исходный код... вот в чём была проблема :jokingly:


Лучше работать завтра, чем сегодня...

Share this post


Link to post
Share on other sites

[AlaSToR], вот собираюсь я портировать какой- то патч. Где (или как) я могу узнать какой базовый адрес имеет прошивка с которой я его портирую?

Share this post


Link to post
Share on other sites

[AlaSToR], вот собираюсь я портировать какой- то патч. Где (или как) я могу узнать какой базовый адрес имеет прошивка с которой я его портирую?

BinEdit автоматически определяет базовый адрес прошивки при первом ее открытии. Просто отвечать утвердительно нужно на его вопросы. После открытия, вначале будет адрес 0x0. Если пролистнуть чуть ниже, он в поле адреса - покажет уже адрес текущий + базовый, т.е. будет или 1XXXXXXX, или 2XXXXXXX. Или же, если это сисол, то будет там база 0x0. Иначе, если все равно адрес не будет входить в диапозон 1XXXXXXX|2XXXXXXX, 2XXXXXXX|3XXXXXXX, значит ошибка или be-файла, или отменили сканирование прошивки, отвечая отрицательно на вопросы BinEdita.

  • Like 1

Share this post


Link to post
Share on other sites

Ну это я и имел ввиду например: mcc menu config 00 - его код 7D00, а у меня в проше идёт код 7D 1D ..........................

и в MCC нет mcc menu config 1D :28: Теперь надеюсь понятно.

 

Так что меню (1088EE1C  7D 1D 1B00 0B00 0100 00000000 0000 0000  Меню 0x1D из 11 пунктов) кто нибудь напишет как найти код, пожалуйста!!!!!!!

В правой части BinEdit открой вкладку "MCC", в столбце "Код" ищи "7D1D" и переходи двойным щелчком на адрес, что написан рядом (0x116FFE70), затем в левой части программы в открывшемся коде листай - с адреса 0x116FFEE0 и ниже идут переходы по значению второго аргумента, у тебя это 0x1B => переходи на 0x11703256 - там и есть описание твоей менюшки.

  • Like 1

Share this post


Link to post
Share on other sites
В правой части BinEdit открой вкладку "MCC", в столбце "Код" ищи "7D1D" и переходи двойным щелчком на адрес, что написан рядом (0x116FFE70), затем в левой части программы в открывшемся коде листай - с адреса 0x116FFEE0 и ниже идут переходы по значению второго аргумента, у тебя это 0x1B => переходи на 0x11703256 - там и есть описание твоей менюшки.

Да я уже восьмой раз пишу что я знаю как найти, я пишу у меня нет в BinEdite кода конфига 1D т.е. смотри скрин!!!!

Спасибо что адреса написал!!!

А файла сим у тебя случаем нет??????

76462-12-08-10)1281560372_thumb.png


Потерял U900 :(, не беда сделаем его из X700 :)

Share this post


Link to post
Share on other sites

у меня нет в BinEdite кода конфига 1D

Открывай в правой части BE вкладку "Свойства", ищи строку:

MCCTable adr="0x10277798" KolFunMCC="38" (значения адресов будут другими у тебя).

Правь значение KolFunMCC - на большее,чем там есть (насколько - пробуй сам,по чуть чуть) - затем нажимай на этой вкладке кнопку "Иголка" (канцелярская), затем переходи на вкладку МСС (все в той же правой части BE) - и проверяй, появился ли данный конфиг. Как появится, сохрани изменения, кнопка дискеты левее от иголки - на той же вкладке.

  • Like 2

Share this post


Link to post
Share on other sites

А файла сим у тебя случаем нет??????

Есть, не помню честно говоря уже его происхождение, но на портале можешь взять sym custom for X700XEFC3

  • Like 1

Share this post


Link to post
Share on other sites

11700072:	7648	LDR	R0, =0x00000A2C
11700074:	92F7D4EC	DCD	0xECD4F792

 

Нужно заменить 0x00000A2C на 0x00000DE7 пишу код

.start 0x11700072
LDR	R0, =0x00000DE7

 

а он мне меняет сразу 2 адреса

11700072:	0048	LDR	R0, =0x00000DE7	
11700074:	E70D0000	DCD	0x00000DE7

 

Где я ступил, чего не знаю??????? :)


Потерял U900 :(, не беда сделаем его из X700 :)

Share this post


Link to post
Share on other sites

ищи... где то ниже должна быть строка с данными... там будет такое: 2C0A0000 ... или всё таки 00000A2C... но по моему первый вариант будет... по этому адресу пропиши

 

.start 0x--------

.hex E70D0000

 

вроде не ошибся :) а то я могу :)


Лучше работать завтра, чем сегодня...

Share this post


Link to post
Share on other sites

Еще проще:

(если включены комментарии), то смотрим строку в адресе 0x11700072:

11700072: 7648 LDR R0, =0x00000A2C ;R0 = значение по адресу (PC + 472)=[0x1170024C]= 0x00000A2C

Жирным выделен адрес, где лежат как раз данные 0xA2C. Но - изменив их, мы можем нарушить работу телефона в других местах. Поэтому вставляем адрес 0x1170024C в поиск, нажимаем треугольник правее кнопки - А с лупой, выбираем: "На место расположения данных Rx=". Здесь нам BE выведет адреса, которые обращаются на адрес, где лежат данные 0xA2C (именно на этот адрес, а не на все, где лежат такие данные). Он нашел 1 адрес - это 0x21700072. Прошу заметить, почему такой адрес - здесь ошибка BinEdit'a, он к найденному адресу прибавляем еще и базу. (Т.е. т.к. на х700 база 0x1, то к 0x1 прибавляется 0x1,и получается, что он находит адрес 0x2.. В G600 база 0x2, поэтому там в поиске вместо 0x2..., получается аж 0x4.. :)). Итак, отлично, на данный адрес ссылается телефон только в одном месте, поэтому смело пишем код:

.start 0x1170024C

.word 0xDE7

Ну или, чтобы вернее:

.start 0x1170024C

.short 0xDE7

Пробуй.

Share this post


Link to post
Share on other sites
Еще проще:

(если включены комментарии), то смотрим строку в адресе 0x11700072:

11700072: 7648 LDR R0, =0x00000A2C ;R0 = значение по адресу (PC + 472)=[0x1170024C]= 0x00000A2C

Жирным выделен адрес, где лежат как раз данные 0xA2C. Но - изменив их, мы можем нарушить работу телефона в других местах. Поэтому вставляем адрес 0x1170024C в поиск, нажимаем треугольник правее кнопки - А с лупой, выбираем: "На место расположения данных Rx=". Здесь нам BE выведет адреса, которые обращаются на адрес, где лежат данные 0xA2C (именно на этот адрес, а не на все, где лежат такие данные). Он нашел 1 адрес - это 0x21700072. Прошу заметить, почему такой адрес - здесь ошибка BinEdit'a, он к найденному адресу прибавляем еще и базу. (Т.е. т.к. на х700 база 0x1, то к 0x1 прибавляется 0x1,и получается, что он находит адрес 0x2.. В G600 база 0x2, поэтому там в поиске вместо 0x2..., получается аж 0x4.. ). Итак, отлично, на данный адрес ссылается телефон только в одном месте, поэтому смело пишем код:

.start 0x1170024C

.word 0xDE7

 

Ну или, чтобы вернее:

.start 0x1170024C

.short 0xDE7

 

Пробуй.

 

Спасибо, на счёт первого сам уже заметил, но прикол, заменил прошиваюсь, а текст в менюшке всё равно - A2C Другие файлы, а мне надо - DE7! Это может быть связанно с патчем Иконки в меню мультимедия, в нём в исх кстати перечесляются текстовые ресурсы, т.е. он там как бы заново всю менюшку пересоздаёт.

Да вопрос, а как теперь изменить текстовые ресурсы пишем например

.start 0x119F90EA адрес DE7

.hex D0 A2 D0 B5 D0 BC D1 8B 00 Слово "Темы"

Или не hex?


Потерял U900 :(, не беда сделаем его из X700 :)

Share this post


Link to post
Share on other sites

-=DaNTe=-,

Чтобы удобней текст писать, лучше использовать директиву .string:

.string "Темы"

  • Like 1

Share this post


Link to post
Share on other sites
-=DaNTe=-,

Чтобы удобней текст писать, лучше использовать директиву .string:

.string "Темы"

Спасибо, чё та я совсем не х.. не знаю оказывается :(

Пойду обновлять версию моска :(


Потерял U900 :(, не беда сделаем его из X700 :)

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now



×
×
  • Create New...