

Код: Выделить всё
Display_Registration_Dialog
; ███████████████ S U B R O U T I N E ███████████████████████████████████████
Display_Registration_Dialog ; CODE XREF: .text:10000???
var_10C= -0x10C
arg_0= 0
STMFD SP!, {R4,LR}
SUB SP, SP, #0x104
MOV R4, R0
ADD R0, SP, #0x5C
MOV R1, #0x50
BL sub_10006600 ; Определяем объект.
MOV R3, #0
STR R3, [SP,#0x10C+var_10C]
MOV R0, #0x14
BL sub_100065D0 ; Выделяем память.
CMP R0, #0 ; Удачно?
ADDNE R1, SP, #0x5C
MOVNE R2, SP
BLNE sub_10005030 ; Тогда инициализируем переменные
; для ввода серийника.
Проинициализировали стек, выделили память для обьекта
Registration_Dialog, который грузим из .rsc- файла.
Структура объекта следующая:
ResourceID: 204DA010
Type: Unknown
лRegistrationd-єлIMEIлUser name2Registration codeMл
If you want to register later press Cancel
You can try program for 21 days.
LDR R1, =0x204DA010 ; Загружаем ResourceID.
BL sub_10006390 ; Выдергиваем из файла строки в формате
; WidePascal Unicode, запускаем диалог
; регистрации, сохраняем данные в переменных.
CMP R0, #0 ; Выясняем, не был ли нажат Cancel.
BEQ loc_10005114 ; Если "да", то выходим из процедуры
; с флагом "Незарегистрирован".
MOV R0, R4
ADD R1, SP, #0x5C
LDR R2, [SP,#0x10C+var_10C] ; Подготавливаем данные для процедуры
; верификации серийного номера со
; свежевведенным.
BL sub_10008680 ; Прыгаем на процедуру проверки двух номеров:
; введенного и того, который будет рассчитан
; на основании IMEI. Расчет будет происходить
; внутри SDRIVE.DLL в процедуре с ординалом 30h.
; (вынос процедуры проверки из основного
; исполняемого файла в библиотеку - единственное
; отличие от других программ SymbianWare/Wave).
CMP R0, #0 ; Самое интересное: процедура SDRIVE_30 возвращает "0",
; если регистрация неудачная и что-то другое, если
; удачная.
BEQ loc_100050D4 ; Если "0", то считаем, что регистрация не
; прошла и прыгаем на кусок кода, который
; выводит соответствующий текст.
MOV R0, #1 ; Регистрация удачна и мы делаем соответствующую
; отметку в регистре R0.
B loc_10005118 ; Прыгаем на выход из процедуры, огибая
; присвоение 0 для результата регистрации.
; ───────────────────────────────────────────────────────────────────────────
dword_100050D0 DCD 0x204DA010 ; DATA XREF: D_R_D+38
; ───────────────────────────────────────────────────────────────────────────
loc_100050D4 ; CODE XREF: D_R_D+5C
ADD R0, SP, #4 ; Здесь и далее выводим строки на экран,
; которые говорят о неверности серийника.
MOV R1, #0x28
BL sub_10006600
BL sub_10006CB0
MOV R4, R0
ADD R1, SP, #0x5C
LDR R2, =0x204DA05B
BL sub_10006C90
MOV R0, R4
ADD R1, SP, #4
LDR R2, =0x204DA05C
BL sub_10006C90
ADD R0, SP, #0x5C
ADD R1, SP, #4
MOV R2, #0
BL sub_10008370 ; Диалог в виде строчки на экране в рамочке. ;)
loc_10005114 ; CODE XREF: D_R_D+44
MOV R0, #0 ; Вот здесь присваивают значение функции в
; случае неудачной регистрации.
loc_10005118 ; CODE XREF: D_R_D+64
B loc_10005124 ; Прыгаем на выход.
; ───────────────────────────────────────────────────────────────────────────
dword_1000511C DCD 0x204DA05B ; DATA XREF: D_R_D+84
dword_10005120 DCD 0x204DA05C ; DATA XREF: D_R_D+94
; ───────────────────────────────────────────────────────────────────────────
loc_10005124 ; CODE XREF: D_R_D+B0
ADD SP, SP, #0x104
LDMFD SP!, {R4,LR} ; Очищаем стек.
BX LR ; Возвращаемся. R0 содержит "0", если регистрация
; неудачна и "1", если удачна. Вуаля! ;)
; End of function D_R_D