Как я могу передать хотя бы «пару байтов» в локальной сети (UEFI DXE) - PullRequest
0 голосов
/ 16 февраля 2020

Мне нужно написать драйвер (DXE), который может передавать «пару байтов» с виртуальной машины (QEMU) на хост-систему (ОС - Ubuntu). Я прочитал UEFI_Spe c и Руководство для разработчиков, но я до сих пор не понимаю, как написать код и какой протокол мне следует использовать (пытался использовать TCPv4, но не могу даже LocateHandleBuffer).

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

Я получаю:

EFI_UNSUPPORTED

Если кто-то может объяснить мне или показать примеры кода, я буду очень благодарен. Спасибо.

1 Ответ

1 голос
/ 16 февраля 2020

Для большинства сетевых протоколов сначала необходимо использовать соответствующий «Протокол привязки службы», чтобы получить дескриптор, содержащий искомый протокол.

Используйте эти шаги для доступа к Tcp4Protocol:

gBS->LocateHandleBuffer(ByProtovol,gEfiTcp4ServiceBindingProtocolGuid, NULL, &HandleCount, &HandleBuffer);
// Loop over the HandleBuffer Array and pick the one you need
gBS->HandleProtocol(HandleBuffer[YourIndex], &gEfiTcp4ServiceBindingProtocolGuid, &Tcp4SBProtocol);
Tcp4SBProtocol->CreateChild(Tcp4SBProtocol, &Tcp4Handle);
gBS->HandleProtocol(Tcp4Handle, &gEfiTcp4ProtocolGuid, &Tcp4Protocol);

Чтобы проверить, доступен ли NI C, вы можете использовать:

// This should return EFI_SUCCESS
gBS->LocateProtocol(&gEfiSimpleNetworkProtocolGuid, NULL, &SimpleNetworkProtocol);

Существует полный пример кода для протокола HttpProtocol в спецификации Uefi (начиная на странице 1548) протокол Tcp4Protocol не сильно отличается.

...