Локализация жестко-закодированных строк PDF Печать E-mail
Индекс материала
Локализация жестко-закодированных строк
Параметры поиска строк
Редактирование жестко-закодированных строк
Плагин RDMAP
Все страницы

Radialix 2 поддерживает локализацию не только ресурсов, но и строк, размещенных в коде приложения - жестко-закодированных строк. В дополнение ко встроенным средствам поиска строк в дистрибутив Radialix 2 включен плагин RDMAP к дизассемблеру IDA http://www.hex-rays.com/idapro/, позволяющий существенно улучшить качество поиска и возможности редактирования жестко-закодированных строк. При увеличении длины строки после перевода Radialix 2 поддерживает автоматический перенос строк в новую секцию и коррекцию ссылок на строку, а также возможность увеличения размера строки за счет использования байтов-заполнителей в конце строки с помощью плагина RDMAP.

Локализация жестко закодированных строк возможна только при создании локализованного файла, создание многоязычных файлов не поддерживается.


Типы поддерживаемых строк

Поддерживается редактирование следующих типов жестко-закодированных строк:
Pascal -  строки, имеющие в Delphi тип string
Структура данных этих строк в коде в Delphi 2007 и младше:

RefCnt    dd 0xFFFFFFFF //Счетчик ссылок, равен -1
Len       dd ?          //Длина строки в символах
Text      db 0 dup(?)   //Символы, каждый символ занимает 1 байт 
terminator db 0          //Нулевой символ-терминатор

При извлечении этих строк производится их преобразование в  UNICODE в соответствии с кодовой страницей языка текста, который установлен в параметрах файла.

В Delphi 2009 эти строки имеют разный формат в зависимости от числа байт, которые занимает один символ.
ANSI строки:

CodePage   dw ?          //Кодовая страница символов строки
CharSize   dw 1          //размер символов в байтах
RefCnt     dd 0xFFFFFFFF //Счетчик ссылок, равен -1
Len        dd ?          //Длина строки в символах
Text       db 0 dup(?)   //Символы 
terminator db 0          //Нулевой символ-терминатор

UNICODE строки:

CodePage   dw ?          //Кодовая страница символов строки
CharSize   dw 2          //размер символов в байтах
RefCnt     dd 0xFFFFFFFF //Счетчик ссылок, равен -1
Len        dd ?          //Длина строки в символах
Text       dw 0 dup(?)   //Символы 
terminator dw 0          //Нулевой символ-терминатор


Pascal Wide - строки, имеющие в Delphi тип widestring
Формат строки:

Len        dd ?        //Длина строки в байтах
Text       dw 0 dup(?) //Символы, каждый символ занимает 2 байта 
terminator dw 0        //Нулевой символ-терминатор


Pascal Short - строки, имеющие в Delphi тип shortstring
Формат строки:

Len        dd ?        //Длина строки в символах, максимум 255.
Text       db 0 dup(?) //Символы, каждый символ занимает 1 байт 

WIDEZ - строки в кодировке UNICODE (2 байта на символ), заканчивающиеся нулевым символом

Text       dw 0 dup(?) //Символы, каждый символ занимает 2 байта 
terminator dw 0        //Нулевой символ-терминатор


ASCIIZ - строки в кодировке ANSI (1 байт на символ), заканчивающиеся нулевым символом

Text       db 0 dup(?) //Символы, каждый символ занимает 1 байт 
terminator db 0        //Нулевой символ-терминатор


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

  • размещение строки в новой секции данных. Для обеспечения корректного переноса производится поиск, а затем при создании локализованных файлов коррекция всех ссылок на строку. В текущей версии поддерживается только один тип ссылок - 32-х разрядное поле, содержащее виртуальный адрес поля Техt в структуре данных строки (для Pascal String - адрес поля Len). Поиск ссылок производится с использованием таблицы перемещений, а при использовании плагина RDMAP дизассемблера IDA - во всем коде. Управление ссылками (удаление, добавление) может производиться только с помощью плагина RDMAP. Добавление новой секции и размещение в ней строк, увеличившейся длины, производится автоматически при создании локализованного файла. В список сообщений при этом добавляется соответствующая запись. Не смотря на перенос строки в новую секцию данные в оригинальном размещении строки также заменяются на перевод - сохраняется укороченная строка.
  • увеличение размера структуры данных строки за счет использования байтов-заполнителей в конце строки. Обычно структуры данных в PE файле выровнены на границу 4-х байт, промежутки меду данными заполнены нулями. Увеличить размер данных строки можно только в дизассемблере IDA c помощью плагина RDMAP.