OpenCore  1.0.4
OpenCore Bootloader
Loading...
Searching...
No Matches
OcAppleEventLib.c
Go to the documentation of this file.
1
19#include <AppleMacEfi.h>
20
21#include <Library/BaseLib.h>
22#include <Library/DebugLib.h>
23#include <Library/MemoryAllocationLib.h>
24#include <Library/OcMiscLib.h>
25#include <Library/UefiBootServicesTableLib.h>
26
27#include "AppleEventInternal.h"
28
29// APPLE_EVENT_HANDLE_PRIVATE_SIGNATURE
30#define APPLE_EVENT_HANDLE_PRIVATE_SIGNATURE \
31 SIGNATURE_32 ('A', 'L', 's', 't')
32
33// APPLE_EVENT_HANDLE_PRIVATE_FROM_LIST_ENTRY
34#define APPLE_EVENT_HANDLE_PRIVATE_FROM_LIST_ENTRY(Handle) \
35 CR ( \
36 (Handle), \
37 APPLE_EVENT_HANDLE_PRIVATE, \
38 Link, \
39 APPLE_EVENT_HANDLE_PRIVATE_SIGNATURE \
40 )
41
42// APPLE_EVENT_HANDLE_PRIVATE
53
54// mEventHandles
55STATIC
56LIST_ENTRY mEventHandles = INITIALIZE_LIST_HEAD_VARIABLE (mEventHandles);
57
58// mNumberOfEventHandles
59STATIC UINTN mNumberOfEventHandles = 0;
60
61// EventLibCreateTimerEvent
62EFI_EVENT
64 IN EFI_EVENT_NOTIFY NotifyFunction,
65 IN VOID *NotifyContext,
66 IN UINT64 TriggerTime,
67 IN BOOLEAN SignalPeriodic,
68 IN EFI_TPL NotifyTpl
69 )
70{
71 EFI_EVENT Event;
72 EFI_STATUS Status;
73
74 DEBUG ((DEBUG_VERBOSE, "EventLibCreateTimerEvent\n"));
75
76 Event = NULL;
77
78 if (NotifyTpl >= TPL_CALLBACK) {
79 Status = gBS->CreateEvent (
80 ((NotifyFunction != NULL)
81 ? (EVT_TIMER | EVT_NOTIFY_SIGNAL)
82 : EVT_TIMER),
83 NotifyTpl,
84 NotifyFunction,
85 NotifyContext,
86 &Event
87 );
88
89 if (!EFI_ERROR (Status)) {
90 Status = gBS->SetTimer (
91 Event,
92 (SignalPeriodic ? TimerPeriodic : TimerRelative),
93 TriggerTime
94 );
95
96 if (EFI_ERROR (Status)) {
97 gBS->CloseEvent (Event);
98
99 Event = NULL;
100 }
101 }
102 }
103
104 return Event;
105}
106
107// EventLibCreateNotifyTimerEvent
108EFI_EVENT
110 IN EFI_EVENT_NOTIFY NotifyFunction,
111 IN VOID *NotifyContext,
112 IN UINT64 TriggerTime,
113 IN BOOLEAN SignalPeriodic
114 )
115{
116 DEBUG ((DEBUG_VERBOSE, "EventLibCreateNotifyTimerEvent\n"));
117
119 NotifyFunction,
120 NotifyContext,
121 TriggerTime,
122 SignalPeriodic,
123 TPL_CALLBACK
124 );
125}
126
127// EventLibCancelEvent
128VOID
130 IN EFI_EVENT Event
131 )
132{
133 EFI_STATUS Status;
134
135 DEBUG ((DEBUG_VERBOSE, "EventLibCancelEvent\n"));
136
137 Status = gBS->SetTimer (Event, TimerCancel, 0);
138
139 if (!EFI_ERROR (Status)) {
140 gBS->CloseEvent (Event);
141 }
142}
143
144// EventSignalEvents
145VOID
147 IN APPLE_EVENT_INFORMATION *EventInformation
148 )
149{
150 LIST_ENTRY *EventHandleEntry;
151 APPLE_EVENT_HANDLE_PRIVATE *EventHandle;
152
153 DEBUG ((DEBUG_VERBOSE, "EventSignalEvents\n"));
154
155 EventHandleEntry = GetFirstNode (&mEventHandles);
156
157 while (!IsNull (&mEventHandles, EventHandleEntry)) {
159 EventHandleEntry
160 );
161
162 if ( EventHandle->Registered
163 && EventHandle->Ready
164 && ((EventInformation->EventType & EventHandle->EventType) != 0)
165 && (EventHandle->NotifyFunction != NULL))
166 {
167 EventHandle->NotifyFunction (
168 EventInformation,
169 EventHandle->NotifyContext
170 );
171 }
172
173 EventHandleEntry = GetNextNode (&mEventHandles, EventHandleEntry);
174 }
175}
176
177// InternalFlagAllEventsReady
178VOID
180 VOID
181 )
182{
183 LIST_ENTRY *EventHandleEntry;
184 APPLE_EVENT_HANDLE_PRIVATE *EventHandle;
185
186 DEBUG ((DEBUG_VERBOSE, "InternalFlagAllEventsReady\n"));
187
188 EventHandleEntry = GetFirstNode (&mEventHandles);
189
190 if (!IsListEmpty (&mEventHandles)) {
191 do {
193 EventHandleEntry
194 );
195
196 EventHandle->Ready = TRUE;
197
198 EventHandleEntry = GetNextNode (&mEventHandles, EventHandleEntry);
199 } while (!IsNull (&mEventHandles, EventHandleEntry));
200 }
201}
202
203// InternalSignalEvents
204VOID
206 IN APPLE_EVENT_INFORMATION *Information
207 )
208{
209 LIST_ENTRY *EventHandleEntry;
210 APPLE_EVENT_HANDLE_PRIVATE *EventHandle;
211
212 DEBUG ((DEBUG_VERBOSE, "InternalSignalEvents\n"));
213
214 EventHandleEntry = GetFirstNode (&mEventHandles);
215
216 if (!IsListEmpty (&mEventHandles)) {
217 do {
219 EventHandleEntry
220 );
221
222 if ( EventHandle->Registered && EventHandle->Ready
223 && (EventHandle->EventType & Information->EventType)
224 && (EventHandle->NotifyFunction != NULL))
225 {
226 EventHandle->NotifyFunction (
227 Information,
228 EventHandle->NotifyContext
229 );
230 }
231
232 EventHandleEntry = GetNextNode (&mEventHandles, EventHandleEntry);
233 } while (!IsNull (&mEventHandles, EventHandleEntry));
234 }
235}
236
237// InternalRemoveUnregisteredEvents
238VOID
240 VOID
241 )
242{
243 LIST_ENTRY *EventHandleEntry;
244 LIST_ENTRY *NextEventHandleEntry;
245 APPLE_EVENT_HANDLE_PRIVATE *EventHandle;
246
247 DEBUG ((DEBUG_VERBOSE, "InternalRemoveUnregisteredEvents\n"));
248
249 EventHandleEntry = GetFirstNode (&mEventHandles);
250
251 if (!IsListEmpty (&mEventHandles)) {
252 do {
253 NextEventHandleEntry = GetNextNode (&mEventHandles, EventHandleEntry);
254
256 EventHandleEntry
257 );
258
259 if (!EventHandle->Registered) {
260 if (EventHandle->Name != NULL) {
261 FreePool ((VOID *)EventHandle->Name);
262 }
263
264 RemoveEntryList (&EventHandle->Link);
265 FreePool ((VOID *)EventHandle);
266 }
267
268 EventHandleEntry = NextEventHandleEntry;
269 } while (!IsNull (&mEventHandles, NextEventHandleEntry));
270 }
271}
272
273// InternalCreatePollEvents
274STATIC
275EFI_STATUS
277 VOID
278 )
279{
280 EFI_STATUS Status;
281
282 DEBUG ((DEBUG_VERBOSE, "InternalCreatePollEvents\n"));
283
285
286 if (!EFI_ERROR (Status)) {
288
289 if (EFI_ERROR (Status)) {
291 }
292 }
293
294 return Status;
295}
296
297// InternalCancelPollEvents
298VOID
300 VOID
301 )
302{
303 DEBUG ((DEBUG_VERBOSE, "InternalCancelPollEvents\n"));
304
307}
308
309// EventRegisterHandler
310EFI_STATUS
311EFIAPI
313 IN APPLE_EVENT_TYPE Type,
314 IN APPLE_EVENT_NOTIFY_FUNCTION NotifyFunction,
316 IN VOID *NotifyContext
317 )
318{
319 EFI_STATUS Status;
320 APPLE_EVENT_HANDLE_PRIVATE *EventHandle;
321
322 DEBUG ((DEBUG_VERBOSE, "EventRegisterHandler\n"));
323
324 Status = EFI_INVALID_PARAMETER;
325
326 if ( (Handle != NULL)
327 && (NotifyFunction != NULL)
328 && (Type != APPLE_EVENT_TYPE_NONE))
329 {
330 *Handle = NULL;
331
333
334 Status = EFI_SUCCESS;
335
336 if (mNumberOfEventHandles == 0) {
337 Status = InternalCreatePollEvents ();
338
339 if (EFI_ERROR (Status)) {
340 goto Done;
341 }
342 }
343
344 EventHandle = AllocatePool (sizeof (*EventHandle));
345
346 Status = EFI_OUT_OF_RESOURCES;
347
348 if (EventHandle != NULL) {
350 EventHandle->Ready = FALSE;
351 EventHandle->Registered = TRUE;
352 EventHandle->EventType = Type;
353 EventHandle->NotifyFunction = NotifyFunction;
354 EventHandle->NotifyContext = NotifyContext;
355 EventHandle->Name = NULL;
356
358
359 InsertTailList (&mEventHandles, &EventHandle->Link);
360
361 *Handle = EventHandle;
362
363 Status = EFI_SUCCESS;
364 }
365 }
366
367Done:
368 return Status;
369}
370
371// EventUnregisterHandler
372EFI_STATUS
373EFIAPI
376 )
377{
378 EFI_STATUS Status;
379 LIST_ENTRY *EventHandleEntry;
380 APPLE_EVENT_HANDLE_PRIVATE *EventHandle;
381
382 DEBUG ((DEBUG_VERBOSE, "EventUnregisterHandler\n"));
383
384 Status = EFI_INVALID_PARAMETER;
385
386 EventHandleEntry = GetFirstNode (&mEventHandles);
387
388 while (!IsNull (&mEventHandles, EventHandleEntry)) {
390 EventHandleEntry
391 );
392
393 if ( ((UINTN)EventHandle == (UINTN)Handle)
394 || ((UINTN)Handle == (UINTN)-1))
395 {
396 EventHandle->Registered = FALSE;
398
399 Status = EFI_SUCCESS;
400
401 if ((UINTN)Handle != (UINTN)-1) {
402 break;
403 }
404 }
405
406 EventHandleEntry = GetNextNode (&mEventHandles, EventHandleEntry);
407 }
408
409 if (mNumberOfEventHandles == 0) {
411 }
412
413 return Status;
414}
415
416// EventSetCursorPosition
417
424EFI_STATUS
425EFIAPI
427 IN DIMENSION *Position
428 )
429{
430 DEBUG ((DEBUG_VERBOSE, "EventSetCursorPosition\n"));
431
432 return EventSetCursorPositionImpl (Position);
433}
434
435// EventSetEventName
436
447EFI_STATUS
448EFIAPI
451 IN CHAR8 *Name
452 )
453{
454 EFI_STATUS Status;
455 UINTN AllocationSize;
456 CHAR8 *EventName;
457
458 DEBUG ((DEBUG_VERBOSE, "EventSetEventName\n"));
459
460 Status = EFI_INVALID_PARAMETER;
461
462 if ((Handle != NULL) && (Name != NULL)) {
463 AllocationSize = AsciiStrSize (Name);
464 EventName = AllocateZeroPool (AllocationSize);
465
466 ((APPLE_EVENT_HANDLE_PRIVATE *)Handle)->Name = EventName;
467
468 Status = EFI_OUT_OF_RESOURCES;
469
470 if (EventName != NULL) {
471 AsciiStrCpyS (EventName, AllocationSize, Name);
472 Status = EFI_SUCCESS;
473 }
474 }
475
476 return Status;
477}
478
479// EventIsCapsLockOnImpl
480
490EFI_STATUS
491EFIAPI
493 IN OUT BOOLEAN *CLockOn
494 )
495{
496 DEBUG ((DEBUG_VERBOSE, "EventIsCapsLockOn\n"));
497
498 return EventIsCapsLockOnImpl (CLockOn);
499}
500
501// InternalUnregisterHandlers
502STATIC
503VOID
505 VOID
506 )
507{
508 DEBUG ((DEBUG_VERBOSE, "InternalUnregisterHandlers\n"));
509
511
513
514 if (!IsListEmpty (&mEventHandles)) {
516 }
517}
518
519// mAppleEventProtocol
528
529// AppleEventUnload
530EFI_STATUS
531EFIAPI
533 VOID
534 )
535{
536 EFI_STATUS Status;
537
538 DEBUG ((DEBUG_VERBOSE, "AppleEventUnload\n"));
539
541
545
546 Status = gBS->UninstallMultipleProtocolInterfaces (
549 (VOID *)&mAppleEventProtocol
550 );
551
552 return Status;
553}
554
557 IN BOOLEAN Install,
558 IN BOOLEAN Reinstall,
559 IN BOOLEAN CustomDelays,
560 IN UINT16 KeyInitialDelay,
561 IN UINT16 KeySubsequentDelay,
562 IN BOOLEAN GraphicsInputMirroring,
563 IN UINT32 PointerPollMin,
564 IN UINT32 PointerPollMax,
565 IN UINT32 PointerPollMask,
566 IN UINT16 PointerSpeedDiv,
567 IN UINT16 PointerSpeedMul,
568 IN UINT16 PointerDwellClickTimeout,
569 IN UINT16 PointerDwellDoubleClickTimeout,
570 IN UINT16 PointerDwellRadius
571 )
572{
573 EFI_STATUS Status;
574 APPLE_EVENT_PROTOCOL *AppleEvent;
575
576 DEBUG ((DEBUG_VERBOSE, "OcAppleEventInstallProtocol\n"));
577
578 if (!Reinstall) {
579 Status = gBS->LocateProtocol (
581 NULL,
582 (VOID *)&AppleEvent
583 );
584
585 if (!EFI_ERROR (Status)) {
586 if (AppleEvent->Revision < APPLE_EVENT_PROTOCOL_REVISION_MINIMUM) {
587 DEBUG ((
588 DEBUG_INFO,
589 "OCAE: Not using OEM revision %u, does not meet required minimum %u\n",
590 (UINT32)AppleEvent->Revision,
592 ));
593 Reinstall = TRUE;
594 } else {
595 DEBUG ((
596 DEBUG_INFO,
597 "OCAE: Using OEM revision %u, meets required minimum %u\n",
598 (UINT32)AppleEvent->Revision,
600 ));
601 return AppleEvent;
602 }
603 }
604 }
605
606 if (!Install) {
607 DEBUG ((DEBUG_INFO, "OCAE: Letting OEM protocol connect later\n"));
608 return NULL;
609 }
610
612 if (EFI_ERROR (Status)) {
613 DEBUG ((DEBUG_ERROR, "OCAE: OEM uninstall failed - %r\n", Status));
614 return NULL;
615 }
616
618 CustomDelays,
619 KeyInitialDelay,
620 KeySubsequentDelay,
621 GraphicsInputMirroring
622 );
623
625 InternalSetPointerPolling (PointerPollMin, PointerPollMax, PointerPollMask);
626 InternalSetPointerSpeed (PointerSpeedDiv, PointerSpeedMul);
628 PointerDwellClickTimeout,
629 PointerDwellDoubleClickTimeout,
630 PointerDwellRadius
631 );
632
633 Status = gBS->InstallMultipleProtocolInterfaces (
637 NULL
638 );
639
640 if (!EFI_ERROR (Status)) {
642
644 }
645
646 if (EFI_ERROR (Status)) {
647 DEBUG ((DEBUG_ERROR, "OCAE: Builtin install failed\n"));
649 return NULL;
650 }
651
652 DEBUG ((DEBUG_INFO, "OCAE: Builtin installed\n"));
653 return &mAppleEventProtocol;
654}
#define APPLE_EVENT_TYPE_NONE
Definition AppleEvent.h:20
VOID * APPLE_EVENT_HANDLE
Definition AppleEvent.h:95
UINT32 APPLE_EVENT_TYPE
Definition AppleEvent.h:45
VOID(EFIAPI * APPLE_EVENT_NOTIFY_FUNCTION)(IN APPLE_EVENT_INFORMATION *Information, IN VOID *NotifyContext)
Definition AppleEvent.h:89
EFI_GUID gAppleEventProtocolGuid
#define APPLE_EVENT_PROTOCOL_REVISION_MINIMUM
Definition AppleEvent.h:103
#define APPLE_EVENT_PROTOCOL_REVISION
Definition AppleEvent.h:100
VOID InternalSetDwellClicking(IN UINT16 ClickTimeout, IN UINT16 DoubleClickTimeout, IN UINT16 Radius)
EFI_STATUS EFIAPI EventIsCapsLockOnImpl(IN OUT BOOLEAN *CLockOn)
Definition KeyHandler.c:802
VOID InternalSetKeyBehaviour(IN BOOLEAN CustomDelays, IN UINT16 KeyInitialDelay, IN UINT16 KeySubsequentDelay, IN BOOLEAN GraphicsInputMirroring)
Definition KeyHandler.c:83
EFI_STATUS EventSetCursorPositionImpl(IN DIMENSION *Position)
VOID InternalSetPointerSpeed(IN UINT16 PointerSpeedDiv, IN UINT16 PointerSpeedMul)
VOID EventCancelSimplePointerPollEvent(VOID)
EFI_STATUS EventCreateSimplePointerPollEvent(VOID)
VOID InternalInitializePointerUiScale(VOID)
VOID InternalSetPointerPolling(IN UINT32 PointerPollMin, IN UINT32 PointerPollMax, IN UINT32 PointerPollMask)
VOID EventCloseSimplePointerInstallNotifyEvent(VOID)
VOID EventSimplePointerDesctructor(VOID)
EFI_STATUS EventCreateSimplePointerInstallNotifyEvent(VOID)
VOID EventCancelKeyStrokePollEvent(VOID)
Definition KeyHandler.c:778
EFI_STATUS EventCreateKeyStrokePollEvent(VOID)
Definition KeyHandler.c:744
VOID InternalCreateQueueEvent(VOID)
Definition EventQueue.c:125
VOID InternalSignalAndCloseQueueEvent(VOID)
Definition EventQueue.c:63
EFI_EVENT EventLibCreateTimerEvent(IN EFI_EVENT_NOTIFY NotifyFunction, IN VOID *NotifyContext, IN UINT64 TriggerTime, IN BOOLEAN SignalPeriodic, IN EFI_TPL NotifyTpl)
VOID EventSignalEvents(IN APPLE_EVENT_INFORMATION *EventInformation)
EFI_EVENT EventLibCreateNotifyTimerEvent(IN EFI_EVENT_NOTIFY NotifyFunction, IN VOID *NotifyContext, IN UINT64 TriggerTime, IN BOOLEAN SignalPeriodic)
#define APPLE_EVENT_HANDLE_PRIVATE_FROM_LIST_ENTRY(Handle)
EFI_STATUS EFIAPI EventRegisterHandler(IN APPLE_EVENT_TYPE Type, IN APPLE_EVENT_NOTIFY_FUNCTION NotifyFunction, OUT APPLE_EVENT_HANDLE *Handle, IN VOID *NotifyContext)
STATIC APPLE_EVENT_PROTOCOL mAppleEventProtocol
APPLE_EVENT_PROTOCOL * OcAppleEventInstallProtocol(IN BOOLEAN Install, IN BOOLEAN Reinstall, IN BOOLEAN CustomDelays, IN UINT16 KeyInitialDelay, IN UINT16 KeySubsequentDelay, IN BOOLEAN GraphicsInputMirroring, IN UINT32 PointerPollMin, IN UINT32 PointerPollMax, IN UINT32 PointerPollMask, IN UINT16 PointerSpeedDiv, IN UINT16 PointerSpeedMul, IN UINT16 PointerDwellClickTimeout, IN UINT16 PointerDwellDoubleClickTimeout, IN UINT16 PointerDwellRadius)
EFI_STATUS EFIAPI AppleEventUnload(VOID)
VOID InternalFlagAllEventsReady(VOID)
#define APPLE_EVENT_HANDLE_PRIVATE_SIGNATURE
VOID InternalSignalEvents(IN APPLE_EVENT_INFORMATION *Information)
VOID EventLibCancelEvent(IN EFI_EVENT Event)
EFI_STATUS EFIAPI EventUnregisterHandler(IN APPLE_EVENT_HANDLE Handle)
STATIC EFI_STATUS InternalCreatePollEvents(VOID)
EFI_STATUS EFIAPI EventIsCapsLockOn(IN OUT BOOLEAN *CLockOn)
EFI_STATUS EFIAPI EventSetCursorPosition(IN DIMENSION *Position)
VOID InternalCancelPollEvents(VOID)
EFI_STATUS EFIAPI EventSetEventName(IN OUT APPLE_EVENT_HANDLE Handle, IN CHAR8 *Name)
STATIC LIST_ENTRY mEventHandles
VOID InternalRemoveUnregisteredEvents(VOID)
STATIC VOID InternalUnregisterHandlers(VOID)
STATIC UINTN mNumberOfEventHandles
EFI_HANDLE gImageHandle
EFI_BOOT_SERVICES * gBS
EFI_STATUS OcUninstallAllProtocolInstances(EFI_GUID *Protocol)
APPLE_EVENT_HANDLE Handle
Definition OcTypingLib.h:45
APPLE_EVENT_NOTIFY_FUNCTION NotifyFunction