前面【参考1】提到了 StartImage 加载 CLib 编写Application 出错的原因,这篇文章介绍如何解决这个问题。
根据原因来看是因为找不到提供 Parameters 的Protocol,那么我们在调用之前给被加载的Application 装上需要的Protocol即可。安装 Pr[......]
标签: 控制台
Step to UEFI (84) ShellExecute 的使用
之前提到过,使用 LoadImage 和 StartImage 无法加载 CLib Build出来的 EFI Application。一种变通的方法是通过 ShellLib 下面的 ShellExcute 来调用其他的 EFI Application。
具体定义在 \ShellPkg\Libr[......]
Step to UEFI (44) ----- 获得按键
在Shell下面编写工具程序,我们经常需要和用户进行交互,需要取得客户按键的信息。
对于这个问题,可以使用 EFI_SIMPLE_TEXT_INPUT_PROTOCOL 的 ReadKeyStroke 来解决【参考1】
写一个小程序来验证一下
#include <U[......]
Step to UEFI (42) ----- 给Shell加一个时间显示功能
目标是:在Shell的右上角实现一个时间显示,类似DOS下的那种内存驻留程序,不影响其他程序的运行一直显示时间。
方法:首先想到的最简单方法是修改Shell.bin的代码,在开始的地方加入一个定时器,触发之后,首先保存当前光标位置,然后移动光标到右上角,自动更新显示时间,最后再将光标移回原位置[......]
Step to UEFI (41) ----- x64 的 FreqCalc程序
之前的一篇文章《Step to UEFI (9)----使用RDTSC计算当前CPU 频率》【参考1】给出了一个计算当前CPU频率的方法。不过 Tim 给我留言,他说这篇文章的程序无法在 x64下正常编译:
我猜测原因是因为我的程序使用的内嵌汇编,内嵌汇编无法被X64的编译器正常编译的[......]
Step to UEFI (39) ----- 编写一个GetCursorPosition函数
我们知道,可以使用 ConOut 下面的 SetCursorPosition 来设置光标输出的位置【参考1】。
但是,找了一圈也没有找到 GetCursorPosition ,我怎么知道当前光标在哪呢?查查C手册,通常使用conio.h 中的 wherex,wherey 来完成这个功能[......]
Step to UEFI (37) ----- SetTimer 设定定时器(上)
众所周知:UEFI中没有中断(UEFI唯一一个中断int 0,timer )【参考1】,如果想实现一个定时器的功能,必须使用 Event。
实现的思路是:
1. CreateEvent 创建 Timer Event
2. SetTimer 设定 Periodic 触发
3. SetT[......]
Step to UEFI (34) ----- FindFile2 查找特定文件
前面介绍了如何枚举全部文件,这里介绍一下如何枚举特定的问题。比如,用 “M*.*” 匹配全部 M开头的文件。
参考 touch 命令的Source Code 很快有了方案,使用:ShellOpenFileMetaArg
对应的头文件在 \ShellPkg\Include\Library\[......]
通过WriteFile对硬盘发送数据
下面这个程序首先用 CreateFile 打开 PhysicalDiskX 然后使用 CreateFile 向里面写入数据。
#include "stdafx.h" #include <windows.h> #include <stdio.h> #include[......]
VS2008 等待按键
通常我们在 Console 的程序中需要等待按键之类的,通常使用的都是:conio.h中的getch() 或者 stdio.h中的getchar()【参考1】。美中不足的是,这两个函数都会一直在那里等待按键,不会去做其他的事情。如果我们需要实现类似Pascal语言中 Keypress 函数,“检查一[......]