Last active
June 27, 2023 08:24
-
-
Save frkd-dev/bc2b0a129c6cba20d98afca7ce32dcd7 to your computer and use it in GitHub Desktop.
AppleKeyboardLayouts Binary Template for 010 Editor
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//------------------------------------------------ | |
//--- 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