HID shared memory is a 0x40000 byte read-only segment of memory shared between applications for input. The segment contains structures for most if not all input methods available to applications.
Memory Map
| Offset | Size in bytes | Description | 
| 0x0 | 0x400 | Unknown, Header? | 
| 0x400 | 0x3000 | Capacitive Touchscreen | 
| 0x3400 | 0x400 | Mouse | 
| 0x3800 | 0x400 | Keyboard | 
| 0x3C00 | 0x400 | Unknown, header and 17 entries | 
| 0x4000 | 0x400 | Unknown, header and 17 entries | 
| 0x4400 | 0x400 | Unknown, header and 17 entries | 
| 0x4800 | 0x400 | Unknown, header and 17 entries | 
| 0x4C00 | 0x200 | Unknown | 
| 0x4E00 | 0x200 | Unknown | 
| 0x5000 | 0x200 | Unknown | 
| 0x5200 | 0x800 | Unknown | 
| 0x5A00 | 0x4000 | Controller Serials? | 
| 0x9A00 | 0x32000 | Controllers | 
| 0x3BA00 | 0x4600 | Unknown | 
Capacitive Touchscreen
| Offset | Size in bytes | Description | 
| 0x0 | 0x28 | Touch Header | 
| 0x28 | 0x290 * 17 | Touch Entries | 
| Offset | Size in bytes | Description | 
| 0x0 | 0x8 | Timestamp | 
| 0x8 | 0x8 | Number of Entries, always 17 | 
| 0x10 | 0x8 | Latest Entry Index | 
| 0x18 | 0x8 | Maximum Entry Index, always 16 | 
| 0x20 | 0x8 | Timestamp | 
Touch Entry
| Offset | Size in bytes | Description | 
| 0x0 | 0x10 | Touch Entry Header | 
| 0x10 | 0x28 * 16 | Touch Data | 
| Offset | Size in bytes | Description | 
| 0x0 | 0x8 | Timestamp | 
| 0x8 | 0x8 | Number of Touches | 
Touch Data Entry
| Offset | Size in bytes | Description | 
| 0x0 | 0x8 | Timestamp | 
| 0x8 | 0x8 | Unknown | 
| 0x10 | 0x4 | Touch X | 
| 0x14 | 0x4 | Touch Y | 
| 0x18 | 0x4 | Touch Diameter X | 
| 0x1C | 0x4 | Touch Diameter Y | 
| 0x20 | 0x4 | Angle | 
| 0x24 | 0x4 | Unknown | 
Mouse
| Offset | Size in bytes | Description | 
| 0x0 | 0x20 | Mouse Header | 
| 0x20 | 0x30 * 17 | Mouse Entries | 
| Offset | Size in bytes | Description | 
| 0x0 | 0x8 | Timestamp | 
| 0x8 | 0x8 | Number of Entries, always 17 | 
| 0x10 | 0x8 | Latest Entry Index | 
| 0x18 | 0x8 | Maximum Entry Index, always 16 | 
Mouse Entry
| Offset | Size in bytes | Description | 
| 0x0 | 0x8 | Timestamp | 
| 0x8 | 0x8 | Timestamp Again? | 
| 0x10 | 0x4 | Mouse X | 
| 0x14 | 0x4 | Mouse Y | 
| 0x18 | 0x4 | Mouse X Change | 
| 0x1C | 0x4 | Mouse Y Change | 
| 0x20 | 0x4 | Scroll Change Y | 
| 0x24 | 0x4 | Scroll Change X? | 
| 0x28 | 0x8 | Mouse Buttons | 
Keyboard
| Offset | Size in bytes | Description | 
| 0x0 | 0x20 | Keyboard Header | 
| 0x20 | 0x30 * 17 | Keyboard Entries | 
| Offset | Size in bytes | Description | 
| 0x0 | 0x8 | Timestamp | 
| 0x8 | 0x8 | Number of Entries, always 17 | 
| 0x10 | 0x8 | Latest Entry Index | 
| 0x18 | 0x8 | Maximum Entry Index, always 16 | 
Keyboard Entry
| Offset | Size in bytes | Description | 
| 0x0 | 0x8 | Timestamp | 
| 0x8 | 0x8 | Timestamp Again? | 
| 0x10 | 0x8 | Modifier Mask | 
| 0x18 | 0x20 | Keys Down, each key gets one bit based on the HID keyboard scan code (F1 is 0x3A, bit 0x3A is set) | 
Controller Serials?
This section contains a series of 16 structures 0x400 bytes large.
| Offset | Size in bytes | Description | 
| 0x30 | 0xE | Controller Serial | 
| 0x60 | 0xE | Controller Serial | 
Controllers
This section contains a series of 10 0x5000 byte structures describing each available controller.
| Controller Index | Description | 
| 0 to 7 | Players 1 to 8 | 
| 8 | Handheld Mode | 
| 9 | Unknown | 
Controller
| Offset | Size in bytes | Description | 
| 0x0 | 0x28 | Controller Header | 
| 0x28 | 0x20 header + 0x30 * 17 | Controller Pro Controller State | 
| 0x378 | 0x20 header + 0x30 * 17 | Controller Handheld Joined State | 
| 0x6C8 | 0x20 header + 0x30 * 17 | Controller Joined State (Lone Joy-Con or Pair of Joy-Con) | 
| 0xA18 | 0x20 header + 0x30 * 17 | Controller Left State (Vertical Controls w/ Joy-Con Half) | 
| 0xD68 | 0x20 header + 0x30 * 17 | Controller Right State (Vertical Controls w/ Joy-Con Half) | 
| 0x10B8 | 0x20 header + 0x30 * 17 | Controller Main State (No Analog Sticks) | 
| 0x1408 | 0x20 header + 0x30 * 17 | Controller Main State | 
| 0x41D0 | 0x10 | Controller MAC | 
| 0x41F0 | 0x10 | Controller MAC | 
| Offset | Size in bytes | Description | 
| 0x0 | 0x4 | Status, bit0 Pro Controller/HID controller, bit1 wired for handheld, bit2 pair, bit3 left, bit4 right | 
| 0x4 | 0x4 | Is Joy-Con Half | 
| 0x8 | 0x4 | bit1 color set does not exist | 
| 0xC | 0x4 | RGBA Body Color (single Joy-Con or Pro Controller) | 
| 0x10 | 0x4 | RGBA Button Color (single Joy-Con or Pro Controller) | 
| 0x14 | 0x4 | bit1 color set does not exist | 
| 0x18 | 0x4 | RGBA Body Color (right Joy-Con) | 
| 0x1C | 0x4 | RGBA Button Color (right Joy-Con) | 
| 0x20 | 0x4 | RGBA Body Color (left Joy-Con) | 
| 0x24 | 0x4 | RGBA Button Color (left Joy-Con) | 
| Offset | Size in bytes | Description | 
| 0x0 | 0x8 | Timestamp | 
| 0x8 | 0x8 | Number of entries, always 17 | 
| 0x10 | 0x8 | Latest Entry Index | 
| 0x18 | 0x8 | Maximum Entry Index, always 16 | 
Controller State
| Offset | Size in bytes | Description | 
| 0x0 | 0x8 | Timestamp | 
| 0x8 | 0x8 | Timestamp Again | 
| 0x10 | 0x8 | Button State | 
| 0x18 | 0x4 | Left Joystick X | 
| 0x1C | 0x4 | Left Joystick Y | 
| 0x20 | 0x4 | Right Joystick X | 
| 0x24 | 0x4 | Right Joystick Y | 
| 0x28 | 0x8 | Controller State (bit0 connected, bit1 wired) | 
Button State
| Bit | Button | 
| 0 | A | 
| 1 | B | 
| 2 | X | 
| 3 | Y | 
| 4 | Left Stick Pressed | 
| 5 | Right Stick Pressed | 
| 6 | L | 
| 7 | R | 
| 8 | ZL | 
| 9 | ZR | 
| 10 | Plus | 
| 11 | Minus | 
| 12 | Left | 
| 13 | Up | 
| 14 | Right | 
| 15 | Down | 
| 16 | Left Stick Left | 
| 17 | Left Stick Up | 
| 18 | Left Stick Right | 
| 19 | Left Stick Down | 
| 20 | Right Stick Left | 
| 21 | Right Stick Up | 
| 22 | Right Stick Right | 
| 23 | Right Stick Down | 
| 24 | SL | 
| 25 | SR |