26#include <Library/BaseLib.h>
27#include <Library/DebugLib.h>
32#include <Library/PrintLib.h>
33#include <Library/TimerLib.h>
34#include <Library/UefiDriverEntryPoint.h>
35#include <Library/UefiBootServicesTableLib.h>
36#include <Library/UefiRuntimeServicesTableLib.h>
39#include <Protocol/GraphicsOutput.h>
41#include <Protocol/SimpleTextInEx.h>
42#include <Protocol/SimpleFileSystem.h>
64 #define STATUS_SQUARE_SIDE 5
67 EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput;
73 gST->ConsoleOutHandle,
75 (VOID **)&GraphicsOutput
77 if (EFI_ERROR (Status)) {
78 DEBUG ((DEBUG_INFO,
"OCSCR: Graphics output protocol not found for status - %r\n", Status));
79 return EFI_UNSUPPORTED;
86 Square[Index].Blue = Blue;
87 Square[Index].Green = Green;
88 Square[Index].Red = Red;
89 Square[Index].Reserved = 0x00;
98 EfiBltVideoToBltBuffer,
111 GraphicsOutput->Blt (
127 gBS->Stall (500*1000);
132 GraphicsOutput->Blt (
152 IN EFI_KEY_DATA *KeyData
155 EFI_FILE_PROTOCOL *Fs;
156 EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput;
157 EFI_GRAPHICS_OUTPUT_BLT_PIXEL *Image;
177 gBS->RestoreTPL (TPL_CALLBACK);
180 if (EFI_ERROR (Status)) {
181 DEBUG ((DEBUG_INFO,
"OCSCR: Can't find writable FS - %r\n", Status));
187 gST->ConsoleOutHandle,
189 (VOID **)&GraphicsOutput
191 if (EFI_ERROR (Status)) {
192 DEBUG ((DEBUG_INFO,
"OCSCR: Graphics output protocol not found for screen - %r\n", Status));
200 ScreenWidth = GraphicsOutput->Mode->Info->HorizontalResolution;
201 ScreenHeight = GraphicsOutput->Mode->Info->VerticalResolution;
202 ImageSize = (UINTN)ScreenWidth * ScreenHeight;
204 if (ImageSize == 0) {
205 DEBUG ((DEBUG_INFO,
"OCSCR: Empty screen size\n"));
213 Status =
gRT->GetTime (
217 if (!EFI_ERROR (Status)) {
224 L
"%02d%02d%02d%02d.png",
234 StrCpyS (FileName,
sizeof (FileName), L
"scrnshot.png");
240 Status =
gBS->AllocatePool (
242 ImageSize *
sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL),
245 if (EFI_ERROR (Status)) {
246 DEBUG ((DEBUG_INFO,
"CRSCR: gBS->AllocatePool returned %r\n", Status));
255 Status = GraphicsOutput->Blt (
258 EfiBltVideoToBltBuffer,
267 if (EFI_ERROR (Status)) {
268 DEBUG ((DEBUG_INFO,
"CRSCR: GraphicsOutput->Blt returned %r\n", Status));
269 gBS->FreePool (Image);
278 for (Index = 0; Index < ImageSize; ++Index) {
279 Temp = Image[Index].Blue;
280 Image[Index].Blue = Image[Index].Red;
281 Image[Index].Red = Temp;
282 Image[Index].Reserved = 0xFF;
292 gBS->FreePool (Image);
293 if (EFI_ERROR (Status)) {
294 DEBUG ((DEBUG_INFO,
"CRSCR: OcEncodePng returned %r\n", Status));
303 Status =
OcSetFileData (Fs, FileName, PngFile, (UINT32)PngFileSize);
304 gBS->FreePool (PngFile);
306 if (EFI_ERROR (Status)) {
307 DEBUG ((DEBUG_INFO,
"CRSCR: OcEncodePng returned %r\n", Status));
325 IN VOID *NotifyContext
338 if (Information == NULL) {
374 EFI_HANDLE *HandleBuffer;
376 EFI_KEY_DATA SimpleTextInExKeyStroke;
377 EFI_HANDLE SimpleTextInExHandle;
378 EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *SimpleTextInEx;
389 Status =
gBS->LocateHandleBuffer (
396 if (!EFI_ERROR (Status)) {
397 for (Index = 0; Index < HandleCount; ++Index) {
400 if (EFI_ERROR (Status)) {
403 "CRSCR: gBS->HandleProtocol[%u] AppleEvent returned %r\n",
413 "CRSCR: AppleEvent[%u] has outdated revision %u, expected %u\n",
415 (UINT32)AppleEvent->Revision,
424 Status = AppleEvent->RegisterHandler (
430 if (!EFI_ERROR (Status)) {
436 "CRSCR: AppleEvent->RegisterHandler[%u] returned %r\n",
442 gBS->FreePool (HandleBuffer);
446 "CRSCR: gBS->LocateHandleBuffer AppleEvent returned %r\n",
452 Status =
gBS->LocateHandleBuffer (
454 &gEfiSimpleTextInputExProtocolGuid,
459 if (EFI_ERROR (Status)) {
462 "CRSCR: gBS->LocateHandleBuffer SimpleTextInEx returned %r\n",
465 return EFI_UNSUPPORTED;
471 SimpleTextInExKeyStroke.Key.ScanCode = SCAN_F10;
472 SimpleTextInExKeyStroke.Key.UnicodeChar = 0;
473 SimpleTextInExKeyStroke.KeyState.KeyShiftState = 0;
474 SimpleTextInExKeyStroke.KeyState.KeyToggleState = 0;
476 for (Index = 0; Index < HandleCount; ++Index) {
477 Status =
gBS->HandleProtocol (
479 &gEfiSimpleTextInputExProtocolGuid,
480 (VOID **)&SimpleTextInEx
483 if (EFI_ERROR (Status)) {
486 "CRSCR: gBS->HandleProtocol[%u] SimpleTextInputEx returned %r\n",
493 Status = SimpleTextInEx->RegisterKeyNotify (
495 &SimpleTextInExKeyStroke,
497 &SimpleTextInExHandle
500 if (!EFI_ERROR (Status)) {
506 "CRSCR: SimpleTextInEx->RegisterKeyNotify[%u] returned %r\n",
512 gBS->FreePool (HandleBuffer);
532 IN EFI_HANDLE ImageHandle,
533 IN EFI_SYSTEM_TABLE *SystemTable
538 EFI_LOADED_IMAGE_PROTOCOL *LoadedImage;
544 Status =
gBS->HandleProtocol (
547 (VOID **)&LoadedImage
550 if (EFI_ERROR (Status)) {
555 if (!EFI_ERROR (Status)) {
559 }
else if (Status != EFI_NOT_FOUND) {
564 if (EFI_ERROR (Status)) {
565 Status =
gBS->CreateEvent (
573 if (!EFI_ERROR (Status)) {
574 gBS->RegisterProtocolNotify (
575 &gEfiSimpleTextInputExProtocolGuid,
580 gBS->RegisterProtocolNotify (
588 "CRSCR: Cannot create event for keyboard protocol arrivals %r\n",
#define APPLE_EVENT_TYPE_NONE
VOID * APPLE_EVENT_HANDLE
#define APPLE_EVENT_TYPE_MOUSE_CLICK
#define APPLE_EVENT_TYPE_KEY_DOWN
EFI_GUID gAppleEventProtocolGuid
#define APPLE_EVENT_PROTOCOL_REVISION_MINIMUM
@ AppleHidUsbKbUsageKeyF10
STATIC EFI_STATUS EFIAPI ShowStatus(IN UINT8 Red, IN UINT8 Green, IN UINT8 Blue)
VOID EFIAPI InstallKeyHandlerWrapper(IN EFI_EVENT Event, IN VOID *Context)
STATIC EFI_STATUS EFIAPI TakeScreenshot(IN EFI_KEY_DATA *KeyData)
STATIC VOID EFIAPI AppleEventKeyHandler(IN APPLE_EVENT_INFORMATION *Information, IN VOID *NotifyContext)
#define STATUS_SQUARE_SIDE
EFI_STATUS EFIAPI CrScreenshotDxeEntry(IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable)
STATIC EFI_EVENT mProtocolNotification
STATIC UINT64 mPreviousTime
STATIC EFI_STATUS InstallKeyHandler(VOID)
STATIC BOOLEAN mEnableMouseClick
EFI_STATUS OcParseLoadOptions(IN CONST EFI_LOADED_IMAGE_PROTOCOL *LoadedImage, OUT OC_FLEX_ARRAY **ParsedVars)
BOOLEAN OcHasParsedVar(IN CONST OC_FLEX_ARRAY *ParsedVars, IN CONST VOID *Name, IN CONST OC_STRING_FORMAT StringFormat)
EFI_STATUS OcSetFileData(IN EFI_FILE_PROTOCOL *WritableFs OPTIONAL, IN CONST CHAR16 *FileName, IN CONST VOID *Buffer, IN UINT32 Size)
EFI_STATUS OcFindWritableOcFileSystem(OUT EFI_FILE_PROTOCOL **FileSystem)
VOID OcFlexArrayFree(IN OUT OC_FLEX_ARRAY **FlexArray)
#define MS_TO_NANOSECONDS(x)
EFI_STATUS OcHandleProtocolFallback(IN EFI_HANDLE Handle, IN EFI_GUID *Protocol, OUT VOID **Interface)
EFI_STATUS OcEncodePng(IN VOID *RawData, IN UINT32 Width, IN UINT32 Height, OUT VOID **Buffer, OUT UINTN *BufferSize)
EFI_RUNTIME_SERVICES * gRT
EFI_GUID gEfiGraphicsOutputProtocolGuid
EFI_GUID gEfiLoadedImageProtocolGuid
UINT64 EFIAPI GetTimeInNanoSecond(IN UINT64 Ticks)
UINT64 EFIAPI GetPerformanceCounter(VOID)