Index: drivers/drivers.c =================================================================== --- drivers/drivers.c (revision 30) +++ drivers/drivers.c (working copy) @@ -130,6 +130,7 @@ UINTN StringIndex; UINTN Index; CHAR8 *Language; + CHAR8 *PlatformLanguage; UINTN DriverImageHandleCount; EFI_HANDLE *DriverImageHandleBuffer; UINTN HandleIndex; @@ -152,6 +153,7 @@ SHELL_VAR_CHECK_PACKAGE ChkPck; Language = NULL; + PlatformLanguage = NULL; DriverImageHandleCount = 0; DriverImageHandleBuffer = NULL; IsHelp = FALSE; @@ -241,7 +243,7 @@ goto Done; } - Language = LibGetVariableLang (); + Language = LibGetVariable (L"Lang", &gEfiGlobalVariableGuid); if (Language == NULL) { Language = (CHAR8 *)AllocateZeroPool(strlena(LanguageCodeEnglish) + 1); if (Language == NULL) { @@ -250,6 +252,15 @@ strcpya(Language, LanguageCodeEnglish); } + PlatformLanguage = LibGetVariable (L"PlatformLang", &gEfiGlobalVariableGuid); + if (PlatformLanguage == NULL) { + PlatformLanguage = (CHAR8 *)AllocateZeroPool(strlena(PlatformLanguageCodeEnglish) + 1); + if (PlatformLanguage == NULL) { + return EFI_OUT_OF_RESOURCES; + } + strcpya(PlatformLanguage, PlatformLanguageCodeEnglish); + } + Item = LibCheckVarGetFlag (&ChkPck, L"-l"); if (Item) { if (Language != NULL) { @@ -314,14 +325,6 @@ EFI_OPEN_PROTOCOL_GET_PROTOCOL ); - ComponentName = NULL; - ComponentName2 = NULL; - Status = LibGetComponentNameProtocol ( - DriverImageHandleBuffer[Index], - &ComponentName, - &ComponentName2 - ); - DiagnosticsStatus = BS->OpenProtocol ( DriverImageHandleBuffer[Index], &gEfiDriverDiagnostics2ProtocolGuid, @@ -418,37 +421,73 @@ } else { PrintToken (STRING_TOKEN (STR_SHELLENV_PROTID_ONE_VAR_D), HiiHandle, NumberOfChildren); } - - Status = EFI_SUCCESS; + DriverName = L""; - SupportedLanguage = NULL; - if (ComponentName != NULL) { - if (ComponentName->GetDriverName != NULL) { - SupportedLanguage = LibConvertSupportedLanguage (ComponentName->SupportedLanguages, Language); + Status = BS->OpenProtocol ( + DriverImageHandleBuffer[Index], + &gEfiComponentName2ProtocolGuid, + (VOID **) &ComponentName2, + NULL, + NULL, + EFI_OPEN_PROTOCOL_GET_PROTOCOL + ); + if (!EFI_ERROR (Status)) { + // + // Driver has Component Name 2 Protocol is available, we get the + // driver name var RFC 3066 language code + // + Status = ComponentName2->GetDriverName ( + ComponentName2, + PlatformLanguage, + &DriverName + ); + if (EFI_ERROR (Status)) { + // + // Current RFC3066 language code fails, we then extract the supported + // language from Component Name 2 protocol interface. + // + SupportedLanguage = ExtractSupportedLanguage(ComponentName2->SupportedLanguages, Language); + if (SupportedLanguage != NULL) { + Status = ComponentName2->GetDriverName ( + ComponentName2, + SupportedLanguage, + &DriverName + ); + FreePool(SupportedLanguage); + } + } + } + if (EFI_ERROR (Status)) { + // + // In case Component Name 2 protocol is not available or some error occurs + // when getting driver name from Component Name 2 protocol, we get driver + // name from Component Name protocol. + // + Status = BS->OpenProtocol ( + DriverImageHandleBuffer[Index], + &gEfiComponentNameProtocolGuid, + (VOID **) &ComponentName, + NULL, + NULL, + EFI_OPEN_PROTOCOL_GET_PROTOCOL + ); + if (!EFI_ERROR (Status)) { Status = ComponentName->GetDriverName ( ComponentName, - SupportedLanguage, + Language, &DriverName ); } - } else if (ComponentName2 != NULL) { - if (ComponentName2->GetDriverName != NULL) { - SupportedLanguage = LibConvertSupportedLanguage (ComponentName2->SupportedLanguages, Language); - Status = ComponentName2->GetDriverName ( - ComponentName2, - SupportedLanguage, - &DriverName - ); - } } - if (SupportedLanguage != NULL) { - FreePool (SupportedLanguage); - } - if (EFI_ERROR (Status)) { + // + // Fails to get driver name from either Component Name 2 & Component Name + // Protocol, we show "" string as driver name. + // DriverName = L""; } + for (StringIndex = 0; StringIndex < StrLen (DriverName) && StringIndex < 35; StringIndex++) { FormattedDriverName[StringIndex] = DriverName[StringIndex]; } @@ -491,6 +530,10 @@ FreePool (Language); } + if (PlatformLanguage != NULL) { + FreePool (PlatformLanguage); + } + ShellCloseHandleEnumerator (); LibCheckVarFreeVarList (&ChkPck); LibUnInitializeStrings (); Index: edit/libFileBuffer.c =================================================================== --- edit/libFileBuffer.c (revision 30) +++ edit/libFileBuffer.c (working copy) @@ -735,7 +735,7 @@ UINTN LineSize; VOID *Buffer; CHAR16 *UnicodeBuffer; - CHAR8 *AsciiBuffer; + UINT8 *AsciiBuffer; UINTN FileSize; EFI_FILE_HANDLE Handle; BOOLEAN CreateFile; @@ -1047,7 +1047,7 @@ // // Unicode file // - if (AsciiBuffer[0] == 0xff && AsciiBuffer[1] == 0xfe) { + if ((FileSize >= 2) && (*((UINT16 *) Buffer) == EFI_UNICODE_BYTE_ORDER_MARK)) { // // Unicode file's size should be even // Index: Library/EfiShellLib.h =================================================================== --- Library/EfiShellLib.h (revision 30) +++ Library/EfiShellLib.h (working copy) @@ -174,22 +174,23 @@ // // Environment variable name constants // -#define VarLanguageCodes L"LangCodes" -#define VarLanguage L"Lang" -#define VarTimeout L"Timeout" -#define VarConsoleIn L"ConIn" -#define VarConsoleOut L"ConOut" -#define VarErrorOut L"ErrOut" -#define VarBootOption L"Boot%04x" -#define VarBootOrder L"BootOrder" -#define VarBootNext L"BootNext" -#define VarBootCurrent L"BootCurrent" -#define VarDriverOption L"Driver%04x" -#define VarDriverOrder L"DriverOrder" -#define VarConsoleInpDev L"ConInDev" -#define VarConsoleOutDev L"ConOutDev" -#define VarErrorOutDev L"ErrOutDev" -#define LanguageCodeEnglish "eng" +#define VarLanguageCodes L"LangCodes" +#define VarLanguage L"Lang" +#define VarTimeout L"Timeout" +#define VarConsoleIn L"ConIn" +#define VarConsoleOut L"ConOut" +#define VarErrorOut L"ErrOut" +#define VarBootOption L"Boot%04x" +#define VarBootOrder L"BootOrder" +#define VarBootNext L"BootNext" +#define VarBootCurrent L"BootCurrent" +#define VarDriverOption L"Driver%04x" +#define VarDriverOrder L"DriverOrder" +#define VarConsoleInpDev L"ConInDev" +#define VarConsoleOutDev L"ConOutDev" +#define VarErrorOutDev L"ErrOutDev" +#define LanguageCodeEnglish "eng" +#define PlatformLanguageCodeEnglish "en-US" #define ISO_639_2_ENTRY_SIZE 3 #define RFC_3066_ENTRY_SIZE 12 @@ -333,4 +334,10 @@ IN CHAR8 *LangCode ); +CHAR8 * +ExtractSupportedLanguage ( + IN CONST CHAR8 *SupportedLanguages, + IN CONST CHAR8 *Language + ); + #endif Index: Library/Misc.c =================================================================== --- Library/Misc.c (revision 30) +++ Library/Misc.c (working copy) @@ -1905,13 +1905,13 @@ IN VOID *UserData ) { - CHAR8 *Data; + UINT8 *Data; CHAR8 Val[50]; CHAR8 Str[20]; - CHAR8 c; + UINT8 c; UINTN Size; UINTN Index; @@ -2271,3 +2271,76 @@ } return Lang; } + +CHAR8 * +ExtractSupportedLanguage ( + IN CONST CHAR8 *SupportedLanguages, + IN CONST CHAR8 *Language + ) +/*++ + + Routine Description: + + This function matches the major language code (first two characters) in the + SupportedLanguages. The first language code in the SupportedLanguages that + matches first two characters of the input Language is returned. If there is no + such match, then NULL is returned. + + Arguments: + + SupportedLanguages - A Null-terminated ASCII string that contains one + or more supported language codes. + + LangCode - A pointer to a Null-terminated ASCII string + array indicating the RFC 3066 language. + + Returns: + + The RFC3066 language code that matches the major language. + +--*/ +{ + CONST CHAR8 *CurrentLanguage; + CHAR8 *SupportedLanguage; + UINTN LanguageLen; + + CurrentLanguage = SupportedLanguages; + + while (CurrentLanguage != '\0') { + // + // Search till the end of current language. + // + LanguageLen = 0; + while (CurrentLanguage[LanguageLen] != ';' && CurrentLanguage[LanguageLen] != '\0') { + LanguageLen++; + } + + // + // should use AsciiStrnCmp(CurrentLanguage, Language, 2) == 0 + // + if ((CurrentLanguage[0] == Language[0]) && (CurrentLanguage[1] == Language[1])) { + // + // Match the major language code, then return a new copy of + // NULL-terminated SupportedLanguage. + // + SupportedLanguage = AllocatePool (LanguageLen + 1); + CopyMem (SupportedLanguage, (VOID *) CurrentLanguage, LanguageLen); + + SupportedLanguage[LanguageLen] = '\0'; + + return SupportedLanguage; + } + // + // Make CurrentLangue point to the next candiate language code. + // + CurrentLanguage += LanguageLen; + if (*CurrentLanguage == ';') { + CurrentLanguage++; + } + } + + return NULL; +} + + + Index: shellenv/batch.c =================================================================== --- shellenv/batch.c (revision 30) +++ shellenv/batch.c (working copy) @@ -2074,17 +2074,17 @@ --*/ { // - // UNICODE byte-order-mark is two bytes + // UNICODE byte-order-mark is 16 bits // - CHAR8 Buffer8[2]; + UINT16 Uint16; UINTN BufSize; EFI_STATUS Status; // // Read the first two bytes to check for byte order mark // - BufSize = sizeof (Buffer8); - Status = File->Read (File, &BufSize, Buffer8); + BufSize = sizeof (Uint16); + Status = File->Read (File, &BufSize, &Uint16); if (EFI_ERROR (Status)) { return Status; } @@ -2098,9 +2098,8 @@ // otherwise assume it is ASCII. UNICODE byte order mark on // IA little endian is first byte 0xff and second byte 0xfe // - if ((Buffer8[0] | (Buffer8[1] << 8)) == EFI_UNICODE_BYTE_ORDER_MARK) { + if ((BufSize == 2) && (Uint16 == EFI_UNICODE_BYTE_ORDER_MARK)) { *IsAscii = FALSE; - } else { *IsAscii = TRUE; } Index: SmbiosView/PrintInfo.c =================================================================== --- SmbiosView/PrintInfo.c (revision 30) +++ SmbiosView/PrintInfo.c (working copy) @@ -1779,7 +1779,7 @@ // // MaxSize is determined by follow formula // - MaxSize = 1 << Size; + MaxSize = (UINTN) 1 << Size; PrintToken (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_ONE_VAR_MB), HiiHandle, MaxSize); if (Option >= SHOW_DETAIL) { Index: SmbiosView/Smbios.h =================================================================== --- SmbiosView/Smbios.h (revision 30) +++ SmbiosView/Smbios.h (working copy) @@ -34,11 +34,6 @@ extern EFI_HII_HANDLE HiiHandle; -#define EFI_SMBIOS_TABLE_GUID \ - { \ - 0xeb9d2d31, 0x2d88, 0x11d3, 0x9a, 0x16, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d \ - } -extern EFI_GUID gEfiSmbiosTableGuid; #endif