最近发现开机之后桌面有一个弹出窗口,郁闷的是上面没有关闭按钮,也无法通过 ALT+F4关闭。

从上面也可以看出来制作广告的人非常不用心

为了确认这个窗口的归属,使用 SPY++

再进一步查看属性就得知他是多玩坦克世界盒子的广告窗口。关掉坦克世界盒子这个窗口也会随之消失。

我挺喜欢这个法系小炮的。射速快8s,一局时间越久,战绩通常越好。
> Read More

最近偶然看到BaseLib 提供了AsmReadMm0() 和AsmWriteMm0()函数,于是进行了下面的实验。

首先,用AsmReadMm0 读取当前 MM0 寄存器的值,然后随机生成一个再写入 MM0 中。

#include <Uefi.h>
#include <Library/BaseLib.h>
#include <Library/UefiLib.h>
#include <Library/UefiApplicationEntryPoint.h>

EFI_STATUS
EFIAPI
MMXTestMain (
  IN     EFI_HANDLE                 ImageHandle,
  IN     EFI_SYSTEM_TABLE   ...								 > Read More
			

在实模式下,内存寻址是通过 “段寄存器:偏移” 来进行的。保护模式出现之后,因为内存地址长度的增加,这样的方式无法完成(不够长)。为了解决这样的使用索引来处理成为顺理成章的事情。

同时为了考虑兼容性,最终引入了Global Descriptor Table 来进行扩展。关于内存的地址信息存放在这个  GDT 中。接下来 CS/DS/ES这样的段寄存器不再存放内存的地址而是存放 GDT 中的“第x个条目”这样的信息。再引入一个 GDTR 的寄存器存放 GDT 在内存中的位置。

在\MdePkg\Include\Library\BaseLib.h中有定义读取 GDTR 的函数。

/**
  Reads the current Global Descriptor Table Register(GDTR) descriptor.

  Reads and returns the current GDTR descriptor...								 > Read More
			

最近在实验屏幕PSR功能的时候碰到一个诡异的问题。具体现象就是:鼠标可以打开桌面上的一个目录,然后就出现鼠标可以移动但是不能点击任何内容的情况。这个时候键盘仍然是可以使用的。

起初我怀疑是系统装了很多乱七八糟的软件导致的问题。然后将这个硬盘换到其他的机器上就没有这样的现象了。接下来就怀疑BIOS导致的,但是理论上BIOS不会导致系统下这样的情况。出现问题的时候,鼠标可以移动,Touch Pad(键盘下面的触摸板)也是可以移动的,但是无法点击。

偶然之间,我换了一个鼠标惊奇的发现问题消失了。然后意识到问题真的有可能是我的鼠标导致的。因为那个鼠标是我刚维修更换过微动的微软 1.01 鼠标,并且这个鼠标是复刻版的微软 1.01,换句话说,这个鼠标除了里面的电路板是微软原装,其他的东西要么是山寨的,要么是我自己维修更换过的。额外说一句,我很喜欢这个型号的鼠标,握起来感觉很好。但是这个对于手小的人来说非常别扭。这个型号的鼠标我有5个,除了1个是十年前购买的原装,其余都是复刻的。我一直用他们办公或者测试。

为了验证猜想,我在一台装有USBlyzer 的机器上实验这个鼠标,仍然能看到现象。接下来打开软件开始抓包。发现出现问题时这个鼠标的Button5 一直处于按下的状态。正常情况下,按下按键后会发出“鼠标X Button 按下”的消息,抬起的时候还会发出“鼠标X Button 抬起”的消息。比如下面就是一个例子:

 按下 Button 5

抬起 Button 5

> Read More

最近在编写代码的时候遇到一个非常奇怪的问题,经过化简,出现问题的代码如下:

#include <Uefi.h>
#include <Library/BaseLib.h>
#include <Library/BaseMemoryLib.h>
#include <Library/MemoryAllocationLib.h>
#include <Library/UefiLib.h>
#include <Library/UefiApplicationEntryPoint.h>
#include <Library/DebugLib.h>

EFI_PCI_IO_PROTOCOL         *mFFIO = NULL;

EFI_STATUS
EFIAPI
MSMain (
  IN     EFI_HANDLE                 ImageHandle,
  IN     EFI_SYSTEM_TABLE...								 > Read More
			

最近 Krishna 做了一个能够读取分析 UEFI Shell 下屏幕历史信息的工具。比如,你想得到某一个 Application 的输出结果,可以先让他运行一次,然后用这个工具抓取之前的输出结果。

这是用这个工具取得 BIOS Version 和 FPT 版本号的例子

具体项目在 https://github.com/krishna116/UefiTest 有兴趣的朋友可以去围观一下。

> Read More

NT32Pkg 是简单方便的虚拟机,很多情况下可以帮助我们验证一些功能。最近研究了一下这个虚拟机中按键功能的实现。

在 \Nt32Pkg\WinNtGopDxe\WinNtGopInput.c 的WinNtGopInitializeSimpleTextInForWindow 函数中可以看到如下代码:

  //
  // Initialize Simple Text In protoocol
  //
  Private->SimpleTextIn.Reset         = WinNtGopSimpleTextInReset;
  Private->SimpleTextIn.ReadKeyStroke = WinNtGopSimpleTextInReadKeyStroke;

  Status = gBS->CreateEvent (
          ...								 > Read More