Вот код изменения GXT в run-time. От комментирую позже.
Пара замечаний: массив строк (0900) должен оканчиваться на метку (даже пустую), максимум изменяемых строк таким способом равно 31 (по числу локальных переменных). После запуска этой подпрограммы, ключи из GXT используются как обычно; текст не должен оканчиваться на пробел (не знаю почему).
Процедура полностью автономная, все что нужно менять это 1) сами строки, 2) массив меток 3) в цикле while число (31@ < 24), оно равно числу элементов массива * 2.
Чтобы строки отображались не в верхнем регистре, а как написаны, переключите форматирование в опциях санника на 'Как есть' ('As is').
- Code:
// ----------------------------------------------------------------------
// change GXT Entries
// ----------------------------------------------------------------------
:ChangeGXTEntries
alloc($_param1, 76)
alloc($_asmproc, 77)
alloc($_param2, 78)
1@ = @_GXTNewString_1
2@ = @_GXTNewString_2
3@ = @_GXTNewString_3
4@ = @_GXTNewString_4
5@ = @_GXTNewString_5
6@ = @_GXTNewString_6
7@ = @_GXTNewString_7
8@ = @_GXTNewString_8
9@ = @_GXTNewString_9
10@ = @_GXTNewString_10
11@ = @_GXTNewString_11
12@ = @_GXTNewString_12
0@ = -429863
31@ = 1
while 31@ < 24 // strings*2
// -------------------------------
// FIND GXT ENTRY
// -------------------------------
&0(0@,1i) = 0xA49960
&0(0@,1i) += @_GetGxtStringPointer
$_asmproc = 0x6A0050 // char* GetGxtString
$_param1 = 0xA49958
005E: $_param1 += 1@(31@,33i) // char* GXTEntry
0572: run_asm_inject true
// -------------------------------
// CHANGE GXT STRING
// -------------------------------
dec(31@)
$_param1 = 0xA49964
005E: $_param1 += 1@(31@,33i) // char* Source, new string
&0(0@,1i) = 0xA49960
&0(0@,1i) += @_CopyString
$_asmproc = 0x718660 // int CopyString
0572: run_asm_inject true
inc(31@,2)
end
return
// ASM injectors
// -------------------------------
// .text:006A0050 ; char *__cdecl GetGxtString(char *GXT_Entry)
:_GetGxtStringPointer
hex
FF 35 909AA400 // push dword ptr [0xA49960+$_param1*4]
B9 40B3C100 // mov ecx, @aAmericanGxt
FF 15 949AA400 // call dword ptr [0xA49960+$_asmproc*4]
A3 989AA400 // mov [$_param2], eax
C3 // return
end
// .text:00718660 ; int __cdecl CopyString(char *Destination,char *Source)
:_CopyString
hex
FF 35 909AA400 // push dword ptr [0xA49960+$_param1*4]
FF 35 989AA400 // push dword ptr [0xA49960+$_param2*4]
FF 15 949AA400 // call dword ptr [0xA49960+$_asmproc*4]
83 C4 08 // add esp, 8
C3 // return
end
// Compiled Strings Pool (null-terminated)
// -------------------------------
:_GXTNewString_1
0900: "NewText1"
0900: 'Entry1'
:_GXTNewString_2
0900: "NewText2"
0900: 'Entry2'
:_GXTNewString_3
0900: "NewText3"
0900: 'Entry3'
:_GXTNewString_4
0900: "NewText4"
0900: 'Entry4'
:_GXTNewString_5
0900: "NewText5"
0900: 'Entry5'
:_GXTNewString_6
0900: "NewText6"
0900: 'Entry6'
:_GXTNewString_7
0900: "NewText7"
0900: 'Entry7'
:_GXTNewString_8
0900: "NewText8"
0900: 'Entry8'
:_GXTNewString_9
0900: "NewText9"
0900: 'Entry9'
:_GXTNewString_10
0900: "NewText10"
0900: 'Entry10'
:_GXTNewString_11
0900: "NewText11"
0900: 'Entry11'
:_GXTNewString_12
// last entry