在翻看之前写的 《Step to UEFI (16) ----- CLIB下获得 SystemTable》 【参考1】的时候偶然注意到:
加入头文件 #include Library/UefiBootServicesTableLib.h ,这个头文件的内容是
#ifndef __UEFI_BOOT_SERVICES_TABLE_LIB_H__
#define __UEFI_BOOT_SERVICES_TABLE_LIB_H__
///
/// Cache the Image Handle
///
extern EFI_HANDLE gImageHandle;
///
/// Cache pointer to the EFI System Table
///
extern EFI_SYSTEM_TABLE *gST;
///
/// Cache pointer to the EFI Boot Services Table
///
extern EFI_BOOT_SERVICES *gBS;
#endif
除了之前关注到的各种Table,居然还有一个 gImageHandle !!!
马上动手写了一个程序验证:
#include <Uefi.h> #include <Library/UefiLib.h> #include <Library/ShellCEntryLib.h> #include <stdio.h> #include <stdlib.h> #include <wchar.h> extern EFI_BOOT_SERVICES *gBS; extern EFI_SYSTEM_TABLE *gST; extern EFI_RUNTIME_SERVICES *gRT; extern EFI_HANDLE gImageHandle; //SimpleTextInputEx.harderr //#define EFI_SHIFT_STATE_VALID 0x80000000 //#define EFI_LEFT_CONTROL_PRESSED 0x00000002 EFI_STATUS EFIAPI NotificationFunction( IN EFI_KEY_DATA *KeyData ) { printf("This is a test from www.lab-z.com \n"); return(EFI_SUCCESS); } /*** Demonstrates basic workings of the main() function by displaying a welcoming message. Note that the UEFI command line is composed of 16-bit UCS2 wide characters. The easiest way to access the command line parameters is to cast Argv as: wchar_t **wArgv = (wchar_t **)Argv; @retval 0 The application exited normally. @retval Other An error occurred. ***/ int EFIAPI main ( IN int Argc, IN char **Argv ) { EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *SimpleEx; EFI_KEY_DATA KeyData; EFI_STATUS Status; EFI_HANDLE CtrlCNotifyHandle = NULL; INTN i; Status = gBS -> OpenProtocol( gST -> ConsoleInHandle, &gEfiSimpleTextInputExProtocolGuid, (VOID**)&SimpleEx, gImageHandle, NULL, EFI_OPEN_PROTOCOL_GET_PROTOCOL); if (EFI_ERROR(Status)) { printf("OpenProtocol ERROR!!\n"); } KeyData.KeyState.KeyToggleState = 0; KeyData.Key.ScanCode = 0; KeyData.KeyState.KeyShiftState = EFI_SHIFT_STATE_VALID | EFI_LEFT_CONTROL_PRESSED; KeyData.Key.UnicodeChar = L's'; Status = SimpleEx -> RegisterKeyNotify ( SimpleEx, &KeyData, NotificationFunction, &CtrlCNotifyHandle); for (i=0;i<200;i++) { printf("Test\n"); gBS -> Stall (5000); } Status = SimpleEx -> UnregisterKeyNotify(SimpleEx, CtrlCNotifyHandle); return EFI_SUCCESS; }
运行结果和之前文章一样,就是说这个方法是OK的!
程序下载 Mainh2
==============================================================================
这样的话,之前提到的方法完全就是“脱了裤子放屁----多此一举”。
另外,再说点好玩的事情,前几天朋友圈里有人转了一篇文章,吹嘘他的“重要”发明“竖版世界地图”。文章的观点基本上是:中国最大的敌人是美国。美国和中国有多远?正常人看普通的世界地图会被误导,以为要横跨太平洋。但是实际上中国和美国如果从北极的方向走才是最近的。结论:看普通的世界地图会导致如此不堪的错误,用我发明的竖版世界地图就万事大吉。文章还在暗示设计北斗导航系统,差点因为看普通的地图而导致大错。
这里放一个“竖版的世界地图”【来自红网,Baidu搜出来的结果】
怎么说呢,看着是挺别扭的,地球仿佛将菊花对准了你............
我想看国家疆域,你把一个水球给我干嘛?
上小学和初中时学过一点地理知识。对于地图来说,基本上就是准确的看着不舒服,舒服看着不准确(投影决定的),根本原因是地球不是立方体,再仔细追究丫也不是标准的球体。
又想起来看过一篇文章,经常出国的人看每个国家的地图都觉得很别扭“为毛中国不是在中间?”
除了习惯的力量,还有这种竖版的地图,上面是北还是南?另外,莫非搞卫星的人不知道世界上还有一种“用空间中到定点的距离小于或等于定长的所有点组成图形的结构”结合“通用标记地面地理特性的方法”贴图在一起的通常我们称之为“地球仪”的东西吗?
说到这里,我也想有一个“伟大”的发明,那就是按照地球表面的凸凹形状做一个地球仪----已经有了?没关系,那我就按照表面G的不同绘制吧。我也编一个故事:NK发射火箭没人考虑G点差别,一直无法满意。后来偶尔最高统帅看到我的地球仪,茅塞顿开.........现在我的地球仪对NK是禁运的.........
建议将 Google Earth 禁掉,我相信我的发明能更加“伟大”。
参考:
1.http://www.lab-z.com/step-to-uefi-16%EF%BC%89-clib%E4%B8%8B%E8%8E%B7%E5%BE%97-systemtable/ Step to UEFI (16) ----- CLIB下获得 SystemTable