+ UINT16 Count;\r
+ LIST_ENTRY *Link;\r
+ HII_THUNK_CONTEXT *ThunkContext;\r
+ HII_THUNK_PRIVATE_DATA *Private;\r
+\r
+ if (HandleBufferLength == NULL) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ Private = HII_THUNK_PRIVATE_DATA_FROM_THIS(This); \r
+\r
+ //\r
+ // Count the number of handles.\r
+ //\r
+ Count = 0;\r
+ Link = GetFirstNode (&Private->ThunkContextListHead);\r
+ while (!IsNull (&Private->ThunkContextListHead, Link)) {\r
+ Count++;\r
+ Link = GetNextNode (&Private->ThunkContextListHead, Link);\r
+ }\r
+\r
+ if (Count > *HandleBufferLength) {\r
+ *HandleBufferLength = (Count * sizeof (FRAMEWORK_EFI_HII_HANDLE));\r
+ return EFI_BUFFER_TOO_SMALL;\r
+ }\r
+\r
+ //\r
+ // Output the handles.\r
+ //\r
+ Count = 0;\r
+ Link = GetFirstNode (&Private->ThunkContextListHead);\r
+ while (!IsNull (&Private->ThunkContextListHead, Link)) {\r
+\r
+ ThunkContext = HII_THUNK_CONTEXT_FROM_LINK (Link);\r
+ Handle[Count] = ThunkContext->FwHiiHandle;\r
+\r
+ Count++;\r
+ Link = GetNextNode (&Private->ThunkContextListHead, Link);\r
+\r
+ }\r
+\r
+ *HandleBufferLength = (Count * sizeof (FRAMEWORK_EFI_HII_HANDLE));\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+EFI_STATUS\r
+LangCodes3066To639 (\r
+ IN CHAR8 *LangCodes3066,\r
+ IN CHAR8 **LangCodes639\r
+ )\r
+{\r
+ CHAR8 *AsciiLangCodes;\r
+ CHAR8 Lang[RFC_3066_ENTRY_SIZE];\r
+ UINTN Index;\r
+ UINTN Count;\r
+ EFI_STATUS Status;\r
+\r
+ ASSERT (LangCodes3066 != NULL);\r
+ ASSERT (LangCodes639 != NULL);\r
+ \r
+ //\r
+ // Count the number of RFC 3066 language codes.\r
+ //\r
+ Index = 0;\r
+ AsciiLangCodes = LangCodes3066;\r
+ while (AsciiStrLen (AsciiLangCodes) != 0) {\r
+ HiiLibGetNextLanguage (&AsciiLangCodes, Lang);\r
+ Index++;\r
+ }\r
+\r
+ Count = Index;\r
+\r
+ //\r
+ // \r
+ //\r
+ *LangCodes639 = AllocateZeroPool (ISO_639_2_ENTRY_SIZE * Count + 1);\r
+ if (*LangCodes639 == NULL) {\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
+\r
+ AsciiLangCodes = LangCodes3066;\r
+\r
+ for (Index = 0; Index < Count; Index++) {\r
+ HiiLibGetNextLanguage (&AsciiLangCodes, Lang);\r
+ Status = ConvertRfc3066LanguageToIso639Language (Lang, *LangCodes639 + Index * ISO_639_2_ENTRY_SIZE);\r
+ ASSERT_EFI_ERROR (Status);\r
+ }\r
+\r