Как изменить русскую раскладку клавиатуры в 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 | Весёлые картинки | Наша галерея | Доска объявлений | Карта сайта | ПОИСК | ФОРУМ