Как изменить русскую раскладку клавиатуры в 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
Я предполагаю, что для других раскладок построение аналогично.

Так как же менять раскладку клавиатуры ?

  1. Делаем резервную копию PMMERGE.DLL
  2. Копируем PMMERGE.DLL во временный каталог.
  3. Запускаем res -x pmmerge.dll 309.13 old_309 Старая раскладка для ru443 помещается в файл old_309.
  4. Правим раскладку в файле old_309
  5. Запускаем res -a pmmerge.dll old_309 Поправленный ресурс оказывается в pmmerge.dll
  6. Копируем PMMERGE.DLL в \OS2\DLL.
  7. Ставим раскладку клавиатуры RU443 (в config.sys или ч/з Selective install).
  8. Если захочется вернуть все назад, то возвращаем назад резервную копию 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 | Весёлые картинки | Наша галерея | Доска объявлений | Карта сайта | ПОИСК | ФОРУМ