+ Gets information about a file from an MTFTPv4 server. \r
+ \r
+ The GetInfo() function assembles an MTFTPv4 request packet with options; \r
+ sends it to the MTFTPv4 server; and may return an MTFTPv4 OACK, MTFTPv4 ERROR, \r
+ or ICMP ERROR packet. Retries occur only if no response packets are received \r
+ from the MTFTPv4 server before the timeout expires.\r
+ It is implemented with EfiMtftp4ReadFile: build a token, then pass it to \r
+ EfiMtftp4ReadFile. In its check packet callback abort the opertions.\r
+\r
+ @param This Pointer to the EFI_MTFTP4_PROTOCOL instance\r
+ @param OverrideData Data that is used to override the existing \r
+ parameters. If NULL, the default parameters that \r
+ were set in the EFI_MTFTP4_PROTOCOL.Configure() \r
+ function are used\r
+ @param Filename Pointer to ASCIIZ file name string\r
+ @param ModeStr Pointer to ASCIIZ mode string. If NULL, "octet" \r
+ will be used\r
+ @param OptionCount Number of option/value string pairs in OptionList\r
+ @param OptionList Pointer to array of option/value string pairs. \r
+ Ignored if OptionCount is zero\r
+ @param PacketLength The number of bytes in the returned packet\r
+ @param Packet PacketThe pointer to the received packet. This \r
+ buffer must be freed by the caller.\r
+\r
+ @retval EFI_SUCCESS An MTFTPv4 OACK packet was received and is in \r
+ the Buffer.\r
+ @retval EFI_INVALID_PARAMETER One or more of the following conditions is TRUE:\r
+ 1.This is NULL.\r
+ 2.Filename is NULL.\r
+ 3.OptionCount is not zero and OptionList is NULL.\r
+ 4.One or more options in OptionList have wrong format.\r
+ 5.PacketLength is NULL.\r
+ 6.One or more IPv4 addresses in OverrideData are \r
+ not valid unicast IPv4 addresses if OverrideData \r
+ is not NULL.\r
+ @retval EFI_UNSUPPORTED One or more options in the OptionList are in the\r
+ unsupported list of structure EFI_MTFTP4_MODE_DATA\r
+ @retval EFI_NOT_STARTED The EFI MTFTPv4 Protocol driver has not been started.\r
+ @retval EFI_NO_MAPPING When using a default address, configuration (DHCP, \r
+ BOOTP, RARP, etc.) has not finished yet.\r
+ @retval EFI_ACCESS_DENIED The previous operation has not completed yet.\r
+ @retval EFI_OUT_OF_RESOURCES Required system resources could not be allocated.\r
+ @retval EFI_TFTP_ERROR An MTFTPv4 ERROR packet was received and is in \r
+ the Buffer.\r
+ @retval EFI_ICMP_ERROR An ICMP ERROR packet was received and the Packet \r
+ is set to NULL.\r
+ @retval EFI_PROTOCOL_ERROR An unexpected MTFTPv4 packet was received and is \r
+ in the Buffer.\r
+ @retval EFI_TIMEOUT No responses were received from the MTFTPv4 server.\r
+ @retval EFI_DEVICE_ERROR An unexpected network error or system error occurred.\r
+ \r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+EfiMtftp4GetInfo (\r
+ IN EFI_MTFTP4_PROTOCOL *This,\r
+ IN EFI_MTFTP4_OVERRIDE_DATA *OverrideData OPTIONAL,\r
+ IN UINT8 *Filename,\r
+ IN UINT8 *ModeStr OPTIONAL,\r
+ IN UINT8 OptionCount,\r
+ IN EFI_MTFTP4_OPTION *OptionList OPTIONAL,\r
+ OUT UINT32 *PacketLength,\r
+ OUT EFI_MTFTP4_PACKET **Packet OPTIONAL\r
+ )\r
+{\r
+ EFI_MTFTP4_TOKEN Token;\r
+ MTFTP4_PROTOCOL *Instance;\r
+ MTFTP4_GETINFO_STATE *State;\r
+ EFI_STATUS Status;\r
+\r
+ if ((This == NULL) || (Filename == NULL) || (PacketLength == NULL) ||\r
+ ((OptionCount != 0) && (OptionList == NULL))) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ if (Packet != NULL) {\r
+ *Packet = NULL;\r
+ }\r
+\r
+ *PacketLength = 0;\r
+ Instance = MTFTP4_PROTOCOL_FROM_THIS (This);\r
+ State = &Instance->GetInfoState;\r
+ State->Packet = Packet;\r
+ State->PacketLen = PacketLength;\r
+ State->Status = EFI_SUCCESS;\r
+\r
+ //\r
+ // Fill in the Token to issue an synchronous ReadFile operation\r
+ //\r
+ Token.Status = EFI_SUCCESS;\r
+ Token.Event = NULL;\r
+ Token.OverrideData = OverrideData;\r
+ Token.Filename = Filename;\r
+ Token.ModeStr = ModeStr;\r
+ Token.OptionCount = OptionCount;\r
+ Token.OptionList = OptionList;\r
+ Token.BufferSize = 0;\r
+ Token.Buffer = NULL;\r
+ Token.CheckPacket = Mtftp4GetInfoCheckPacket;\r
+ Token.TimeoutCallback = NULL;\r
+ Token.PacketNeeded = NULL;\r
+\r
+ Status = EfiMtftp4ReadFile (This, &Token);\r