1 Index: drivers/drivers.c
2 ===================================================================
3 --- drivers/drivers.c (revision 30)
4 +++ drivers/drivers.c (working copy)
9 + CHAR8 *PlatformLanguage;
10 UINTN DriverImageHandleCount;
11 EFI_HANDLE *DriverImageHandleBuffer;
14 SHELL_VAR_CHECK_PACKAGE ChkPck;
17 + PlatformLanguage = NULL;
18 DriverImageHandleCount = 0;
19 DriverImageHandleBuffer = NULL;
25 - Language = LibGetVariableLang ();
26 + Language = LibGetVariable (L"Lang", &gEfiGlobalVariableGuid);
27 if (Language == NULL) {
28 Language = (CHAR8 *)AllocateZeroPool(strlena(LanguageCodeEnglish) + 1);
29 if (Language == NULL) {
31 strcpya(Language, LanguageCodeEnglish);
34 + PlatformLanguage = LibGetVariable (L"PlatformLang", &gEfiGlobalVariableGuid);
35 + if (PlatformLanguage == NULL) {
36 + PlatformLanguage = (CHAR8 *)AllocateZeroPool(strlena(PlatformLanguageCodeEnglish) + 1);
37 + if (PlatformLanguage == NULL) {
38 + return EFI_OUT_OF_RESOURCES;
40 + strcpya(PlatformLanguage, PlatformLanguageCodeEnglish);
43 Item = LibCheckVarGetFlag (&ChkPck, L"-l");
45 if (Language != NULL) {
47 EFI_OPEN_PROTOCOL_GET_PROTOCOL
50 - ComponentName = NULL;
51 - ComponentName2 = NULL;
52 - Status = LibGetComponentNameProtocol (
53 - DriverImageHandleBuffer[Index],
58 DiagnosticsStatus = BS->OpenProtocol (
59 DriverImageHandleBuffer[Index],
60 &gEfiDriverDiagnostics2ProtocolGuid,
63 PrintToken (STRING_TOKEN (STR_SHELLENV_PROTID_ONE_VAR_D), HiiHandle, NumberOfChildren);
66 - Status = EFI_SUCCESS;
68 DriverName = L"<UNKNOWN>";
69 - SupportedLanguage = NULL;
70 - if (ComponentName != NULL) {
71 - if (ComponentName->GetDriverName != NULL) {
72 - SupportedLanguage = LibConvertSupportedLanguage (ComponentName->SupportedLanguages, Language);
73 + Status = BS->OpenProtocol (
74 + DriverImageHandleBuffer[Index],
75 + &gEfiComponentName2ProtocolGuid,
76 + (VOID **) &ComponentName2,
79 + EFI_OPEN_PROTOCOL_GET_PROTOCOL
81 + if (!EFI_ERROR (Status)) {
83 + // Driver has Component Name 2 Protocol is available, we get the
84 + // driver name var RFC 3066 language code
86 + Status = ComponentName2->GetDriverName (
91 + if (EFI_ERROR (Status)) {
93 + // Current RFC3066 language code fails, we then extract the supported
94 + // language from Component Name 2 protocol interface.
96 + SupportedLanguage = ExtractSupportedLanguage(ComponentName2->SupportedLanguages, Language);
97 + if (SupportedLanguage != NULL) {
98 + Status = ComponentName2->GetDriverName (
103 + FreePool(SupportedLanguage);
107 + if (EFI_ERROR (Status)) {
109 + // In case Component Name 2 protocol is not available or some error occurs
110 + // when getting driver name from Component Name 2 protocol, we get driver
111 + // name from Component Name protocol.
113 + Status = BS->OpenProtocol (
114 + DriverImageHandleBuffer[Index],
115 + &gEfiComponentNameProtocolGuid,
116 + (VOID **) &ComponentName,
119 + EFI_OPEN_PROTOCOL_GET_PROTOCOL
121 + if (!EFI_ERROR (Status)) {
122 Status = ComponentName->GetDriverName (
129 - } else if (ComponentName2 != NULL) {
130 - if (ComponentName2->GetDriverName != NULL) {
131 - SupportedLanguage = LibConvertSupportedLanguage (ComponentName2->SupportedLanguages, Language);
132 - Status = ComponentName2->GetDriverName (
139 - if (SupportedLanguage != NULL) {
140 - FreePool (SupportedLanguage);
143 if (EFI_ERROR (Status)) {
145 + // Fails to get driver name from either Component Name 2 & Component Name
146 + // Protocol, we show "<UNKNOWN>" string as driver name.
148 DriverName = L"<UNKNOWN>";
152 for (StringIndex = 0; StringIndex < StrLen (DriverName) && StringIndex < 35; StringIndex++) {
153 FormattedDriverName[StringIndex] = DriverName[StringIndex];
159 + if (PlatformLanguage != NULL) {
160 + FreePool (PlatformLanguage);
163 ShellCloseHandleEnumerator ();
164 LibCheckVarFreeVarList (&ChkPck);
165 LibUnInitializeStrings ();
166 Index: edit/libFileBuffer.c
167 ===================================================================
168 --- edit/libFileBuffer.c (revision 30)
169 +++ edit/libFileBuffer.c (working copy)
173 CHAR16 *UnicodeBuffer;
174 - CHAR8 *AsciiBuffer;
175 + UINT8 *AsciiBuffer;
177 EFI_FILE_HANDLE Handle;
179 @@ -1047,7 +1047,7 @@
183 - if (AsciiBuffer[0] == 0xff && AsciiBuffer[1] == 0xfe) {
184 + if ((FileSize >= 2) && (*((UINT16 *) Buffer) == EFI_UNICODE_BYTE_ORDER_MARK)) {
186 // Unicode file's size should be even
188 Index: Library/EfiShellLib.h
189 ===================================================================
190 --- Library/EfiShellLib.h (revision 30)
191 +++ Library/EfiShellLib.h (working copy)
192 @@ -174,22 +174,23 @@
194 // Environment variable name constants
196 -#define VarLanguageCodes L"LangCodes"
197 -#define VarLanguage L"Lang"
198 -#define VarTimeout L"Timeout"
199 -#define VarConsoleIn L"ConIn"
200 -#define VarConsoleOut L"ConOut"
201 -#define VarErrorOut L"ErrOut"
202 -#define VarBootOption L"Boot%04x"
203 -#define VarBootOrder L"BootOrder"
204 -#define VarBootNext L"BootNext"
205 -#define VarBootCurrent L"BootCurrent"
206 -#define VarDriverOption L"Driver%04x"
207 -#define VarDriverOrder L"DriverOrder"
208 -#define VarConsoleInpDev L"ConInDev"
209 -#define VarConsoleOutDev L"ConOutDev"
210 -#define VarErrorOutDev L"ErrOutDev"
211 -#define LanguageCodeEnglish "eng"
212 +#define VarLanguageCodes L"LangCodes"
213 +#define VarLanguage L"Lang"
214 +#define VarTimeout L"Timeout"
215 +#define VarConsoleIn L"ConIn"
216 +#define VarConsoleOut L"ConOut"
217 +#define VarErrorOut L"ErrOut"
218 +#define VarBootOption L"Boot%04x"
219 +#define VarBootOrder L"BootOrder"
220 +#define VarBootNext L"BootNext"
221 +#define VarBootCurrent L"BootCurrent"
222 +#define VarDriverOption L"Driver%04x"
223 +#define VarDriverOrder L"DriverOrder"
224 +#define VarConsoleInpDev L"ConInDev"
225 +#define VarConsoleOutDev L"ConOutDev"
226 +#define VarErrorOutDev L"ErrOutDev"
227 +#define LanguageCodeEnglish "eng"
228 +#define PlatformLanguageCodeEnglish "en-US"
230 #define ISO_639_2_ENTRY_SIZE 3
231 #define RFC_3066_ENTRY_SIZE 12
237 +ExtractSupportedLanguage (
238 + IN CONST CHAR8 *SupportedLanguages,
239 + IN CONST CHAR8 *Language
243 Index: Library/Misc.c
244 ===================================================================
245 --- Library/Misc.c (revision 30)
246 +++ Library/Misc.c (working copy)
247 @@ -1905,13 +1905,13 @@
263 @@ -2271,3 +2271,76 @@
269 +ExtractSupportedLanguage (
270 + IN CONST CHAR8 *SupportedLanguages,
271 + IN CONST CHAR8 *Language
275 + Routine Description:
277 + This function matches the major language code (first two characters) in the
278 + SupportedLanguages. The first language code in the SupportedLanguages that
279 + matches first two characters of the input Language is returned. If there is no
280 + such match, then NULL is returned.
284 + SupportedLanguages - A Null-terminated ASCII string that contains one
285 + or more supported language codes.
287 + LangCode - A pointer to a Null-terminated ASCII string
288 + array indicating the RFC 3066 language.
292 + The RFC3066 language code that matches the major language.
296 + CONST CHAR8 *CurrentLanguage;
297 + CHAR8 *SupportedLanguage;
300 + CurrentLanguage = SupportedLanguages;
302 + while (CurrentLanguage != '\0') {
304 + // Search till the end of current language.
307 + while (CurrentLanguage[LanguageLen] != ';' && CurrentLanguage[LanguageLen] != '\0') {
312 + // should use AsciiStrnCmp(CurrentLanguage, Language, 2) == 0
314 + if ((CurrentLanguage[0] == Language[0]) && (CurrentLanguage[1] == Language[1])) {
316 + // Match the major language code, then return a new copy of
317 + // NULL-terminated SupportedLanguage.
319 + SupportedLanguage = AllocatePool (LanguageLen + 1);
320 + CopyMem (SupportedLanguage, (VOID *) CurrentLanguage, LanguageLen);
322 + SupportedLanguage[LanguageLen] = '\0';
324 + return SupportedLanguage;
327 + // Make CurrentLangue point to the next candiate language code.
329 + CurrentLanguage += LanguageLen;
330 + if (*CurrentLanguage == ';') {
340 Index: shellenv/batch.c
341 ===================================================================
342 --- shellenv/batch.c (revision 30)
343 +++ shellenv/batch.c (working copy)
344 @@ -2074,17 +2074,17 @@
348 - // UNICODE byte-order-mark is two bytes
349 + // UNICODE byte-order-mark is 16 bits
357 // Read the first two bytes to check for byte order mark
359 - BufSize = sizeof (Buffer8);
360 - Status = File->Read (File, &BufSize, Buffer8);
361 + BufSize = sizeof (Uint16);
362 + Status = File->Read (File, &BufSize, &Uint16);
363 if (EFI_ERROR (Status)) {
366 @@ -2098,9 +2098,8 @@
367 // otherwise assume it is ASCII. UNICODE byte order mark on
368 // IA little endian is first byte 0xff and second byte 0xfe
370 - if ((Buffer8[0] | (Buffer8[1] << 8)) == EFI_UNICODE_BYTE_ORDER_MARK) {
371 + if ((BufSize == 2) && (Uint16 == EFI_UNICODE_BYTE_ORDER_MARK)) {
377 Index: SmbiosView/PrintInfo.c
378 ===================================================================
379 --- SmbiosView/PrintInfo.c (revision 30)
380 +++ SmbiosView/PrintInfo.c (working copy)
381 @@ -1779,7 +1779,7 @@
383 // MaxSize is determined by follow formula
385 - MaxSize = 1 << Size;
386 + MaxSize = (UINTN) 1 << Size;
387 PrintToken (STRING_TOKEN (STR_SMBIOSVIEW_PRINTINFO_ONE_VAR_MB), HiiHandle, MaxSize);
389 if (Option >= SHOW_DETAIL) {
390 Index: SmbiosView/Smbios.h
391 ===================================================================
392 --- SmbiosView/Smbios.h (revision 30)
393 +++ SmbiosView/Smbios.h (working copy)
396 extern EFI_HII_HANDLE HiiHandle;
398 -#define EFI_SMBIOS_TABLE_GUID \
400 - 0xeb9d2d31, 0x2d88, 0x11d3, 0x9a, 0x16, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d \
403 -extern EFI_GUID gEfiSmbiosTableGuid;