]> 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 3dd9b79a86b91c3321577c50f79e350bad46c981..11f5c159df449acb1482c1f9e3dbeb2e08b19cc5 100644 (file)
@@ -1,8 +1,8 @@
 /** @file\r
   DevicePathFromText protocol as defined in the UEFI 2.0 specification.\r
 \r
-Copyright (c) 2006 - 2008, Intel Corporation. <BR>\r
-All rights reserved. This program and the accompanying materials\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
@@ -14,54 +14,40 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 \r
 #include "DevicePath.h"\r
 \r
-STATIC\r
-CHAR16 *\r
-StrDuplicate (\r
-  IN CONST CHAR16  *Src\r
-  )\r
-/*++\r
 \r
-  Routine Description:\r
-    Duplicate a string\r
+/**\r
+\r
+  Duplicates a string.\r
 \r
-  Arguments:\r
-    Src - Source string\r
+  @param  Src  Source string.\r
 \r
-  Returns:\r
-    Duplicated string\r
+  @return The duplicated string.\r
 \r
---*/\r
+**/\r
+CHAR16 *\r
+StrDuplicate (\r
+  IN CONST CHAR16  *Src\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
+  @return Parameter text for the node.\r
 \r
-STATIC\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
@@ -113,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
@@ -172,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
@@ -184,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
@@ -271,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
+  Skip the leading white space and '0x' or '0X' of a integer string\r
 \r
-  Arguments:\r
-    Digit - Pointer to byte that receives the value of the hex character.\r
-    Char  - Unicode character to test.\r
+  @param Str             The integer string\r
+  @param IsHex           TRUE: Hex string, FALSE: Decimal string\r
 \r
-  Returns:\r
-    TRUE  - If the character is a hexadecimal digit.\r
-    FALSE - Otherwise.\r
+  @return The trimmed Hex string.\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
-  if (ConvertedStrLen != NULL) {\r
-    *ConvertedStrLen = HexCnt;\r
-  }\r
-\r
-  return EFI_SUCCESS;\r
-}\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
@@ -444,107 +294,75 @@ TrimHexStr (
   return Str;\r
 }\r
 \r
-STATIC\r
-UINTN\r
-Xtoi (\r
-  IN CHAR16  *Str\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
+/**\r
 \r
-  Convert hex string to uint\r
+  Convert hex string to uint.\r
 \r
-Arguments:\r
+  @param Str             The hex string\r
 \r
-  Str  -  The string\r
-  \r
-Returns:\r
+  @return A UINTN value represented by Str\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
@@ -555,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
@@ -609,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
+  @param Str             The integer string. If leading with "0x" or "0X", it's hexadecimal.\r
 \r
-  Str  -  The integer string. If leading with "0x" or "0X", it's heximal.\r
+  @return A UINTN value represented by Str\r
 \r
-Returns:\r
-\r
---*/\r
+**/\r
+UINTN\r
+Strtoi (\r
+  IN CHAR16  *Str\r
+  )\r
 {\r
   BOOLEAN IsHex;\r
 \r
@@ -645,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
+  @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
-  Str  -  The integer string. If leading with "0x" or "0X", it's heximal.\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
@@ -676,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
@@ -698,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
@@ -718,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
@@ -781,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
@@ -795,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
@@ -812,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
@@ -833,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
@@ -848,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
@@ -857,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
@@ -870,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
@@ -878,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
@@ -895,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
@@ -905,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
@@ -939,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
@@ -952,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
@@ -965,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
@@ -982,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
@@ -1002,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
@@ -1011,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
@@ -1025,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
@@ -1034,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
@@ -1043,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
@@ -1052,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
@@ -1061,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
@@ -1070,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
@@ -1079,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
@@ -1123,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
@@ -1168,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
@@ -1182,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
@@ -1196,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
@@ -1211,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
@@ -1220,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
@@ -1235,7 +1288,7 @@ DevPathFromTextFibre (
   Fibre  = (FIBRECHANNEL_DEVICE_PATH *) CreateDeviceNode (\r
                                           MESSAGING_DEVICE_PATH,\r
                                           MSG_FIBRECHANNEL_DP,\r
-                                          sizeof (FIBRECHANNEL_DEVICE_PATH)\r
+                                          (UINT16) sizeof (FIBRECHANNEL_DEVICE_PATH)\r
                                           );\r
 \r
   Fibre->Reserved = 0;\r
@@ -1245,29 +1298,78 @@ DevPathFromTextFibre (
   return (EFI_DEVICE_PATH_PROTOCOL *) Fibre;\r
 }\r
 \r
-STATIC\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
+  *(UINT64 *) (&FibreEx->WWN) = SwapBytes64 (*(UINT64 *) (&FibreEx->WWN));\r
+  *(UINT64 *) (&FibreEx->Lun) = SwapBytes64 (*(UINT64 *) (&FibreEx->Lun));\r
+\r
+  return (EFI_DEVICE_PATH_PROTOCOL *) FibreEx;\r
+}\r
+\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
@@ -1282,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
@@ -1291,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
@@ -1334,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
@@ -1347,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
@@ -1360,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
@@ -1371,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
@@ -1388,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
@@ -1405,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
@@ -1422,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
@@ -1441,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
@@ -1456,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
@@ -1485,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
@@ -1519,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
@@ -1530,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
@@ -1538,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
@@ -1547,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
-  return (EFI_DEVICE_PATH_PROTOCOL *) MAC;\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
+**/\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
@@ -1575,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
@@ -1596,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
@@ -1603,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
@@ -1613,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
@@ -1641,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
@@ -1660,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
@@ -1708,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
@@ -1725,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
@@ -1741,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
@@ -1753,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
@@ -1767,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
@@ -1782,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
@@ -1797,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
@@ -1812,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
@@ -1827,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
@@ -1842,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
@@ -1857,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
@@ -1872,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
@@ -1887,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
@@ -1902,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
@@ -1917,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
@@ -1932,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
@@ -1947,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
@@ -1963,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
@@ -1979,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
@@ -1995,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
@@ -2025,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
@@ -2046,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
@@ -2061,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
@@ -2070,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
@@ -2099,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
+**/\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
-  iSCSI->NetworkProtocol  = (UINT16) StrCmp (ProtocolStr, L"TCP");\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
@@ -2129,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
@@ -2159,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
@@ -2168,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
@@ -2199,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
@@ -2218,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
@@ -2231,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
@@ -2239,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
@@ -2252,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
@@ -2260,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
@@ -2273,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
@@ -2281,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
@@ -2326,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
@@ -2350,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
@@ -2372,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
@@ -2392,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
@@ -2416,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
@@ -2460,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
@@ -2485,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
@@ -2521,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
@@ -2530,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
@@ -2554,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