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/libEditor.c =================================================================== --- edit/libEditor.c (revision 30) +++ edit/libEditor.c (working copy) @@ -88,8 +88,6 @@ ) { EFI_STATUS Status; - EFI_HANDLE *HandleBuffer; - UINTN HandleCount; // // basic initialization @@ -117,38 +115,22 @@ ); // - // Find mouse + // Find mouse in System Table ConsoleInHandle // - HandleBuffer = NULL; - Status = LibLocateHandle ( - ByProtocol, - &gEfiPrimaryConsoleInDeviceGuid, - NULL, - &HandleCount, - &HandleBuffer - ); + Status = BS->HandleProtocol ( + In, + &gEfiSimplePointerProtocolGuid, + &MainEditor.MouseInterface + ); - if (!EFI_ERROR (Status)) { - if (HandleCount > 0) { - Status = BS->HandleProtocol ( - HandleBuffer[0], - &gEfiSimplePointerProtocolGuid, - &MainEditor.MouseInterface - ); - - if (EFI_ERROR (Status)) { - MainEditor.MouseInterface = NULL; - } else { - MainEditor.MouseAccumulatorX = 0; - MainEditor.MouseAccumulatorY = 0; - MainEditor.MouseSupported = TRUE; - } - } + if (EFI_ERROR (Status)) { + MainEditor.MouseInterface = NULL; + } else { + MainEditor.MouseAccumulatorX = 0; + MainEditor.MouseAccumulatorY = 0; + MainEditor.MouseSupported = TRUE; } - if (HandleBuffer) { - FreePool (HandleBuffer); - } // // below will call the five components' init function // 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: hexedit/libEditor.c =================================================================== --- hexedit/libEditor.c (revision 30) +++ hexedit/libEditor.c (working copy) @@ -100,8 +100,6 @@ --*/ { EFI_STATUS Status; - EFI_HANDLE *HandleBuffer; - UINTN HandleCount; // // basic initialization @@ -129,36 +127,19 @@ &(HMainEditor.ScreenSize.Row) ); - HandleBuffer = NULL; - Status = LibLocateHandle ( - ByProtocol, - &gEfiPrimaryConsoleInDeviceGuid, - NULL, - &HandleCount, - &HandleBuffer - ); - - if (!EFI_ERROR (Status)) { - - if (HandleCount > 0) { - Status = BS->HandleProtocol ( - HandleBuffer[0], - &gEfiSimplePointerProtocolGuid, - &HMainEditor.MouseInterface - ); - if (EFI_ERROR (Status)) { - HMainEditor.MouseInterface = NULL; - } else { - HMainEditor.MouseAccumulatorX = 0; - HMainEditor.MouseAccumulatorY = 0; - HMainEditor.MouseSupported = TRUE; - } - } + Status = BS->HandleProtocol ( + In, + &gEfiSimplePointerProtocolGuid, + &HMainEditor.MouseInterface + ); + if (EFI_ERROR (Status)) { + HMainEditor.MouseInterface = NULL; + } else { + HMainEditor.MouseAccumulatorX = 0; + HMainEditor.MouseAccumulatorY = 0; + HMainEditor.MouseSupported = TRUE; } - if (HandleBuffer != NULL) { - FreePool (HandleBuffer); - } // // below will call the five components' init function // 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: shellenv/Connect.c =================================================================== --- shellenv/Connect.c (revision 30) +++ shellenv/Connect.c (working copy) @@ -831,6 +831,16 @@ return Status; } + // + // Close proxy console before disconnect all devices. + // + SEnvCloseConsoleProxy ( + ST->ConsoleInHandle, + &ST->ConIn, + ST->ConsoleOutHandle, + &ST->ConOut + ); + for (Index = 0; Index < AllHandleCount; Index++) { // // Check whether the handle is still in handle database @@ -1004,7 +1014,6 @@ VOID SEnvConnectConsole ( CHAR16 *VariableName, - EFI_GUID *PrimaryGuid, EFI_GUID *ConsoleGuid, EFI_HANDLE *ConsoleHandle, VOID **ConsoleInterface @@ -1018,27 +1027,36 @@ EFI_HANDLE *AllHandleBuffer; VOID *Interface; - *ConsoleHandle = NULL; - *ConsoleInterface = NULL; ConsoleIndex = 0; + AllHandleBuffer = NULL; DevicePath = LibGetVariable (VariableName, &gEfiGlobalVariableGuid); - if (DevicePath != NULL) { - SEnvConnectDevicePath (DevicePath); - FreePool (DevicePath); + if (DevicePath == NULL) { + // + // If no any device defined in EFI variable, do nothing + // + return; } - AllHandleBuffer = NULL; - Status = BS->LocateHandleBuffer ( - ByProtocol, - PrimaryGuid, - NULL, - &AllHandleCount, - &AllHandleBuffer - ); - if (!EFI_ERROR (Status) && AllHandleCount > 0) { - *ConsoleHandle = AllHandleBuffer[0]; - } else if (*ConsoleHandle == NULL) { + // + // Connect all console devices + // + SEnvConnectDevicePath (DevicePath); + FreePool (DevicePath); + + Status = EFI_NOT_FOUND; + // + // Check ConsoleHandle validation whatever it was updated or not. + // + if (*ConsoleHandle != NULL) { + Status = BS->HandleProtocol ( + *ConsoleHandle, + ConsoleGuid, + &Interface + ); + } + + if (EFI_ERROR (Status)) { AllHandleBuffer = NULL; Status = BS->LocateHandleBuffer ( ByProtocol, @@ -1063,16 +1081,16 @@ &gEfiDevicePathProtocolGuid, &Interface ); - if (EFI_ERROR (Status)) { + if (!EFI_ERROR (Status)) { ConsoleIndex = Index; break; } } + + *ConsoleHandle = AllHandleBuffer[ConsoleIndex]; } } - *ConsoleHandle = AllHandleBuffer[ConsoleIndex]; - if (*ConsoleHandle != NULL) { BS->HandleProtocol ( *ConsoleHandle, @@ -1081,7 +1099,7 @@ ); } - if (AllHandleBuffer) { + if (AllHandleBuffer != NULL) { FreePool (AllHandleBuffer); } } @@ -1189,8 +1207,7 @@ EFI_STATUS Status; // - // Check current ConIn and ConOut to ensure it is the ConsoleProxy - // Otherwise, the Console should not be close + // Check current ConIn and ConOut to judge it is the ConsoleProxy // Status = SEnvCheckConsoleProxy ( ST->ConsoleInHandle, @@ -1203,23 +1220,21 @@ // Indicate the Console is replaced by redirection operation // It is not safe to connect Console here // - if (EFI_ERROR (Status)) { - return ; + if (!EFI_ERROR (Status)) { + // + // It is proxy console, to prevent the proxy console form being restored to original console, + // close it temporary before connect all console + // + SEnvCloseConsoleProxy ( + ST->ConsoleInHandle, + &ST->ConIn, + ST->ConsoleOutHandle, + &ST->ConOut + ); } - // - // To prevent the proxy console form being restored to original console, - // close it temporary before connect all console - // - SEnvCloseConsoleProxy ( - ST->ConsoleInHandle, - &ST->ConIn, - ST->ConsoleOutHandle, - &ST->ConOut - ); SEnvConnectConsole ( VarErrorOut, - &gEfiPrimaryStandardErrorDeviceGuid, &gEfiSimpleTextOutProtocolGuid, &ST->StandardErrorHandle, (VOID **) &ST->StdErr @@ -1227,7 +1242,6 @@ SEnvConnectConsole ( VarConsoleOut, - &gEfiPrimaryConsoleOutDeviceGuid, &gEfiSimpleTextOutProtocolGuid, &ST->ConsoleOutHandle, (VOID **) &ST->ConOut @@ -1235,7 +1249,6 @@ SEnvConnectConsole ( VarConsoleIn, - &gEfiPrimaryConsoleInDeviceGuid, &gEfiSimpleTextInProtocolGuid, &ST->ConsoleInHandle, (VOID **) &ST->ConIn @@ -1254,6 +1267,8 @@ SetCrc (&ST->Hdr); } + + EFI_STATUS EFIAPI SEnvCmdReconnect ( 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