MASM32 Downloads
EFI_KEY_STATE struct KeyShiftState dd ? KeyToggleState db ? ; EFI_KEY_TOGGLE_STATEEFI_KEY_STATE endsP_EFI_KEY_STATE TYPEDEF PTR EFI_KEY_STATEEFI_KEY_DATA struct Key EFI_INPUT_KEY {?} KeyState EFI_KEY_STATE {?}EFI_KEY_DATA endsP_EFI_KEY_DATA TYPEDEF PTR EFI_KEY_DATAEFI_KEY_TOGGLE_STATE TYPEDEF UINT8P_EFI_KEY_TOGGLE_STATE TYPEDEF PTR EFI_KEY_TOGGLE_STATE; dword KeyShiftState:EFI_SHIFT_STATE_VALID equ 0x80000000EFI_RIGHT_SHIFT_PRESSED equ 0x00000001EFI_LEFT_SHIFT_PRESSED equ 0x00000002EFI_RIGHT_CONTROL_PRESSED equ 0x00000004EFI_LEFT_CONTROL_PRESSED equ 0x00000008EFI_RIGHT_ALT_PRESSED equ 0x00000010EFI_LEFT_ALT_PRESSED equ 0x00000020EFI_RIGHT_LOGO_PRESSED equ 0x00000040EFI_LEFT_LOGO_PRESSED equ 0x00000080EFI_MENU_KEY_PRESSED equ 0x00000100EFI_SYS_REQ_PRESSED equ 0x00000200; byte EFI_KEY_TOGGLE_STATE:EFI_SCROLL_LOCK_ACTIVE equ 0x01EFI_NUM_LOCK_ACTIVE equ 0x02EFI_CAPS_LOCK_ACTIVE equ 0x04EFI_KEY_STATE_EXPOSED equ 0x40EFI_TOGGLE_STATE_VALID equ 0x80;-------------------------------------; EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL;-------------------------------------P_EFI_KEY_NOTIFY_FUNCTION TYPEDEF POINTER ;PTR EFI_KEY_NOTIFY_FUNCTIONRAWINTERFACE ConInEx STDFUNC Reset, <voidarg>, pThis:PTR ConInEx, ExtendedVerification:BOOLEAN STDFUNC ReadKeyStrokeEx, <voidarg>, pThis:PTR ConInEx, KeyData: P_EFI_KEY_DATA WaitForKeyEx EFI_EVENT ? STDFUNC SetState, <voidarg>, pThis:PTR ConInEx, KeyToggleState: P_EFI_KEY_TOGGLE_STATE STDFUNC RegisterKeyNotify, <voidarg>, pThis:PTR ConInEx, KeyData : P_EFI_KEY_DATA, KeyNotificationFunction: P_EFI_KEY_NOTIFY_FUNCTION STDFUNC UnregisterKeyNotify , <voidarg>, pThis:PTR ConInEx, NotificationHandle: P_EFI_KEY_NOTIFY_FUNCTIONENDRAWINTERFACEPCONINEX TYPEDEF PTR ConInEx.dataEFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL_GUID EFI_GUID <0xDD9E7534, 0x7762, 0x4698, {0x8C, 0x14, 0xF5, 0x85, 0x17, 0xA6, 0x25, 0xAA}>
include efiOA.incinclude efiGUID.incexterndef pConsole:PCONOUTexterndef pBootServices:P_BOOT_SERVICES.data ConInExProto qword 0 Handle EFI_HANDLE 0 SystemTablePtr dq 0 pConsole PCONOUT 0 pConsoleIn PCONIN 0 pBootServices P_BOOT_SERVICES 0 pRuntimeServices P_RUNTIME_SERVICES 0.codealign ALIGN_CODEWaitKey proc FRAME local eindex : QWORD UseConsole "Waiting for a key....." ; rather than spin on key read, use event system to wait for key event: mov r11, pConsoleIn mov r10, pBootServices invoke [r10].EFI_BOOT_SERVICES.WaitForEvent, 1, addr [r11].ConInEx.WaitForKeyEx, addr eindex test rax,rax jz @F ; EFI_SUCCESS, key event happened ret @@: ; remove the key mov rcx, pConsoleIn invoke [rcx].ConInEx.Reset, rcx, FALSE retWaitKey endpMain PROC FRAME imageHandle:EFI_HANDLE, SystemTable:PTR_EFI_SYSTEM_TABLE ;Runtime model initialization mov Handle, rcx mov SystemTablePtr,rdx mov rax, SystemTablePtr mov rsi, [rax].EFI_SYSTEM_TABLE.RuntimeServices mov pRuntimeServices, rsi mov rsi, [rax].EFI_SYSTEM_TABLE.BootServices mov pBootServices, rsi mov rcx,SystemTablePtr mov rax,[rcx].EFI_SYSTEM_TABLE.ConIn mov pConsoleIn,rax mov rax,[rcx].EFI_SYSTEM_TABLE.ConOut mov pConsole, rax mov rax, pBootServices invoke [rax].EFI_BOOT_SERVICES.LocateProtocol, ADDR EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL_GUID, NULL, ADDR ConInExProto call WaitKey CStr complete, "Complete",13,10 mov rax, pBootServices invoke [rax].EFI_BOOT_SERVICES.Exit, Handle, EFI_SUCCESS, 10, addr completeMain endp
the uefi inc file shipped with UASM