本文整理汇总了C++中EFI_PXE_BASE_CODE_PROTOCOL::Mtftp方法的典型用法代码示例。如果您正苦于以下问题:C++ EFI_PXE_BASE_CODE_PROTOCOL::Mtftp方法的具体用法?C++ EFI_PXE_BASE_CODE_PROTOCOL::Mtftp怎么用?C++ EFI_PXE_BASE_CODE_PROTOCOL::Mtftp使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类EFI_PXE_BASE_CODE_PROTOCOL
的用法示例。
在下文中一共展示了EFI_PXE_BASE_CODE_PROTOCOL::Mtftp方法的3个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: ASSERT
EFI_STATUS
BdsTftpLoadImage (
IN EFI_DEVICE_PATH* DevicePath,
IN EFI_HANDLE Handle,
IN EFI_DEVICE_PATH* RemainingDevicePath,
IN EFI_ALLOCATE_TYPE Type,
IN OUT EFI_PHYSICAL_ADDRESS *Image,
OUT UINTN *ImageSize
)
{
EFI_STATUS Status;
EFI_PXE_BASE_CODE_PROTOCOL *Pxe;
UINT64 TftpBufferSize;
VOID* TftpBuffer;
EFI_IP_ADDRESS ServerIp;
IPv4_DEVICE_PATH* IPv4DevicePathNode;
FILEPATH_DEVICE_PATH* FilePathDevicePath;
EFI_IP_ADDRESS LocalIp;
ASSERT(IS_DEVICE_PATH_NODE(RemainingDevicePath,MESSAGING_DEVICE_PATH,MSG_IPv4_DP));
IPv4DevicePathNode = (IPv4_DEVICE_PATH*)RemainingDevicePath;
FilePathDevicePath = (FILEPATH_DEVICE_PATH*)(IPv4DevicePathNode + 1);
Status = gBS->LocateProtocol (&gEfiPxeBaseCodeProtocolGuid, NULL, (VOID **)&Pxe);
if (EFI_ERROR(Status)) {
return Status;
}
Status = Pxe->Start (Pxe, FALSE);
if (EFI_ERROR(Status) && (Status != EFI_ALREADY_STARTED)) {
return Status;
}
if (!IPv4DevicePathNode->StaticIpAddress) {
Status = Pxe->Dhcp(Pxe, TRUE);
} else {
CopyMem (&LocalIp.v4, &IPv4DevicePathNode->LocalIpAddress, sizeof (EFI_IPv4_ADDRESS));
Status = Pxe->SetStationIp (Pxe, &LocalIp, NULL);
}
if (EFI_ERROR(Status)) {
return Status;
}
CopyMem (&ServerIp.v4, &IPv4DevicePathNode->RemoteIpAddress, sizeof (EFI_IPv4_ADDRESS));
Status = Pxe->Mtftp (
Pxe,
EFI_PXE_BASE_CODE_TFTP_GET_FILE_SIZE,
NULL,
FALSE,
&TftpBufferSize,
NULL,
&ServerIp,
(UINT8 *)FilePathDevicePath->PathName,
NULL,
TRUE
);
if (EFI_ERROR(Status)) {
return Status;
}
// Allocate a buffer to hold the whole file.
TftpBuffer = AllocatePool(TftpBufferSize);
if (TftpBuffer == NULL) {
return EFI_OUT_OF_RESOURCES;
}
Status = Pxe->Mtftp (
Pxe,
EFI_PXE_BASE_CODE_TFTP_READ_FILE,
TftpBuffer,
FALSE,
&TftpBufferSize,
NULL,
&ServerIp,
(UINT8 *)FilePathDevicePath->PathName,
NULL,
FALSE
);
if (EFI_ERROR(Status)) {
FreePool(TftpBuffer);
} else if (ImageSize != NULL) {
*ImageSize = (UINTN)TftpBufferSize;
}
return Status;
}
示例2: if
//.........这里部分代码省略.........
//
// Get the last received Dhcp4 reply packet.
//
if (Mode->PxeReplyReceived) {
Cache4 = &Private->PxeReply.Dhcp4;
} else if (Mode->ProxyOfferReceived) {
Cache4 = &Private->ProxyOffer.Dhcp4;
} else {
Cache4 = &Private->DhcpAck.Dhcp4;
}
ASSERT (Cache4->OptList[PXEBC_DHCP4_TAG_INDEX_BOOTFILE] != NULL);
//
// Parse the boot server address.
// If prompt/discover is disabled, get the first boot server from the boot servers list.
// Otherwise, parse the boot server Ipv4 address from next server address field in DHCP header.
// If all these fields are not available, use option 54 instead.
//
VendorOpt = &Cache4->VendorOpt;
if (IS_DISABLE_PROMPT_MENU (VendorOpt->DiscoverCtrl) && IS_VALID_BOOT_SERVERS (VendorOpt->BitMap)) {
Entry = VendorOpt->BootSvr;
if (VendorOpt->BootSvrLen >= sizeof (PXEBC_BOOT_SVR_ENTRY) && Entry->IpCnt > 0) {
CopyMem (
&Private->ServerIp,
&Entry->IpAddr[0],
sizeof (EFI_IPv4_ADDRESS)
);
}
}
if (Private->ServerIp.Addr[0] == 0) {
//
// ServerIp.Addr[0] equals zero means we failed to get IP address from boot server list.
// Try to use next server address field.
//
CopyMem (
&Private->ServerIp,
&Cache4->Packet.Offer.Dhcp4.Header.ServerAddr,
sizeof (EFI_IPv4_ADDRESS)
);
}
if (Private->ServerIp.Addr[0] == 0) {
//
// Still failed , use the IP address from option 54.
//
CopyMem (
&Private->ServerIp,
Cache4->OptList[PXEBC_DHCP4_TAG_INDEX_SERVER_ID]->Data,
sizeof (EFI_IPv4_ADDRESS)
);
}
//
// Parse the boot file name by option.
//
Private->BootFileName = Cache4->OptList[PXEBC_DHCP4_TAG_INDEX_BOOTFILE]->Data;
if (Cache4->OptList[PXEBC_DHCP4_TAG_INDEX_BOOTFILE_LEN] != NULL) {
//
// Parse the boot file size by option.
//
CopyMem (&Value, Cache4->OptList[PXEBC_DHCP4_TAG_INDEX_BOOTFILE_LEN]->Data, sizeof (Value));
Value = NTOHS (Value);
//
// The field of boot file size is 512 bytes in unit.
//
*BufferSize = 512 * Value;
} else {
//
// Get the bootfile size by tftp command if no option available.
//
Status = PxeBc->Mtftp (
PxeBc,
EFI_PXE_BASE_CODE_TFTP_GET_FILE_SIZE,
NULL,
FALSE,
BufferSize,
&Private->BlockSize,
&Private->ServerIp,
Private->BootFileName,
NULL,
FALSE
);
}
//
// Save the value of boot file size.
//
Private->BootFileSize = (UINTN) *BufferSize;
//
// Display all the information: boot server address, boot file name and boot file size.
//
AsciiPrint ("\n Server IP address is ");
PxeBcShowIp4Addr (&Private->ServerIp.v4);
AsciiPrint ("\n NBP filename is %a", Private->BootFileName);
AsciiPrint ("\n NBP filesize is %d Bytes", Private->BootFileSize);
return Status;
}
示例3: if
/**
Parse out the boot information from the last Dhcp4 reply packet.
@param[in, out] Private Pointer to PxeBc private data.
@param[out] BufferSize Size of the boot file to be downloaded.
@retval EFI_SUCCESS Successfully parsed out all the boot information.
@retval Others Failed to parse out the boot information.
**/
EFI_STATUS
PxeBcDhcp4BootInfo (
IN OUT PXEBC_PRIVATE_DATA *Private,
OUT UINT64 *BufferSize
)
{
EFI_PXE_BASE_CODE_PROTOCOL *PxeBc;
EFI_PXE_BASE_CODE_MODE *Mode;
EFI_STATUS Status;
PXEBC_DHCP4_PACKET_CACHE *Cache4;
UINT16 Value;
PxeBc = &Private->PxeBc;
Mode = PxeBc->Mode;
Status = EFI_SUCCESS;
*BufferSize = 0;
//
// Get the last received Dhcp4 reply packet.
//
if (Mode->PxeReplyReceived) {
Cache4 = &Private->PxeReply.Dhcp4;
} else if (Mode->ProxyOfferReceived) {
Cache4 = &Private->ProxyOffer.Dhcp4;
} else {
Cache4 = &Private->DhcpAck.Dhcp4;
}
//
// Parse the boot server Ipv4 address by next server address.
// If this field isn't available, use option 54 instead.
//
CopyMem (
&Private->ServerIp,
&Cache4->Packet.Offer.Dhcp4.Header.ServerAddr,
sizeof (EFI_IPv4_ADDRESS)
);
if (Private->ServerIp.Addr[0] == 0) {
CopyMem (
&Private->ServerIp,
Cache4->OptList[PXEBC_DHCP4_TAG_INDEX_SERVER_ID]->Data,
sizeof (EFI_IPv4_ADDRESS)
);
}
//
// Parse the boot file name by option.
//
ASSERT (Cache4->OptList[PXEBC_DHCP4_TAG_INDEX_BOOTFILE] != NULL);
Private->BootFileName = Cache4->OptList[PXEBC_DHCP4_TAG_INDEX_BOOTFILE]->Data;
if (Cache4->OptList[PXEBC_DHCP4_TAG_INDEX_BOOTFILE_LEN] != NULL) {
//
// Parse the boot file size by option.
//
CopyMem (&Value, Cache4->OptList[PXEBC_DHCP4_TAG_INDEX_BOOTFILE_LEN]->Data, sizeof (Value));
Value = NTOHS (Value);
//
// The field of boot file size is 512 bytes in unit.
//
*BufferSize = 512 * Value;
} else {
//
// Get the bootfile size by tftp command if no option available.
//
Status = PxeBc->Mtftp (
PxeBc,
EFI_PXE_BASE_CODE_TFTP_GET_FILE_SIZE,
NULL,
FALSE,
BufferSize,
&Private->BlockSize,
&Private->ServerIp,
Private->BootFileName,
NULL,
FALSE
);
}
//
// Save the value of boot file size.
//
Private->BootFileSize = (UINTN) *BufferSize;
//
// Display all the information: boot server address, boot file name and boot file size.
//
AsciiPrint ("\n Server IP address is ");
PxeBcShowIp4Addr (&Private->ServerIp.v4);
//.........这里部分代码省略.........