+UINTN mGuidDataLen[] = {8, 4, 4, 4, 12};\r
+/**\r
+ Function to determine if the string can convert to a GUID.\r
+ The string must be restricted as "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" format.\r
+\r
+ @param[in] String The string to test.\r
+\r
+ @retval TRUE The string can convert to a GUID.\r
+ @retval FALSE The string can't convert to a GUID.\r
+**/\r
+BOOLEAN\r
+IsValidGuidString(\r
+ IN CONST CHAR16 *String\r
+ )\r
+{\r
+ CONST CHAR16 *Walker;\r
+ CONST CHAR16 *PrevWalker;\r
+ UINTN Index;\r
+\r
+ if (String == NULL) {\r
+ return FALSE;\r
+ }\r
+\r
+ Walker = String;\r
+ PrevWalker = String;\r
+ Index = 0;\r
+\r
+ while (Walker != NULL && *Walker != CHAR_NULL) {\r
+ if ( (*Walker >= '0' && *Walker <= '9') ||\r
+ (*Walker >= 'a' && *Walker <= 'f') ||\r
+ (*Walker >= 'A' && *Walker <= 'F')\r
+ ) {\r
+ Walker++;\r
+ } else {\r
+ if (*Walker == L'-' && (((UINTN)Walker - (UINTN)PrevWalker) / sizeof (CHAR16)) == mGuidDataLen[Index]) {\r
+ Walker++;\r
+ PrevWalker = Walker;\r
+ Index++;\r
+ } else {\r
+ return FALSE;\r
+ }\r
+ }\r
+ }\r
+\r
+ if ((((UINTN)Walker - (UINTN)PrevWalker) / sizeof (CHAR16)) == mGuidDataLen[Index]) {\r
+ return TRUE;\r
+ } else {\r
+ return FALSE;\r
+ }\r
+}\r
+\r
+/**\r
+ Convert a hex-character to decimal value.\r
+\r
+ This internal function only deal with Unicode character\r
+ which maps to a valid hexadecimal ASII character, i.e.\r
+ L'0' to L'9', L'a' to L'f' or L'A' to L'F'. For other\r
+ Unicode character, the value returned does not make sense.\r
+\r
+ @param[in] Char The character to convert.\r
+\r
+ @retval The numerical value converted.\r
+**/\r
+UINTN\r
+HexCharToDecimal(\r
+ IN CHAR16 Char\r
+ )\r
+{\r
+ if (Char >= '0' && Char <= '9') {\r
+ return Char - L'0';\r
+ } else if (Char >= 'a' && Char <= 'f') {\r
+ return Char - L'a' + 10;\r
+ } else {\r
+ return Char - L'A' + 10;\r
+ }\r
+}\r
+\r
+/**\r
+ Function try to convert a string to GUID format.\r
+\r
+ @param[in] String The string will be converted.\r
+ @param[out] Guid Save the result convert from string.\r
+\r
+ @retval EFI_SUCCESS The string was successfully converted to a GUID.\r
+ @retval EFI_UNSUPPORTED The input string is not in registry format.\r
+**/\r
+EFI_STATUS\r
+ConvertStrToGuid(\r
+ IN CONST CHAR16 *String,\r
+ OUT GUID *Guid\r
+ )\r
+{\r
+ CONST CHAR16 *Walker;\r
+ UINT8 TempValue;\r
+ UINTN Index;\r
+\r
+ if (String == NULL || !IsValidGuidString (String)) {\r
+ return EFI_UNSUPPORTED;\r
+ }\r
+\r
+ Index = 0;\r
+\r
+ Walker = String;\r
+ Guid->Data1 = (UINT32)StrHexToUint64 (Walker);\r
+\r
+ Walker += 9;\r
+ Guid->Data2 = (UINT16)StrHexToUint64 (Walker);\r
+\r
+ Walker += 5;\r
+ Guid->Data3 = (UINT16)StrHexToUint64 (Walker);\r
+\r
+ Walker += 5;\r
+ while (Walker != NULL && *Walker != CHAR_NULL) {\r
+ if (*Walker == L'-') {\r
+ Walker++;\r
+ } else {\r
+ TempValue = (UINT8)HexCharToDecimal (*Walker);\r
+ TempValue = (UINT8)LShiftU64 (TempValue, 4);\r
+ Walker++;\r
+\r
+ TempValue += (UINT8)HexCharToDecimal (*Walker);\r
+ Walker++;\r
+\r
+ Guid->Data4[Index] = TempValue;\r
+ Index++;\r
+ }\r
+ }\r
+\r
+ return EFI_SUCCESS;\r
+}\r
+\r