Как изменить русскую раскладку клавиатуры в OS/2 PM окнах.
- ... что самое интересное на свете? - Тайна. - Нет, самое интересное на свете - жизнь. А тайна... Она просто делает интересную жизнь еще инетреснее. |
(C) Сергей Павлов |
Необходимое замечание.
В этой статье мы будем изменять раскладку клавиатуры в OS/2 PM окнах. Поскольку вся информация, на основе которой я написал статью, получена помимо фирмы IBM (или каких-либо других официальных источников), то ни я, ни фирма IBM не гарантируем, что приведенные советы сработают, что они вполне безопасны или полезны. Ни я, ни фирма IBM не будут нести какой-либо ответственности за возможные убытки и потери, произошедшие в результате использования данной статьи. Иными словами - никаких гарантий нет; пытаясь применить что-либо из прочитанного ниже вы действуете НА СВОЙ СТРАХ И РИСК.Где расположена русская раскладка клавиатуры для PM окон?
Русская раскладка для PM окон располагается в файле \OS2\DLL\PMMERGE.DLL. В этом же файле хранятся раскладки клавиатуры для других стран. Кроме того, в PMMERGE.DLL хранятся другие ресурсы, необходимые для нормальной работы Presentation Manager. Поскольку PMMERGE.DLL критичен для функционирования OS/2 Presentation Manager, я настоятельно рекомендую перед любыми манипуляциями с этим важным файлом сделать его резервную копию.Какие инструменты нужны для того, чтобы копаться в недрах PMMERGE.DLL?
Набор инструментов типичен для занятий программированием: напильник, молоток, зубило, hiew.exe... Очень кстати будет архив resmgr.zip, который прислал мне Max A. Alekseyev.Какие ресурсы отвечают за русскую раскладку?
306.13, 309.13, и еще 347.13, 349.13. 309.13 - это раскладка RU443. Можно предположить, что RU441 - это 306.13. Что такое 347.13 и 349.13 я не знаю.Если кто-то хочет поискать русские ресурсы сам - для этого нужно преобразовать PMMERGE.DLL в PMMERGE.RES (инструменарий указан чуть выше). Искать в .res файле надо последовательность 0xb7 0x01 0xc4 0x01. Эта последовательность - не что иное как буквы "йц". Как только искомая последовательность найдена, надо подниматься по файлу до кода 0xd (это код типа ресурса = 13). Рядом с ним лежит и номер ресурса.
Что известно о формате ресурсов?
Посмотрим на ресурс 309.13:0000000: FF 0D 00 FF-35 01 30 10-E2 01 00 00-16 00 58 47 Код ресурса и номер ресурса. 0000010: 01 00 35 00-00 00 06 00-16 00 02 00-22 00 08 00 0000020: 3A 00 5E 38-1D 5B 2A 36-03 03 02 02-01 01 3A 45 0000030: 28 00 32 00-01 04 10 1B-1E 28 2C 34-29 29 01 03 0000040: 47 49 4B 4D-4F 53 4A 00-D0 00 66 01-DC 01 DC 01 Что это такое - знает только IBM... 0000050: DC 01 DC 01-DC 01 04 00-01 39 00 00-CE 01 2D 00 С двух нулей по адресу 0x5C началась раскладка верхнего регистра. Символы лежат в двухбайтной кодировке ('-' лежит как 0x2d 0x00). 0000060: 2F 00 22 00-3A 00 2C 00-2E 00 5F 00-3F 00 25 00 0000070: 21 00 3B 00-08 00 09 00-B7 01 C4 01-C1 01 B8 01 Что такое 08 00 и 09 00 знает только IBM (есть мнение, что это backspace и tab). А с адреса 0x78 началась раскладка буквенных клавиш в том порядке, как они находятся на клавиатуре (йцукенг...). Обратим внимание на то, что 0x1c4-0x1b7=13='ц'-'й'. Значит символы закодированы в порядке следования в русском алфивите. 0000080: B3 01 BB 01-B1 01 C6 01-C7 01 B5 01-C3 01 C8 01 0000090: 0D 00 00 00-C2 01 C9 01-B0 01 AE 01-BD 01 BE 01 C2 01 - это ряд "фыва..." 00000A0: BC 01 B9 01-B2 01 B4 01-CB 01 7C 00-00 00 29 00 00000B0: CD 01 C5 01-BF 01 BA 01-B6 01 C0 01-CA 01 AF 01 А это уже "ячсм..." 00000C0: CC 01 CF 01-00 00 2A 00-00 00 20 00-4A 4A 2D 00 Снова нечто непонятное... 00000D0: 4E 4E 2B 00-5A 5C 0D 00-00 00 2F 00-03 00 01 39 00000E0: 00 00 31 00-32 00 33 00-34 00 35 00-36 00 37 00 ... и вот пошло все сначала, но для верхнего регистра. 00000F0: 38 00 39 00-30 00 3D 00-5C 00 08 00-00 00 97 01Я предполагаю, что для других раскладок построение аналогично.
Так как же менять раскладку клавиатуры ?
- Делаем резервную копию PMMERGE.DLL
- Копируем PMMERGE.DLL во временный каталог.
- Запускаем res -x pmmerge.dll 309.13 old_309 Старая раскладка для ru443 помещается в файл old_309.
- Правим раскладку в файле old_309
- Запускаем res -a pmmerge.dll old_309 Поправленный ресурс оказывается в pmmerge.dll
- Копируем PMMERGE.DLL в \OS2\DLL.
- Ставим раскладку клавиатуры RU443 (в config.sys или ч/з Selective install).
- Если захочется вернуть все назад, то возвращаем назад резервную копию PMMERGE.DLL.
А проще можно?
Да, можно. Вариант раскладки RU443 можно скачать здесь (архив pmmutil.zip). Внутри есть README. После применения рекомендуется поправить keyboard.dcp. Благо его можно править более цивилизованным методом (редактор идет с русификатором Layer/2).Как отключить стандартную переключалку клавиатуры?
Для тех, кому надоело пищание при штатном переключении по ALT+SHIFT, привожу рецепт, который прислал мне Ivan Klimenko (кто автор - не знаю):Ignore Alt-LShift and Alt-RShift. KBDBASE SYS 31061 6.02.99 14:18 e:\os2\boot\KBDBASE.OLD and e:\os2\boot\KBDBASE.SYS Offset Old New 004111 57 81 004112 B6 4C 004113 01 0C 004114 E8 00 004115 55 04 004116 F8 80 004117 26 0E 004118 8B 22 004119 55 01 00411A 0E 04 00411B 06 C6 00411C 52 44 00411D 50 01 00411E 8B FF 00411F C2 E9 004120 8E 94 004121 06 00 ------------------------------------------------------------ Если у вас другой билд KBDBASE, найдите по аналогии и подправьте [0] - это начало Layer_HKey [1] - "проглатываем" пакет [2] и [3] по задумке не должны были пускать пакет в VKBD но фактически это не срабатывает. По этому прилагается патч для VKBD. kbdbase.sys 000040E3: C3 retn ; [0] 000040E4: 53 push bx 000040E5: 8B5C06 mov bx,[si][00006] 000040E8: 81E3080A and bx,00A08 000040EC: 81FB0802 cmp bx,00208 000040F0: 7503 jne 0000040F5 000040F2: EB0A jmps 0000040FE 000040F4: 90 nop 000040F5: 81FB0808 cmp bx,00808 000040F9: 7403 je 0000040FE 000040FB: E9B800 jmp 0000041B6 000040FE: 8A6401 mov ah,[si][00001] 00004101: 80FC2A cmp ah,02A 00004104: 7503 jne 000004109 00004106: EB09 jmps 000004111 00004108: 90 nop 00004109: 80FC36 cmp ah,036 0000410C: 7403 je 000004111 0000410E: E9A500 jmp 0000041B6 00004111: 814C0C0004 or w,[si][0000C],00400 ; [1] 00004116: 800E220104 or b,[00122],004 ; [2] 0000411B: C64401FF mov b,[si][00001],0FF ; [3] 0000411F: E99400 jmp 0000041B6 Если кого-то смущает патч - того же эффекта можно добится, пересобрав KBDBASE из исходников DDK. Те исходники, что есть у меня -- от 8.209. Imho в этом случае патч лучше, чем работа на "устаревшем" KBDBASE. ------------------------------------------------------------ Ignore Alt-LShift and Alt-RShift in VDM. VKBD SYS 25607 26.08.98 4:41 e:\os2\mdos\VKBD.OLD and e:\os2\mdos\VKBD.SYS Offset Old Hex 003C61 75 EB 003CCD 75 EB ------------------------------------------------------------ vkbd.sys 00003C42: 6A00 push 000 00003C44: E8DB050000 call 000004224 00003C49: 66A351000700 mov [000070051],ax 00003C4F: 66A316010700 mov [000070116],ax 00003C55: F6C402 test ah,002 00003C58: 745A je 000003CB4 00003C5A: 803D4E0007002A cmp b,[00007004E],02A ; [*] 00003C61: EB51 jmps 000003CB4 00003C63: 66813D470007005703 cmp w,[000070047],00357 00003C6C: 7421 je 000003C8F ... 00003CAF: EB5E jmps 000003D0F 00003CB1: 90 nop 00003CB2: 90 nop 00003CB3: 90 nop 00003CB4: F6055200070002 test b,[000070052],002 00003CBB: 7509 jne 000003CC6 00003CBD: F6055200070008 test b,[000070052],008 00003CC4: 7449 je 000003D0F 00003CC6: 803D4E00070036 cmp b,[00007004E],036 ; [*] 00003CCD: EB40 jmps 000003D0F ; [*] 00003CCF: B897040000 mov eax,000000497 00003CD4: C60000 mov b,[eax],000 00003CD7: 66813D470007005703 cmp w,[000070047],00357 00003CE0: 7421 je 000003D03Для тех, кому лень править по приведенному рецепту - здесь можно взять уже исправленные KBDBASE.SYS и VKBD.SYS.
Благодарности.
Я хочу поблагодарить всех, кто участвовал в обсуждении проблемы изменения раскладок клавиатуры, писал мне письма с вопросами и делился со мной полезными утилитами. Особую благодарность надо вынести Eugen Kuleshov как человеку, который подал идею написать эту самую статью.Сергей Коган
http://www.omskelecom.ru/users/kogan
Безвозмездное распространение статьи со ссылкой на автора приветствуется.
Интересные ссылки:
Комментариев к странице: 0 | Добавить комментарий
Домой | Проект ядро Core/2 | Проект OS/4 Download | Новости | Гостевая книга | Подробно обо всем | Нужные программы | Проекты | OS/2 FAQ | Всячина | За и Против | Металлолом | #OS2Russian | RDM/2 | Весёлые картинки | Наша галерея | Доска объявлений | Карта сайта | ПОИСК | ФОРУМ