如何在 UEFI 应用程序中使用 ArpDxe 驱动程序

How to utilize ArpDxe driver in UEFI application

我正在尝试在 UEFI 应用程序中使用 ArpDxe 驱动程序获取 ARP table。这是我的代码:

EFI_ARP_PROTOCOL* Arp;
EFI_STATUS Status;
UINT32 Count;
UINT32 Length;
EFI_ARP_FIND_DATA* Entries;
    
Status = gBS->LocateProtocol (
             &gEfiArpProtocolGuid,
             NULL,
             (VOID**)&Arp
             );

if (Status == EFI_SUCCESS) {
    Status = Arp->Find(Arp, true, NULL, &Length, &Count, &Entries, false);
    if (Status == EFI_SUCCESS) {
        //......
    }
}

问题是,ARP 查找功能总是 returns EFI_NOT_FOUND。 我尝试在 运行 我的应用程序之前 ping 一个有效的 IP,尝试在调用 find 函数之前调用 ARP 请求函数,甚至尝试调用 ARP add 函数来添加一个虚拟数据,但是 none 它们导致可以找到一些东西。有人可以指出我做错了什么吗?

与大多数网络协议一样,ARP 使用服务绑定协议来创建新实例。

你必须:

  • 找到服务绑定协议

    EFI_HANDLE ChildHandle = NULL;
    EFI_SERVICE_BINDING_PROTOCOL* ArpSb;
    gBS->LocateProtocol(&gEfiArpServiceBindingProtocolGuid,NULL,(VOID**)&ArpSb)
    
  • 创建一个新的 ARP 实例

    ArpSb->CreateChild(ArpSb, &ChildHandle)
    
  • 处理EFI_ARP_PROTOCOL

    gBS->HandleProtocol(ChildHandle, &gEfiArpProtocolGuid, (VOID**)&Arp)
    
  • 配置新实例

    Arp->Configure(Arp,...)
    
  • 完成后销毁实例

    ArpSb->DestroyChild(ArpSb, ChildHandle)
    

当您直接搜索 proctocol(不创建新实例)时,您会得到一个属于某些配置未知的驱动程序或应用程序的实例。