0

我使用以下命令来定位EFI_USER_MANAGER_PROTOCOL:

Status = gBS->LocateHandle(ByProtocol, &gEfiUserManagerProtocolGuid, NULL, &bufferSizeu, handlesu);

我明白了EFI_ERROR - EFI_NOT_FOUND

现在我尝试安装协议,然后打开协议:

  Status = gBS->InstallMultipleProtocolInterfaces (&ImageHandle, &gEfiUserManagerProtocolGuid, NULL, NULL);

协议打开成功,我尝试调用函数current()

Status = users->Current(users, &User);

电脑死机,没有显示任何错误。

我该如何解决?

4

1 回答 1

0

要解决此问题,您需要检查如何调用 InstallMultipleProtocolInterfaces - 看起来您没有提供协议实例(实际上您提供了 NULL)。因此,当您找到协议实例时,您会找到放置在那里的内容,即 NULL,因此您的“用户”变量为 NULL,并且在您使用它时系统会挂起。

请在 UEFI 规范中找到 InstallMultipleProtocolInterfaces 的描述:第一项(在 Handle 之后)始终是指向协议 GUID 的指针,第二项始终是指向协议接口的指针。这些对用于调用引导服务 InstallProtocolInterface() 以将协议接口添加到 Handle。

我会做类似的事情:

Status = gBS->InstallMultipleProtocolInterfaces (
    &ImageHandle,
    &gEfiUserManagerProtocolGuid,
    &mUserManager,
    NULL);

其中 mUserManager 将是您的协议接口结构。由于您拥有协议接口,因此您可以验证所定位协议的地址是否指向结构的实际位置。

于 2014-06-03T07:39:22.137 回答