// // AppleProtocols.c // Clover // // Created by Slice on 14.10.16. // #include #include #include #include #include #include #include #include //#include #include #include #include #include #include #include //#include #include #include #include #include "Common.h" //#define APPLE_SMC_PROTOCOL_GUID {0x17407e5a, 0xaf6c, 0x4ee8, {0x98, 0xa8, 0x00, 0x21, 0x04, 0x53, 0xcd, 0xd9}} //#define APPLE_IMAGE_CODEC_PROTOCOL_GUID {0x0dfce9f6, 0xc4e3, 0x45ee, {0xa0, 0x6a, 0xa8, 0x61, 0x3b, 0x98, 0xa5, 0x07}} /****************************************************/ /**/ /** Installs our AppleSMC overrides. */ /** Original DataHub protocol. */ APPLE_SMC_IO_PROTOCOL gOrgAppleSMC; APPLE_SMC_IO_PROTOCOL *gAppleSMC; EFI_STATUS EFIAPI OvrReadData (IN APPLE_SMC_IO_PROTOCOL *This, IN SMC_KEY Key, IN SMC_DATA_SIZE Size, OUT SMC_DATA *Value ) { EFI_STATUS Status; CHAR8 Str[512]; CHAR8 StrSmall[10]; CHAR8 *Ptr; INTN i; Status = gOrgAppleSMC.SmcReadValue(This, Key, Size, Value); PRINT("->AppleSMC.SmcReadValue SMC=%x (%c%c%c%c) len=%d\n", Key, (Key >> 24) & 0xFF, (Key >> 16) & 0xFF, (Key >> 8) & 0xFF, Key & 0xFF, Size); AsciiSPrint(Str, 512, "--> data=:"); Ptr = &Str[10]; *Ptr++ = ' '; ASSERT(Size < sizeof(Str)-15); for (i=0; iAppleSMC.SmcWriteValue SMC=%x (%c%c%c%c) len=%d\n", Key, (Key >> 24) & 0xFF, (Key >> 16) & 0xFF, (Key >> 8) & 0xFF, Key & 0xFF, Size); AsciiSPrint(Str, 512, "--> data=:"); Ptr = &Str[10]; *Ptr++ = ' '; ASSERT(Size < sizeof(Str)-15); for (i=0; iAppleSMC.SmcGetKeyCount(%p), =>%d\n", Count, Count?(Count[3] + Count[2]*16):0); return Status; } EFI_STATUS EFIAPI OvrAddKey (IN APPLE_SMC_IO_PROTOCOL *This, IN SMC_KEY Key, IN SMC_DATA_SIZE Size, IN SMC_KEY_TYPE Type, IN SMC_KEY_ATTRIBUTES Attributes ) { EFI_STATUS Status; Status = gOrgAppleSMC.SmcAddKey(This, Key, Size, Type, Attributes); PRINT("->AppleSMC.SmcAddKey SMC=%x (%c%c%c%c) len=%d type=%a, attr=%x\n", Key, (Key >> 24) & 0xFF, (Key >> 16) & 0xFF, (Key >> 8) & 0xFF, Key & 0xFF, Size, Type, Attributes); return Status; } EFI_STATUS EFIAPI OvrKeyFromIndex (IN APPLE_SMC_IO_PROTOCOL *This, IN SMC_INDEX Index, OUT SMC_KEY *Key ) { EFI_STATUS Status; Status = gOrgAppleSMC.SmcGetKeyFromIndex(This, Index, Key); PRINT("->AppleSMC.SmcGetKeyFromIndex(%d), =>0x%x\n", Index, Key?*Key:0); return Status; } EFI_STATUS EFIAPI OvrGetKeyInfo (IN APPLE_SMC_IO_PROTOCOL *This, IN SMC_KEY Key, OUT SMC_DATA_SIZE *Size, OUT SMC_KEY_TYPE *Type, OUT SMC_KEY_ATTRIBUTES *Attributes ) { EFI_STATUS Status; Status = gOrgAppleSMC.SmcGetKeyInfo(This, Key, Size, Type, Attributes); PRINT("->AppleSMC.SmcGetKeyInfo SMC=%x (%c%c%c%c) len=%d type=%a, attr=%x\n", Key, (Key >> 24) & 0xFF, (Key >> 16) & 0xFF, (Key >> 8) & 0xFF, Key & 0xFF, Size?*Size:0, Type?*Type:0, Attributes?*Attributes:0); return Status; } EFI_STATUS EFIAPI OvrReset (IN APPLE_SMC_IO_PROTOCOL *This, IN UINT32 Mode ) { EFI_STATUS Status; Status = gOrgAppleSMC.SmcReset(This, Mode); PRINT("->AppleSMC.SmcReset(%d)\n", Mode); return Status; } /* EFI_STATUS EFIAPI OvrUnknown1 (IN APPLE_SMC_IO_PROTOCOL *This ) { EFI_STATUS Status; Status = gOrgAppleSMC.SmcUnknown1(This); PRINT("->AppleSMC.SmcUnknown1()\n"); return Status; } EFI_STATUS EFIAPI OvrUnknown2 (IN APPLE_SMC_IO_PROTOCOL *This, IN UINTN Unkn1, IN UINTN Unkn2 ) { EFI_STATUS Status; Status = gOrgAppleSMC.SmcUnknown2(This, Unkn1, Unkn2); PRINT("->AppleSMC.SmcUnknown2(0x%x, 0x%x)\n", Unkn1, Unkn2); return Status; } EFI_STATUS EFIAPI OvrUnknown3 (IN APPLE_SMC_IO_PROTOCOL *This, IN UINTN Unkn1, IN UINTN Unkn2 ) { EFI_STATUS Status; Status = gOrgAppleSMC.SmcUnknown3(This, Unkn1, Unkn2); PRINT("->AppleSMC.SmcUnknown3(0x%x, 0x%x)\n", Unkn1, Unkn2); return Status; } EFI_STATUS EFIAPI OvrUnknown4 (IN APPLE_SMC_IO_PROTOCOL *This, IN UINTN Mode ) { EFI_STATUS Status; Status = gOrgAppleSMC.SmcUnknown4(This, Mode); PRINT("->AppleSMC.SmcUnknown4(0x%x)\n", Mode); return Status; } EFI_STATUS EFIAPI OvrUnknown5 (IN APPLE_SMC_IO_PROTOCOL *This, IN UINTN Mode ) { EFI_STATUS Status; Status = gOrgAppleSMC.SmcUnknown5(This, Mode); PRINT("->AppleSMC.SmcUnknown5(0x%x)\n", Mode); return Status; } */ EFI_STATUS EFIAPI OvrAppleSMC(VOID) { EFI_STATUS Status; // PRINT("Overriding AppleSMC ...\n"); // Locate AppleSMC protocol Status = gBS->LocateProtocol(&gAppleSMCProtocolGuid, NULL, (VOID **) &gAppleSMC); if (EFI_ERROR(Status)) { PRINT("Error Overriding AppleSMC: %r\n", Status); return Status; } // Store originals CopyMem(&gOrgAppleSMC, gAppleSMC, sizeof(APPLE_SMC_IO_PROTOCOL)); // Override with our implementation gAppleSMC->SmcReadValue = OvrReadData; gAppleSMC->SmcWriteValue = OvrWriteValue; gAppleSMC->SmcGetKeyCount = OvrGetKeyCount; gAppleSMC->SmcAddKey = OvrAddKey; gAppleSMC->SmcGetKeyFromIndex = OvrKeyFromIndex; gAppleSMC->SmcGetKeyInfo = OvrGetKeyInfo; gAppleSMC->SmcReset = OvrReset; /* gAppleSMC->SmcUnknown1 = OvrUnknown1; gAppleSMC->SmcUnknown2 = OvrUnknown2; gAppleSMC->SmcUnknown3 = OvrUnknown3; gAppleSMC->SmcUnknown4 = OvrUnknown4; gAppleSMC->SmcUnknown5 = OvrUnknown5; */ PRINT("AppleSMC overriden!\n"); return EFI_SUCCESS; } /****************************************************/ /**/ /** Installs our AppleImageCodecProtocol overrides. */ APPLE_IMAGE_CODEC_PROTOCOL gOrgAppleImageCodec; APPLE_IMAGE_CODEC_PROTOCOL *gAppleImageCodec; EFI_STATUS EFIAPI OvrRecognizeImageData (//IN APPLE_IMAGE_CODEC_PROTOCOL* This, VOID *ImageBuffer, UINTN ImageSize, OUT VOID **OutBuffer ) { EFI_STATUS Status; Status = gOrgAppleImageCodec.RecognizeImageData(ImageBuffer, ImageSize, OutBuffer); if (EFI_ERROR(Status)) { PRINT("->AppleImageCodec.RecognizeImageData(%p, 0x%x, %p), sign=%4x, status=%r\n", ImageBuffer, ImageSize, OutBuffer, ImageBuffer?(*(UINT32*)ImageBuffer):0, Status); } return Status; } EFI_STATUS EFIAPI OvrGetImageDims (//IN APPLE_IMAGE_CODEC_PROTOCOL* This, VOID *ImageBuffer, UINTN ImageSize, UINT32 *ImageWidth, UINT32 *ImageHeight ) { EFI_STATUS Status; Status = gOrgAppleImageCodec.GetImageDims(ImageBuffer, ImageSize, ImageWidth, ImageHeight); if (EFI_ERROR(Status)) { PRINT("->AppleImageCodec.GetImageDims(%p, 0x%x, %p, %p), status=%r\n", ImageBuffer, ImageSize, ImageWidth, ImageHeight, Status); // PRINT("--> ImageWidth=%d, ImageHeight=%d\n", ImageWidth?*ImageWidth:0, ImageHeight?*ImageHeight:0); } return Status; } EFI_STATUS EFIAPI OvrDecodeImageData (//IN APPLE_IMAGE_CODEC_PROTOCOL* This, VOID *ImageBuffer, UINTN ImageSize, EFI_UGA_PIXEL **RawImageData, UINT32 *RawImageDataSize ) { EFI_STATUS Status; Status = gOrgAppleImageCodec.DecodeImageData(ImageBuffer, ImageSize, RawImageData, RawImageDataSize); if (EFI_ERROR(Status)) { PRINT("->AppleImageCodec.DecodeImageData(%p, 0x%x, %p, %p), status=%r\n", ImageBuffer, ImageSize, RawImageData, RawImageDataSize, Status); // if (!EFI_ERROR(Status)) { // PRINT("--> RawImageDataSize=%d\n", RawImageDataSize?*RawImageDataSize:0); } return Status; } EFI_STATUS EFIAPI OvrAICUnknown1 (VOID* ImageBuffer, UINTN Param1, UINTN Param2, UINTN Param3) { EFI_STATUS Status; Status = gOrgAppleImageCodec.Unknown1(ImageBuffer, Param1, Param2, Param3); PRINT("->AppleImageCodec.Unknown1(%p, 0x%x, 0x%x, 0x%x), status=%r\n", ImageBuffer, Param1, Param2, Param3); return Status; } EFI_STATUS EFIAPI OvrAICUnknown2 (VOID* ImageBuffer, UINTN Param1, UINTN Param2, UINTN Param3) { EFI_STATUS Status; Status = gOrgAppleImageCodec.Unknown2(ImageBuffer, Param1, Param2, Param3); PRINT("->AppleImageCodec.Unknown2(%p, 0x%x, 0x%x, 0x%x), status=%r\n", ImageBuffer, Param1, Param2, Param3); return Status; } EFI_STATUS EFIAPI OvrAppleImageCodec(VOID) { EFI_STATUS Status; // PRINT("Overriding AppleImageCodec ...\n"); // Locate AppleSMC protocol Status = gBS->LocateProtocol(&gAppleImageCodecProtocolGuid, NULL, (VOID **) &gAppleImageCodec); if (EFI_ERROR(Status)) { PRINT("Error Overriding AppleImageCodec: %r\n", Status); return Status; } // Store originals CopyMem(&gOrgAppleImageCodec, gAppleImageCodec, sizeof(APPLE_IMAGE_CODEC_PROTOCOL)); // Override with our implementation gAppleImageCodec->RecognizeImageData = OvrRecognizeImageData; gAppleImageCodec->GetImageDims = OvrGetImageDims; gAppleImageCodec->DecodeImageData = OvrDecodeImageData; gAppleImageCodec->Unknown1 = OvrAICUnknown1; gAppleImageCodec->Unknown2 = OvrAICUnknown2; PRINT("AppleImageCodec overriden!\n"); return EFI_SUCCESS; } /****************************************************/ /**/ /** Installs our AppleKeyState overrides. */ APPLE_KEY_STATE_PROTOCOL gOrgAppleKeyState; APPLE_KEY_STATE_PROTOCOL *gAppleKeyState; EFI_STATUS EFIAPI OvrReadKeyState (IN APPLE_KEY_STATE_PROTOCOL *This, OUT UINT16 *ModifyFlags, OUT UINTN *PressedKeyStatesCount, OUT APPLE_KEY_CODE *PressedKeyStates) { EFI_STATUS Status; Status = gOrgAppleKeyState.ReadKeyState(This, ModifyFlags, PressedKeyStatesCount, PressedKeyStates); if (PressedKeyStatesCount && *PressedKeyStatesCount && PressedKeyStates) { PRINT("->ReadKeyState(), count=%d, flags=0x%x states={%x,%x}, status=%r\n", *PressedKeyStatesCount, ModifyFlags?*ModifyFlags:0, PressedKeyStates[0], PressedKeyStates[1], Status); } return Status; } EFI_STATUS EFIAPI OvrSearchKeyStroke (APPLE_KEY_STATE_PROTOCOL* This, IN UINT16 ModifyFlags, IN UINTN PressedKeyStatesCount, IN OUT APPLE_KEY_CODE *PressedKeyStates, IN BOOLEAN ExactMatch) { EFI_STATUS Status; Status = gOrgAppleKeyState.SearchKeyStroke(This, ModifyFlags, PressedKeyStatesCount, PressedKeyStates, ExactMatch); if (PressedKeyStates) { PRINT("->SearchKeyStroke(), count=%d, flags=0x%x, %a match, states={%x,%x}, status=%r\n", PressedKeyStatesCount, ModifyFlags, ExactMatch?"exact":"~", PressedKeyStates[0], PressedKeyStates[1], Status); } return Status; } EFI_STATUS EFIAPI OvrAppleKeyState(VOID) { EFI_STATUS Status; // PRINT("Overriding AppleKeyState ...\n"); // Locate AppleKeyState protocol Status = gBS->LocateProtocol(&gAppleKeyStateProtocolGuid, NULL, (VOID **) &gAppleKeyState); if (EFI_ERROR(Status)) { PRINT("Error Overriding AppleKeyState: %r\n", Status); return Status; } // Store originals CopyMem(&gOrgAppleKeyState, gAppleKeyState, sizeof(APPLE_KEY_STATE_PROTOCOL)); // Override with our implementation gAppleKeyState->ReadKeyState = OvrReadKeyState; gAppleKeyState->SearchKeyStroke = OvrSearchKeyStroke; PRINT("AppleKeyState overriden!\n"); return EFI_SUCCESS; } //************************************************** EFI_OS_INFO_PROTOCOL gOrgOSInfo; EFI_OS_INFO_PROTOCOL *gOSInfo; // OSInfoOSNameImpl VOID EFIAPI OvrOSName ( IN CHAR8 *Name) { // EFI_STATUS Status; gOrgOSInfo.OSName(Name); PRINT("->OSInfo.OSName=%a\n", Name); } // OSInfoOSVendorImpl VOID EFIAPI OvrOSVendor ( IN CHAR8 *Name) { // EFI_STATUS Status; gOrgOSInfo.OSVendor(Name); PRINT("->OSInfo.OSVendor=%a\n", Name); } VOID EFIAPI OvrOSGetVtd ( OUT UINTN *BootVTdEnabled) { // EFI_STATUS Status; gOrgOSInfo.GetBootVTdEnabled(BootVTdEnabled); PRINT("->OSInfo.GetVtd=0x%x\n", *BootVTdEnabled); } VOID EFIAPI OvrOSSetVtd ( IN UINTN *BootVTdEnabled) { // EFI_STATUS Status; gOrgOSInfo.SetBootVTdEnabled(BootVTdEnabled); PRINT("->OSInfo.SetVtd=0x%x\n", *BootVTdEnabled); } EFI_STATUS EFIAPI OvrOSInfo(VOID) { EFI_STATUS Status; // PRINT("Overriding OSInfo ...\n"); // Locate EfiOSInfo protocol Status = gBS->LocateProtocol(&gEfiOSInfoProtocolGuid, NULL, (VOID **) &gOSInfo); if (EFI_ERROR(Status)) { PRINT("Error Overriding OSInfo: %r\n", Status); return Status; } // Store originals CopyMem(&gOrgOSInfo, gOSInfo, sizeof(EFI_OS_INFO_PROTOCOL)); // Override with our implementation gOSInfo->OSVendor = OvrOSVendor; gOSInfo->OSName = OvrOSName; // gOSInfo->OSEmpty = OvrOSEmpty; gOSInfo->SetBootVTdEnabled = OvrOSSetVtd; gOSInfo->GetBootVTdEnabled = OvrOSGetVtd; PRINT("EfiOSInfo overriden!\n"); return EFI_SUCCESS; } //************************************************** APPLE_GRAPH_CONFIG_PROTOCOL gOrgGraphConfig; APPLE_GRAPH_CONFIG_PROTOCOL *gGraphConfig; EFI_STATUS EFIAPI OvrRestoreConfig (APPLE_GRAPH_CONFIG_PROTOCOL* This, UINT32 Param1, UINT32 Param2, VOID* Param3, VOID* Param4, VOID* Param5 ) { EFI_STATUS Status; Status = gOrgGraphConfig.RestoreConfig(This, Param1, Param2, Param3, Param4, Param5); PRINT("->GraphConfig.RestoreConfig(%x, %x, %p, %p, %p) status=%r\n", Param1, Param2, Param3, Param4, Param5, Status); return EFI_SUCCESS; } EFI_STATUS EFIAPI OvrGraphConfig(VOID) { EFI_STATUS Status; // PRINT("Overriding GraphConfig ...\n"); // Locate AppleGraphConfig protocol Status = gBS->LocateProtocol(&gAppleGraphConfigProtocolGuid, NULL, (VOID **) &gGraphConfig); if (EFI_ERROR(Status)) { PRINT("Error Overriding GraphConfig: %r\n", Status); return Status; } // Store originals CopyMem(&gOrgGraphConfig, gGraphConfig, sizeof(APPLE_GRAPH_CONFIG_PROTOCOL)); // Override with our implementation gGraphConfig->RestoreConfig = OvrRestoreConfig; PRINT("AppleGraphConfig overriden!\n"); return EFI_SUCCESS; } //********************************************** EFI_FIRMWARE_VOLUME_PROTOCOL gOrgFV; EFI_FIRMWARE_VOLUME_PROTOCOL *gFirmwareVolume; EFI_STATUS EFIAPI OvrFvReadFile ( IN EFI_FIRMWARE_VOLUME_PROTOCOL *This, IN EFI_GUID *NameGuid, IN OUT VOID **Buffer, IN OUT UINTN *BufferSize, OUT EFI_FV_FILETYPE *FoundType, OUT EFI_FV_FILE_ATTRIBUTES *FileAttributes, OUT UINT32 *AuthenticationStatus ) { EFI_STATUS Status; Status = gOrgFV.ReadFile(This, NameGuid, Buffer, BufferSize, FoundType, FileAttributes, AuthenticationStatus); PRINT("->FirmwareVolume.ReadFile(%g, size=%d) status=%r\n", NameGuid, BufferSize?*BufferSize:0, Status); return Status; } EFI_STATUS EFIAPI OvrFvReadSection ( IN EFI_FIRMWARE_VOLUME_PROTOCOL *This, IN EFI_GUID *NameGuid, IN EFI_SECTION_TYPE SectionType, IN UINTN SectionInstance, IN OUT VOID **Buffer, IN OUT UINTN *BufferSize, OUT UINT32 *AuthenticationStatus ) { EFI_STATUS Status; Status = gOrgFV.ReadSection(This, NameGuid, SectionType, SectionInstance, Buffer, BufferSize, AuthenticationStatus); PRINT("->FirmwareVolume.ReadSection(%g, type=%x, #%d, %d) status=%r\n", NameGuid, SectionType, SectionInstance, BufferSize?*BufferSize:0, Status); return Status; } EFI_STATUS EFIAPI OvrFirmwareVolume(VOID) { EFI_STATUS Status; PRINT("Overriding FirmwareVolume ...\n"); // Locate FirmwareVolume protocol Status = gBS->LocateProtocol(&gEfiFirmwareVolumeProtocolGuid, NULL, (VOID **) &gFirmwareVolume); if (EFI_ERROR(Status)) { PRINT("Error Overriding FirmwareVolume: %r\n", Status); return Status; } // Store originals CopyMem(&gOrgFV, gFirmwareVolume, sizeof(EFI_FIRMWARE_VOLUME_PROTOCOL)); // Override with our implementation gFirmwareVolume->ReadSection = OvrFvReadSection; gFirmwareVolume->ReadFile = OvrFvReadFile; PRINT("FirmwareVolume overriden!\n"); return EFI_SUCCESS; } /****************************************************/ /**/ /** Installs our AppleKeyboardInfo overrides. */ EFI_KEYBOARD_INFO_PROTOCOL gOrgAppleKeyboardInfo; EFI_KEYBOARD_INFO_PROTOCOL *gAppleKeyboardInfo; EFI_STATUS EFIAPI GetKeyboardDeviceInfo ( OUT UINT16 *IdVendor, OUT UINT16 *IdProduct, OUT UINT8 *CountryCode ) { /* *IdVendor = mIdVendor; *IdProduct = mIdProduct; *CountryCode = mCountryCode; */ EFI_STATUS Status; Status = gOrgAppleKeyboardInfo.GetInfo(IdVendor, IdProduct, CountryCode); PRINT("->KeyboardInfo => Vendor=0x%4x, Product=0x%4x, CountryCode=%x\n", IdVendor?*IdVendor:0, IdProduct?*IdProduct:0, CountryCode?*CountryCode:0); return Status; } EFI_STATUS EFIAPI OvrEfiKeyboardInfo(VOID) { EFI_STATUS Status; PRINT("Overriding EfiKeyboardInfo ...\n"); // Locate EfiKeyboardInfo protocol Status = gBS->LocateProtocol(&gEfiKeyboardInfoProtocolGuid, NULL, (VOID **)&gAppleKeyboardInfo); if (EFI_ERROR(Status)) { PRINT("Error Overriding EfiKeyboardInfo: %r\n", Status); return Status; } // Store originals CopyMem(&gOrgAppleKeyboardInfo, gAppleKeyboardInfo, sizeof(EFI_KEYBOARD_INFO_PROTOCOL)); // Override with our implementation gAppleKeyboardInfo->GetInfo = GetKeyboardDeviceInfo; PRINT("EfiKeyboardInfo overriden!\n"); return EFI_SUCCESS; } //************************ // APPLE_KEY_MAP_DATABASE_PROTOCOL APPLE_KEY_MAP_DATABASE_PROTOCOL gOrgAppleKeyMapDb; APPLE_KEY_MAP_DATABASE_PROTOCOL *gAppleKeyMapDb; EFI_STATUS EFIAPI OvrCreateKeyStrokesBuffer (IN APPLE_KEY_MAP_DATABASE_PROTOCOL *This, IN UINTN KeyBufferSize, OUT UINTN *Index) { EFI_STATUS Status; Status = gOrgAppleKeyMapDb.CreateKeyStrokesBuffer(This, KeyBufferSize, Index); PRINT("->CreateKeyStrokesBuffer => KeyBufferSize=%d, Index=%d, Status=%r\n", KeyBufferSize, Index?*Index:0, Status); return Status; } EFI_STATUS EFIAPI OvrRemoveKeyStrokesBuffer ( IN APPLE_KEY_MAP_DATABASE_PROTOCOL *This, IN UINTN Index ) { EFI_STATUS Status; Status = gOrgAppleKeyMapDb.RemoveKeyStrokesBuffer(This, Index); PRINT("->RemoveKeyStrokesBuffer => Index=%d, Status=%r\n", Index, Status); return Status; } EFI_STATUS EFIAPI OvrSetKeyStrokeBufferKeys ( IN APPLE_KEY_MAP_DATABASE_PROTOCOL *This, IN UINTN Index, IN APPLE_MODIFIER_MAP Modifiers, IN UINTN NumberOfKeys, IN APPLE_KEY_CODE *Keys ) { EFI_STATUS Status; Status = gOrgAppleKeyMapDb.SetKeyStrokeBufferKeys(This, Index, Modifiers, NumberOfKeys, Keys); #if SET_KEY_STROKE PRINT("->SetKeyStrokeBufferKeys => Index=%d, Modifiers=%x, NoKeys=%d, Keys={%x, %x}, Status=%r\n", Index, Modifiers, NumberOfKeys, Keys?*Keys:0, (Keys && NumberOfKeys>1)?Keys[1]:0, Status); #endif return Status; } EFI_STATUS EFIAPI OvrAppleKeyMapDb(VOID) { EFI_STATUS Status; PRINT("Overriding AppleKeyMapDb ...\n"); // Locate AppleKeyMapDb protocol Status = gBS->LocateProtocol(&gAppleKeyMapDatabaseProtocolGuid, NULL, (VOID **)&gAppleKeyMapDb); if (EFI_ERROR(Status)) { PRINT("Error Overriding AppleKeyMapDb: %r\n", Status); return Status; } // Store originals CopyMem(&gOrgAppleKeyMapDb, gAppleKeyMapDb, sizeof(APPLE_KEY_MAP_DATABASE_PROTOCOL)); // Override with our implementation gAppleKeyMapDb->CreateKeyStrokesBuffer = OvrCreateKeyStrokesBuffer; gAppleKeyMapDb->RemoveKeyStrokesBuffer = OvrRemoveKeyStrokesBuffer; gAppleKeyMapDb->SetKeyStrokeBufferKeys = OvrSetKeyStrokeBufferKeys; PRINT("AppleKeyMapDb overriden!\n"); return EFI_SUCCESS; }