【问题标题】:How to "CreateChild()".UEFI如何“CreateChild()”.UEFI
【发布时间】:2020-06-29 13:43:54
【问题描述】:

我想知道如何访问 TCP4Protocol 以在我的 DXE 驱动程序中使用。 我已经问过类似的问题:myFirstQestion

现在我找不到解决错误的方法。

因为我在尝试加载驱动程序时得到了调试字符串“无法创建子项”。在下面选择我的代码。

或者也许有人知道如何通过 dxe 驱动程序从链接完成我的任务。

谢谢。

#include "Uefi.h"
#include <Protocol/Tcp4.h>
#include <Library/UefiDriverEntryPoint.h>
#include <Library/UefiBootServicesTableLib.h>
#include <Protocol/ServiceBinding.h>
#include <Protocol/SimpleNetwork.h>
#include <Library/DebugLib.h>


EFI_STATUS
EFIAPI
Net1DriverDxeEntry(IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable)
{
    EFI_TCP4_PROTOCOL               *TCP4protocol = NULL;
    EFI_SERVICE_BINDING_PROTOCOL    *TCP4ServiceBinding = NULL;
    EFI_SIMPLE_NETWORK_PROTOCOL     *SimpleNetworkProtocol = NULL;
    EFI_HANDLE                      *HandleBuffer = NULL;
    EFI_HANDLE                      *TCP4Handle = NULL;
    UINTN                            HandleCount;
    UINTN                            i;
    CHAR16                          *Deb1 = L"Simple network protocol not found\r\n";
    CHAR16                          *Deb2 = L"TCP4 protocol not found\r\n";
    CHAR16                          *Deb3 = L"Can't create child\r\n";
    CHAR16                          *Deb4 = L"Can't handle protocol\n\r\n";





    EFI_STATUS Status = gBS->LocateProtocol(&gEfiSimpleNetworkProtocolGuid,NULL, (VOID**) &SimpleNetworkProtocol);

    if (EFI_ERROR (Status)) 
    {
        DEBUG((-1, "ShowStatus: Simple network protocol not found\n"));
        gST->ConOut->OutputString(gST->ConOut, Deb1);
        return EFI_UNSUPPORTED;
    }

    Status = gBS->LocateHandleBuffer(ByProtocol,&gEfiTcp4ProtocolGuid, NULL, &HandleCount,&HandleBuffer);
    if (EFI_ERROR (Status)) 
    {
        gST->ConOut->OutputString(gST->ConOut, Deb2);
        DEBUG((-2, "ShowStatus: TCP4 protocol not found\n"));
        return EFI_UNSUPPORTED;
    }

    for (i = 0; i < HandleCount; i ++) 
    {
        Status = gBS->HandleProtocol(HandleBuffer[i], &gEfiTcp4ServiceBindingProtocolGuid,(VOID **) &TCP4ServiceBinding);
        if(EFI_ERROR (Status))
        {
        DEBUG((-3, "\n"));
        gST->ConOut->OutputString(gST->ConOut, Deb3);
        return EFI_UNSUPPORTED;
        }

        TCP4ServiceBinding->CreateChild(TCP4ServiceBinding, TCP4Handle);


        Status = gBS->HandleProtocol(TCP4Handle,&gEfiTcp4ProtocolGuid,(VOID **) &TCP4protocol);
        if(EFI_ERROR (Status))
        {
        gST->ConOut->OutputString(gST->ConOut, Deb4);
        DEBUG((-4, "ShowStatus: Can't handle protocol\n"));
        return EFI_UNSUPPORTED;
        }
    }

return EFI_SUCCESS;
}

【问题讨论】:

    标签: c driver uefi


    【解决方案1】:

    TCP4Handle 的类型应该是 EFI_HANDLE 而不是 EFI_HANDLE*。

    EFI_HANDLE                      TCP4Handle = NULL;
    //....
    TCP4ServiceBinding->CreateChild(TCP4ServiceBinding, &TCP4Handle);
    

    而且您必须寻找 gEfiTcp4ServiceBindingProtocolGuid 而不是 gEfiTcp4ProtocolGuid。

    Status = gBS->LocateHandleBuffer(ByProtocol,&gEfiTcp4ServiceBindingProtocolGuid, NULL, &HandleCount,&HandleBuffer);
    

    【讨论】:

      猜你喜欢
      • 2021-03-25
      • 2015-11-20
      • 2019-04-04
      • 2017-02-07
      • 2023-03-30
      • 1970-01-01
      • 2016-01-11
      • 1970-01-01
      • 2015-10-28
      相关资源
      最近更新 更多