Windows Platform Development Site     All Products  |   Support  |   Search  |   microsoft.com Home  
microsoft.com Home 
  Platform Development  |   Site Map  |   Platform Development Japan  |

Scan Code Mapper for Windows

In Microsoft® Windows® operating systems, PS/2-compatible scan codes provided by an input device are converted into virtual keys, which are propagated through the system in the form of Windows messages. If a device produces an incorrect scan code for a certain key, the wrong virtual key message will be sent. This can be fixed by writing a filter driver that analyzes the scan codes generated by firmware and modifies the incorrect scan code to one understood by the system. However, this is a tedious process and can sometimes lead to severe problems, if errors exist in the kernel-level filter driver.

Windows 2000 and Windows XP include a new Scan Code Mapper, which provides a method that allows for mapping of scan codes. The scan code mappings for Windows are stored in the following registry key:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control
	\Keyboard Layout

IMPORTANT: There is also a Keyboard Layouts key (notice the plural form) under the Control key, but that key should not be modified.

In the Keyboard Layout key, the Scancode Map value must be added. This value is of type REG_BINARY and has the data format specified in the following table.

Start offset
(in bytes)
Size
(in bytes)
Data
0 4 Header: Version Information
4 4 Header: Flags
8 4 Header: Number of Mappings
12 4 Individual Mappings
Last 4 bytes 4 Null Terminator (0x00000000)

The first and second DWORDS store header information and should be set to all zeroes for the current version of the Scan Code Mapper. The third DWORD entry holds a count of the total number of mappings that follow, including the null terminating mapping. The minimum count would therefore be 1 (no mappings specified). The individual mappings follow the header. Each mapping is one DWORD in length and is divided into two WORD length fields. Each WORD field stores the scan code for a key to be mapped.

Once the map is stored in the registry, the system must be rebooted for the mappings to take effect. Note that if the mapping of a scan code is necessary on a keypress, the step is performed in user mode just before the scan code is converted to a virtual key. Doing this conversion in user mode can present certain limitations, such as mapping not working correctly when running under Terminal Services.

The following presents an example. To swap the left CTRL key with the CAPS LOCK key, use a registry editor (preferably Regedt32.exe) to modify the registry key described earlier. The following value is stored in the Scancode Map key:

00000000 00000000 0300000000 3A001D00 1D003A00 00000000

It is important to remember that entries stored in the registry are always in little Endian format. The following table contains these entries broken into DWORD fields and the bytes swapped.

Value Interpretation
0x00000000 Header: Version. Set to all zeroes.
0x00000000 Header: Flags. Set to all zeroes.
0x00000003 Three entries in the map (including null entry).
0x001D003A Left CTRL key --> CAPS LOCK (0x1D --> 0x3A).
0x003A001D CAPS LOCK --> Left CTRL key (0x3A --> 0x1D).
0x00000000 Null terminator.

To remove these mappings, the following registry value must be deleted and then the system must be rebooted:

HKEY_LOCAL_MACHINE\ SYSTEM\CurrentControlSet\Control
	\Keyboard Layout\Scancode Map

It is also possible to add a key not generally available on a keyboard or to remove a key that is never used. The following example shows the value stored in Scancode Map to remove the right CTRL key and change the functionality of the right ALT key to work as a mute key:

00000000 00000000 03000000 00001DE0 20E038E0 00000000

Value Interpretation
0x00000000 Header: Version. Set to all zeroes.
0x00000000 Header: Flags. Set to all zeroes.
0x00000003 Three entries in the map (including null entry).
0xE01D0000 Remove the right CTRL key (0xE01D --> 0x00).
0xE038E020 Right ALT key --> Mute key (0xE038 --> 0xE020).
0x00000000 Null terminator.

After the necessary data is generated, it can be inserted into the registry in several ways.

  • A .reg file can be generated that can be easily incorporated into the system registry using a registry editor such as Regedit.exe.
  • An .ini file can be created that contains the necessary information to be added to the registry using Regini.exe.
  • An .inf file can also be created with an [AddReg] section that contains the registry information to be added.
  • Regedt32.exe can be used to manually add the information to the registry.

The Scan Code Mapper has several advantages and disadvantages. The advantages include:

  • The Mapper can be used as an easy fix to correct firmware errors.
  • Frequently used keys can be added to the keyboard by modifying the map in registry. Keys that aren't often used (for example, right CTRL key) can be mapped to null (removed) or exchanged for other keys.
  • Key locations can be altered easily. Users can easily customize the location of frequently used keys for their benefit.

The following disadvantages are recognized:

  • Once the map is stored in the registry, a system reboot is required to activate it.
  • The mappings stored in the registry work at system level and apply to all users. These mappings cannot be set to work differently depending on the current user.
  • The current implementation restricts the functionality of the map such that mappings always apply to all keyboards connected to the system. It is not currently possible to create a map on a per-keyboard basis.

Last Updated: December 4, 2001

  Contact Us   |   E-mail this Page   |   Microsoft Hardware Newsletter
  © 2001 - 2003 Microsoft Corporation. All rights reserved.     Terms of Use    Privacy Statement     Accessibility