Skip to content

Instantly share code, notes, and snippets.

@frkd-dev
Last active June 27, 2023 08:24
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save frkd-dev/bc2b0a129c6cba20d98afca7ce32dcd7 to your computer and use it in GitHub Desktop.
Save frkd-dev/bc2b0a129c6cba20d98afca7ce32dcd7 to your computer and use it in GitHub Desktop.
AppleKeyboardLayouts Binary Template for 010 Editor
//------------------------------------------------
//--- 010 Editor v13.0.2 Binary Template
//
// File: /System/Library/Keyboard Layouts/AppleKeyboardLayouts.bundle/Contents/Resources/AppleKeyboardLayouts-L.dat
// Authors: vit9696, frkd_dev
// Version: 0.2
// Purpose: Keyboard layout decoding (replacement of USBKeyboardLayouts.plist)
// Category: Operating System
// File Mask: *.dat
// ID Bytes: 02 EF CD AB
// History: 0.2 - parsing of the whole file with data
// 0.1 - published at https://github.com/acidanthera/OpenCorePkg/blob/master/Utilities/AppleKeyboardLayouts/AppleKeyboardLayouts.bt
// Copyright (c) 2023 frkd_dev
// Copyright (c) 2018 vit9696
//------------------------------------------------
typedef struct {
uint32 magic;
uint32 entriesCount;
uint32 entriesTableOffset;
uint32 unkZero1;
uint32 unkDataOffset1;
uint32 unkDataOffset2;
} Header;
typedef struct {
uint32 zero;
uint32 keyLayoutNameOffset; /* e.g. Czech-QWERTY */
uint32 keyLayoutNumberOffset; /* e.g. 30778 */
uint32 flags; /* ScriptCode? */
uint32 locale; /* e.g. cs */
uint32 unkFlags;
uint32 keyLayoutDataSize;
uint32 keyLayoutDataOffset;
uint32 unicodeRangesSize;
uint32 unicodeRangesOffset;
uint32 iconSize;
uint32 iconOffset;
uint32 modPlistSize;
uint32 modPlistOffset;
uint32 plistSize;
uint32 plistOffset;
} EntryInfo;
typedef struct {
local int i;
Header header;
Assert(header.magic == 0xABCDEF02, "Invalid magic!");
FSeek(header.entriesTableOffset);
EntryInfo entriesTable[header.entriesCount];
uint32 unkData1[414] <comment = "Unidentified data set #1">;
uint32 unkData2[414] <comment = "Unidentified data set #2">;
for (i = 0; i < header.entriesCount; i++) {
FSeek(entriesTable[i].keyLayoutNameOffset);
struct LayoutData {
string layoutName;
if (entriesTable[i].locale != 0) {
FSeek(entriesTable[i].locale);
string locale;
}
FSeek(entriesTable[i].keyLayoutDataOffset);
byte layout[entriesTable[i].keyLayoutDataSize];
FSeek(entriesTable[i].unicodeRangesOffset);
wchar_t unicodeRange[entriesTable[i].unicodeRangesSize];
if (entriesTable[i].iconOffset != 0 && entriesTable[i].iconSize != 0) {
FSeek(entriesTable[i].iconOffset);
byte icon[entriesTable[i].iconSize];
}
if (entriesTable[i].modPlistOffset != 0 && entriesTable[i].modPlistSize != 0) {
FSeek(entriesTable[i].modPlistOffset);
byte modPlist[entriesTable[i].modPlistSize];
}
if (entriesTable[i].plistOffset != 0 && entriesTable[i].plistSize != 0) {
FSeek(entriesTable[i].plistOffset);
//#include "BPlist.bt"
byte plist[entriesTable[i].plistSize];
}
} data;
}
} KeyboardLayout;
KeyboardLayout keyboardLayoutFile;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment