23#include <Library/BaseLib.h>
24#include <Library/BaseMemoryLib.h>
25#include <Library/DebugLib.h>
26#include <Library/MemoryAllocationLib.h>
30#include <Library/TimerLib.h>
31#include <Library/UefiBootServicesTableLib.h>
34#define KEY_MAP_AGGREGATOR_DATA_SIGNATURE \
35 SIGNATURE_32 ('K', 'e', 'y', 'A')
38#define KEY_MAP_AGGREGATOR_DATA_FROM_AGGREGATOR_THIS(This) \
41 KEY_MAP_AGGREGATOR_DATA, \
43 KEY_MAP_AGGREGATOR_DATA_SIGNATURE \
47#define KEY_MAP_AGGREGATOR_DATA_FROM_DATABASE_THIS(This) \
50 KEY_MAP_AGGREGATOR_DATA, \
52 KEY_MAP_AGGREGATOR_DATA_SIGNATURE \
67#define APPLE_KEY_STROKES_INFO_SIGNATURE SIGNATURE_32 ('K', 'e', 'y', 'S')
70#define APPLE_KEY_STROKES_INFO_FROM_LIST_ENTRY(Entry) \
73 APPLE_KEY_STROKES_INFO, \
75 APPLE_KEY_STROKES_INFO_SIGNATURE \
78#define SIZE_OF_APPLE_KEY_STROKES_INFO \
79 OFFSET_OF (APPLE_KEY_STROKES_INFO, KeyCodes)
105 KeyStrokesInfo = NULL;
108 Entry = GetFirstNode (&KeyMapAggregatorData->KeyStrokesInfoList);
109 !IsNull (&KeyMapAggregatorData->KeyStrokesInfoList, Entry);
110 Entry = GetNextNode (&KeyMapAggregatorData->KeyStrokesInfoList, Entry)
115 if (KeyStrokesInfoWalker->
Index == Index) {
116 KeyStrokesInfo = KeyStrokesInfoWalker;
122 return KeyStrokesInfo;
152 IN OUT UINTN *NumberOfKeyCodes,
163 UINTN DbNumberOfKeyCodestrokes;
171 DbNumberOfKeyCodestrokes = 0;
181 DbModifiers |= KeyStrokesInfo->
Modifiers;
184 Key = KeyStrokesInfo->
KeyCodes[Index];
186 for (Index2 = 0; Index2 < DbNumberOfKeyCodestrokes; ++Index2) {
192 if (Index2 == DbNumberOfKeyCodestrokes) {
193 KeyMapAggregatorData->
KeyCodeBuffer[DbNumberOfKeyCodestrokes] = Key;
194 ++DbNumberOfKeyCodestrokes;
199 Result = (BOOLEAN)(DbNumberOfKeyCodestrokes > *NumberOfKeyCodes);
201 *NumberOfKeyCodes = DbNumberOfKeyCodestrokes;
203 Status = EFI_BUFFER_TOO_SMALL;
206 *Modifiers = DbModifiers;
208 Status = EFI_SUCCESS;
210 if (KeyCodes != NULL) {
214 (DbNumberOfKeyCodestrokes * sizeof (*KeyCodes))
227 IN UINTN NumCheckKeys,
228 IN BOOLEAN ExactMatch
234 if (ExactMatch && (NumKeys != NumCheckKeys)) {
238 for (CheckIndex = 0; CheckIndex < NumCheckKeys; ++CheckIndex) {
239 for (Index = 0; Index < NumKeys; ++Index) {
240 if (CheckKeys[CheckIndex] == Keys[Index]) {
245 if (NumKeys == Index) {
267 IN BOOLEAN FlushConsole
283 Status = KeyMap->GetKeyStrokes (
290 if (EFI_ERROR (Status)) {
291 DEBUG ((DEBUG_ERROR,
"OCKM: GetKeyStrokes failure - %r\n", Status));
295 if ((Key != 0) && !
OcKeyMapHasKey (Keys, NumKeys, Key) && (Modifiers == 0)) {
299 if ((Key == 0) && (NumKeys == 0) && (Modifiers == 0)) {
335 IN UINTN NumberOfKeyCodes,
337 IN BOOLEAN ExactMatch
343 UINTN DbNumberOfKeyCodes;
348 Status = This->GetKeyStrokes (
355 if (EFI_ERROR (Status)) {
360 if (DbModifiers != Modifiers) {
363 }
else if ((DbModifiers & Modifiers) != Modifiers) {
375 return EFI_NOT_FOUND;
402 IN UINTN BufferLength,
409 UINTN TotalBufferLength;
423 Buffer = AllocateZeroPool (TotalBufferLength *
sizeof (*
Buffer));
427 Status = EFI_OUT_OF_RESOURCES;
430 KeyStrokesInfo = AllocateZeroPool (
432 + (BufferLength *
sizeof (*
Buffer))
435 Status = EFI_OUT_OF_RESOURCES;
437 if (KeyStrokesInfo != NULL) {
444 &KeyStrokesInfo->
Link
447 Status = EFI_SUCCESS;
449 *Index = KeyStrokesInfo->
Index;
484 KeyMapAggregatorData,
488 Status = EFI_NOT_FOUND;
490 if (KeyStrokesInfo != NULL) {
493 RemoveEntryList (&KeyStrokesInfo->
Link);
494 gBS->FreePool ((VOID *)KeyStrokesInfo);
496 Status = EFI_SUCCESS;
529 IN UINTN NumberOfKeyCodes,
541 KeyMapAggregatorData,
545 Status = EFI_NOT_FOUND;
547 if (KeyStrokesInfo != NULL) {
548 Status = EFI_OUT_OF_RESOURCES;
555 (VOID *)&KeyStrokesInfo->
KeyCodes[0],
557 (NumberOfKeyCodes * sizeof (*KeyCodes))
560 Status = EFI_SUCCESS;
599 EFI_HANDLE NewHandle;
604 if (EFI_ERROR (Status) || EFI_ERROR (Status2)) {
605 DEBUG ((DEBUG_ERROR,
"OCKM: Uninstall failed - %r/%r\n", Status, Status2));
609 Status =
gBS->LocateProtocol (
614 Status2 =
gBS->LocateProtocol (
620 if (!EFI_ERROR (Status2)) {
624 if (!EFI_ERROR (Status)) {
629 }
else if (!EFI_ERROR (Status)) {
637 KeyMapAggregatorData = AllocateZeroPool (
sizeof (*KeyMapAggregatorData));
639 if (KeyMapAggregatorData == NULL) {
658 Status =
gBS->InstallMultipleProtocolInterfaces (
661 (VOID *)&KeyMapAggregatorData->
Database,
666 if (EFI_ERROR (Status)) {
667 FreePool (KeyMapAggregatorData);
APPLE_HID_USAGE APPLE_KEY_CODE
UINT16 APPLE_MODIFIER_MAP
#define APPLE_KEY_MAP_AGGREGATOR_PROTOCOL_REVISION
EFI_GUID gAppleKeyMapAggregatorProtocolGuid
#define APPLE_KEY_MAP_DATABASE_PROTOCOL_REVISION
EFI_GUID gAppleKeyMapDatabaseProtocolGuid
#define ARRAY_SIZE(Array)
APPLE_KEY_MAP_AGGREGATOR_PROTOCOL * OcAppleKeyMapInstallProtocols(IN BOOLEAN Reinstall)
VOID OcKeyMapFlush(IN APPLE_KEY_MAP_AGGREGATOR_PROTOCOL *KeyMap, IN APPLE_KEY_CODE Key, IN BOOLEAN FlushConsole)
STATIC EFI_STATUS EFIAPI InternalRemoveKeyStrokesBuffer(IN APPLE_KEY_MAP_DATABASE_PROTOCOL *This, IN UINTN Index)
BOOLEAN OcKeyMapHasKeys(IN CONST APPLE_KEY_CODE *Keys, IN UINTN NumKeys, IN CONST APPLE_KEY_CODE *CheckKeys, IN UINTN NumCheckKeys, IN BOOLEAN ExactMatch)
STATIC EFI_STATUS EFIAPI InternalGetKeyStrokes(IN APPLE_KEY_MAP_AGGREGATOR_PROTOCOL *This, OUT APPLE_MODIFIER_MAP *Modifiers, IN OUT UINTN *NumberOfKeyCodes, OUT APPLE_KEY_CODE *KeyCodes OPTIONAL)
STATIC EFI_STATUS EFIAPI InternalSetKeyStrokeBufferKeys(IN APPLE_KEY_MAP_DATABASE_PROTOCOL *This, IN UINTN Index, IN APPLE_MODIFIER_MAP Modifiers, IN UINTN NumberOfKeyCodes, IN APPLE_KEY_CODE *KeyCodes)
STATIC APPLE_KEY_STROKES_INFO * InternalGetKeyStrokesByIndex(IN KEY_MAP_AGGREGATOR_DATA *KeyMapAggregatorData, IN UINTN Index)
#define KEY_MAP_AGGREGATOR_DATA_SIGNATURE
#define KEY_MAP_AGGREGATOR_DATA_FROM_DATABASE_THIS(This)
APPLE_KEY_MAP_DATABASE_PROTOCOL * OcAppleKeyMapGetDatabase(VOID)
STATIC APPLE_KEY_MAP_DATABASE_PROTOCOL * mKeyMapDatabase
STATIC EFI_STATUS EFIAPI InternalCreateKeyStrokesBuffer(IN APPLE_KEY_MAP_DATABASE_PROTOCOL *This, IN UINTN BufferLength, OUT UINTN *Index)
#define SIZE_OF_APPLE_KEY_STROKES_INFO
BOOLEAN OcKeyMapHasKey(IN CONST APPLE_KEY_CODE *Keys, IN UINTN NumKeys, IN CONST APPLE_KEY_CODE KeyCode)
#define APPLE_KEY_STROKES_INFO_SIGNATURE
#define KEY_MAP_AGGREGATOR_DATA_FROM_AGGREGATOR_THIS(This)
#define APPLE_KEY_STROKES_INFO_FROM_LIST_ENTRY(Entry)
STATIC EFI_STATUS EFIAPI InternalContainsKeyStrokes(IN APPLE_KEY_MAP_AGGREGATOR_PROTOCOL *This, IN APPLE_MODIFIER_MAP Modifiers, IN UINTN NumberOfKeyCodes, IN OUT APPLE_KEY_CODE *KeyCodes, IN BOOLEAN ExactMatch)
#define OC_KEY_MAP_DEFAULT_SIZE
EFI_STATUS OcUninstallAllProtocolInstances(EFI_GUID *Protocol)
VOID OcConsoleFlush(VOID)
#define OC_MINIMAL_CPU_DELAY
OC_TYPING_BUFFER_ENTRY Buffer[OC_TYPING_BUFFER_SIZE]
VOID *EFIAPI CopyMem(OUT VOID *DestinationBuffer, IN CONST VOID *SourceBuffer, IN UINTN Length)
UINTN EFIAPI MicroSecondDelay(IN UINTN MicroSeconds)
KEY_MAP_GET_KEY_STROKES GetKeyStrokes
KEY_MAP_CONTAINS_KEY_STROKES ContainsKeyStrokes
KEY_MAP_CREATE_KEY_STROKES_BUFFER CreateKeyStrokesBuffer
KEY_MAP_REMOVE_KEY_STROKES_BUFFER RemoveKeyStrokesBuffer
KEY_MAP_SET_KEY_STROKES_KEYS SetKeyStrokeBufferKeys
UINTN KeyCodeBufferLength
APPLE_KEY_CODE KeyCodes[]
APPLE_MODIFIER_MAP Modifiers
UINTN KeyCodeBufferLength
APPLE_KEY_MAP_DATABASE_PROTOCOL Database
APPLE_KEY_CODE * KeyCodeBuffer
APPLE_KEY_MAP_AGGREGATOR_PROTOCOL Aggregator
LIST_ENTRY KeyStrokesInfoList