Step to UEFI (20) ----- 再论“ CLib 获得 ImageHandle”的问题

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

 

程序下载 Mainh2

==============================================================================

这样的话,之前提到的方法完全就是“脱了裤子放屁----多此一举”。

另外,再说点好玩的事情,前几天朋友圈里有人转了一篇文章,吹嘘他的“重要”发明“竖版世界地图”。文章的观点基本上是:中国最大的敌人是美国。美国和中国有多远?正常人看普通的世界地图会被误导,以为要横跨太平洋。但是实际上中国和美国如果从北极的方向走才是最近的。结论:看普通的世界地图会导致如此不堪的错误,用我发明的竖版世界地图就万事大吉。文章还在暗示设计北斗导航系统,差点因为看普通的地图而导致大错。

这里放一个“竖版的世界地图”【来自红网,Baidu搜出来的结果】

U9383P704DT20140623085032

怎么说呢,看着是挺别扭的,地球仿佛将菊花对准了你............

我想看国家疆域,你把一个水球给我干嘛?

上小学和初中时学过一点地理知识。对于地图来说,基本上就是准确的看着不舒服,舒服看着不准确(投影决定的),根本原因是地球不是立方体,再仔细追究丫也不是标准的球体。

又想起来看过一篇文章,经常出国的人看每个国家的地图都觉得很别扭“为毛中国不是在中间?”

除了习惯的力量,还有这种竖版的地图,上面是北还是南?另外,莫非搞卫星的人不知道世界上还有一种“用空间中到定点的距离小于或等于定长的所有点组成图形的结构”结合“通用标记地面地理特性的方法”贴图在一起的通常我们称之为“地球仪”的东西吗?

说到这里,我也想有一个“伟大”的发明,那就是按照地球表面的凸凹形状做一个地球仪----已经有了?没关系,那我就按照表面G的不同绘制吧。我也编一个故事:NK发射火箭没人考虑G点差别,一直无法满意。后来偶尔最高统帅看到我的地球仪,茅塞顿开.........现在我的地球仪对NK是禁运的.........

建议将 Google Earth 禁掉,我相信我的发明能更加“伟大”。

参考:

1.https://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

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注