mirror of https://github.com/acidanthera/audk.git
Replace BufToHexString by UnicodeValueToString
Replace HexStringToBuf by StrHexToUint64 git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@8034 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
parent
dfbe9de95f
commit
63d55bb98a
|
@ -80,6 +80,10 @@ GetDevicePath (
|
||||||
UINTN Length;
|
UINTN Length;
|
||||||
EFI_STRING PathHdr;
|
EFI_STRING PathHdr;
|
||||||
EFI_STRING DevicePathString;
|
EFI_STRING DevicePathString;
|
||||||
|
UINT8 *DevicePathBuffer;
|
||||||
|
CHAR16 TemStr[2];
|
||||||
|
UINTN Index;
|
||||||
|
UINT8 DigitUint8;
|
||||||
|
|
||||||
if (String == NULL || DevicePath == NULL) {
|
if (String == NULL || DevicePath == NULL) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
|
@ -114,21 +118,52 @@ GetDevicePath (
|
||||||
// as the device path resides in RAM memory.
|
// as the device path resides in RAM memory.
|
||||||
// Translate the data into binary.
|
// Translate the data into binary.
|
||||||
//
|
//
|
||||||
Length /= 2;
|
DevicePathBuffer = (UINT8 *) AllocateZeroPool ((Length + 1) / 2);
|
||||||
*DevicePath = (UINT8 *) AllocateZeroPool (Length);
|
if (DevicePathBuffer == NULL) {
|
||||||
if (*DevicePath == NULL) {
|
|
||||||
FreePool (DevicePathString);
|
FreePool (DevicePathString);
|
||||||
return EFI_OUT_OF_RESOURCES;
|
return EFI_OUT_OF_RESOURCES;
|
||||||
}
|
}
|
||||||
|
|
||||||
HexStringToBufInReverseOrder (*DevicePath, &Length, DevicePathString);
|
ZeroMem (TemStr, sizeof (TemStr));
|
||||||
|
for (Index = 0; DevicePathString[Index] != L'\0'; Index ++) {
|
||||||
|
TemStr[0] = DevicePathString[Index];
|
||||||
|
DigitUint8 = (UINT8) StrHexToUint64 (TemStr);
|
||||||
|
if ((Index & 1) == 0) {
|
||||||
|
DevicePathBuffer [Index/2] = DigitUint8;
|
||||||
|
} else {
|
||||||
|
DevicePathBuffer [Index/2] = (UINT8) ((DevicePathBuffer [Index/2] << 4) + DigitUint8);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
FreePool (DevicePathString);
|
FreePool (DevicePathString);
|
||||||
|
|
||||||
|
*DevicePath = DevicePathBuffer;
|
||||||
|
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Converts the unicode character of the string from uppercase to lowercase.
|
||||||
|
This is a internal function.
|
||||||
|
|
||||||
|
@param Str String to be converted
|
||||||
|
|
||||||
|
**/
|
||||||
|
VOID
|
||||||
|
EFIAPI
|
||||||
|
HiiToLower (
|
||||||
|
IN OUT CHAR16 *Str
|
||||||
|
)
|
||||||
|
{
|
||||||
|
CHAR16 *Ptr;
|
||||||
|
|
||||||
|
for (Ptr = Str; *Ptr != L'\0'; Ptr++) {
|
||||||
|
if (*Ptr >= L'A' && *Ptr <= L'Z') {
|
||||||
|
*Ptr = (CHAR16) (*Ptr - L'A' + L'a');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Generate a sub string then output it.
|
Generate a sub string then output it.
|
||||||
|
@ -159,8 +194,11 @@ GenerateSubStr (
|
||||||
{
|
{
|
||||||
UINTN Length;
|
UINTN Length;
|
||||||
EFI_STRING Str;
|
EFI_STRING Str;
|
||||||
EFI_STATUS Status;
|
|
||||||
EFI_STRING StringHeader;
|
EFI_STRING StringHeader;
|
||||||
|
CHAR16 *TemString;
|
||||||
|
CHAR16 *TemName;
|
||||||
|
UINT8 *TemBuffer;
|
||||||
|
UINTN Index;
|
||||||
|
|
||||||
ASSERT (String != NULL && SubStr != NULL);
|
ASSERT (String != NULL && SubStr != NULL);
|
||||||
|
|
||||||
|
@ -171,34 +209,55 @@ GenerateSubStr (
|
||||||
}
|
}
|
||||||
|
|
||||||
Length = StrLen (String) + BufferLen * 2 + 1 + 1;
|
Length = StrLen (String) + BufferLen * 2 + 1 + 1;
|
||||||
Str = AllocateZeroPool (Length * sizeof (CHAR16));
|
Str = AllocateZeroPool (Length * sizeof (CHAR16));
|
||||||
ASSERT (Str != NULL);
|
ASSERT (Str != NULL);
|
||||||
|
|
||||||
StrCpy (Str, String);
|
StrCpy (Str, String);
|
||||||
Length = (BufferLen * 2 + 1) * sizeof (CHAR16);
|
Length = (BufferLen * 2 + 1) * sizeof (CHAR16);
|
||||||
|
|
||||||
Status = EFI_SUCCESS;
|
|
||||||
StringHeader = Str + StrLen (String);
|
StringHeader = Str + StrLen (String);
|
||||||
|
TemString = (CHAR16 *) StringHeader;
|
||||||
|
|
||||||
switch (Flag) {
|
switch (Flag) {
|
||||||
case 1:
|
case 1:
|
||||||
Status = BufInReverseOrderToHexString (StringHeader, (UINT8 *) Buffer, BufferLen);
|
//
|
||||||
|
// Convert Buffer to Hex String in reverse order
|
||||||
|
//
|
||||||
|
TemBuffer = ((UINT8 *) Buffer);
|
||||||
|
for (Index = 0; Index < BufferLen; Index ++, TemBuffer ++) {
|
||||||
|
TemString += UnicodeValueToString (TemString, PREFIX_ZERO | RADIX_HEX, *TemBuffer, 2);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
Status = UnicodeToConfigString (StringHeader, &Length, (CHAR16 *) Buffer);
|
//
|
||||||
|
// Check buffer is enough
|
||||||
|
//
|
||||||
|
TemName = (CHAR16 *) Buffer;
|
||||||
|
ASSERT (Length < ((StrLen (TemName) * 4 + 1) * sizeof (CHAR16)));
|
||||||
|
//
|
||||||
|
// Convert Unicode String to Config String, e.g. "ABCD" => "0041004200430044"
|
||||||
|
//
|
||||||
|
for (; *TemName != L'\0'; TemName++) {
|
||||||
|
TemString += UnicodeValueToString (TemString, PREFIX_ZERO | RADIX_HEX, *TemName, 4);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
Status = BufToHexString (StringHeader, &Length, (UINT8 *) Buffer, BufferLen);
|
|
||||||
//
|
//
|
||||||
// Convert the uppercase to lowercase since <HexAf> is defined in lowercase format.
|
// Convert Buffer to Hex String
|
||||||
//
|
//
|
||||||
ToLower (StringHeader);
|
TemBuffer = ((UINT8 *) Buffer) + BufferLen - 1;
|
||||||
|
for (Index = 0; Index < BufferLen; Index ++, TemBuffer --) {
|
||||||
|
TemString += UnicodeValueToString (TemString, PREFIX_ZERO | RADIX_HEX, *TemBuffer, 2);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
ASSERT_EFI_ERROR (Status);
|
//
|
||||||
|
// Convert the uppercase to lowercase since <HexAf> is defined in lowercase format.
|
||||||
|
//
|
||||||
|
HiiToLower (StringHeader);
|
||||||
StrCat (Str, L"&");
|
StrCat (Str, L"&");
|
||||||
|
|
||||||
*SubStr = Str;
|
*SubStr = Str;
|
||||||
|
@ -344,14 +403,17 @@ GetValueOfNumber (
|
||||||
EFI_STRING Str;
|
EFI_STRING Str;
|
||||||
UINT8 *Buf;
|
UINT8 *Buf;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
UINT8 DigitUint8;
|
||||||
|
UINTN Index;
|
||||||
|
CHAR16 TemStr[2];
|
||||||
|
|
||||||
ASSERT (StringPtr != NULL && Number != NULL && Len != NULL);
|
ASSERT (StringPtr != NULL && Number != NULL && Len != NULL);
|
||||||
ASSERT (*StringPtr != 0);
|
ASSERT (*StringPtr != L'\0');
|
||||||
|
|
||||||
Buf = NULL;
|
Buf = NULL;
|
||||||
|
|
||||||
TmpPtr = StringPtr;
|
TmpPtr = StringPtr;
|
||||||
while (*StringPtr != 0 && *StringPtr != L'&') {
|
while (*StringPtr != L'\0' && *StringPtr != L'&') {
|
||||||
StringPtr++;
|
StringPtr++;
|
||||||
}
|
}
|
||||||
*Len = StringPtr - TmpPtr;
|
*Len = StringPtr - TmpPtr;
|
||||||
|
@ -363,7 +425,7 @@ GetValueOfNumber (
|
||||||
goto Exit;
|
goto Exit;
|
||||||
}
|
}
|
||||||
CopyMem (Str, TmpPtr, *Len * sizeof (CHAR16));
|
CopyMem (Str, TmpPtr, *Len * sizeof (CHAR16));
|
||||||
*(Str + *Len) = 0;
|
*(Str + *Len) = L'\0';
|
||||||
|
|
||||||
Length = (Length + 1) / 2;
|
Length = (Length + 1) / 2;
|
||||||
Buf = (UINT8 *) AllocateZeroPool (Length);
|
Buf = (UINT8 *) AllocateZeroPool (Length);
|
||||||
|
@ -371,10 +433,17 @@ GetValueOfNumber (
|
||||||
Status = EFI_OUT_OF_RESOURCES;
|
Status = EFI_OUT_OF_RESOURCES;
|
||||||
goto Exit;
|
goto Exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = HexStringToBuf (Buf, &Length, Str, NULL);
|
Length = *Len;
|
||||||
if (EFI_ERROR (Status)) {
|
ZeroMem (TemStr, sizeof (TemStr));
|
||||||
goto Exit;
|
for (Index = 0; Index < Length; Index ++) {
|
||||||
|
TemStr[0] = Str[Length - Index - 1];
|
||||||
|
DigitUint8 = (UINT8) StrHexToUint64 (TemStr);
|
||||||
|
if ((Index & 1) == 0) {
|
||||||
|
Buf [Index/2] = DigitUint8;
|
||||||
|
} else {
|
||||||
|
Buf [Index/2] = (UINT8) ((Buf [Index/2] << 4) + DigitUint8);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
*Number = Buf;
|
*Number = Buf;
|
||||||
|
@ -384,6 +453,7 @@ Exit:
|
||||||
if (Str != NULL) {
|
if (Str != NULL) {
|
||||||
FreePool (Str);
|
FreePool (Str);
|
||||||
}
|
}
|
||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -959,6 +1029,9 @@ HiiBlockToConfig (
|
||||||
UINT8 *Value;
|
UINT8 *Value;
|
||||||
EFI_STRING ValueStr;
|
EFI_STRING ValueStr;
|
||||||
EFI_STRING ConfigElement;
|
EFI_STRING ConfigElement;
|
||||||
|
UINTN Index;
|
||||||
|
UINT8 *TemBuffer;
|
||||||
|
CHAR16 *TemString;
|
||||||
|
|
||||||
if (This == NULL || Progress == NULL || Config == NULL) {
|
if (This == NULL || Progress == NULL || Config == NULL) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
|
@ -1107,10 +1180,13 @@ HiiBlockToConfig (
|
||||||
Status = EFI_OUT_OF_RESOURCES;
|
Status = EFI_OUT_OF_RESOURCES;
|
||||||
goto Exit;
|
goto Exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = BufToHexString (ValueStr, &Length, Value, Width);
|
TemString = ValueStr;
|
||||||
ASSERT_EFI_ERROR (Status);
|
TemBuffer = Value + Width - 1;
|
||||||
ToLower (ValueStr);
|
for (Index = 0; Index < Width; Index ++, TemBuffer --) {
|
||||||
|
TemString += UnicodeValueToString (TemString, PREFIX_ZERO | RADIX_HEX, *TemBuffer, 2);
|
||||||
|
}
|
||||||
|
HiiToLower (ValueStr);
|
||||||
|
|
||||||
FreePool (Value);
|
FreePool (Value);
|
||||||
Value = NULL;
|
Value = NULL;
|
||||||
|
|
|
@ -809,7 +809,7 @@ InsertStringPackage (
|
||||||
AsciiStrCpy (Language, (CHAR8 *) PackageHdr + HeaderSize - LanguageSize);
|
AsciiStrCpy (Language, (CHAR8 *) PackageHdr + HeaderSize - LanguageSize);
|
||||||
for (Link = PackageList->StringPkgHdr.ForwardLink; Link != &PackageList->StringPkgHdr; Link = Link->ForwardLink) {
|
for (Link = PackageList->StringPkgHdr.ForwardLink; Link != &PackageList->StringPkgHdr; Link = Link->ForwardLink) {
|
||||||
StringPackage = CR (Link, HII_STRING_PACKAGE_INSTANCE, StringEntry, HII_STRING_PACKAGE_SIGNATURE);
|
StringPackage = CR (Link, HII_STRING_PACKAGE_INSTANCE, StringEntry, HII_STRING_PACKAGE_SIGNATURE);
|
||||||
if (R8_EfiLibCompareLanguage (Language, StringPackage->StringPkgHdr->Language)) {
|
if (HiiCompareLanguage (Language, StringPackage->StringPkgHdr->Language)) {
|
||||||
FreePool (Language);
|
FreePool (Language);
|
||||||
return EFI_UNSUPPORTED;
|
return EFI_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
|
|
|
@ -41,6 +41,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||||
#include <Library/UefiLib.h>
|
#include <Library/UefiLib.h>
|
||||||
#include <Library/PcdLib.h>
|
#include <Library/PcdLib.h>
|
||||||
#include <Library/UefiRuntimeServicesTableLib.h>
|
#include <Library/UefiRuntimeServicesTableLib.h>
|
||||||
|
#include <Library/PrintLib.h>
|
||||||
|
|
||||||
|
|
||||||
#define HII_DATABASE_NOTIFY_GUID \
|
#define HII_DATABASE_NOTIFY_GUID \
|
||||||
|
@ -1688,11 +1689,25 @@ HiiGetAltCfg (
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
Compare whether two names of languages are identical.
|
||||||
|
|
||||||
|
@param Language1 Name of language 1
|
||||||
|
@param Language2 Name of language 2
|
||||||
|
|
||||||
|
@retval TRUE same
|
||||||
|
@retval FALSE not same
|
||||||
|
|
||||||
|
**/
|
||||||
|
BOOLEAN
|
||||||
|
HiiCompareLanguage (
|
||||||
|
IN CHAR8 *Language1,
|
||||||
|
IN CHAR8 *Language2
|
||||||
|
)
|
||||||
|
;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Global variables
|
// Global variables
|
||||||
//
|
//
|
||||||
extern EFI_EVENT gHiiKeyboardLayoutChanged;
|
extern EFI_EVENT gHiiKeyboardLayoutChanged;
|
||||||
|
|
||||||
#include "R8Lib.h"
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -36,9 +36,6 @@
|
||||||
String.c
|
String.c
|
||||||
Database.c
|
Database.c
|
||||||
Font.c
|
Font.c
|
||||||
R8Lib.h
|
|
||||||
R8Lib.c
|
|
||||||
|
|
||||||
|
|
||||||
[Packages]
|
[Packages]
|
||||||
MdePkg/MdePkg.dec
|
MdePkg/MdePkg.dec
|
||||||
|
@ -57,6 +54,7 @@
|
||||||
UefiLib
|
UefiLib
|
||||||
PcdLib
|
PcdLib
|
||||||
UefiRuntimeServicesTableLib
|
UefiRuntimeServicesTableLib
|
||||||
|
PrintLib
|
||||||
|
|
||||||
[Protocols]
|
[Protocols]
|
||||||
gEfiDevicePathProtocolGuid ## SOMETIMES_CONSUMES
|
gEfiDevicePathProtocolGuid ## SOMETIMES_CONSUMES
|
||||||
|
|
|
@ -1,60 +0,0 @@
|
||||||
/** @file
|
|
||||||
Implement a utility function named R8_EfiLibCompareLanguage.
|
|
||||||
|
|
||||||
Copyright (c) 2007 - 2008, Intel Corporation
|
|
||||||
|
|
||||||
All rights reserved. This program and the accompanying materials
|
|
||||||
are licensed and made available under the terms and conditions of the BSD License
|
|
||||||
which accompanies this distribution. The full text of the license may be found at
|
|
||||||
http://opensource.org/licenses/bsd-license.php
|
|
||||||
|
|
||||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|
||||||
|
|
||||||
|
|
||||||
**/
|
|
||||||
|
|
||||||
#include "HiiDatabase.h"
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
Compare whether two names of languages are identical.
|
|
||||||
|
|
||||||
@param Language1 Name of language 1
|
|
||||||
@param Language2 Name of language 2
|
|
||||||
|
|
||||||
@retval TRUE same
|
|
||||||
@retval FALSE not same
|
|
||||||
|
|
||||||
**/
|
|
||||||
BOOLEAN
|
|
||||||
R8_EfiLibCompareLanguage (
|
|
||||||
IN CHAR8 *Language1,
|
|
||||||
IN CHAR8 *Language2
|
|
||||||
)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
// Porting Guide:
|
|
||||||
// This library interface is simply obsolete.
|
|
||||||
// Include the source code to user code.
|
|
||||||
//
|
|
||||||
UINTN Index;
|
|
||||||
|
|
||||||
for (Index = 0; (Language1[Index] != 0) && (Language2[Index] != 0); Index++) {
|
|
||||||
if (Language1[Index] != Language2[Index]) {
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (((Language1[Index] == 0) && (Language2[Index] == 0)) ||
|
|
||||||
((Language1[Index] == 0) && (Language2[Index] != ';')) ||
|
|
||||||
((Language1[Index] == ';') && (Language2[Index] != 0)) ||
|
|
||||||
((Language1[Index] == ';') && (Language2[Index] != ';'))) {
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,39 +0,0 @@
|
||||||
/** @file
|
|
||||||
Implement a utility function named R8_EfiLibCompareLanguage.
|
|
||||||
|
|
||||||
Copyright (c) 2007 - 2008, Intel Corporation
|
|
||||||
|
|
||||||
All rights reserved. This program and the accompanying materials
|
|
||||||
are licensed and made available under the terms and conditions of the BSD License
|
|
||||||
which accompanies this distribution. The full text of the license may be found at
|
|
||||||
http://opensource.org/licenses/bsd-license.php
|
|
||||||
|
|
||||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|
||||||
|
|
||||||
|
|
||||||
**/
|
|
||||||
|
|
||||||
#ifndef __R8_LIB_H__
|
|
||||||
#define __R8_LIB_H__
|
|
||||||
|
|
||||||
/**
|
|
||||||
Compare whether two names of languages are identical.
|
|
||||||
|
|
||||||
@param Language1 Name of language 1
|
|
||||||
@param Language2 Name of language 2
|
|
||||||
|
|
||||||
@retval TRUE same
|
|
||||||
@retval FALSE not same
|
|
||||||
|
|
||||||
**/
|
|
||||||
BOOLEAN
|
|
||||||
R8_EfiLibCompareLanguage (
|
|
||||||
IN CHAR8 *Language1,
|
|
||||||
IN CHAR8 *Language2
|
|
||||||
)
|
|
||||||
;
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
|
@ -1014,7 +1014,7 @@ HiiNewString (
|
||||||
Link = Link->ForwardLink
|
Link = Link->ForwardLink
|
||||||
) {
|
) {
|
||||||
StringPackage = CR (Link, HII_STRING_PACKAGE_INSTANCE, StringEntry, HII_STRING_PACKAGE_SIGNATURE);
|
StringPackage = CR (Link, HII_STRING_PACKAGE_INSTANCE, StringEntry, HII_STRING_PACKAGE_SIGNATURE);
|
||||||
if (R8_EfiLibCompareLanguage (StringPackage->StringPkgHdr->Language, (CHAR8 *) Language)) {
|
if (HiiCompareLanguage (StringPackage->StringPkgHdr->Language, (CHAR8 *) Language)) {
|
||||||
Matched = TRUE;
|
Matched = TRUE;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1353,7 +1353,7 @@ HiiGetString (
|
||||||
Link = Link->ForwardLink
|
Link = Link->ForwardLink
|
||||||
) {
|
) {
|
||||||
StringPackage = CR (Link, HII_STRING_PACKAGE_INSTANCE, StringEntry, HII_STRING_PACKAGE_SIGNATURE);
|
StringPackage = CR (Link, HII_STRING_PACKAGE_INSTANCE, StringEntry, HII_STRING_PACKAGE_SIGNATURE);
|
||||||
if (R8_EfiLibCompareLanguage (StringPackage->StringPkgHdr->Language, (CHAR8 *) Language)) {
|
if (HiiCompareLanguage (StringPackage->StringPkgHdr->Language, (CHAR8 *) Language)) {
|
||||||
Status = GetStringWorker (Private, StringPackage, StringId, String, StringSize, StringFontInfo);
|
Status = GetStringWorker (Private, StringPackage, StringId, String, StringSize, StringFontInfo);
|
||||||
if (Status != EFI_NOT_FOUND) {
|
if (Status != EFI_NOT_FOUND) {
|
||||||
return Status;
|
return Status;
|
||||||
|
@ -1446,7 +1446,7 @@ HiiSetString (
|
||||||
Link = Link->ForwardLink
|
Link = Link->ForwardLink
|
||||||
) {
|
) {
|
||||||
StringPackage = CR (Link, HII_STRING_PACKAGE_INSTANCE, StringEntry, HII_STRING_PACKAGE_SIGNATURE);
|
StringPackage = CR (Link, HII_STRING_PACKAGE_INSTANCE, StringEntry, HII_STRING_PACKAGE_SIGNATURE);
|
||||||
if (R8_EfiLibCompareLanguage (StringPackage->StringPkgHdr->Language, (CHAR8 *) Language)) {
|
if (HiiCompareLanguage (StringPackage->StringPkgHdr->Language, (CHAR8 *) Language)) {
|
||||||
OldPackageLen = StringPackage->StringPkgHdr->Header.Length;
|
OldPackageLen = StringPackage->StringPkgHdr->Header.Length;
|
||||||
Status = SetStringWorker (
|
Status = SetStringWorker (
|
||||||
Private,
|
Private,
|
||||||
|
@ -1635,7 +1635,7 @@ HiiGetSecondaryLanguages (
|
||||||
Link1 = Link1->ForwardLink
|
Link1 = Link1->ForwardLink
|
||||||
) {
|
) {
|
||||||
StringPackage = CR (Link1, HII_STRING_PACKAGE_INSTANCE, StringEntry, HII_STRING_PACKAGE_SIGNATURE);
|
StringPackage = CR (Link1, HII_STRING_PACKAGE_INSTANCE, StringEntry, HII_STRING_PACKAGE_SIGNATURE);
|
||||||
if (R8_EfiLibCompareLanguage (StringPackage->StringPkgHdr->Language, (CHAR8 *) FirstLanguage)) {
|
if (HiiCompareLanguage (StringPackage->StringPkgHdr->Language, (CHAR8 *) FirstLanguage)) {
|
||||||
Languages = StringPackage->StringPkgHdr->Language;
|
Languages = StringPackage->StringPkgHdr->Language;
|
||||||
//
|
//
|
||||||
// Language is a series of ';' terminated strings, first one is primary
|
// Language is a series of ';' terminated strings, first one is primary
|
||||||
|
@ -1663,3 +1663,41 @@ HiiGetSecondaryLanguages (
|
||||||
return EFI_INVALID_LANGUAGE;
|
return EFI_INVALID_LANGUAGE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Compare whether two names of languages are identical.
|
||||||
|
|
||||||
|
@param Language1 Name of language 1
|
||||||
|
@param Language2 Name of language 2
|
||||||
|
|
||||||
|
@retval TRUE same
|
||||||
|
@retval FALSE not same
|
||||||
|
|
||||||
|
**/
|
||||||
|
BOOLEAN
|
||||||
|
HiiCompareLanguage (
|
||||||
|
IN CHAR8 *Language1,
|
||||||
|
IN CHAR8 *Language2
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Porting Guide:
|
||||||
|
// This library interface is simply obsolete.
|
||||||
|
// Include the source code to user code.
|
||||||
|
//
|
||||||
|
UINTN Index;
|
||||||
|
|
||||||
|
for (Index = 0; (Language1[Index] != 0) && (Language2[Index] != 0); Index++) {
|
||||||
|
if (Language1[Index] != Language2[Index]) {
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (((Language1[Index] == 0) && (Language2[Index] == 0)) ||
|
||||||
|
((Language1[Index] == 0) && (Language2[Index] != ';')) ||
|
||||||
|
((Language1[Index] == ';') && (Language2[Index] != 0)) ||
|
||||||
|
((Language1[Index] == ';') && (Language2[Index] != ';'))) {
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
|
@ -64,21 +64,6 @@ IScsiIpToStr (
|
||||||
UnicodeSPrint ( Str, 2 * IP4_STR_MAX_SIZE, L"%d.%d.%d.%d", Ip->Addr[0], Ip->Addr[1], Ip->Addr[2], Ip->Addr[3]);
|
UnicodeSPrint ( Str, 2 * IP4_STR_MAX_SIZE, L"%d.%d.%d.%d", Ip->Addr[0], Ip->Addr[1], Ip->Addr[2], Ip->Addr[3]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
Pop up an invalid notify which displays the message in Warning.
|
|
||||||
|
|
||||||
@param[in] Warning The warning message.
|
|
||||||
**/
|
|
||||||
VOID
|
|
||||||
PopUpInvalidNotify (
|
|
||||||
IN CHAR16 *Warning
|
|
||||||
)
|
|
||||||
{
|
|
||||||
EFI_INPUT_KEY Key;
|
|
||||||
|
|
||||||
IfrLibCreatePopUp (1, &Key, Warning);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Update the list of iSCSI devices the iSCSI driver is controlling.
|
Update the list of iSCSI devices the iSCSI driver is controlling.
|
||||||
|
|
||||||
|
@ -512,6 +497,7 @@ IScsiFormCallback (
|
||||||
EFI_IP_ADDRESS SubnetMask;
|
EFI_IP_ADDRESS SubnetMask;
|
||||||
EFI_IP_ADDRESS Gateway;
|
EFI_IP_ADDRESS Gateway;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
EFI_INPUT_KEY Key;
|
||||||
|
|
||||||
Private = ISCSI_FORM_CALLBACK_INFO_FROM_FORM_CALLBACK (This);
|
Private = ISCSI_FORM_CALLBACK_INFO_FROM_FORM_CALLBACK (This);
|
||||||
|
|
||||||
|
@ -534,7 +520,7 @@ IScsiFormCallback (
|
||||||
|
|
||||||
Status = gIScsiInitiatorName.Set (&gIScsiInitiatorName, &BufferSize, IScsiName);
|
Status = gIScsiInitiatorName.Set (&gIScsiInitiatorName, &BufferSize, IScsiName);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
PopUpInvalidNotify (L"Invalid iSCSI Name!");
|
CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid iSCSI Name!", NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
@ -543,7 +529,7 @@ IScsiFormCallback (
|
||||||
IScsiUnicodeStrToAsciiStr (IfrNvData->LocalIp, Ip4String);
|
IScsiUnicodeStrToAsciiStr (IfrNvData->LocalIp, Ip4String);
|
||||||
Status = IScsiAsciiStrToIp (Ip4String, &HostIp.v4);
|
Status = IScsiAsciiStrToIp (Ip4String, &HostIp.v4);
|
||||||
if (EFI_ERROR (Status) || !Ip4IsUnicast (NTOHL (HostIp.Addr[0]), 0)) {
|
if (EFI_ERROR (Status) || !Ip4IsUnicast (NTOHL (HostIp.Addr[0]), 0)) {
|
||||||
PopUpInvalidNotify (L"Invalid IP address!");
|
CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid IP address!", NULL);
|
||||||
Status = EFI_INVALID_PARAMETER;
|
Status = EFI_INVALID_PARAMETER;
|
||||||
} else {
|
} else {
|
||||||
CopyMem (&Private->Current->SessionConfigData.LocalIp, &HostIp.v4, sizeof (HostIp.v4));
|
CopyMem (&Private->Current->SessionConfigData.LocalIp, &HostIp.v4, sizeof (HostIp.v4));
|
||||||
|
@ -555,7 +541,7 @@ IScsiFormCallback (
|
||||||
IScsiUnicodeStrToAsciiStr (IfrNvData->SubnetMask, Ip4String);
|
IScsiUnicodeStrToAsciiStr (IfrNvData->SubnetMask, Ip4String);
|
||||||
Status = IScsiAsciiStrToIp (Ip4String, &SubnetMask.v4);
|
Status = IScsiAsciiStrToIp (Ip4String, &SubnetMask.v4);
|
||||||
if (EFI_ERROR (Status) || ((SubnetMask.Addr[0] != 0) && (IScsiGetSubnetMaskPrefixLength (&SubnetMask.v4) == 0))) {
|
if (EFI_ERROR (Status) || ((SubnetMask.Addr[0] != 0) && (IScsiGetSubnetMaskPrefixLength (&SubnetMask.v4) == 0))) {
|
||||||
PopUpInvalidNotify (L"Invalid Subnet Mask!");
|
CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid Subnet Mask!", NULL);
|
||||||
Status = EFI_INVALID_PARAMETER;
|
Status = EFI_INVALID_PARAMETER;
|
||||||
} else {
|
} else {
|
||||||
CopyMem (&Private->Current->SessionConfigData.SubnetMask, &SubnetMask.v4, sizeof (SubnetMask.v4));
|
CopyMem (&Private->Current->SessionConfigData.SubnetMask, &SubnetMask.v4, sizeof (SubnetMask.v4));
|
||||||
|
@ -567,7 +553,7 @@ IScsiFormCallback (
|
||||||
IScsiUnicodeStrToAsciiStr (IfrNvData->Gateway, Ip4String);
|
IScsiUnicodeStrToAsciiStr (IfrNvData->Gateway, Ip4String);
|
||||||
Status = IScsiAsciiStrToIp (Ip4String, &Gateway.v4);
|
Status = IScsiAsciiStrToIp (Ip4String, &Gateway.v4);
|
||||||
if (EFI_ERROR (Status) || ((Gateway.Addr[0] != 0) && !Ip4IsUnicast (NTOHL (Gateway.Addr[0]), 0))) {
|
if (EFI_ERROR (Status) || ((Gateway.Addr[0] != 0) && !Ip4IsUnicast (NTOHL (Gateway.Addr[0]), 0))) {
|
||||||
PopUpInvalidNotify (L"Invalid Gateway!");
|
CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid Gateway!", NULL);
|
||||||
Status = EFI_INVALID_PARAMETER;
|
Status = EFI_INVALID_PARAMETER;
|
||||||
} else {
|
} else {
|
||||||
CopyMem (&Private->Current->SessionConfigData.Gateway, &Gateway.v4, sizeof (Gateway.v4));
|
CopyMem (&Private->Current->SessionConfigData.Gateway, &Gateway.v4, sizeof (Gateway.v4));
|
||||||
|
@ -579,7 +565,7 @@ IScsiFormCallback (
|
||||||
IScsiUnicodeStrToAsciiStr (IfrNvData->TargetIp, Ip4String);
|
IScsiUnicodeStrToAsciiStr (IfrNvData->TargetIp, Ip4String);
|
||||||
Status = IScsiAsciiStrToIp (Ip4String, &HostIp.v4);
|
Status = IScsiAsciiStrToIp (Ip4String, &HostIp.v4);
|
||||||
if (EFI_ERROR (Status) || !Ip4IsUnicast (NTOHL (HostIp.Addr[0]), 0)) {
|
if (EFI_ERROR (Status) || !Ip4IsUnicast (NTOHL (HostIp.Addr[0]), 0)) {
|
||||||
PopUpInvalidNotify (L"Invalid IP address!");
|
CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid IP address!", NULL);
|
||||||
Status = EFI_INVALID_PARAMETER;
|
Status = EFI_INVALID_PARAMETER;
|
||||||
} else {
|
} else {
|
||||||
CopyMem (&Private->Current->SessionConfigData.TargetIp, &HostIp.v4, sizeof (HostIp.v4));
|
CopyMem (&Private->Current->SessionConfigData.TargetIp, &HostIp.v4, sizeof (HostIp.v4));
|
||||||
|
@ -591,7 +577,7 @@ IScsiFormCallback (
|
||||||
IScsiUnicodeStrToAsciiStr (IfrNvData->TargetName, IScsiName);
|
IScsiUnicodeStrToAsciiStr (IfrNvData->TargetName, IScsiName);
|
||||||
Status = IScsiNormalizeName (IScsiName, AsciiStrLen (IScsiName));
|
Status = IScsiNormalizeName (IScsiName, AsciiStrLen (IScsiName));
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
PopUpInvalidNotify (L"Invalid iSCSI Name!");
|
CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid iSCSI Name!", NULL);
|
||||||
} else {
|
} else {
|
||||||
AsciiStrCpy (Private->Current->SessionConfigData.TargetName, IScsiName);
|
AsciiStrCpy (Private->Current->SessionConfigData.TargetName, IScsiName);
|
||||||
}
|
}
|
||||||
|
@ -609,7 +595,7 @@ IScsiFormCallback (
|
||||||
IScsiUnicodeStrToAsciiStr (IfrNvData->BootLun, LunString);
|
IScsiUnicodeStrToAsciiStr (IfrNvData->BootLun, LunString);
|
||||||
Status = IScsiAsciiStrToLun (LunString, (UINT8 *) &Lun);
|
Status = IScsiAsciiStrToLun (LunString, (UINT8 *) &Lun);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
PopUpInvalidNotify (L"Invalid LUN string!");
|
CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid LUN string!", NULL);
|
||||||
} else {
|
} else {
|
||||||
CopyMem (Private->Current->SessionConfigData.BootLun, &Lun, sizeof (Lun));
|
CopyMem (Private->Current->SessionConfigData.BootLun, &Lun, sizeof (Lun));
|
||||||
}
|
}
|
||||||
|
@ -661,11 +647,11 @@ IScsiFormCallback (
|
||||||
|
|
||||||
if ((Gateway.Addr[0] != 0)) {
|
if ((Gateway.Addr[0] != 0)) {
|
||||||
if (SubnetMask.Addr[0] == 0) {
|
if (SubnetMask.Addr[0] == 0) {
|
||||||
PopUpInvalidNotify (L"Gateway address is set but subnet mask is zero.");
|
CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Gateway address is set but subnet mask is zero.", NULL);
|
||||||
Status = EFI_INVALID_PARAMETER;
|
Status = EFI_INVALID_PARAMETER;
|
||||||
break;
|
break;
|
||||||
} else if (!IP4_NET_EQUAL (HostIp.Addr[0], Gateway.Addr[0], SubnetMask.Addr[0])) {
|
} else if (!IP4_NET_EQUAL (HostIp.Addr[0], Gateway.Addr[0], SubnetMask.Addr[0])) {
|
||||||
PopUpInvalidNotify (L"Local IP and Gateway are not in the same subnet.");
|
CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Local IP and Gateway are not in the same subnet.", NULL);
|
||||||
Status = EFI_INVALID_PARAMETER;
|
Status = EFI_INVALID_PARAMETER;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -677,7 +663,7 @@ IScsiFormCallback (
|
||||||
if (!Private->Current->SessionConfigData.TargetInfoFromDhcp) {
|
if (!Private->Current->SessionConfigData.TargetInfoFromDhcp) {
|
||||||
CopyMem (&HostIp.v4, &Private->Current->SessionConfigData.TargetIp, sizeof (HostIp.v4));
|
CopyMem (&HostIp.v4, &Private->Current->SessionConfigData.TargetIp, sizeof (HostIp.v4));
|
||||||
if (!Ip4IsUnicast (NTOHL (HostIp.Addr[0]), 0)) {
|
if (!Ip4IsUnicast (NTOHL (HostIp.Addr[0]), 0)) {
|
||||||
PopUpInvalidNotify (L"Target IP is invalid!");
|
CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Target IP is invalid!", NULL);
|
||||||
Status = EFI_INVALID_PARAMETER;
|
Status = EFI_INVALID_PARAMETER;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -685,7 +671,7 @@ IScsiFormCallback (
|
||||||
|
|
||||||
if (IfrNvData->CHAPType != ISCSI_CHAP_NONE) {
|
if (IfrNvData->CHAPType != ISCSI_CHAP_NONE) {
|
||||||
if ((IfrNvData->CHAPName[0] == '\0') || (IfrNvData->CHAPSecret[0] == '\0')) {
|
if ((IfrNvData->CHAPName[0] == '\0') || (IfrNvData->CHAPSecret[0] == '\0')) {
|
||||||
PopUpInvalidNotify (L"CHAP Name or CHAP Secret is invalid!");
|
CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"CHAP Name or CHAP Secret is invalid!", NULL);
|
||||||
Status = EFI_INVALID_PARAMETER;
|
Status = EFI_INVALID_PARAMETER;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -693,7 +679,7 @@ IScsiFormCallback (
|
||||||
if ((IfrNvData->CHAPType == ISCSI_CHAP_MUTUAL) &&
|
if ((IfrNvData->CHAPType == ISCSI_CHAP_MUTUAL) &&
|
||||||
((IfrNvData->ReverseCHAPName[0] == '\0') || (IfrNvData->ReverseCHAPSecret[0] == '\0'))
|
((IfrNvData->ReverseCHAPName[0] == '\0') || (IfrNvData->ReverseCHAPSecret[0] == '\0'))
|
||||||
) {
|
) {
|
||||||
PopUpInvalidNotify (L"Reverse CHAP Name or Reverse CHAP Secret is invalid!");
|
CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Reverse CHAP Name or Reverse CHAP Secret is invalid!", NULL);
|
||||||
Status = EFI_INVALID_PARAMETER;
|
Status = EFI_INVALID_PARAMETER;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -123,55 +123,64 @@ IScsiAsciiStrToLun (
|
||||||
OUT UINT8 *Lun
|
OUT UINT8 *Lun
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
UINT32 Index;
|
UINTN Index, IndexValue, IndexNum, SizeStr;
|
||||||
CHAR8 *LunUnitStr[4];
|
CHAR8 TemStr[2];
|
||||||
CHAR8 Digit;
|
UINT8 TemValue;
|
||||||
UINTN Temp;
|
UINT16 Value [4];
|
||||||
|
|
||||||
ZeroMem (Lun, 8);
|
ZeroMem (Lun, 8);
|
||||||
ZeroMem (LunUnitStr, sizeof (LunUnitStr));
|
ZeroMem (TemStr, 2);
|
||||||
|
ZeroMem ((UINT8 *) Value, sizeof (Value));
|
||||||
|
SizeStr = AsciiStrLen (Str);
|
||||||
|
IndexValue = 0;
|
||||||
|
IndexNum = 0;
|
||||||
|
|
||||||
Index = 0;
|
for (Index = 0; Index < SizeStr; Index ++) {
|
||||||
LunUnitStr[0] = Str;
|
TemStr[0] = Str[Index];
|
||||||
|
TemValue = (UINT8) AsciiStrHexToUint64 (TemStr);
|
||||||
if (!IsHexDigit ((UINT8 *) &Digit, *Str)) {
|
if (TemValue == 0 && TemStr[0] != '0') {
|
||||||
return EFI_INVALID_PARAMETER;
|
if ((TemStr[0] != '-') || (IndexNum == 0)) {
|
||||||
}
|
//
|
||||||
|
// Invalid Lun Char
|
||||||
while (*Str != '\0') {
|
//
|
||||||
//
|
return EFI_INVALID_PARAMETER;
|
||||||
// Legal representations of LUN:
|
|
||||||
// 4752-3A4F-6b7e-2F99,
|
|
||||||
// 6734-9-156f-127,
|
|
||||||
// 4186-9
|
|
||||||
//
|
|
||||||
if (*Str == '-') {
|
|
||||||
*Str = '\0';
|
|
||||||
Index++;
|
|
||||||
|
|
||||||
if (*(Str + 1) != '\0') {
|
|
||||||
if (!IsHexDigit ((UINT8 *) &Digit, *(Str + 1))) {
|
|
||||||
return EFI_INVALID_PARAMETER;
|
|
||||||
}
|
|
||||||
|
|
||||||
LunUnitStr[Index] = Str + 1;
|
|
||||||
}
|
}
|
||||||
} else if (!IsHexDigit ((UINT8 *) &Digit, *Str)) {
|
}
|
||||||
|
|
||||||
|
if ((TemValue == 0) && (TemStr[0] == '-')) {
|
||||||
|
//
|
||||||
|
// Next Lun value
|
||||||
|
//
|
||||||
|
if (++IndexValue >= 4) {
|
||||||
|
//
|
||||||
|
// Max 4 Lun value
|
||||||
|
//
|
||||||
|
return EFI_INVALID_PARAMETER;
|
||||||
|
}
|
||||||
|
//
|
||||||
|
// Restart str index for the next lun value
|
||||||
|
//
|
||||||
|
IndexNum = 0;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (++IndexNum > 4) {
|
||||||
|
//
|
||||||
|
// Each Lun Str can't exceed size 4, because it will be as UINT16 value
|
||||||
|
//
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
Str++;
|
//
|
||||||
|
// Combine UINT16 value
|
||||||
|
//
|
||||||
|
Value[IndexValue] = (UINT16) ((Value[IndexValue] << 4) + TemValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (Index = 0; (Index < 4) && (LunUnitStr[Index] != NULL); Index++) {
|
for (Index = 0; Index <= IndexValue; Index ++) {
|
||||||
if (AsciiStrLen (LunUnitStr[Index]) > 4) {
|
*((UINT16 *) &Lun[Index * 2]) = HTONS (Value[Index]);
|
||||||
return EFI_INVALID_PARAMETER;
|
|
||||||
}
|
|
||||||
|
|
||||||
Temp = AsciiStrHexToUintn (LunUnitStr[Index]);
|
|
||||||
*((UINT16 *) &Lun[Index * 2]) = HTONS (Temp);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -434,52 +443,38 @@ IScsiHexToBin (
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
UINTN Index;
|
UINTN Index;
|
||||||
UINT32 HexCount;
|
UINTN Length;
|
||||||
CHAR8 *HexBuf;
|
|
||||||
UINT8 Digit;
|
UINT8 Digit;
|
||||||
UINT8 Byte;
|
CHAR8 TemStr[2];
|
||||||
|
|
||||||
Digit = 0;
|
ZeroMem (TemStr, sizeof (TemStr));
|
||||||
|
|
||||||
//
|
//
|
||||||
// Find out how many hex characters the string has.
|
// Find out how many hex characters the string has.
|
||||||
//
|
//
|
||||||
HexBuf = HexStr;
|
if ((HexStr[0] == '0') && ((HexStr[1] == 'x') || (HexStr[1] == 'X'))) {
|
||||||
if ((HexBuf[0] == '0') && ((HexBuf[1] == 'x') || (HexBuf[1] == 'X'))) {
|
HexStr += 2;
|
||||||
HexBuf += 2;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Length = AsciiStrLen (HexStr);
|
||||||
|
|
||||||
for (Index = 0, HexCount = 0; IsHexDigit (&Digit, HexBuf[Index]); Index++, HexCount++)
|
for (Index = 0; Index < Length; Index ++) {
|
||||||
;
|
TemStr[0] = HexStr[Index];
|
||||||
|
Digit = (UINT8) AsciiStrHexToUint64 (TemStr);
|
||||||
if (HexCount == 0) {
|
if (Digit == 0 && TemStr[0] != '0') {
|
||||||
*BinLength = 0;
|
//
|
||||||
return EFI_SUCCESS;
|
// Invalid Lun Char
|
||||||
}
|
//
|
||||||
//
|
break;
|
||||||
// Test if buffer is passed enough.
|
}
|
||||||
//
|
if ((Index & 1) == 0) {
|
||||||
if (((HexCount + 1) / 2) > *BinLength) {
|
BinBuffer [Index/2] = Digit;
|
||||||
*BinLength = (HexCount + 1) / 2;
|
} else {
|
||||||
return EFI_BUFFER_TOO_SMALL;
|
BinBuffer [Index/2] = (UINT8) ((BinBuffer [Index/2] << 4) + Digit);
|
||||||
}
|
|
||||||
|
|
||||||
*BinLength = (HexCount + 1) / 2;
|
|
||||||
|
|
||||||
for (Index = 0; Index < HexCount; Index++) {
|
|
||||||
|
|
||||||
IsHexDigit (&Digit, HexBuf[HexCount - 1 - Index]);
|
|
||||||
|
|
||||||
if ((Index & 1) == 0) {
|
|
||||||
Byte = Digit;
|
|
||||||
} else {
|
|
||||||
Byte = BinBuffer[*BinLength - 1 - Index / 2];
|
|
||||||
Byte &= 0x0F;
|
|
||||||
Byte = (UINT8) (Byte | (Digit << 4));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
BinBuffer[*BinLength - 1 - Index / 2] = Byte;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
*BinLength = (UINT32) ((Index + 1)/2);
|
||||||
|
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
|
@ -605,7 +605,13 @@ EnterCarriageReturn:
|
||||||
default:
|
default:
|
||||||
if (ManualInput) {
|
if (ManualInput) {
|
||||||
if (HexInput) {
|
if (HexInput) {
|
||||||
if (!IsHexDigit (&Digital, Key.UnicodeChar)) {
|
if ((Key.UnicodeChar >= L'0') && (Key.UnicodeChar <= L'9')) {
|
||||||
|
Digital = (UINT8) (Key.UnicodeChar - L'0');
|
||||||
|
} else if ((Key.UnicodeChar >= L'A') && (Key.UnicodeChar <= L'F')) {
|
||||||
|
Digital = (UINT8) (Key.UnicodeChar - L'A' + 0x0A);
|
||||||
|
} else if ((Key.UnicodeChar >= L'a') && (Key.UnicodeChar <= L'f')) {
|
||||||
|
Digital = (UINT8) (Key.UnicodeChar - L'a' + 0x0A);
|
||||||
|
} else {
|
||||||
UpdateStatusBar (INPUT_ERROR, Question->QuestionFlags, TRUE);
|
UpdateStatusBar (INPUT_ERROR, Question->QuestionFlags, TRUE);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1018,8 +1018,12 @@ GetQuestionValue (
|
||||||
CHAR16 *Value;
|
CHAR16 *Value;
|
||||||
CHAR16 *StringPtr;
|
CHAR16 *StringPtr;
|
||||||
UINTN Length;
|
UINTN Length;
|
||||||
|
UINTN Index;
|
||||||
|
UINTN LengthStr;
|
||||||
BOOLEAN IsBufferStorage;
|
BOOLEAN IsBufferStorage;
|
||||||
BOOLEAN IsString;
|
BOOLEAN IsString;
|
||||||
|
CHAR16 TemStr[5];
|
||||||
|
UINT8 DigitUint8;
|
||||||
|
|
||||||
Status = EFI_SUCCESS;
|
Status = EFI_SUCCESS;
|
||||||
|
|
||||||
|
@ -1141,15 +1145,44 @@ GetQuestionValue (
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LengthStr = StrLen (Value);
|
||||||
|
Status = EFI_SUCCESS;
|
||||||
if (IsString) {
|
if (IsString) {
|
||||||
//
|
//
|
||||||
// Convert Config String to Unicode String, e.g "0041004200430044" => "ABCD"
|
// Convert Config String to Unicode String, e.g "0041004200430044" => "ABCD"
|
||||||
|
// Add string tail char L'\0' into Length
|
||||||
//
|
//
|
||||||
Length = StorageWidth + sizeof (CHAR16);
|
Length = StorageWidth + sizeof (CHAR16);
|
||||||
Status = ConfigStringToUnicode ((CHAR16 *) Dst, &Length, Value);
|
if (Length < ((LengthStr / 4 + 1) * 2)) {
|
||||||
|
Status = EFI_BUFFER_TOO_SMALL;
|
||||||
|
} else {
|
||||||
|
StringPtr = (CHAR16 *) Dst;
|
||||||
|
ZeroMem (TemStr, sizeof (TemStr));
|
||||||
|
for (Index = 0; Index < LengthStr; Index += 4) {
|
||||||
|
StrnCpy (TemStr, Value + Index, 4);
|
||||||
|
StringPtr[Index/4] = (CHAR16) StrHexToUint64 (TemStr);
|
||||||
|
}
|
||||||
|
//
|
||||||
|
// Add tailing L'\0' character
|
||||||
|
//
|
||||||
|
StringPtr[Index/4] = L'\0';
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
Status = HexStringToBuf (Dst, &StorageWidth, Value, NULL);
|
if (StorageWidth < ((LengthStr + 1) / 2)) {
|
||||||
|
Status = EFI_BUFFER_TOO_SMALL;
|
||||||
|
} else {
|
||||||
|
ZeroMem (TemStr, sizeof (TemStr));
|
||||||
|
for (Index = 0; Index < LengthStr; Index ++) {
|
||||||
|
TemStr[0] = Value[LengthStr - Index - 1];
|
||||||
|
DigitUint8 = (UINT8) StrHexToUint64 (TemStr);
|
||||||
|
if ((Index & 1) == 0) {
|
||||||
|
Dst [Index/2] = DigitUint8;
|
||||||
|
} else {
|
||||||
|
Dst [Index/2] = (UINT8) ((Dst [Index/2] << 4) + DigitUint8);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
FreePool (Value);
|
FreePool (Value);
|
||||||
|
@ -1222,18 +1255,48 @@ GetQuestionValue (
|
||||||
}
|
}
|
||||||
*StringPtr = L'\0';
|
*StringPtr = L'\0';
|
||||||
|
|
||||||
|
LengthStr = StrLen (Value);
|
||||||
|
Status = EFI_SUCCESS;
|
||||||
if (!IsBufferStorage && IsString) {
|
if (!IsBufferStorage && IsString) {
|
||||||
//
|
//
|
||||||
// Convert Config String to Unicode String, e.g "0041004200430044" => "ABCD"
|
// Convert Config String to Unicode String, e.g "0041004200430044" => "ABCD"
|
||||||
|
// Add string tail char L'\0' into Length
|
||||||
//
|
//
|
||||||
Length = StorageWidth + sizeof (CHAR16);
|
Length = StorageWidth + sizeof (CHAR16);
|
||||||
Status = ConfigStringToUnicode ((CHAR16 *) Dst, &Length, Value);
|
if (Length < ((LengthStr / 4 + 1) * 2)) {
|
||||||
} else {
|
Status = EFI_BUFFER_TOO_SMALL;
|
||||||
Status = HexStringToBuf (Dst, &StorageWidth, Value, NULL);
|
} else {
|
||||||
if (EFI_ERROR (Status)) {
|
StringPtr = (CHAR16 *) Dst;
|
||||||
FreePool (Result);
|
ZeroMem (TemStr, sizeof (TemStr));
|
||||||
return Status;
|
for (Index = 0; Index < LengthStr; Index += 4) {
|
||||||
|
StrnCpy (TemStr, Value + Index, 4);
|
||||||
|
StringPtr[Index/4] = (CHAR16) StrHexToUint64 (TemStr);
|
||||||
|
}
|
||||||
|
//
|
||||||
|
// Add tailing L'\0' character
|
||||||
|
//
|
||||||
|
StringPtr[Index/4] = L'\0';
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
if (StorageWidth < ((LengthStr + 1) / 2)) {
|
||||||
|
Status = EFI_BUFFER_TOO_SMALL;
|
||||||
|
} else {
|
||||||
|
ZeroMem (TemStr, sizeof (TemStr));
|
||||||
|
for (Index = 0; Index < LengthStr; Index ++) {
|
||||||
|
TemStr[0] = Value[LengthStr - Index - 1];
|
||||||
|
DigitUint8 = (UINT8) StrHexToUint64 (TemStr);
|
||||||
|
if ((Index & 1) == 0) {
|
||||||
|
Dst [Index/2] = DigitUint8;
|
||||||
|
} else {
|
||||||
|
Dst [Index/2] = (UINT8) ((Dst [Index/2] << 4) + DigitUint8);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
FreePool (Result);
|
||||||
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
|
@ -1244,6 +1307,7 @@ GetQuestionValue (
|
||||||
} else {
|
} else {
|
||||||
SetValueByName (Storage, Question->VariableName, Value);
|
SetValueByName (Storage, Question->VariableName, Value);
|
||||||
}
|
}
|
||||||
|
|
||||||
FreePool (Result);
|
FreePool (Result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1286,6 +1350,10 @@ SetQuestionValue (
|
||||||
UINTN Length;
|
UINTN Length;
|
||||||
BOOLEAN IsBufferStorage;
|
BOOLEAN IsBufferStorage;
|
||||||
BOOLEAN IsString;
|
BOOLEAN IsString;
|
||||||
|
UINT8 *TemBuffer;
|
||||||
|
CHAR16 *TemName;
|
||||||
|
CHAR16 *TemString;
|
||||||
|
UINTN Index;
|
||||||
|
|
||||||
Status = EFI_SUCCESS;
|
Status = EFI_SUCCESS;
|
||||||
|
|
||||||
|
@ -1397,20 +1465,32 @@ SetQuestionValue (
|
||||||
} else {
|
} else {
|
||||||
if (IsString) {
|
if (IsString) {
|
||||||
//
|
//
|
||||||
// Convert Unicode String to Config String, e.g. "ABCD" => "0041004200430044"
|
// Allocate enough string buffer.
|
||||||
//
|
//
|
||||||
Value = NULL;
|
Value = NULL;
|
||||||
BufferLen = ((StrLen ((CHAR16 *) Src) * 4) + 1) * sizeof (CHAR16);
|
BufferLen = ((StrLen ((CHAR16 *) Src) * 4) + 1) * sizeof (CHAR16);
|
||||||
Value = AllocateZeroPool (BufferLen);
|
Value = AllocateZeroPool (BufferLen);
|
||||||
ASSERT (Value != NULL);
|
ASSERT (Value != NULL);
|
||||||
Status = UnicodeToConfigString (Value, &BufferLen, (CHAR16 *) Src);
|
//
|
||||||
ASSERT_EFI_ERROR (Status);
|
// Convert Unicode String to Config String, e.g. "ABCD" => "0041004200430044"
|
||||||
|
//
|
||||||
|
TemName = (CHAR16 *) Src;
|
||||||
|
TemString = Value;
|
||||||
|
for (; *TemName != L'\0'; TemName++) {
|
||||||
|
TemString += UnicodeValueToString (TemString, PREFIX_ZERO | RADIX_HEX, *TemName, 4);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
BufferLen = StorageWidth * 2 + 1;
|
BufferLen = StorageWidth * 2 + 1;
|
||||||
Value = AllocateZeroPool (BufferLen * sizeof (CHAR16));
|
Value = AllocateZeroPool (BufferLen * sizeof (CHAR16));
|
||||||
ASSERT (Value != NULL);
|
ASSERT (Value != NULL);
|
||||||
BufToHexString (Value, &BufferLen, Src, StorageWidth);
|
//
|
||||||
ToLower (Value);
|
// Convert Buffer to Hex String
|
||||||
|
//
|
||||||
|
TemBuffer = Src + StorageWidth - 1;
|
||||||
|
TemString = Value;
|
||||||
|
for (Index = 0; Index < StorageWidth; Index ++, TemBuffer --) {
|
||||||
|
TemString += UnicodeValueToString (TemString, PREFIX_ZERO | RADIX_HEX, *TemBuffer, 2);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = SetValueByName (Storage, Question->VariableName, Value);
|
Status = SetValueByName (Storage, Question->VariableName, Value);
|
||||||
|
@ -1446,17 +1526,34 @@ SetQuestionValue (
|
||||||
}
|
}
|
||||||
|
|
||||||
Value = ConfigResp + StrLen (ConfigResp);
|
Value = ConfigResp + StrLen (ConfigResp);
|
||||||
|
|
||||||
if (!IsBufferStorage && IsString) {
|
if (!IsBufferStorage && IsString) {
|
||||||
//
|
//
|
||||||
// Convert Unicode String to Config String, e.g. "ABCD" => "0041004200430044"
|
// Convert Unicode String to Config String, e.g. "ABCD" => "0041004200430044"
|
||||||
//
|
//
|
||||||
BufferLen = ((StrLen ((CHAR16 *) Src) * 4) + 1) * sizeof (CHAR16);
|
TemName = (CHAR16 *) Src;
|
||||||
Status = UnicodeToConfigString (Value, &BufferLen, (CHAR16 *) Src);
|
TemString = Value;
|
||||||
ASSERT_EFI_ERROR (Status);
|
for (; *TemName != L'\0'; TemName++) {
|
||||||
|
TemString += UnicodeValueToString (TemString, PREFIX_ZERO | RADIX_HEX, *TemName, 4);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
BufferLen = StorageWidth * 2 + 1;
|
//
|
||||||
BufToHexString (Value, &BufferLen, Src, StorageWidth);
|
// Convert Buffer to Hex String
|
||||||
ToLower (Value);
|
//
|
||||||
|
TemBuffer = Src + StorageWidth - 1;
|
||||||
|
TemString = Value;
|
||||||
|
for (Index = 0; Index < StorageWidth; Index ++, TemBuffer --) {
|
||||||
|
TemString += UnicodeValueToString (TemString, PREFIX_ZERO | RADIX_HEX, *TemBuffer, 2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Convert to lower char.
|
||||||
|
//
|
||||||
|
for (TemString = Value; *Value != L'\0'; Value++) {
|
||||||
|
if (*Value >= L'A' && *Value <= L'Z') {
|
||||||
|
*Value = (CHAR16) (*Value - L'A' + L'a');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|
|
@ -1506,6 +1506,9 @@ UiDisplayMenu (
|
||||||
UINT16 DefaultId;
|
UINT16 DefaultId;
|
||||||
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
||||||
FORM_BROWSER_STATEMENT *Statement;
|
FORM_BROWSER_STATEMENT *Statement;
|
||||||
|
CHAR16 TemStr[2];
|
||||||
|
UINT8 *DevicePathBuffer;
|
||||||
|
UINT8 DigitUint8;
|
||||||
|
|
||||||
CopyMem (&LocalScreen, &gScreenDimensions, sizeof (EFI_SCREEN_DESCRIPTOR));
|
CopyMem (&LocalScreen, &gScreenDimensions, sizeof (EFI_SCREEN_DESCRIPTOR));
|
||||||
|
|
||||||
|
@ -2358,8 +2361,27 @@ UiDisplayMenu (
|
||||||
}
|
}
|
||||||
BufferSize = StrLen (StringPtr) / 2;
|
BufferSize = StrLen (StringPtr) / 2;
|
||||||
DevicePath = AllocatePool (BufferSize);
|
DevicePath = AllocatePool (BufferSize);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Convert from Device Path String to DevicePath Buffer in the reverse order.
|
||||||
|
//
|
||||||
|
DevicePathBuffer = (UINT8 *) DevicePath;
|
||||||
|
for (Index = 0; StringPtr[Index] != L'\0'; Index ++) {
|
||||||
|
TemStr[0] = StringPtr[Index];
|
||||||
|
DigitUint8 = (UINT8) StrHexToUint64 (TemStr);
|
||||||
|
if (DigitUint8 == 0 && TemStr[0] != L'0') {
|
||||||
|
//
|
||||||
|
// Invalid Hex Char as the tail.
|
||||||
|
//
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if ((Index & 1) == 0) {
|
||||||
|
DevicePathBuffer [Index/2] = DigitUint8;
|
||||||
|
} else {
|
||||||
|
DevicePathBuffer [Index/2] = (UINT8) ((DevicePathBuffer [Index/2] << 4) + DigitUint8);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
HexStringToBufInReverseOrder ((UINT8 *) DevicePath, &BufferSize, StringPtr);
|
|
||||||
Selection->Handle = HiiLibDevicePathToHiiHandle (DevicePath);
|
Selection->Handle = HiiLibDevicePathToHiiHandle (DevicePath);
|
||||||
if (Selection->Handle == NULL) {
|
if (Selection->Handle == NULL) {
|
||||||
//
|
//
|
||||||
|
|
Loading…
Reference in New Issue