]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/DevicePathDxe/DevicePathFromText.c
Adopt new IPv4/IPv6 device path for network modules.
[mirror_edk2.git] / MdeModulePkg / Universal / DevicePathDxe / DevicePathFromText.c
index 88994c2d911c9081790fdbe090ffc1ae7b7156eb..11f5c159df449acb1482c1f9e3dbeb2e08b19cc5 100644 (file)
@@ -1,74 +1,53 @@
-/*++\r
+/** @file\r
+  DevicePathFromText protocol as defined in the UEFI 2.0 specification.\r
 \r
-Copyright (c) 2006, Intel Corporation                                                         \r
-All rights reserved. This program and the accompanying materials                          \r
-are licensed and made available under the terms and conditions of the BSD License         \r
-which accompanies this distribution.  The full text of the license may be found at        \r
-http://opensource.org/licenses/bsd-license.php                                            \r
-                                                                                          \r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     \r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             \r
+Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
 \r
-Module Name:\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
 \r
-  DevicePathFromText.c\r
+**/\r
 \r
-Abstract:\r
+#include "DevicePath.h"\r
 \r
-  DevicePathFromText protocol as defined in the UEFI 2.0 specification.\r
 \r
---*/\r
+/**\r
 \r
-#include "DevicePath.h"\r
+  Duplicates a string.\r
+\r
+  @param  Src  Source string.\r
 \r
-STATIC\r
+  @return The duplicated string.\r
+\r
+**/\r
 CHAR16 *\r
 StrDuplicate (\r
   IN CONST CHAR16  *Src\r
   )\r
-/*++\r
-\r
-  Routine Description:\r
-    Duplicate a string\r
-\r
-  Arguments:\r
-    Src - Source string\r
-\r
-  Returns:\r
-    Duplicated string\r
-\r
---*/\r
 {\r
-  UINTN   Length;\r
-  CHAR16  *ReturnStr;\r
+  return AllocateCopyPool (StrSize (Src), Src);\r
+}\r
 \r
-  Length = StrLen ((CHAR16 *) Src);\r
+/**\r
 \r
-  ReturnStr = AllocateCopyPool ((Length + 1) * sizeof (CHAR16), (VOID *) Src);\r
+  Get parameter in a pair of parentheses follow the given node name.\r
+  For example, given the "Pci(0,1)" and NodeName "Pci", it returns "0,1".\r
 \r
-  return ReturnStr;\r
-}\r
+  @param  Str      Device Path Text.\r
+  @param  NodeName Name of the node.\r
 \r
-STATIC\r
+  @return Parameter text for the node.\r
+\r
+**/\r
 CHAR16 *\r
 GetParamByNodeName (\r
   IN CHAR16 *Str,\r
   IN CHAR16 *NodeName\r
   )\r
-/*++\r
-\r
-  Routine Description:\r
-    Get parameter in a pair of parentheses follow the given node name.\r
-    For example, given the "Pci(0,1)" and NodeName "Pci", it returns "0,1".\r
-\r
-  Arguments:\r
-    Str      - Device Path Text\r
-    NodeName - Name of the node\r
-\r
-  Returns:\r
-    Parameter text for the node\r
-\r
---*/\r
 {\r
   CHAR16  *ParamStr;\r
   CHAR16  *StrPointer;\r
@@ -120,28 +99,23 @@ GetParamByNodeName (
   return ParamStr;\r
 }\r
 \r
-STATIC\r
+/**\r
+  Gets current sub-string from a string list, before return\r
+  the list header is moved to next sub-string. The sub-string is separated\r
+  by the specified character. For example, the separator is ',', the string\r
+  list is "2,0,3", it returns "2", the remain list move to "0,3"\r
+\r
+  @param  List        A string list separated by the specified separator\r
+  @param  Separator   The separator character\r
+\r
+  @return A pointer to the current sub-string\r
+\r
+**/\r
 CHAR16 *\r
 SplitStr (\r
   IN OUT CHAR16 **List,\r
   IN     CHAR16 Separator\r
   )\r
-/*++\r
-\r
-  Routine Description:\r
-    Get current sub-string from a string list, before return\r
-    the list header is moved to next sub-string. The sub-string is separated\r
-    by the specified character. For example, the separator is ',', the string\r
-    list is "2,0,3", it returns "2", the remain list move to "0,3"\r
-\r
-  Arguments:\r
-    List       - A string list separated by the specified separator\r
-    Separator  - The separator character\r
-\r
-  Returns:\r
-    pointer    - The current sub-string\r
-\r
---*/\r
 {\r
   CHAR16  *Str;\r
   CHAR16  *ReturnStr;\r
@@ -179,7 +153,14 @@ SplitStr (
   return ReturnStr;\r
 }\r
 \r
-STATIC\r
+/**\r
+  Gets the next parameter string from the list.\r
+\r
+  @param List            A string list separated by the specified separator\r
+\r
+  @return A pointer to the current sub-string\r
+\r
+**/\r
 CHAR16 *\r
 GetNextParamStr (\r
   IN OUT CHAR16 **List\r
@@ -191,26 +172,20 @@ GetNextParamStr (
   return SplitStr (List, L',');\r
 }\r
 \r
-STATIC\r
+/**\r
+  Get one device node from entire device path text.\r
+\r
+  @param DevicePath      On input, the current Device Path node; on output, the next device path node\r
+  @param IsInstanceEnd   This node is the end of a device path instance\r
+\r
+  @return A device node text or NULL if no more device node available\r
+\r
+**/\r
 CHAR16 *\r
 GetNextDeviceNodeStr (\r
   IN OUT CHAR16   **DevicePath,\r
   OUT    BOOLEAN  *IsInstanceEnd\r
   )\r
-/*++\r
-\r
-  Routine Description:\r
-    Get one device node from entire device path text.\r
-\r
-  Arguments:\r
-    Str           - The entire device path text string\r
-    IsInstanceEnd - This node is the end of a device path instance\r
-\r
-  Returns:\r
-    a pointer     - A device node text\r
-    NULL          - No more device node available\r
-\r
---*/\r
 {\r
   CHAR16  *Str;\r
   CHAR16  *ReturnStr;\r
@@ -278,172 +253,40 @@ GetNextDeviceNodeStr (
   return ReturnStr;\r
 }\r
 \r
-STATIC\r
-BOOLEAN\r
-IsHexDigit (\r
-  OUT UINT8      *Digit,\r
-  IN  CHAR16      Char\r
-  )\r
-/*++\r
-\r
-  Routine Description:\r
-    Determines if a Unicode character is a hexadecimal digit.\r
-    The test is case insensitive.\r
-\r
-  Arguments:\r
-    Digit - Pointer to byte that receives the value of the hex character.\r
-    Char  - Unicode character to test.\r
-\r
-  Returns:\r
-    TRUE  - If the character is a hexadecimal digit.\r
-    FALSE - Otherwise.\r
-\r
---*/\r
-{\r
-  if ((Char >= L'0') && (Char <= L'9')) {\r
-    *Digit = (UINT8) (Char - L'0');\r
-    return TRUE;\r
-  }\r
-\r
-  if ((Char >= L'A') && (Char <= L'F')) {\r
-    *Digit = (UINT8) (Char - L'A' + 0x0A);\r
-    return TRUE;\r
-  }\r
-\r
-  if ((Char >= L'a') && (Char <= L'f')) {\r
-    *Digit = (UINT8) (Char - L'a' + 0x0A);\r
-    return TRUE;\r
-  }\r
-\r
-  return FALSE;\r
-}\r
-\r
-STATIC\r
-EFI_STATUS\r
-HexStringToBuf (\r
-  IN OUT UINT8                     *Buf,   \r
-  IN OUT UINTN                     *Len,\r
-  IN     CHAR16                    *Str,\r
-  OUT    UINTN                     *ConvertedStrLen  OPTIONAL\r
-  )\r
-/*++\r
-\r
-  Routine Description:\r
-    Converts Unicode string to binary buffer.\r
-    The conversion may be partial.\r
-    The first character in the string that is not hex digit stops the conversion.\r
-    At a minimum, any blob of data could be represented as a hex string.\r
-\r
-  Arguments:\r
-    Buf    - Pointer to buffer that receives the data.\r
-    Len    - Length in bytes of the buffer to hold converted data.\r
-                If routine return with EFI_SUCCESS, containing length of converted data.\r
-                If routine return with EFI_BUFFER_TOO_SMALL, containg length of buffer desired.\r
-    Str    - String to be converted from.\r
-    ConvertedStrLen - Length of the Hex String consumed.\r
-\r
-  Returns:\r
-    EFI_SUCCESS: Routine Success.\r
-    EFI_BUFFER_TOO_SMALL: The buffer is too small to hold converted data.\r
-    EFI_\r
-\r
---*/\r
-{\r
-  UINTN       HexCnt;\r
-  UINTN       Idx;\r
-  UINTN       BufferLength;\r
-  UINT8       Digit;\r
-  UINT8       Byte;\r
-\r
-  Digit = 0;\r
-\r
-  //\r
-  // Find out how many hex characters the string has.\r
-  //\r
-  for (Idx = 0, HexCnt = 0; IsHexDigit (&Digit, Str[Idx]); Idx++, HexCnt++);\r
-\r
-  if (HexCnt == 0) {\r
-    *Len = 0;\r
-    return EFI_SUCCESS;\r
-  }\r
-  //\r
-  // Two Unicode characters make up 1 buffer byte. Round up.\r
-  //\r
-  BufferLength = (HexCnt + 1) / 2; \r
-\r
-  //\r
-  // Test if  buffer is passed enough.\r
-  //\r
-  if (BufferLength > (*Len)) {\r
-    *Len = BufferLength;\r
-    return EFI_BUFFER_TOO_SMALL;\r
-  }\r
-\r
-  *Len = BufferLength;\r
-\r
-  for (Idx = 0; Idx < HexCnt; Idx++) {\r
-\r
-    IsHexDigit (&Digit, Str[HexCnt - 1 - Idx]);\r
-\r
-    //\r
-    // For odd charaters, write the lower nibble for each buffer byte,\r
-    // and for even characters, the upper nibble.\r
-    //\r
-    if ((Idx & 1) == 0) {\r
-      Byte = Digit;\r
-    } else {\r
-      Byte = Buf[Idx / 2];\r
-      Byte &= 0x0F;\r
-      Byte = (UINT8) (Byte | Digit << 4);\r
-    }\r
 \r
-    Buf[Idx / 2] = Byte;\r
-  }\r
+/**\r
+  Skip the leading white space and '0x' or '0X' of a integer string\r
 \r
-  if (ConvertedStrLen != NULL) {\r
-    *ConvertedStrLen = HexCnt;\r
-  }\r
+  @param Str             The integer string\r
+  @param IsHex           TRUE: Hex string, FALSE: Decimal string\r
 \r
-  return EFI_SUCCESS;\r
-}\r
+  @return The trimmed Hex string.\r
 \r
-STATIC\r
+**/\r
 CHAR16 *\r
 TrimHexStr (\r
   IN CHAR16   *Str,\r
   OUT BOOLEAN *IsHex\r
   )\r
-/*++\r
-\r
-  Routine Description:\r
-    Skip the leading white space and '0x' or '0X' of a integer string\r
-\r
-  Arguments:\r
-    Str   -  The integer string\r
-    IsHex -  1: Hex string,  0: Decimal string\r
-\r
-  Returns:\r
-\r
---*/\r
 {\r
   *IsHex = FALSE;\r
 \r
   //\r
   // skip preceeding white space\r
   //\r
-  while (*Str && *Str == ' ') {\r
+  while ((*Str != 0) && *Str == ' ') {\r
     Str += 1;\r
   }\r
   //\r
   // skip preceeding zeros\r
   //\r
-  while (*Str && *Str == '0') {\r
+  while ((*Str != 0) && *Str == '0') {\r
     Str += 1;\r
   }\r
   //\r
   // skip preceeding character 'x' or 'X'\r
   //\r
-  if (*Str && (*Str == 'x' || *Str == 'X')) {\r
+  if ((*Str != 0) && (*Str == 'x' || *Str == 'X')) {\r
     Str += 1;\r
     *IsHex = TRUE;\r
   }\r
@@ -451,107 +294,75 @@ TrimHexStr (
   return Str;\r
 }\r
 \r
-STATIC\r
-UINTN\r
-Xtoi (\r
-  IN CHAR16  *Str\r
-  )\r
-/*++\r
+/**\r
 \r
-Routine Description:\r
+  Convert hex string to uint.\r
 \r
-  Convert hex string to uint\r
+  @param Str             The hex string\r
 \r
-Arguments:\r
+  @return A UINTN value represented by Str\r
 \r
-  Str  -  The string\r
-  \r
-Returns:\r
-\r
---*/\r
+**/\r
+UINTN\r
+Xtoi (\r
+  IN CHAR16  *Str\r
+  )\r
 {\r
-  UINTN   Rvalue;\r
-  UINTN   Length;\r
+  return StrHexToUintn (Str);\r
+}\r
 \r
-  ASSERT (Str != NULL);\r
+/**\r
 \r
-  //\r
-  // convert hex digits\r
-  //\r
-  Rvalue = 0;\r
-  Length = sizeof (UINTN);\r
-  HexStringToBuf ((UINT8 *) &Rvalue, &Length, Str, NULL);\r
+  Convert hex string to 64 bit data.\r
 \r
-  return Rvalue;\r
-}\r
+  @param Str             The hex string\r
+  @param Data            A pointer to the UINT64 value represented by Str\r
 \r
-STATIC\r
+**/\r
 VOID\r
 Xtoi64 (\r
-  IN CHAR16  *Str,\r
-  IN UINT64  *Data\r
+  IN  CHAR16  *Str,\r
+  OUT UINT64  *Data\r
   )\r
-/*++\r
-\r
-Routine Description:\r
-\r
-  Convert hex string to 64 bit data.\r
+{\r
+  *Data = StrHexToUint64 (Str);\r
+}\r
 \r
-Arguments:\r
+/**\r
 \r
-  Str  -  The string\r
-  \r
-Returns:\r
+  Convert decimal string to uint.\r
 \r
---*/\r
-{\r
-  UINTN  Length;\r
+  @param Str             The decimal string\r
 \r
-  *Data  = 0;\r
-  Length = sizeof (UINT64);\r
-  HexStringToBuf ((UINT8 *) Data, &Length, Str, NULL);\r
-}\r
+  @return A UINTN value represented by Str\r
 \r
-STATIC\r
+**/\r
 UINTN\r
 Dtoi (\r
-  IN CHAR16  *str\r
+  IN CHAR16  *Str\r
   )\r
-/*++\r
-\r
-Routine Description:\r
-\r
-  Convert decimal string to uint\r
-\r
-Arguments:\r
-\r
-  Str  -  The string\r
-  \r
-Returns:\r
-\r
---*/\r
 {\r
   UINTN   Rvalue;\r
   CHAR16  Char;\r
   UINTN   High;\r
   UINTN   Low;\r
 \r
-  ASSERT (str != NULL);\r
+  ASSERT (Str != NULL);\r
 \r
   High = (UINTN) -1 / 10;\r
   Low  = (UINTN) -1 % 10;\r
   //\r
   // skip preceeding white space\r
   //\r
-  while (*str && *str == ' ') {\r
-    str += 1;\r
+  while ((*Str != 0) && *Str == ' ') {\r
+    Str += 1;\r
   }\r
   //\r
   // convert digits\r
   //\r
   Rvalue = 0;\r
-  Char = *(str++);\r
-  while (Char) {\r
+  Char = *(Str++);\r
+  while (Char != 0) {\r
     if (Char >= '0' && Char <= '9') {\r
       if ((Rvalue > High || Rvalue == High) && (Char - '0' > (INTN) Low)) {\r
         return (UINTN) -1;\r
@@ -562,52 +373,46 @@ Returns:
       break;\r
     }\r
 \r
-    Char = *(str++);\r
+    Char = *(Str++);\r
   }\r
 \r
   return Rvalue;\r
 }\r
 \r
-STATIC\r
+/**\r
+\r
+  Convert decimal string to uint.\r
+\r
+  @param Str             The decimal string\r
+  @param Data            A pointer to the UINT64 value represented by Str\r
+\r
+**/\r
 VOID\r
 Dtoi64 (\r
-  IN CHAR16  *str,\r
+  IN CHAR16  *Str,\r
   OUT UINT64 *Data\r
   )\r
-/*++\r
-\r
-Routine Description:\r
-\r
-  Convert decimal string to uint\r
-\r
-Arguments:\r
-\r
-  Str  -  The string\r
-\r
-Returns:\r
-\r
---*/\r
 {\r
   UINT64   Rvalue;\r
   CHAR16   Char;\r
   UINT64   High;\r
   UINT64   Low;\r
 \r
-  ASSERT (str != NULL);\r
+  ASSERT (Str != NULL);\r
   ASSERT (Data != NULL);\r
 \r
   //\r
   // skip preceeding white space\r
   //\r
-  while (*str && *str == ' ') {\r
-    str += 1;\r
+  while ((*Str != 0) && *Str == ' ') {\r
+    Str += 1;\r
   }\r
   //\r
   // convert digits\r
   //\r
   Rvalue = 0;\r
-  Char = *(str++);\r
-  while (Char) {\r
+  Char = *(Str++);\r
+  while (Char != 0) {\r
     if (Char >= '0' && Char <= '9') {\r
       High = LShiftU64 (Rvalue, 3);\r
       Low = LShiftU64 (Rvalue, 1);\r
@@ -616,30 +421,25 @@ Returns:
       break;\r
     }\r
 \r
-    Char = *(str++);\r
+    Char = *(Str++);\r
   }\r
 \r
   *Data = Rvalue;\r
 }\r
 \r
-STATIC\r
-UINTN\r
-Strtoi (\r
-  IN CHAR16  *Str\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
+/**\r
 \r
   Convert integer string to uint.\r
 \r
-Arguments:\r
-\r
-  Str  -  The integer string. If leading with "0x" or "0X", it's heximal.\r
+  @param Str             The integer string. If leading with "0x" or "0X", it's hexadecimal.\r
 \r
-Returns:\r
+  @return A UINTN value represented by Str\r
 \r
---*/\r
+**/\r
+UINTN\r
+Strtoi (\r
+  IN CHAR16  *Str\r
+  )\r
 {\r
   BOOLEAN IsHex;\r
 \r
@@ -652,25 +452,19 @@ Returns:
   }\r
 }\r
 \r
-STATIC\r
-VOID\r
-Strtoi64 (\r
-  IN CHAR16  *Str,\r
-  IN UINT64  *Data\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
+/**\r
 \r
   Convert integer string to 64 bit data.\r
 \r
-Arguments:\r
-\r
-  Str  -  The integer string. If leading with "0x" or "0X", it's heximal.\r
+  @param Str             The integer string. If leading with "0x" or "0X", it's hexadecimal.\r
+  @param Data            A pointer to the UINT64 value represented by Str\r
 \r
-Returns:\r
-\r
---*/\r
+**/\r
+VOID\r
+Strtoi64 (\r
+  IN  CHAR16  *Str,\r
+  OUT UINT64  *Data\r
+  )\r
 {\r
   BOOLEAN IsHex;\r
 \r
@@ -683,8 +477,17 @@ Returns:
   }\r
 }\r
 \r
-STATIC\r
-EFI_STATUS \r
+/**\r
+  Converts a list of string to a specified buffer.\r
+\r
+  @param Buf             The output buffer that contains the string.\r
+  @param BufferLength    The length of the buffer\r
+  @param Str             The input string that contains the hex number\r
+\r
+  @retval EFI_SUCCESS    The string was successfully converted to the buffer.\r
+\r
+**/\r
+EFI_STATUS\r
 StrToBuf (\r
   OUT UINT8    *Buf,\r
   IN  UINTN    BufferLength,\r
@@ -705,10 +508,18 @@ StrToBuf (
 \r
   for(Index = 0; Index < StrLength; Index++, Str++) {\r
 \r
-    IsHexDigit (&Digit, *Str);\r
+    if ((*Str >= L'a') && (*Str <= L'f')) {\r
+      Digit = (UINT8) (*Str - L'a' + 0x0A);\r
+    } else if ((*Str >= L'A') && (*Str <= L'F')) {\r
+      Digit = (UINT8) (*Str - L'A' + 0x0A);\r
+    } else if ((*Str >= L'0') && (*Str <= L'9')) {\r
+      Digit = (UINT8) (*Str - L'0');\r
+    } else {\r
+      return EFI_INVALID_PARAMETER;\r
+    }\r
 \r
     //\r
-    // For odd charaters, write the upper nibble for each buffer byte,\r
+    // For odd characters, write the upper nibble for each buffer byte,\r
     // and for even characters, the lower nibble.\r
     //\r
     if ((Index & 1) == 0) {\r
@@ -725,53 +536,69 @@ StrToBuf (
   return EFI_SUCCESS;\r
 }\r
 \r
-STATIC\r
+/**\r
+  Converts a string to GUID value.\r
+  Guid Format is xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\r
+\r
+  @param Str              The registry format GUID string that contains the GUID value.\r
+  @param Guid             A pointer to the converted GUID value.\r
+\r
+  @retval EFI_SUCCESS     The GUID string was successfully converted to the GUID value.\r
+  @retval EFI_UNSUPPORTED The input string is not in registry format.\r
+  @return others          Some error occurred when converting part of GUID value.\r
+\r
+**/\r
 EFI_STATUS\r
 StrToGuid (\r
   IN  CHAR16   *Str,\r
   OUT EFI_GUID *Guid\r
   )\r
 {\r
-  UINTN       BufferLength;\r
-  UINTN       ConvertedStrLen;\r
-  EFI_STATUS  Status;\r
-\r
-  BufferLength = sizeof (Guid->Data1);\r
-  Status = HexStringToBuf ((UINT8 *) &Guid->Data1, &BufferLength, Str, &ConvertedStrLen);\r
-  if (EFI_ERROR (Status)) {\r
-    return Status;\r
+  //\r
+  // Get the first UINT32 data\r
+  //\r
+  Guid->Data1 = (UINT32) StrHexToUint64  (Str);\r
+  while (!IS_HYPHEN (*Str) && !IS_NULL (*Str)) {\r
+    Str ++;\r
   }\r
-  Str += ConvertedStrLen;\r
+  \r
   if (IS_HYPHEN (*Str)) {\r
-    Str++;   \r
+    Str++;\r
   } else {\r
     return EFI_UNSUPPORTED;\r
   }\r
-\r
-  BufferLength = sizeof (Guid->Data2);\r
-  Status = HexStringToBuf ((UINT8 *) &Guid->Data2, &BufferLength, Str, &ConvertedStrLen);\r
-  if (EFI_ERROR (Status)) {\r
-    return Status;\r
+  \r
+  //\r
+  // Get the second UINT16 data\r
+  //\r
+  Guid->Data2 = (UINT16) StrHexToUint64  (Str);\r
+  while (!IS_HYPHEN (*Str) && !IS_NULL (*Str)) {\r
+    Str ++;\r
   }\r
-  Str += ConvertedStrLen;\r
+\r
   if (IS_HYPHEN (*Str)) {\r
     Str++;\r
   } else {\r
     return EFI_UNSUPPORTED;\r
   }\r
-\r
-  BufferLength = sizeof (Guid->Data3);\r
-  Status = HexStringToBuf ((UINT8 *) &Guid->Data3, &BufferLength, Str, &ConvertedStrLen);\r
-  if (EFI_ERROR (Status)) {\r
-    return Status;\r
+  \r
+  //\r
+  // Get the third UINT16 data\r
+  //\r
+  Guid->Data3 = (UINT16) StrHexToUint64  (Str);\r
+  while (!IS_HYPHEN (*Str) && !IS_NULL (*Str)) {\r
+    Str ++;\r
   }\r
-  Str += ConvertedStrLen;\r
+\r
   if (IS_HYPHEN (*Str)) {\r
     Str++;\r
   } else {\r
     return EFI_UNSUPPORTED;\r
   }\r
 \r
+  //\r
+  // Get the following 8 bytes data\r
+  //  \r
   StrToBuf (&Guid->Data4[0], 2, Str);\r
   //\r
   // Skip 2 byte hex chars\r
@@ -788,7 +615,13 @@ StrToGuid (
   return EFI_SUCCESS;\r
 }\r
 \r
-STATIC\r
+/**\r
+  Converts a string to IPv4 address\r
+\r
+  @param Str             A string representation of IPv4 address.\r
+  @param IPv4Addr        A pointer to the converted IPv4 address.\r
+\r
+**/\r
 VOID\r
 StrToIPv4Addr (\r
   IN OUT CHAR16           **Str,\r
@@ -802,7 +635,13 @@ StrToIPv4Addr (
   }\r
 }\r
 \r
-STATIC\r
+/**\r
+  Converts a string to IPv4 address\r
+\r
+  @param Str             A string representation of IPv6 address.\r
+  @param IPv6Addr        A pointer to the converted IPv6 address.\r
+\r
+**/\r
 VOID\r
 StrToIPv6Addr (\r
   IN OUT CHAR16           **Str,\r
@@ -819,7 +658,14 @@ StrToIPv6Addr (
   }\r
 }\r
 \r
-STATIC\r
+/**\r
+  Converts a Unicode string to ASCII string.\r
+\r
+  @param Str             The equivalent Unicode string\r
+  @param AsciiStr        On input, it points to destination ASCII string buffer; on output, it points\r
+                         to the next ASCII string next to it\r
+\r
+**/\r
 VOID\r
 StrToAscii (\r
   IN     CHAR16 *Str,\r
@@ -840,7 +686,14 @@ StrToAscii (
   *AsciiStr = Dest + 1;\r
 }\r
 \r
-STATIC\r
+/**\r
+  Converts a text device path node to Hardware PCI device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+\r
+  @return A pointer to Hardware PCI device path structure.\r
+\r
+**/\r
 EFI_DEVICE_PATH_PROTOCOL *\r
 DevPathFromTextPci (\r
   IN CHAR16 *TextDeviceNode\r
@@ -855,7 +708,7 @@ DevPathFromTextPci (
   Pci         = (PCI_DEVICE_PATH *) CreateDeviceNode (\r
                                       HARDWARE_DEVICE_PATH,\r
                                       HW_PCI_DP,\r
-                                      sizeof (PCI_DEVICE_PATH)\r
+                                      (UINT16) sizeof (PCI_DEVICE_PATH)\r
                                       );\r
 \r
   Pci->Function = (UINT8) Strtoi (FunctionStr);\r
@@ -864,7 +717,14 @@ DevPathFromTextPci (
   return (EFI_DEVICE_PATH_PROTOCOL *) Pci;\r
 }\r
 \r
-STATIC\r
+/**\r
+  Converts a text device path node to Hardware PC card device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+\r
+  @return A pointer to Hardware PC card device path structure.\r
+\r
+**/\r
 EFI_DEVICE_PATH_PROTOCOL *\r
 DevPathFromTextPcCard (\r
   IN CHAR16 *TextDeviceNode\r
@@ -877,7 +737,7 @@ DevPathFromTextPcCard (
   Pccard            = (PCCARD_DEVICE_PATH *) CreateDeviceNode (\r
                                                HARDWARE_DEVICE_PATH,\r
                                                HW_PCCARD_DP,\r
-                                               sizeof (PCCARD_DEVICE_PATH)\r
+                                               (UINT16) sizeof (PCCARD_DEVICE_PATH)\r
                                                );\r
 \r
   Pccard->FunctionNumber  = (UINT8) Strtoi (FunctionNumberStr);\r
@@ -885,7 +745,14 @@ DevPathFromTextPcCard (
   return (EFI_DEVICE_PATH_PROTOCOL *) Pccard;\r
 }\r
 \r
-STATIC\r
+/**\r
+  Converts a text device path node to Hardware memory map device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+\r
+  @return A pointer to Hardware memory map device path structure.\r
+\r
+**/\r
 EFI_DEVICE_PATH_PROTOCOL *\r
 DevPathFromTextMemoryMapped (\r
   IN CHAR16 *TextDeviceNode\r
@@ -902,7 +769,7 @@ DevPathFromTextMemoryMapped (
   MemMap             = (MEMMAP_DEVICE_PATH *) CreateDeviceNode (\r
                                                HARDWARE_DEVICE_PATH,\r
                                                HW_MEMMAP_DP,\r
-                                               sizeof (MEMMAP_DEVICE_PATH)\r
+                                               (UINT16) sizeof (MEMMAP_DEVICE_PATH)\r
                                                );\r
 \r
   MemMap->MemoryType = (UINT32) Strtoi (MemoryTypeStr);\r
@@ -912,7 +779,17 @@ DevPathFromTextMemoryMapped (
   return (EFI_DEVICE_PATH_PROTOCOL *) MemMap;\r
 }\r
 \r
-STATIC\r
+/**\r
+  Converts a text device path node to Vendor device path structure based on the input Type\r
+  and SubType.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+  @param Type            The type of device path node.\r
+  @param SubType         The subtype of device path node.\r
+\r
+  @return A pointer to the newly-created Vendor device path structure.\r
+\r
+**/\r
 EFI_DEVICE_PATH_PROTOCOL *\r
 ConvertFromTextVendor (\r
   IN CHAR16 *TextDeviceNode,\r
@@ -946,7 +823,14 @@ ConvertFromTextVendor (
   return (EFI_DEVICE_PATH_PROTOCOL *) Vendor;\r
 }\r
 \r
-STATIC\r
+/**\r
+  Converts a text device path node to Vendor Hardware device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+\r
+  @return A pointer to the newly-created Vendor Hardware device path structure.\r
+\r
+**/\r
 EFI_DEVICE_PATH_PROTOCOL *\r
 DevPathFromTextVenHw (\r
   IN CHAR16 *TextDeviceNode\r
@@ -959,7 +843,14 @@ DevPathFromTextVenHw (
            );\r
 }\r
 \r
-STATIC\r
+/**\r
+  Converts a text device path node to Hardware Controller device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+\r
+  @return A pointer to the newly-created Hardware Controller device path structure.\r
+\r
+**/\r
 EFI_DEVICE_PATH_PROTOCOL *\r
 DevPathFromTextCtrl (\r
   IN CHAR16 *TextDeviceNode\r
@@ -972,14 +863,20 @@ DevPathFromTextCtrl (
   Controller    = (CONTROLLER_DEVICE_PATH *) CreateDeviceNode (\r
                                                HARDWARE_DEVICE_PATH,\r
                                                HW_CONTROLLER_DP,\r
-                                               sizeof (CONTROLLER_DEVICE_PATH)\r
+                                               (UINT16) sizeof (CONTROLLER_DEVICE_PATH)\r
                                                );\r
   Controller->ControllerNumber = (UINT32) Strtoi (ControllerStr);\r
 \r
   return (EFI_DEVICE_PATH_PROTOCOL *) Controller;\r
 }\r
 \r
-STATIC\r
+/**\r
+  Converts a string to EisaId.\r
+\r
+  @param Text   The input string.\r
+  @param EisaId A pointer to the output EisaId.\r
+\r
+**/\r
 VOID\r
 EisaIdFromText (\r
   IN CHAR16 *Text,\r
@@ -989,12 +886,20 @@ EisaIdFromText (
   UINTN PnpId;\r
 \r
   PnpId = Xtoi (Text + 3);\r
-  *EisaId = (((Text[0] - '@') & 0x1f) << 10) + \r
-            (((Text[1] - '@') & 0x1f) << 5) + \r
+  *EisaId = (((Text[0] - '@') & 0x1f) << 10) +\r
+            (((Text[1] - '@') & 0x1f) << 5) +\r
             ((Text[2] - '@') & 0x1f) +\r
             (UINT32) (PnpId << 16);\r
 }\r
 \r
+/**\r
+  Converts a text device path node to ACPI HID device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+\r
+  @return A pointer to the newly-created ACPI HID device path structure.\r
+\r
+**/\r
 EFI_DEVICE_PATH_PROTOCOL *\r
 DevPathFromTextAcpi (\r
   IN CHAR16 *TextDeviceNode\r
@@ -1009,7 +914,7 @@ DevPathFromTextAcpi (
   Acpi   = (ACPI_HID_DEVICE_PATH *) CreateDeviceNode (\r
                                       ACPI_DEVICE_PATH,\r
                                       ACPI_DP,\r
-                                      sizeof (ACPI_HID_DEVICE_PATH)\r
+                                      (UINT16) sizeof (ACPI_HID_DEVICE_PATH)\r
                                       );\r
 \r
   EisaIdFromText (HIDStr, &Acpi->HID);\r
@@ -1018,7 +923,15 @@ DevPathFromTextAcpi (
   return (EFI_DEVICE_PATH_PROTOCOL *) Acpi;\r
 }\r
 \r
-STATIC\r
+/**\r
+  Converts a text device path node to ACPI HID device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+  @param PnPId           The input plug and play identification.\r
+\r
+  @return A pointer to the newly-created ACPI HID device path structure.\r
+\r
+**/\r
 EFI_DEVICE_PATH_PROTOCOL *\r
 ConvertFromTextAcpi (\r
   IN CHAR16 *TextDeviceNode,\r
@@ -1032,7 +945,7 @@ ConvertFromTextAcpi (
   Acpi   = (ACPI_HID_DEVICE_PATH *) CreateDeviceNode (\r
                                       ACPI_DEVICE_PATH,\r
                                       ACPI_DP,\r
-                                      sizeof (ACPI_HID_DEVICE_PATH)\r
+                                      (UINT16) sizeof (ACPI_HID_DEVICE_PATH)\r
                                       );\r
 \r
   Acpi->HID = EFI_PNP_ID (PnPId);\r
@@ -1041,7 +954,14 @@ ConvertFromTextAcpi (
   return (EFI_DEVICE_PATH_PROTOCOL *) Acpi;\r
 }\r
 \r
-STATIC\r
+/**\r
+  Converts a text device path node to PCI root device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+\r
+  @return A pointer to the newly-created PCI root device path structure.\r
+\r
+**/\r
 EFI_DEVICE_PATH_PROTOCOL *\r
 DevPathFromTextPciRoot (\r
   IN CHAR16 *TextDeviceNode\r
@@ -1050,7 +970,30 @@ DevPathFromTextPciRoot (
   return ConvertFromTextAcpi (TextDeviceNode, 0x0a03);\r
 }\r
 \r
-STATIC\r
+/**\r
+  Converts a text device path node to PCIE root device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+\r
+  @return A pointer to the newly-created PCIE root device path structure.\r
+\r
+**/\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextPcieRoot (\r
+  IN CHAR16 *TextDeviceNode\r
+  )\r
+{\r
+  return ConvertFromTextAcpi (TextDeviceNode, 0x0a08);\r
+}\r
+\r
+/**\r
+  Converts a text device path node to Floppy device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+\r
+  @return A pointer to the newly-created Floppy device path structure.\r
+\r
+**/\r
 EFI_DEVICE_PATH_PROTOCOL *\r
 DevPathFromTextFloppy (\r
   IN CHAR16 *TextDeviceNode\r
@@ -1059,7 +1002,14 @@ DevPathFromTextFloppy (
   return ConvertFromTextAcpi (TextDeviceNode, 0x0604);\r
 }\r
 \r
-STATIC\r
+/**\r
+  Converts a text device path node to Keyboard device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+\r
+  @return A pointer to the newly-created  Keyboard device path structure.\r
+\r
+**/\r
 EFI_DEVICE_PATH_PROTOCOL *\r
 DevPathFromTextKeyboard (\r
   IN CHAR16 *TextDeviceNode\r
@@ -1068,7 +1018,14 @@ DevPathFromTextKeyboard (
   return ConvertFromTextAcpi (TextDeviceNode, 0x0301);\r
 }\r
 \r
-STATIC\r
+/**\r
+  Converts a text device path node to Serial device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+\r
+  @return A pointer to the newly-created Serial device path structure.\r
+\r
+**/\r
 EFI_DEVICE_PATH_PROTOCOL *\r
 DevPathFromTextSerial (\r
   IN CHAR16 *TextDeviceNode\r
@@ -1077,7 +1034,14 @@ DevPathFromTextSerial (
   return ConvertFromTextAcpi (TextDeviceNode, 0x0501);\r
 }\r
 \r
-STATIC\r
+/**\r
+  Converts a text device path node to Parallel Port device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+\r
+  @return A pointer to the newly-created Parallel Port device path structure.\r
+\r
+**/\r
 EFI_DEVICE_PATH_PROTOCOL *\r
 DevPathFromTextParallelPort (\r
   IN CHAR16 *TextDeviceNode\r
@@ -1086,7 +1050,14 @@ DevPathFromTextParallelPort (
   return ConvertFromTextAcpi (TextDeviceNode, 0x0401);\r
 }\r
 \r
-STATIC\r
+/**\r
+  Converts a text device path node to ACPI extension device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+\r
+  @return A pointer to the newly-created ACPI extension device path structure.\r
+\r
+**/\r
 EFI_DEVICE_PATH_PROTOCOL *\r
 DevPathFromTextAcpiEx (\r
   IN CHAR16 *TextDeviceNode\r
@@ -1130,7 +1101,14 @@ DevPathFromTextAcpiEx (
   return (EFI_DEVICE_PATH_PROTOCOL *) AcpiEx;\r
 }\r
 \r
-STATIC\r
+/**\r
+  Converts a text device path node to ACPI extension device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+\r
+  @return A pointer to the newly-created ACPI extension device path structure.\r
+\r
+**/\r
 EFI_DEVICE_PATH_PROTOCOL *\r
 DevPathFromTextAcpiExp (\r
   IN CHAR16 *TextDeviceNode\r
@@ -1175,7 +1153,61 @@ DevPathFromTextAcpiExp (
   return (EFI_DEVICE_PATH_PROTOCOL *) AcpiEx;\r
 }\r
 \r
-STATIC\r
+/**\r
+  Converts a text device path node to ACPI _ADR device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+\r
+  @return A pointer to the newly-created ACPI _ADR device path structure.\r
+\r
+**/\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextAcpiAdr (\r
+  IN CHAR16 *TextDeviceNode\r
+  )\r
+{\r
+  CHAR16                *DisplayDeviceStr;\r
+  ACPI_ADR_DEVICE_PATH  *AcpiAdr;\r
+  UINTN                 Index;\r
+  UINTN                 Length;\r
+\r
+  AcpiAdr = (ACPI_ADR_DEVICE_PATH *) CreateDeviceNode (\r
+                                       ACPI_DEVICE_PATH,\r
+                                       ACPI_ADR_DP,\r
+                                       (UINT16) sizeof (ACPI_ADR_DEVICE_PATH)\r
+                                       );\r
+  ASSERT (AcpiAdr != NULL);\r
+\r
+  for (Index = 0; ; Index++) {\r
+    DisplayDeviceStr = GetNextParamStr (&TextDeviceNode);\r
+    if (IS_NULL (*DisplayDeviceStr)) {\r
+      break;\r
+    }\r
+    if (Index > 0) {\r
+      Length  = DevicePathNodeLength (AcpiAdr);\r
+      AcpiAdr = ReallocatePool (\r
+                  Length,\r
+                  Length + sizeof (UINT32),\r
+                  AcpiAdr\r
+                  );\r
+      ASSERT (AcpiAdr != NULL);\r
+      SetDevicePathNodeLength (AcpiAdr, Length + sizeof (UINT32));\r
+    }\r
+    \r
+    (&AcpiAdr->ADR)[Index] = (UINT32) Strtoi (DisplayDeviceStr);\r
+  }\r
+\r
+  return (EFI_DEVICE_PATH_PROTOCOL *) AcpiAdr;\r
+}\r
+\r
+/**\r
+  Converts a text device path node to Parallel Port device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+\r
+  @return A pointer to the newly-created Parallel Port device path structure.\r
+\r
+**/\r
 EFI_DEVICE_PATH_PROTOCOL *\r
 DevPathFromTextAta (\r
   IN CHAR16 *TextDeviceNode\r
@@ -1189,7 +1221,7 @@ DevPathFromTextAta (
   Atapi = (ATAPI_DEVICE_PATH *) CreateDeviceNode (\r
                                   MESSAGING_DEVICE_PATH,\r
                                   MSG_ATAPI_DP,\r
-                                  sizeof (ATAPI_DEVICE_PATH)\r
+                                  (UINT16) sizeof (ATAPI_DEVICE_PATH)\r
                                   );\r
 \r
   PrimarySecondaryStr     = GetNextParamStr (&TextDeviceNode);\r
@@ -1203,7 +1235,14 @@ DevPathFromTextAta (
   return (EFI_DEVICE_PATH_PROTOCOL *) Atapi;\r
 }\r
 \r
-STATIC\r
+/**\r
+  Converts a text device path node to SCSI device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+\r
+  @return A pointer to the newly-created SCSI device path structure.\r
+\r
+**/\r
 EFI_DEVICE_PATH_PROTOCOL *\r
 DevPathFromTextScsi (\r
   IN CHAR16 *TextDeviceNode\r
@@ -1218,7 +1257,7 @@ DevPathFromTextScsi (
   Scsi   = (SCSI_DEVICE_PATH *) CreateDeviceNode (\r
                                    MESSAGING_DEVICE_PATH,\r
                                    MSG_SCSI_DP,\r
-                                   sizeof (SCSI_DEVICE_PATH)\r
+                                   (UINT16) sizeof (SCSI_DEVICE_PATH)\r
                                    );\r
 \r
   Scsi->Pun = (UINT16) Strtoi (PunStr);\r
@@ -1227,7 +1266,14 @@ DevPathFromTextScsi (
   return (EFI_DEVICE_PATH_PROTOCOL *) Scsi;\r
 }\r
 \r
-STATIC\r
+/**\r
+  Converts a text device path node to Fibre device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+\r
+  @return A pointer to the newly-created Fibre device path structure.\r
+\r
+**/\r
 EFI_DEVICE_PATH_PROTOCOL *\r
 DevPathFromTextFibre (\r
   IN CHAR16 *TextDeviceNode\r
@@ -1237,44 +1283,93 @@ DevPathFromTextFibre (
   CHAR16                    *LunStr;\r
   FIBRECHANNEL_DEVICE_PATH  *Fibre;\r
 \r
-  WWNStr = GetNextParamStr (&TextDeviceNode);\r
-  LunStr = GetNextParamStr (&TextDeviceNode);\r
-  Fibre  = (FIBRECHANNEL_DEVICE_PATH *) CreateDeviceNode (\r
-                                          MESSAGING_DEVICE_PATH,\r
-                                          MSG_FIBRECHANNEL_DP,\r
-                                          sizeof (FIBRECHANNEL_DEVICE_PATH)\r
-                                          );\r
+  WWNStr = GetNextParamStr (&TextDeviceNode);\r
+  LunStr = GetNextParamStr (&TextDeviceNode);\r
+  Fibre  = (FIBRECHANNEL_DEVICE_PATH *) CreateDeviceNode (\r
+                                          MESSAGING_DEVICE_PATH,\r
+                                          MSG_FIBRECHANNEL_DP,\r
+                                          (UINT16) sizeof (FIBRECHANNEL_DEVICE_PATH)\r
+                                          );\r
+\r
+  Fibre->Reserved = 0;\r
+  Strtoi64 (WWNStr, &Fibre->WWN);\r
+  Strtoi64 (LunStr, &Fibre->Lun);\r
+\r
+  return (EFI_DEVICE_PATH_PROTOCOL *) Fibre;\r
+}\r
+\r
+/**\r
+  Converts a text device path node to FibreEx device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+\r
+  @return A pointer to the newly-created FibreEx device path structure.\r
+\r
+**/\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextFibreEx (\r
+  IN CHAR16 *TextDeviceNode\r
+  )\r
+{\r
+  CHAR16                      *WWNStr;\r
+  CHAR16                      *LunStr;\r
+  FIBRECHANNELEX_DEVICE_PATH  *FibreEx;\r
+\r
+  WWNStr  = GetNextParamStr (&TextDeviceNode);\r
+  LunStr  = GetNextParamStr (&TextDeviceNode);\r
+  FibreEx = (FIBRECHANNELEX_DEVICE_PATH *) CreateDeviceNode (\r
+                                             MESSAGING_DEVICE_PATH,\r
+                                             MSG_FIBRECHANNELEX_DP,\r
+                                             (UINT16) sizeof (FIBRECHANNELEX_DEVICE_PATH)\r
+                                             );\r
+\r
+  FibreEx->Reserved = 0;\r
+  Strtoi64 (WWNStr, (UINT64 *) (&FibreEx->WWN));\r
+  Strtoi64 (LunStr, (UINT64 *) (&FibreEx->Lun));\r
 \r
-  Fibre->Reserved = 0;\r
-  Strtoi64 (WWNStr, &Fibre->WWN);\r
-  Strtoi64 (LunStr, &Fibre->Lun);\r
+  *(UINT64 *) (&FibreEx->WWN) = SwapBytes64 (*(UINT64 *) (&FibreEx->WWN));\r
+  *(UINT64 *) (&FibreEx->Lun) = SwapBytes64 (*(UINT64 *) (&FibreEx->Lun));\r
 \r
-  return (EFI_DEVICE_PATH_PROTOCOL *) Fibre;\r
+  return (EFI_DEVICE_PATH_PROTOCOL *) FibreEx;\r
 }\r
 \r
-STATIC\r
+/**\r
+  Converts a text device path node to 1394 device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+\r
+  @return A pointer to the newly-created 1394 device path structure.\r
+\r
+**/\r
 EFI_DEVICE_PATH_PROTOCOL *\r
 DevPathFromText1394 (\r
   IN CHAR16 *TextDeviceNode\r
   )\r
 {\r
   CHAR16            *GuidStr;\r
-  F1394_DEVICE_PATH *F1394;\r
+  F1394_DEVICE_PATH *F1394DevPath;\r
 \r
   GuidStr = GetNextParamStr (&TextDeviceNode);\r
-  F1394  = (F1394_DEVICE_PATH *) CreateDeviceNode (\r
-                                   MESSAGING_DEVICE_PATH,\r
-                                   MSG_1394_DP,\r
-                                   sizeof (F1394_DEVICE_PATH)\r
-                                   );\r
+  F1394DevPath  = (F1394_DEVICE_PATH *) CreateDeviceNode (\r
+                                          MESSAGING_DEVICE_PATH,\r
+                                          MSG_1394_DP,\r
+                                          (UINT16) sizeof (F1394_DEVICE_PATH)\r
+                                          );\r
 \r
-  F1394->Reserved = 0;\r
-  Xtoi64 (GuidStr, &F1394->Guid);\r
+  F1394DevPath->Reserved = 0;\r
+  Xtoi64 (GuidStr, &F1394DevPath->Guid);\r
 \r
-  return (EFI_DEVICE_PATH_PROTOCOL *) F1394;\r
+  return (EFI_DEVICE_PATH_PROTOCOL *) F1394DevPath;\r
 }\r
 \r
-STATIC\r
+/**\r
+  Converts a text device path node to USB device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+\r
+  @return A pointer to the newly-created USB device path structure.\r
+\r
+**/\r
 EFI_DEVICE_PATH_PROTOCOL *\r
 DevPathFromTextUsb (\r
   IN CHAR16 *TextDeviceNode\r
@@ -1289,7 +1384,7 @@ DevPathFromTextUsb (
   Usb                   = (USB_DEVICE_PATH *) CreateDeviceNode (\r
                                                 MESSAGING_DEVICE_PATH,\r
                                                 MSG_USB_DP,\r
-                                                sizeof (USB_DEVICE_PATH)\r
+                                                (UINT16) sizeof (USB_DEVICE_PATH)\r
                                                 );\r
 \r
   Usb->ParentPortNumber = (UINT8) Strtoi (PortStr);\r
@@ -1298,28 +1393,42 @@ DevPathFromTextUsb (
   return (EFI_DEVICE_PATH_PROTOCOL *) Usb;\r
 }\r
 \r
-STATIC\r
+/**\r
+  Converts a text device path node to I20 device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+\r
+  @return A pointer to the newly-created I20 device path structure.\r
+\r
+**/\r
 EFI_DEVICE_PATH_PROTOCOL *\r
 DevPathFromTextI2O (\r
   IN CHAR16 *TextDeviceNode\r
   )\r
 {\r
   CHAR16          *TIDStr;\r
-  I2O_DEVICE_PATH *I2O;\r
+  I2O_DEVICE_PATH *I2ODevPath;\r
 \r
-  TIDStr    = GetNextParamStr (&TextDeviceNode);\r
-  I2O       = (I2O_DEVICE_PATH *) CreateDeviceNode (\r
+  TIDStr     = GetNextParamStr (&TextDeviceNode);\r
+  I2ODevPath = (I2O_DEVICE_PATH *) CreateDeviceNode (\r
                                     MESSAGING_DEVICE_PATH,\r
                                     MSG_I2O_DP,\r
-                                    sizeof (I2O_DEVICE_PATH)\r
+                                    (UINT16) sizeof (I2O_DEVICE_PATH)\r
                                     );\r
 \r
-  I2O->Tid  = (UINT32) Strtoi (TIDStr);\r
+  I2ODevPath->Tid  = (UINT32) Strtoi (TIDStr);\r
 \r
-  return (EFI_DEVICE_PATH_PROTOCOL *) I2O;\r
+  return (EFI_DEVICE_PATH_PROTOCOL *) I2ODevPath;\r
 }\r
 \r
-STATIC\r
+/**\r
+  Converts a text device path node to Infini Band device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+\r
+  @return A pointer to the newly-created Infini Band device path structure.\r
+\r
+**/\r
 EFI_DEVICE_PATH_PROTOCOL *\r
 DevPathFromTextInfiniband (\r
   IN CHAR16 *TextDeviceNode\r
@@ -1341,7 +1450,7 @@ DevPathFromTextInfiniband (
   InfiniBand = (INFINIBAND_DEVICE_PATH *) CreateDeviceNode (\r
                                             MESSAGING_DEVICE_PATH,\r
                                             MSG_INFINIBAND_DP,\r
-                                            sizeof (INFINIBAND_DEVICE_PATH)\r
+                                            (UINT16) sizeof (INFINIBAND_DEVICE_PATH)\r
                                             );\r
 \r
   InfiniBand->ResourceFlags = (UINT32) Strtoi (FlagsStr);\r
@@ -1354,7 +1463,14 @@ DevPathFromTextInfiniband (
   return (EFI_DEVICE_PATH_PROTOCOL *) InfiniBand;\r
 }\r
 \r
-STATIC\r
+/**\r
+  Converts a text device path node to Vendor-Defined Messaging device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+\r
+  @return A pointer to the newly-created Vendor-Defined Messaging device path structure.\r
+\r
+**/\r
 EFI_DEVICE_PATH_PROTOCOL *\r
 DevPathFromTextVenMsg (\r
   IN CHAR16 *TextDeviceNode\r
@@ -1367,7 +1483,14 @@ DevPathFromTextVenMsg (
             );\r
 }\r
 \r
-STATIC\r
+/**\r
+  Converts a text device path node to Vendor defined PC-ANSI device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+\r
+  @return A pointer to the newly-created Vendor defined PC-ANSI device path structure.\r
+\r
+**/\r
 EFI_DEVICE_PATH_PROTOCOL *\r
 DevPathFromTextVenPcAnsi (\r
   IN CHAR16 *TextDeviceNode\r
@@ -1378,13 +1501,20 @@ DevPathFromTextVenPcAnsi (
   Vendor = (VENDOR_DEVICE_PATH *) CreateDeviceNode (\r
                                     MESSAGING_DEVICE_PATH,\r
                                     MSG_VENDOR_DP,\r
-                                    sizeof (VENDOR_DEVICE_PATH));\r
+                                    (UINT16) sizeof (VENDOR_DEVICE_PATH));\r
   CopyGuid (&Vendor->Guid, &gEfiPcAnsiGuid);\r
 \r
   return (EFI_DEVICE_PATH_PROTOCOL *) Vendor;\r
 }\r
 \r
-STATIC\r
+/**\r
+  Converts a text device path node to Vendor defined VT100 device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+\r
+  @return A pointer to the newly-created Vendor defined VT100 device path structure.\r
+\r
+**/\r
 EFI_DEVICE_PATH_PROTOCOL *\r
 DevPathFromTextVenVt100 (\r
   IN CHAR16 *TextDeviceNode\r
@@ -1395,13 +1525,20 @@ DevPathFromTextVenVt100 (
   Vendor = (VENDOR_DEVICE_PATH *) CreateDeviceNode (\r
                                     MESSAGING_DEVICE_PATH,\r
                                     MSG_VENDOR_DP,\r
-                                    sizeof (VENDOR_DEVICE_PATH));\r
+                                    (UINT16) sizeof (VENDOR_DEVICE_PATH));\r
   CopyGuid (&Vendor->Guid, &gEfiVT100Guid);\r
 \r
   return (EFI_DEVICE_PATH_PROTOCOL *) Vendor;\r
 }\r
 \r
-STATIC\r
+/**\r
+  Converts a text device path node to Vendor defined VT100 Plus device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+\r
+  @return A pointer to the newly-created Vendor defined VT100 Plus device path structure.\r
+\r
+**/\r
 EFI_DEVICE_PATH_PROTOCOL *\r
 DevPathFromTextVenVt100Plus (\r
   IN CHAR16 *TextDeviceNode\r
@@ -1412,13 +1549,20 @@ DevPathFromTextVenVt100Plus (
   Vendor = (VENDOR_DEVICE_PATH *) CreateDeviceNode (\r
                                     MESSAGING_DEVICE_PATH,\r
                                     MSG_VENDOR_DP,\r
-                                    sizeof (VENDOR_DEVICE_PATH));\r
+                                    (UINT16) sizeof (VENDOR_DEVICE_PATH));\r
   CopyGuid (&Vendor->Guid, &gEfiVT100PlusGuid);\r
 \r
   return (EFI_DEVICE_PATH_PROTOCOL *) Vendor;\r
 }\r
 \r
-STATIC\r
+/**\r
+  Converts a text device path node to Vendor defined UTF8 device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+\r
+  @return A pointer to the newly-created Vendor defined UTF8 device path structure.\r
+\r
+**/\r
 EFI_DEVICE_PATH_PROTOCOL *\r
 DevPathFromTextVenUtf8 (\r
   IN CHAR16 *TextDeviceNode\r
@@ -1429,13 +1573,20 @@ DevPathFromTextVenUtf8 (
   Vendor = (VENDOR_DEVICE_PATH *) CreateDeviceNode (\r
                                     MESSAGING_DEVICE_PATH,\r
                                     MSG_VENDOR_DP,\r
-                                    sizeof (VENDOR_DEVICE_PATH));\r
+                                    (UINT16) sizeof (VENDOR_DEVICE_PATH));\r
   CopyGuid (&Vendor->Guid, &gEfiVTUTF8Guid);\r
 \r
   return (EFI_DEVICE_PATH_PROTOCOL *) Vendor;\r
 }\r
 \r
-STATIC\r
+/**\r
+  Converts a text device path node to UART Flow Control device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+\r
+  @return A pointer to the newly-created UART Flow Control device path structure.\r
+\r
+**/\r
 EFI_DEVICE_PATH_PROTOCOL *\r
 DevPathFromTextUartFlowCtrl (\r
   IN CHAR16 *TextDeviceNode\r
@@ -1448,10 +1599,10 @@ DevPathFromTextUartFlowCtrl (
   UartFlowControl = (UART_FLOW_CONTROL_DEVICE_PATH *) CreateDeviceNode (\r
                                                         MESSAGING_DEVICE_PATH,\r
                                                         MSG_VENDOR_DP,\r
-                                                        sizeof (UART_FLOW_CONTROL_DEVICE_PATH)\r
+                                                        (UINT16) sizeof (UART_FLOW_CONTROL_DEVICE_PATH)\r
                                                         );\r
 \r
-  CopyGuid (&UartFlowControl->Guid, &mEfiDevicePathMessagingUartFlowControlGuid);\r
+  CopyGuid (&UartFlowControl->Guid, &gEfiUartDevicePathGuid);\r
   if (StrCmp (ValueStr, L"XonXoff") == 0) {\r
     UartFlowControl->FlowControlMap = 2;\r
   } else if (StrCmp (ValueStr, L"Hardware") == 0) {\r
@@ -1463,7 +1614,14 @@ DevPathFromTextUartFlowCtrl (
   return (EFI_DEVICE_PATH_PROTOCOL *) UartFlowControl;\r
 }\r
 \r
-STATIC\r
+/**\r
+  Converts a text device path node to Serial Attached SCSI device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+\r
+  @return A pointer to the newly-created Serial Attached SCSI device path structure.\r
+\r
+**/\r
 EFI_DEVICE_PATH_PROTOCOL *\r
 DevPathFromTextSAS (\r
   IN CHAR16 *TextDeviceNode\r
@@ -1492,10 +1650,10 @@ DevPathFromTextSAS (
   Sas         = (SAS_DEVICE_PATH *) CreateDeviceNode (\r
                                        MESSAGING_DEVICE_PATH,\r
                                        MSG_VENDOR_DP,\r
-                                       sizeof (SAS_DEVICE_PATH)\r
+                                       (UINT16) sizeof (SAS_DEVICE_PATH)\r
                                        );\r
 \r
-  CopyGuid (&Sas->Guid, &mEfiDevicePathMessagingSASGuid);\r
+  CopyGuid (&Sas->Guid, &gEfiSasDevicePathGuid);\r
   Strtoi64 (AddressStr, &Sas->SasAddress);\r
   Strtoi64 (LunStr, &Sas->Lun);\r
   Sas->RelativeTargetPort = (UINT16) Strtoi (RTPStr);\r
@@ -1526,7 +1684,82 @@ DevPathFromTextSAS (
   return (EFI_DEVICE_PATH_PROTOCOL *) Sas;\r
 }\r
 \r
-STATIC\r
+/**\r
+  Converts a text device path node to Serial Attached SCSI Ex device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+\r
+  @return A pointer to the newly-created Serial Attached SCSI Ex device path structure.\r
+\r
+**/\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextSasEx (\r
+  IN CHAR16 *TextDeviceNode\r
+  )\r
+{\r
+  CHAR16            *AddressStr;\r
+  CHAR16            *LunStr;\r
+  CHAR16            *RTPStr;\r
+  CHAR16            *SASSATAStr;\r
+  CHAR16            *LocationStr;\r
+  CHAR16            *ConnectStr;\r
+  CHAR16            *DriveBayStr;\r
+  UINT16            Info;\r
+  SASEX_DEVICE_PATH *SasEx;\r
+\r
+  AddressStr  = GetNextParamStr (&TextDeviceNode);\r
+  LunStr      = GetNextParamStr (&TextDeviceNode);\r
+  RTPStr      = GetNextParamStr (&TextDeviceNode);\r
+  SASSATAStr  = GetNextParamStr (&TextDeviceNode);\r
+  LocationStr = GetNextParamStr (&TextDeviceNode);\r
+  ConnectStr  = GetNextParamStr (&TextDeviceNode);\r
+  DriveBayStr = GetNextParamStr (&TextDeviceNode);\r
+  Info        = 0x0000;\r
+  SasEx       = (SASEX_DEVICE_PATH *) CreateDeviceNode (\r
+                                        MESSAGING_DEVICE_PATH,\r
+                                        MSG_SASEX_DP,\r
+                                        (UINT16) sizeof (SASEX_DEVICE_PATH)\r
+                                        );\r
+\r
+  Strtoi64 (AddressStr, (UINT64 *) &SasEx->SasAddress);\r
+  Strtoi64 (LunStr,     (UINT64 *) &SasEx->Lun);\r
+  *(UINT64 *) &SasEx->SasAddress = SwapBytes64 (*(UINT64 *) &SasEx->SasAddress);\r
+  *(UINT64 *) &SasEx->Lun        = SwapBytes64 (*(UINT64 *) &SasEx->Lun);\r
+  SasEx->RelativeTargetPort      = (UINT16) Strtoi (RTPStr);\r
+  if (StrCmp (SASSATAStr, L"NoTopology") != 0) {\r
+    if (StrCmp (DriveBayStr, L"0") == 0) {\r
+      Info |= 0x0001;\r
+    } else {\r
+      Info |= 0x0002;\r
+      Info = (UINT16) (Info | (Strtoi (DriveBayStr) << 8));\r
+    }\r
+\r
+    if (StrCmp (SASSATAStr, L"SATA") == 0) {\r
+      Info |= 0x0010;\r
+    }\r
+\r
+    if (StrCmp (LocationStr, L"External") == 0) {\r
+      Info |= 0x0020;\r
+    }\r
+\r
+    if (StrCmp (ConnectStr, L"Expanded") == 0) {\r
+      Info |= 0x0040;\r
+    }\r
+  }\r
+\r
+  SasEx->DeviceTopology = Info;\r
+\r
+  return (EFI_DEVICE_PATH_PROTOCOL *) SasEx;\r
+}\r
+\r
+/**\r
+  Converts a text device path node to Debug Port device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+\r
+  @return A pointer to the newly-created Debug Port device path structure.\r
+\r
+**/\r
 EFI_DEVICE_PATH_PROTOCOL *\r
 DevPathFromTextDebugPort (\r
   IN CHAR16 *TextDeviceNode\r
@@ -1537,7 +1770,7 @@ DevPathFromTextDebugPort (
   Vend = (VENDOR_DEFINED_MESSAGING_DEVICE_PATH *) CreateDeviceNode (\r
                                                     MESSAGING_DEVICE_PATH,\r
                                                     MSG_VENDOR_DP,\r
-                                                    sizeof (VENDOR_DEFINED_MESSAGING_DEVICE_PATH)\r
+                                                    (UINT16) sizeof (VENDOR_DEFINED_MESSAGING_DEVICE_PATH)\r
                                                     );\r
 \r
   CopyGuid (&Vend->Guid, &gEfiDebugPortProtocolGuid);\r
@@ -1545,7 +1778,14 @@ DevPathFromTextDebugPort (
   return (EFI_DEVICE_PATH_PROTOCOL *) Vend;\r
 }\r
 \r
-STATIC\r
+/**\r
+  Converts a text device path node to MAC device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+\r
+  @return A pointer to the newly-created MAC device path structure.\r
+\r
+**/\r
 EFI_DEVICE_PATH_PROTOCOL *\r
 DevPathFromTextMAC (\r
   IN CHAR16 *TextDeviceNode\r
@@ -1554,25 +1794,58 @@ DevPathFromTextMAC (
   CHAR16                *AddressStr;\r
   CHAR16                *IfTypeStr;\r
   UINTN                 Length;\r
-  MAC_ADDR_DEVICE_PATH  *MAC;\r
+  MAC_ADDR_DEVICE_PATH  *MACDevPath;\r
 \r
   AddressStr    = GetNextParamStr (&TextDeviceNode);\r
   IfTypeStr     = GetNextParamStr (&TextDeviceNode);\r
-  MAC           = (MAC_ADDR_DEVICE_PATH *) CreateDeviceNode (\r
+  MACDevPath    = (MAC_ADDR_DEVICE_PATH *) CreateDeviceNode (\r
                                               MESSAGING_DEVICE_PATH,\r
                                               MSG_MAC_ADDR_DP,\r
-                                              sizeof (MAC_ADDR_DEVICE_PATH)\r
+                                              (UINT16) sizeof (MAC_ADDR_DEVICE_PATH)\r
                                               );\r
 \r
-  MAC->IfType   = (UINT8) Strtoi (IfTypeStr);\r
+  MACDevPath->IfType   = (UINT8) Strtoi (IfTypeStr);\r
 \r
   Length = sizeof (EFI_MAC_ADDRESS);\r
-  StrToBuf (&MAC->MacAddress.Addr[0], Length, AddressStr);\r
+  StrToBuf (&MACDevPath->MacAddress.Addr[0], Length, AddressStr);\r
+\r
+  return (EFI_DEVICE_PATH_PROTOCOL *) MACDevPath;\r
+}\r
+\r
+\r
+/**\r
+  Converts a text format to the network protocol ID.\r
+\r
+  @param Text  String of protocol field.\r
+\r
+  @return Network protocol ID .\r
 \r
-  return (EFI_DEVICE_PATH_PROTOCOL *) MAC;\r
+**/\r
+UINTN\r
+NetworkProtocolFromText (\r
+  IN CHAR16 *Text\r
+  )\r
+{\r
+  if (StrCmp (Text, L"UDP") == 0) {\r
+    return RFC_1700_UDP_PROTOCOL;\r
+  }\r
+\r
+  if (StrCmp (Text, L"TCP") == 0) {\r
+    return RFC_1700_TCP_PROTOCOL;\r
+  }\r
+\r
+  return Strtoi (Text);\r
 }\r
 \r
-STATIC\r
+\r
+/**\r
+  Converts a text device path node to IPV4 device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+\r
+  @return A pointer to the newly-created IPV4 device path structure.\r
+\r
+**/\r
 EFI_DEVICE_PATH_PROTOCOL *\r
 DevPathFromTextIPv4 (\r
   IN CHAR16 *TextDeviceNode\r
@@ -1582,20 +1855,24 @@ DevPathFromTextIPv4 (
   CHAR16            *ProtocolStr;\r
   CHAR16            *TypeStr;\r
   CHAR16            *LocalIPStr;\r
+  CHAR16            *GatewayIPStr;\r
+  CHAR16            *SubnetMaskStr;\r
   IPv4_DEVICE_PATH  *IPv4;\r
 \r
   RemoteIPStr           = GetNextParamStr (&TextDeviceNode);\r
   ProtocolStr           = GetNextParamStr (&TextDeviceNode);\r
   TypeStr               = GetNextParamStr (&TextDeviceNode);\r
   LocalIPStr            = GetNextParamStr (&TextDeviceNode);\r
+  GatewayIPStr          = GetNextParamStr (&TextDeviceNode);\r
+  SubnetMaskStr         = GetNextParamStr (&TextDeviceNode);\r
   IPv4                  = (IPv4_DEVICE_PATH *) CreateDeviceNode (\r
                                                  MESSAGING_DEVICE_PATH,\r
                                                  MSG_IPv4_DP,\r
-                                                 sizeof (IPv4_DEVICE_PATH)\r
+                                                 (UINT16) sizeof (IPv4_DEVICE_PATH)\r
                                                  );\r
 \r
   StrToIPv4Addr (&RemoteIPStr, &IPv4->RemoteIpAddress);\r
-  IPv4->Protocol = (UINT16) ((StrCmp (ProtocolStr, L"UDP") == 0) ? 0 : 1);\r
+  IPv4->Protocol = (UINT16) NetworkProtocolFromText (ProtocolStr);\r
   if (StrCmp (TypeStr, L"Static") == 0) {\r
     IPv4->StaticIpAddress = TRUE;\r
   } else {\r
@@ -1603,6 +1880,13 @@ DevPathFromTextIPv4 (
   }\r
 \r
   StrToIPv4Addr (&LocalIPStr, &IPv4->LocalIpAddress);\r
+  if (!IS_NULL (*GatewayIPStr) && !IS_NULL (*SubnetMaskStr)) {\r
+    StrToIPv4Addr (&GatewayIPStr,  &IPv4->GatewayIpAddress);\r
+    StrToIPv4Addr (&SubnetMaskStr, &IPv4->SubnetMask);\r
+  } else {\r
+    ZeroMem (&IPv4->GatewayIpAddress, sizeof (IPv4->GatewayIpAddress));\r
+    ZeroMem (&IPv4->SubnetMask,    sizeof (IPv4->SubnetMask));\r
+  }\r
 \r
   IPv4->LocalPort       = 0;\r
   IPv4->RemotePort      = 0;\r
@@ -1610,7 +1894,14 @@ DevPathFromTextIPv4 (
   return (EFI_DEVICE_PATH_PROTOCOL *) IPv4;\r
 }\r
 \r
-STATIC\r
+/**\r
+  Converts a text device path node to IPV6 device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+\r
+  @return A pointer to the newly-created IPV6 device path structure.\r
+\r
+**/\r
 EFI_DEVICE_PATH_PROTOCOL *\r
 DevPathFromTextIPv6 (\r
   IN CHAR16 *TextDeviceNode\r
@@ -1620,27 +1911,40 @@ DevPathFromTextIPv6 (
   CHAR16            *ProtocolStr;\r
   CHAR16            *TypeStr;\r
   CHAR16            *LocalIPStr;\r
+  CHAR16            *GatewayIPStr;\r
+  CHAR16            *PrefixLengthStr;\r
   IPv6_DEVICE_PATH  *IPv6;\r
 \r
   RemoteIPStr           = GetNextParamStr (&TextDeviceNode);\r
   ProtocolStr           = GetNextParamStr (&TextDeviceNode);\r
   TypeStr               = GetNextParamStr (&TextDeviceNode);\r
   LocalIPStr            = GetNextParamStr (&TextDeviceNode);\r
+  PrefixLengthStr       = GetNextParamStr (&TextDeviceNode);\r
+  GatewayIPStr          = GetNextParamStr (&TextDeviceNode);\r
   IPv6                  = (IPv6_DEVICE_PATH *) CreateDeviceNode (\r
                                                  MESSAGING_DEVICE_PATH,\r
                                                  MSG_IPv6_DP,\r
-                                                 sizeof (IPv6_DEVICE_PATH)\r
+                                                 (UINT16) sizeof (IPv6_DEVICE_PATH)\r
                                                  );\r
 \r
   StrToIPv6Addr (&RemoteIPStr, &IPv6->RemoteIpAddress);\r
-  IPv6->Protocol        = (UINT16) ((StrCmp (ProtocolStr, L"UDP") == 0) ? 0 : 1);\r
+  IPv6->Protocol        = (UINT16) NetworkProtocolFromText (ProtocolStr);\r
   if (StrCmp (TypeStr, L"Static") == 0) {\r
-    IPv6->StaticIpAddress = TRUE;\r
+    IPv6->IpAddressOrigin = 0;\r
+  } else if (StrCmp (TypeStr, L"StatelessAutoConfigure") == 0) {\r
+    IPv6->IpAddressOrigin = 1;\r
   } else {\r
-    IPv6->StaticIpAddress = FALSE;\r
+    IPv6->IpAddressOrigin = 2;\r
   }\r
 \r
   StrToIPv6Addr (&LocalIPStr, &IPv6->LocalIpAddress);\r
+  if (!IS_NULL (*GatewayIPStr) && !IS_NULL (*PrefixLengthStr)) {\r
+    StrToIPv6Addr (&GatewayIPStr, &IPv6->GatewayIpAddress);\r
+    IPv6->PrefixLength = (UINT8) Strtoi (PrefixLengthStr);\r
+  } else {\r
+    ZeroMem (&IPv6->GatewayIpAddress, sizeof (IPv6->GatewayIpAddress));\r
+    IPv6->PrefixLength = 0;\r
+  }\r
 \r
   IPv6->LocalPort       = 0;\r
   IPv6->RemotePort      = 0;\r
@@ -1648,7 +1952,14 @@ DevPathFromTextIPv6 (
   return (EFI_DEVICE_PATH_PROTOCOL *) IPv6;\r
 }\r
 \r
-STATIC\r
+/**\r
+  Converts a text device path node to UART device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+\r
+  @return A pointer to the newly-created UART device path structure.\r
+\r
+**/\r
 EFI_DEVICE_PATH_PROTOCOL *\r
 DevPathFromTextUart (\r
   IN CHAR16 *TextDeviceNode\r
@@ -1667,7 +1978,7 @@ DevPathFromTextUart (
   Uart            = (UART_DEVICE_PATH *) CreateDeviceNode (\r
                                            MESSAGING_DEVICE_PATH,\r
                                            MSG_UART_DP,\r
-                                           sizeof (UART_DEVICE_PATH)\r
+                                           (UINT16) sizeof (UART_DEVICE_PATH)\r
                                            );\r
 \r
   Uart->BaudRate  = (StrCmp (BaudStr, L"DEFAULT") == 0) ? 115200 : Dtoi (BaudStr);\r
@@ -1715,7 +2026,15 @@ DevPathFromTextUart (
   return (EFI_DEVICE_PATH_PROTOCOL *) Uart;\r
 }\r
 \r
-STATIC\r
+/**\r
+  Converts a text device path node to USB class device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+  @param UsbClassText    A pointer to USB_CLASS_TEXT structure to be integrated to USB Class Text.\r
+\r
+  @return A pointer to the newly-created USB class device path structure.\r
+\r
+**/\r
 EFI_DEVICE_PATH_PROTOCOL *\r
 ConvertFromTextUsbClass (\r
   IN CHAR16         *TextDeviceNode,\r
@@ -1732,7 +2051,7 @@ ConvertFromTextUsbClass (
   UsbClass    = (USB_CLASS_DEVICE_PATH *) CreateDeviceNode (\r
                                             MESSAGING_DEVICE_PATH,\r
                                             MSG_USB_CLASS_DP,\r
-                                            sizeof (USB_CLASS_DEVICE_PATH)\r
+                                            (UINT16) sizeof (USB_CLASS_DEVICE_PATH)\r
                                             );\r
 \r
   VIDStr      = GetNextParamStr (&TextDeviceNode);\r
@@ -1748,7 +2067,7 @@ ConvertFromTextUsbClass (
     UsbClass->DeviceSubClass = (UINT8) Strtoi (SubClassStr);\r
   } else {\r
     UsbClass->DeviceSubClass = UsbClassText->SubClass;\r
-  }  \r
+  }\r
 \r
   ProtocolStr = GetNextParamStr (&TextDeviceNode);\r
 \r
@@ -1760,7 +2079,14 @@ ConvertFromTextUsbClass (
 }\r
 \r
 \r
-STATIC\r
+/**\r
+  Converts a text device path node to USB class device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+\r
+  @return A pointer to the newly-created USB class device path structure.\r
+\r
+**/\r
 EFI_DEVICE_PATH_PROTOCOL *\r
 DevPathFromTextUsbClass (\r
   IN CHAR16 *TextDeviceNode\r
@@ -1774,7 +2100,14 @@ DevPathFromTextUsbClass (
   return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
 }\r
 \r
-STATIC\r
+/**\r
+  Converts a text device path node to USB audio device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+\r
+  @return A pointer to the newly-created USB audio device path structure.\r
+\r
+**/\r
 EFI_DEVICE_PATH_PROTOCOL *\r
 DevPathFromTextUsbAudio (\r
   IN CHAR16 *TextDeviceNode\r
@@ -1789,7 +2122,14 @@ DevPathFromTextUsbAudio (
   return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
 }\r
 \r
-STATIC\r
+/**\r
+  Converts a text device path node to USB CDC Control device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+\r
+  @return A pointer to the newly-created USB CDC Control device path structure.\r
+\r
+**/\r
 EFI_DEVICE_PATH_PROTOCOL *\r
 DevPathFromTextUsbCDCControl (\r
   IN CHAR16 *TextDeviceNode\r
@@ -1804,7 +2144,14 @@ DevPathFromTextUsbCDCControl (
   return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
 }\r
 \r
-STATIC\r
+/**\r
+  Converts a text device path node to USB HID device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+\r
+  @return A pointer to the newly-created USB HID device path structure.\r
+\r
+**/\r
 EFI_DEVICE_PATH_PROTOCOL *\r
 DevPathFromTextUsbHID (\r
   IN CHAR16 *TextDeviceNode\r
@@ -1819,7 +2166,14 @@ DevPathFromTextUsbHID (
   return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
 }\r
 \r
-STATIC\r
+/**\r
+  Converts a text device path node to USB Image device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+\r
+  @return A pointer to the newly-created USB Image device path structure.\r
+\r
+**/\r
 EFI_DEVICE_PATH_PROTOCOL *\r
 DevPathFromTextUsbImage (\r
   IN CHAR16 *TextDeviceNode\r
@@ -1834,7 +2188,14 @@ DevPathFromTextUsbImage (
   return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
 }\r
 \r
-STATIC\r
+/**\r
+  Converts a text device path node to USB Print device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+\r
+  @return A pointer to the newly-created USB Print device path structure.\r
+\r
+**/\r
 EFI_DEVICE_PATH_PROTOCOL *\r
 DevPathFromTextUsbPrinter (\r
   IN CHAR16 *TextDeviceNode\r
@@ -1849,7 +2210,14 @@ DevPathFromTextUsbPrinter (
   return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
 }\r
 \r
-STATIC\r
+/**\r
+  Converts a text device path node to USB mass storage device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+\r
+  @return A pointer to the newly-created USB mass storage device path structure.\r
+\r
+**/\r
 EFI_DEVICE_PATH_PROTOCOL *\r
 DevPathFromTextUsbMassStorage (\r
   IN CHAR16 *TextDeviceNode\r
@@ -1864,7 +2232,14 @@ DevPathFromTextUsbMassStorage (
   return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
 }\r
 \r
-STATIC\r
+/**\r
+  Converts a text device path node to USB HUB device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+\r
+  @return A pointer to the newly-created USB HUB device path structure.\r
+\r
+**/\r
 EFI_DEVICE_PATH_PROTOCOL *\r
 DevPathFromTextUsbHub (\r
   IN CHAR16 *TextDeviceNode\r
@@ -1879,7 +2254,14 @@ DevPathFromTextUsbHub (
   return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
 }\r
 \r
-STATIC\r
+/**\r
+  Converts a text device path node to USB CDC data device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+\r
+  @return A pointer to the newly-created USB CDC data device path structure.\r
+\r
+**/\r
 EFI_DEVICE_PATH_PROTOCOL *\r
 DevPathFromTextUsbCDCData (\r
   IN CHAR16 *TextDeviceNode\r
@@ -1894,7 +2276,14 @@ DevPathFromTextUsbCDCData (
   return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
 }\r
 \r
-STATIC\r
+/**\r
+  Converts a text device path node to USB smart card device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+\r
+  @return A pointer to the newly-created USB smart card device path structure.\r
+\r
+**/\r
 EFI_DEVICE_PATH_PROTOCOL *\r
 DevPathFromTextUsbSmartCard (\r
   IN CHAR16 *TextDeviceNode\r
@@ -1909,7 +2298,14 @@ DevPathFromTextUsbSmartCard (
   return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
 }\r
 \r
-STATIC\r
+/**\r
+  Converts a text device path node to USB video device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+\r
+  @return A pointer to the newly-created USB video device path structure.\r
+\r
+**/\r
 EFI_DEVICE_PATH_PROTOCOL *\r
 DevPathFromTextUsbVideo (\r
   IN CHAR16 *TextDeviceNode\r
@@ -1924,7 +2320,14 @@ DevPathFromTextUsbVideo (
   return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
 }\r
 \r
-STATIC\r
+/**\r
+  Converts a text device path node to USB diagnostic device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+\r
+  @return A pointer to the newly-created USB diagnostic device path structure.\r
+\r
+**/\r
 EFI_DEVICE_PATH_PROTOCOL *\r
 DevPathFromTextUsbDiagnostic (\r
   IN CHAR16 *TextDeviceNode\r
@@ -1939,7 +2342,14 @@ DevPathFromTextUsbDiagnostic (
   return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
 }\r
 \r
-STATIC\r
+/**\r
+  Converts a text device path node to USB wireless device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+\r
+  @return A pointer to the newly-created USB wireless device path structure.\r
+\r
+**/\r
 EFI_DEVICE_PATH_PROTOCOL *\r
 DevPathFromTextUsbWireless (\r
   IN CHAR16 *TextDeviceNode\r
@@ -1954,7 +2364,14 @@ DevPathFromTextUsbWireless (
   return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
 }\r
 \r
-STATIC\r
+/**\r
+  Converts a text device path node to USB device firmware update device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+\r
+  @return A pointer to the newly-created USB device firmware update device path structure.\r
+\r
+**/\r
 EFI_DEVICE_PATH_PROTOCOL *\r
 DevPathFromTextUsbDeviceFirmwareUpdate (\r
   IN CHAR16 *TextDeviceNode\r
@@ -1970,7 +2387,14 @@ DevPathFromTextUsbDeviceFirmwareUpdate (
   return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
 }\r
 \r
-STATIC\r
+/**\r
+  Converts a text device path node to USB IRDA bridge device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+\r
+  @return A pointer to the newly-created USB IRDA bridge device path structure.\r
+\r
+**/\r
 EFI_DEVICE_PATH_PROTOCOL *\r
 DevPathFromTextUsbIrdaBridge (\r
   IN CHAR16 *TextDeviceNode\r
@@ -1986,7 +2410,14 @@ DevPathFromTextUsbIrdaBridge (
   return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
 }\r
 \r
-STATIC\r
+/**\r
+  Converts a text device path node to USB text and measurement device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+\r
+  @return A pointer to the newly-created USB text and measurement device path structure.\r
+\r
+**/\r
 EFI_DEVICE_PATH_PROTOCOL *\r
 DevPathFromTextUsbTestAndMeasurement (\r
   IN CHAR16 *TextDeviceNode\r
@@ -2002,7 +2433,14 @@ DevPathFromTextUsbTestAndMeasurement (
   return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
 }\r
 \r
-STATIC\r
+/**\r
+  Converts a text device path node to USB WWID device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+\r
+  @return A pointer to the newly-created USB WWID device path structure.\r
+\r
+**/\r
 EFI_DEVICE_PATH_PROTOCOL *\r
 DevPathFromTextUsbWwid (\r
   IN CHAR16 *TextDeviceNode\r
@@ -2032,7 +2470,14 @@ DevPathFromTextUsbWwid (
   return (EFI_DEVICE_PATH_PROTOCOL *) UsbWwid;\r
 }\r
 \r
-STATIC\r
+/**\r
+  Converts a text device path node to Logic Unit device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+\r
+  @return A pointer to the newly-created Logic Unit device path structure.\r
+\r
+**/\r
 EFI_DEVICE_PATH_PROTOCOL *\r
 DevPathFromTextUnit (\r
   IN CHAR16 *TextDeviceNode\r
@@ -2053,7 +2498,14 @@ DevPathFromTextUnit (
   return (EFI_DEVICE_PATH_PROTOCOL *) LogicalUnit;\r
 }\r
 \r
-STATIC\r
+/**\r
+  Converts a text device path node to iSCSI device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+\r
+  @return A pointer to the newly-created iSCSI device path structure.\r
+\r
+**/\r
 EFI_DEVICE_PATH_PROTOCOL *\r
 DevPathFromTextiSCSI (\r
   IN CHAR16 *TextDeviceNode\r
@@ -2068,7 +2520,7 @@ DevPathFromTextiSCSI (
   CHAR16                      *AuthenticationStr;\r
   CHAR16                      *ProtocolStr;\r
   CHAR8                       *AsciiStr;\r
-  ISCSI_DEVICE_PATH_WITH_NAME *iSCSI;\r
+  ISCSI_DEVICE_PATH_WITH_NAME *ISCSIDevPath;\r
 \r
   NameStr           = GetNextParamStr (&TextDeviceNode);\r
   PortalGroupStr    = GetNextParamStr (&TextDeviceNode);\r
@@ -2077,17 +2529,17 @@ DevPathFromTextiSCSI (
   DataDigestStr     = GetNextParamStr (&TextDeviceNode);\r
   AuthenticationStr = GetNextParamStr (&TextDeviceNode);\r
   ProtocolStr       = GetNextParamStr (&TextDeviceNode);\r
-  iSCSI             = (ISCSI_DEVICE_PATH_WITH_NAME *) CreateDeviceNode (\r
+  ISCSIDevPath      = (ISCSI_DEVICE_PATH_WITH_NAME *) CreateDeviceNode (\r
                                                         MESSAGING_DEVICE_PATH,\r
                                                         MSG_ISCSI_DP,\r
                                                         (UINT16) (sizeof (ISCSI_DEVICE_PATH_WITH_NAME) + StrLen (NameStr))\r
                                                         );\r
 \r
-  AsciiStr = iSCSI->iSCSITargetName;\r
+  AsciiStr = ISCSIDevPath->TargetName;\r
   StrToAscii (NameStr, &AsciiStr);\r
 \r
-  iSCSI->TargetPortalGroupTag = (UINT16) Strtoi (PortalGroupStr);\r
-  Strtoi64 (LunStr, &iSCSI->Lun);\r
+  ISCSIDevPath->TargetPortalGroupTag = (UINT16) Strtoi (PortalGroupStr);\r
+  Strtoi64 (LunStr, &ISCSIDevPath->Lun);\r
 \r
   Options = 0x0000;\r
   if (StrCmp (HeaderDigestStr, L"CRC32C") == 0) {\r
@@ -2106,14 +2558,49 @@ DevPathFromTextiSCSI (
     Options |= 0x1000;\r
   }\r
 \r
-  iSCSI->LoginOption      = (UINT16) Options;\r
+  ISCSIDevPath->LoginOption      = (UINT16) Options;\r
+\r
+  ISCSIDevPath->NetworkProtocol  = (UINT16) StrCmp (ProtocolStr, L"TCP");\r
+\r
+  return (EFI_DEVICE_PATH_PROTOCOL *) ISCSIDevPath;\r
+}\r
+\r
+/**\r
+  Converts a text device path node to VLAN device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+\r
+  @return A pointer to the newly-created VLAN device path structure.\r
 \r
-  iSCSI->NetworkProtocol  = (UINT16) StrCmp (ProtocolStr, L"TCP");\r
+**/\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextVlan (\r
+  IN CHAR16 *TextDeviceNode\r
+  )\r
+{\r
+  CHAR16            *VlanStr;\r
+  VLAN_DEVICE_PATH  *Vlan;\r
+\r
+  VlanStr = GetNextParamStr (&TextDeviceNode);\r
+  Vlan    = (VLAN_DEVICE_PATH *) CreateDeviceNode (\r
+                                   MESSAGING_DEVICE_PATH,\r
+                                   MSG_VLAN_DP,\r
+                                   (UINT16) sizeof (VLAN_DEVICE_PATH)\r
+                                   );\r
+\r
+  Vlan->VlanId = (UINT16) Strtoi (VlanStr);\r
 \r
-  return (EFI_DEVICE_PATH_PROTOCOL *) iSCSI;\r
+  return (EFI_DEVICE_PATH_PROTOCOL *) Vlan;\r
 }\r
 \r
-STATIC\r
+/**\r
+  Converts a text device path node to HD device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+\r
+  @return A pointer to the newly-created HD device path structure.\r
+\r
+**/\r
 EFI_DEVICE_PATH_PROTOCOL *\r
 DevPathFromTextHD (\r
   IN CHAR16 *TextDeviceNode\r
@@ -2136,7 +2623,7 @@ DevPathFromTextHD (
   Hd                  = (HARDDRIVE_DEVICE_PATH *) CreateDeviceNode (\r
                                                     MEDIA_DEVICE_PATH,\r
                                                     MEDIA_HARDDRIVE_DP,\r
-                                                    sizeof (HARDDRIVE_DEVICE_PATH)\r
+                                                    (UINT16) sizeof (HARDDRIVE_DEVICE_PATH)\r
                                                     );\r
 \r
   Hd->PartitionNumber = (UINT32) Dtoi (PartitionStr);\r
@@ -2166,7 +2653,14 @@ DevPathFromTextHD (
   return (EFI_DEVICE_PATH_PROTOCOL *) Hd;\r
 }\r
 \r
-STATIC\r
+/**\r
+  Converts a text device path node to CDROM device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+\r
+  @return A pointer to the newly-created CDROM device path structure.\r
+\r
+**/\r
 EFI_DEVICE_PATH_PROTOCOL *\r
 DevPathFromTextCDROM (\r
   IN CHAR16 *TextDeviceNode\r
@@ -2175,25 +2669,32 @@ DevPathFromTextCDROM (
   CHAR16            *EntryStr;\r
   CHAR16            *StartStr;\r
   CHAR16            *SizeStr;\r
-  CDROM_DEVICE_PATH *CDROM;\r
+  CDROM_DEVICE_PATH *CDROMDevPath;\r
 \r
   EntryStr              = GetNextParamStr (&TextDeviceNode);\r
   StartStr              = GetNextParamStr (&TextDeviceNode);\r
   SizeStr               = GetNextParamStr (&TextDeviceNode);\r
-  CDROM                 = (CDROM_DEVICE_PATH *) CreateDeviceNode (\r
+  CDROMDevPath          = (CDROM_DEVICE_PATH *) CreateDeviceNode (\r
                                                   MEDIA_DEVICE_PATH,\r
                                                   MEDIA_CDROM_DP,\r
-                                                  sizeof (CDROM_DEVICE_PATH)\r
+                                                  (UINT16) sizeof (CDROM_DEVICE_PATH)\r
                                                   );\r
 \r
-  CDROM->BootEntry      = (UINT32) Strtoi (EntryStr);\r
-  Strtoi64 (StartStr, &CDROM->PartitionStart);\r
-  Strtoi64 (SizeStr, &CDROM->PartitionSize);\r
+  CDROMDevPath->BootEntry = (UINT32) Strtoi (EntryStr);\r
+  Strtoi64 (StartStr, &CDROMDevPath->PartitionStart);\r
+  Strtoi64 (SizeStr, &CDROMDevPath->PartitionSize);\r
 \r
-  return (EFI_DEVICE_PATH_PROTOCOL *) CDROM;\r
+  return (EFI_DEVICE_PATH_PROTOCOL *) CDROMDevPath;\r
 }\r
 \r
-STATIC\r
+/**\r
+  Converts a text device path node to Vendor-defined media device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+\r
+  @return A pointer to the newly-created Vendor-defined media device path structure.\r
+\r
+**/\r
 EFI_DEVICE_PATH_PROTOCOL *\r
 DevPathFromTextVenMEDIA (\r
   IN CHAR16 *TextDeviceNode\r
@@ -2206,7 +2707,14 @@ DevPathFromTextVenMEDIA (
            );\r
 }\r
 \r
-STATIC\r
+/**\r
+  Converts a text device path node to File device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+\r
+  @return A pointer to the newly-created File device path structure.\r
+\r
+**/\r
 EFI_DEVICE_PATH_PROTOCOL *\r
 DevPathFromTextFilePath (\r
   IN CHAR16 *TextDeviceNode\r
@@ -2225,7 +2733,14 @@ DevPathFromTextFilePath (
   return (EFI_DEVICE_PATH_PROTOCOL *) File;\r
 }\r
 \r
-STATIC\r
+/**\r
+  Converts a text device path node to Media protocol device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+\r
+  @return A pointer to the newly-created Media protocol device path structure.\r
+\r
+**/\r
 EFI_DEVICE_PATH_PROTOCOL *\r
 DevPathFromTextMedia (\r
   IN CHAR16 *TextDeviceNode\r
@@ -2238,7 +2753,7 @@ DevPathFromTextMedia (
   Media   = (MEDIA_PROTOCOL_DEVICE_PATH *) CreateDeviceNode (\r
                                              MEDIA_DEVICE_PATH,\r
                                              MEDIA_PROTOCOL_DP,\r
-                                             sizeof (MEDIA_PROTOCOL_DEVICE_PATH)\r
+                                             (UINT16) sizeof (MEDIA_PROTOCOL_DEVICE_PATH)\r
                                              );\r
 \r
   StrToGuid (GuidStr, &Media->Protocol);\r
@@ -2246,7 +2761,14 @@ DevPathFromTextMedia (
   return (EFI_DEVICE_PATH_PROTOCOL *) Media;\r
 }\r
 \r
-STATIC\r
+/**\r
+  Converts a text device path node to firmware volume device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+\r
+  @return A pointer to the newly-created firmware volume device path structure.\r
+\r
+**/\r
 EFI_DEVICE_PATH_PROTOCOL *\r
 DevPathFromTextFv (\r
   IN CHAR16 *TextDeviceNode\r
@@ -2259,7 +2781,7 @@ DevPathFromTextFv (
   Fv      = (MEDIA_FW_VOL_DEVICE_PATH *) CreateDeviceNode (\r
                                            MEDIA_DEVICE_PATH,\r
                                            MEDIA_PIWG_FW_VOL_DP,\r
-                                           sizeof (MEDIA_FW_VOL_DEVICE_PATH)\r
+                                           (UINT16) sizeof (MEDIA_FW_VOL_DEVICE_PATH)\r
                                            );\r
 \r
   StrToGuid (GuidStr, &Fv->FvName);\r
@@ -2267,7 +2789,14 @@ DevPathFromTextFv (
   return (EFI_DEVICE_PATH_PROTOCOL *) Fv;\r
 }\r
 \r
-STATIC\r
+/**\r
+  Converts a text device path node to firmware file device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+\r
+  @return A pointer to the newly-created firmware file device path structure.\r
+\r
+**/\r
 EFI_DEVICE_PATH_PROTOCOL *\r
 DevPathFromTextFvFile (\r
   IN CHAR16 *TextDeviceNode\r
@@ -2280,7 +2809,7 @@ DevPathFromTextFvFile (
   FvFile  = (MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *) CreateDeviceNode (\r
                                                     MEDIA_DEVICE_PATH,\r
                                                     MEDIA_PIWG_FW_FILE_DP,\r
-                                                    sizeof (MEDIA_FW_VOL_FILEPATH_DEVICE_PATH)\r
+                                                    (UINT16) sizeof (MEDIA_FW_VOL_FILEPATH_DEVICE_PATH)\r
                                                     );\r
 \r
   StrToGuid (GuidStr, &FvFile->FvFileName);\r
@@ -2288,7 +2817,45 @@ DevPathFromTextFvFile (
   return (EFI_DEVICE_PATH_PROTOCOL *) FvFile;\r
 }\r
 \r
-STATIC\r
+/**\r
+  Converts a text device path node to text relative offset device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+\r
+  @return A pointer to the newly-created Text device path structure.\r
+\r
+**/\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextRelativeOffsetRange (\r
+  IN CHAR16 *TextDeviceNode\r
+  )\r
+{\r
+  CHAR16                                  *StartingOffsetStr;\r
+  CHAR16                                  *EndingOffsetStr;\r
+  MEDIA_RELATIVE_OFFSET_RANGE_DEVICE_PATH *Offset;\r
+\r
+  StartingOffsetStr = GetNextParamStr (&TextDeviceNode);\r
+  EndingOffsetStr   = GetNextParamStr (&TextDeviceNode);\r
+  Offset            = (MEDIA_RELATIVE_OFFSET_RANGE_DEVICE_PATH *) CreateDeviceNode (\r
+                                                                    MEDIA_DEVICE_PATH,\r
+                                                                    MEDIA_RELATIVE_OFFSET_RANGE_DP,\r
+                                                                    (UINT16) sizeof (MEDIA_RELATIVE_OFFSET_RANGE_DEVICE_PATH)\r
+                                                                    );\r
+\r
+  Strtoi64 (StartingOffsetStr, &Offset->StartingOffset);\r
+  Strtoi64 (EndingOffsetStr, &Offset->EndingOffset);\r
+\r
+  return (EFI_DEVICE_PATH_PROTOCOL *) Offset;\r
+}\r
+\r
+/**\r
+  Converts a text device path node to BIOS Boot Specification device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+\r
+  @return A pointer to the newly-created BIOS Boot Specification device path structure.\r
+\r
+**/\r
 EFI_DEVICE_PATH_PROTOCOL *\r
 DevPathFromTextBBS (\r
   IN CHAR16 *TextDeviceNode\r
@@ -2333,7 +2900,14 @@ DevPathFromTextBBS (
   return (EFI_DEVICE_PATH_PROTOCOL *) Bbs;\r
 }\r
 \r
-STATIC\r
+/**\r
+  Converts a text device path node to SATA device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+\r
+  @return A pointer to the newly-created SATA device path structure.\r
+\r
+**/\r
 EFI_DEVICE_PATH_PROTOCOL *\r
 DevPathFromTextSata (\r
   IN CHAR16 *TextDeviceNode\r
@@ -2357,14 +2931,14 @@ DevPathFromTextSata (
   Sata = (SATA_DEVICE_PATH *) CreateDeviceNode (\r
                                 MESSAGING_DEVICE_PATH,\r
                                 MSG_SATA_DP,\r
-                                sizeof (SATA_DEVICE_PATH)\r
+                                (UINT16) sizeof (SATA_DEVICE_PATH)\r
                                 );\r
   Sata->HBAPortNumber = (UINT16) Xtoi (Param1);\r
   if (Param3 != NULL) {\r
     Sata->PortMultiplierPortNumber = (UINT16) Xtoi (Param2);\r
     Param2                   = Param3;\r
   } else {\r
-    Sata->PortMultiplierPortNumber = 0;\r
+    Sata->PortMultiplierPortNumber = SATA_HBA_DIRECT_CONNECT_FLAG;\r
   }\r
   Sata->Lun = (UINT16) Xtoi (Param2);\r
 \r
@@ -2379,15 +2953,18 @@ GLOBAL_REMOVE_IF_UNREFERENCED DEVICE_PATH_FROM_TEXT_TABLE DevPathFromTextTable[]
   {L"Ctrl", DevPathFromTextCtrl},\r
   {L"Acpi", DevPathFromTextAcpi},\r
   {L"PciRoot", DevPathFromTextPciRoot},\r
+  {L"PcieRoot", DevPathFromTextPcieRoot},\r
   {L"Floppy", DevPathFromTextFloppy},\r
   {L"Keyboard", DevPathFromTextKeyboard},\r
   {L"Serial", DevPathFromTextSerial},\r
   {L"ParallelPort", DevPathFromTextParallelPort},\r
   {L"AcpiEx", DevPathFromTextAcpiEx},\r
   {L"AcpiExp", DevPathFromTextAcpiExp},\r
+  {L"AcpiAdr", DevPathFromTextAcpiAdr},\r
   {L"Ata", DevPathFromTextAta},\r
   {L"Scsi", DevPathFromTextScsi},\r
   {L"Fibre", DevPathFromTextFibre},\r
+  {L"FibreEx", DevPathFromTextFibreEx},\r
   {L"I1394", DevPathFromText1394},\r
   {L"USB", DevPathFromTextUsb},\r
   {L"I2O", DevPathFromTextI2O},\r
@@ -2399,6 +2976,7 @@ GLOBAL_REMOVE_IF_UNREFERENCED DEVICE_PATH_FROM_TEXT_TABLE DevPathFromTextTable[]
   {L"VenUtf8", DevPathFromTextVenUtf8},\r
   {L"UartFlowCtrl", DevPathFromTextUartFlowCtrl},\r
   {L"SAS", DevPathFromTextSAS},\r
+  {L"SasEx", DevPathFromTextSasEx},\r
   {L"DebugPort", DevPathFromTextDebugPort},\r
   {L"MAC", DevPathFromTextMAC},\r
   {L"IPv4", DevPathFromTextIPv4},\r
@@ -2423,38 +3001,37 @@ GLOBAL_REMOVE_IF_UNREFERENCED DEVICE_PATH_FROM_TEXT_TABLE DevPathFromTextTable[]
   {L"UsbWwid", DevPathFromTextUsbWwid},\r
   {L"Unit", DevPathFromTextUnit},\r
   {L"iSCSI", DevPathFromTextiSCSI},\r
+  {L"Vlan", DevPathFromTextVlan},\r
   {L"HD", DevPathFromTextHD},\r
   {L"CDROM", DevPathFromTextCDROM},\r
   {L"VenMEDIA", DevPathFromTextVenMEDIA},\r
   {L"Media", DevPathFromTextMedia},\r
   {L"Fv", DevPathFromTextFv},\r
   {L"FvFile", DevPathFromTextFvFile},\r
+  {L"Offset", DevPathFromTextRelativeOffsetRange},\r
   {L"BBS", DevPathFromTextBBS},\r
   {L"Sata", DevPathFromTextSata},\r
   {NULL, NULL}\r
 };\r
 \r
-EFI_DEVICE_PATH_PROTOCOL *\r
-ConvertTextToDeviceNode (\r
-  IN CONST CHAR16 *TextDeviceNode\r
-  )\r
-/*++\r
-\r
-  Routine Description:\r
-    Convert text to the binary representation of a device node.\r
+/**\r
+  Convert text to the binary representation of a device node.\r
 \r
-  Arguments:\r
-    TextDeviceNode   -   TextDeviceNode points to the text representation of a device\r
+  @param TextDeviceNode  TextDeviceNode points to the text representation of a device\r
                          node. Conversion starts with the first character and continues\r
                          until the first non-device node character.\r
 \r
-  Returns:\r
-    A pointer        -   Pointer to the EFI device node.\r
-    NULL             -   If TextDeviceNode is NULL or there was insufficient memory or text unsupported.\r
+  @return A pointer to the EFI device node or NULL if TextDeviceNode is NULL or there was\r
+          insufficient memory or text unsupported.\r
 \r
---*/\r
+**/\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+EFIAPI\r
+ConvertTextToDeviceNode (\r
+  IN CONST CHAR16 *TextDeviceNode\r
+  )\r
 {\r
-  EFI_DEVICE_PATH_PROTOCOL * (*DumpNode) (CHAR16 *);\r
+  DUMP_NODE                DumpNode;\r
   CHAR16                   *ParamStr;\r
   EFI_DEVICE_PATH_PROTOCOL *DeviceNode;\r
   CHAR16                   *DeviceNodeStr;\r
@@ -2467,8 +3044,9 @@ ConvertTextToDeviceNode (
   ParamStr      = NULL;\r
   DumpNode      = NULL;\r
   DeviceNodeStr = StrDuplicate (TextDeviceNode);\r
+  ASSERT (DeviceNodeStr != NULL);\r
 \r
-  for (Index = 0; DevPathFromTextTable[Index].Function; Index++) {\r
+  for (Index = 0; DevPathFromTextTable[Index].Function != NULL; Index++) {\r
     ParamStr = GetParamByNodeName (DeviceNodeStr, DevPathFromTextTable[Index].DevicePathNodeText);\r
     if (ParamStr != NULL) {\r
       DumpNode = DevPathFromTextTable[Index].Function;\r
@@ -2492,27 +3070,25 @@ ConvertTextToDeviceNode (
   return DeviceNode;\r
 }\r
 \r
-EFI_DEVICE_PATH_PROTOCOL *\r
-ConvertTextToDevicePath (\r
-  IN CONST CHAR16 *TextDevicePath\r
-  )\r
-/*++\r
+/**\r
+  Convert text to the binary representation of a device path.\r
 \r
-  Routine Description:\r
-    Convert text to the binary representation of a device path.\r
 \r
-  Arguments:\r
-    TextDevicePath   -   TextDevicePath points to the text representation of a device\r
+  @param TextDevicePath  TextDevicePath points to the text representation of a device\r
                          path. Conversion starts with the first character and continues\r
                          until the first non-device node character.\r
 \r
-  Returns:\r
-    A pointer        -   Pointer to the allocated device path.\r
-    NULL             -   If TextDeviceNode is NULL or there was insufficient memory.\r
+  @return A pointer to the allocated device path or NULL if TextDeviceNode is NULL or\r
+          there was insufficient memory.\r
 \r
---*/\r
+**/\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+EFIAPI\r
+ConvertTextToDevicePath (\r
+  IN CONST CHAR16 *TextDevicePath\r
+  )\r
 {\r
-  EFI_DEVICE_PATH_PROTOCOL * (*DumpNode) (CHAR16 *);\r
+  DUMP_NODE                DumpNode;\r
   CHAR16                   *ParamStr;\r
   EFI_DEVICE_PATH_PROTOCOL *DeviceNode;\r
   UINTN                    Index;\r
@@ -2528,6 +3104,7 @@ ConvertTextToDevicePath (
   }\r
 \r
   DevicePath = (EFI_DEVICE_PATH_PROTOCOL *) AllocatePool (END_DEVICE_PATH_LENGTH);\r
+  ASSERT (DevicePath != NULL);\r
   SetDevicePathEndNode (DevicePath);\r
 \r
   ParamStr            = NULL;\r
@@ -2537,7 +3114,7 @@ ConvertTextToDevicePath (
   Str                 = DevicePathStr;\r
   while ((DeviceNodeStr = GetNextDeviceNodeStr (&Str, &IsInstanceEnd)) != NULL) {\r
     DumpNode = NULL;\r
-    for (Index = 0; DevPathFromTextTable[Index].Function; Index++) {\r
+    for (Index = 0; DevPathFromTextTable[Index].Function != NULL; Index++) {\r
       ParamStr = GetParamByNodeName (DeviceNodeStr, DevPathFromTextTable[Index].DevicePathNodeText);\r
       if (ParamStr != NULL) {\r
         DumpNode = DevPathFromTextTable[Index].Function;\r
@@ -2561,9 +3138,10 @@ ConvertTextToDevicePath (
     FreePool (DeviceNode);\r
     DevicePath = NewDevicePath;\r
 \r
-    if (IsInstanceEnd) {\r
+    if (IsInstanceEnd != 0) {\r
       DeviceNode = (EFI_DEVICE_PATH_PROTOCOL *) AllocatePool (END_DEVICE_PATH_LENGTH);\r
-      SetDevicePathInstanceEndNode (DeviceNode);\r
+      ASSERT (DeviceNode != NULL);\r
+      SET_DEVICE_PATH_INSTANCE_END_NODE (DeviceNode);\r
 \r
       NewDevicePath = AppendDeviceNodeProtocolInterface (DevicePath, DeviceNode);\r
       FreePool (DevicePath);\r