在翻看之前写的 《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



















