Sync all bug fixes between EDK1.04 and EDK1.06 into EdkCompatibilityPkg.
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@11094 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
@@ -37,6 +37,7 @@ HII_VENDOR_DEVICE_PATH mHiiVendorDevicePathTemplate = {
|
||||
},
|
||||
EFI_IFR_TIANO_GUID,
|
||||
},
|
||||
0,
|
||||
0
|
||||
},
|
||||
{
|
||||
@@ -181,22 +182,23 @@ Returns:
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
HII_VENDOR_DEVICE_PATH_NODE *VendorDevicePath;
|
||||
UINT64 MonotonicCount;
|
||||
|
||||
VendorDevicePath = EfiLibAllocateCopyPool (sizeof (HII_VENDOR_DEVICE_PATH), &mHiiVendorDevicePathTemplate);
|
||||
if (VendorDevicePath == NULL) {
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
|
||||
gBS->GetNextMonotonicCount (&MonotonicCount);
|
||||
VendorDevicePath->MonotonicCount = (UINT32) MonotonicCount;
|
||||
//
|
||||
// Use memory address as unique ID to distinguish from different device paths
|
||||
//
|
||||
VendorDevicePath->UniqueId = (UINT64) ((UINTN) VendorDevicePath);
|
||||
|
||||
*DriverHandle = NULL;
|
||||
Status = gBS->InstallProtocolInterface (
|
||||
Status = gBS->InstallMultipleProtocolInterfaces (
|
||||
DriverHandle,
|
||||
&gEfiDevicePathProtocolGuid,
|
||||
EFI_NATIVE_INTERFACE,
|
||||
VendorDevicePath
|
||||
VendorDevicePath,
|
||||
NULL
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
@@ -240,7 +242,7 @@ Returns:
|
||||
&gEfiDevicePathProtocolGuid,
|
||||
DevicePath
|
||||
);
|
||||
|
||||
gBS->FreePool (DevicePath);
|
||||
return Status;
|
||||
}
|
||||
|
||||
@@ -511,6 +513,7 @@ Arguments:
|
||||
|
||||
Returns:
|
||||
EFI_SUCCESS - Successfully extract Class for specified Hii handle.
|
||||
EFI_NOT_FOUND - Class not found.
|
||||
|
||||
--*/
|
||||
{
|
||||
@@ -525,10 +528,12 @@ Returns:
|
||||
UINT32 Offset2;
|
||||
UINT32 PackageListLength;
|
||||
EFI_HII_PACKAGE_HEADER PackageHeader;
|
||||
BOOLEAN ClassFound;
|
||||
|
||||
*Class = EFI_NON_DEVICE_CLASS;
|
||||
*FormSetTitle = 0;
|
||||
*FormSetHelp = 0;
|
||||
ClassFound = FALSE;
|
||||
|
||||
//
|
||||
// Locate HII Database protocol
|
||||
@@ -574,7 +579,7 @@ Returns:
|
||||
Package = ((UINT8 *) HiiPackageList) + Offset;
|
||||
EfiCopyMem (&PackageHeader, Package, sizeof (EFI_HII_PACKAGE_HEADER));
|
||||
|
||||
if (PackageHeader.Type == EFI_HII_PACKAGE_FORM) {
|
||||
if (PackageHeader.Type == EFI_HII_PACKAGE_FORMS) {
|
||||
//
|
||||
// Search Class Opcode in this Form Package
|
||||
//
|
||||
@@ -602,6 +607,139 @@ Returns:
|
||||
//
|
||||
// Till now, we ought to have found the formset Opcode
|
||||
//
|
||||
ClassFound = TRUE;
|
||||
break;
|
||||
}
|
||||
|
||||
Offset2 += ((EFI_IFR_OP_HEADER *) OpCodeData)->Length;
|
||||
}
|
||||
|
||||
if (Offset2 < PackageHeader.Length) {
|
||||
//
|
||||
// Target formset found
|
||||
//
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
Offset += PackageHeader.Length;
|
||||
}
|
||||
|
||||
gBS->FreePool (HiiPackageList);
|
||||
|
||||
return ClassFound ? EFI_SUCCESS : EFI_NOT_FOUND;
|
||||
}
|
||||
|
||||
EFI_STATUS
|
||||
ExtractClassGuidFromHiiHandle (
|
||||
IN EFI_HII_HANDLE Handle,
|
||||
OUT UINT8 *NumberOfClassGuid,
|
||||
OUT EFI_GUID **ClassGuid,
|
||||
OUT EFI_STRING_ID *FormSetTitle,
|
||||
OUT EFI_STRING_ID *FormSetHelp
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
Extract formset ClassGuid for given HII handle.
|
||||
|
||||
Arguments:
|
||||
HiiHandle - Hii handle
|
||||
NumberOfClassGuid - Number of ClassGuid
|
||||
ClassGuid - Pointer to callee allocated buffer, an array of ClassGuid
|
||||
FormSetTitle - Formset title string
|
||||
FormSetHelp - Formset help string
|
||||
|
||||
Returns:
|
||||
EFI_SUCCESS - Successfully extract Class for specified Hii handle.
|
||||
|
||||
--*/
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
UINTN BufferSize;
|
||||
EFI_HII_DATABASE_PROTOCOL *HiiDatabase;
|
||||
EFI_HII_PACKAGE_LIST_HEADER *HiiPackageList;
|
||||
UINT8 *Package;
|
||||
UINT8 *FormSet;
|
||||
UINT8 *OpCodeData;
|
||||
UINT32 Offset;
|
||||
UINT32 Offset2;
|
||||
UINT32 PackageListLength;
|
||||
EFI_HII_PACKAGE_HEADER PackageHeader;
|
||||
|
||||
if (NumberOfClassGuid == NULL || ClassGuid == NULL || FormSetTitle == NULL || FormSetHelp == NULL) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
*NumberOfClassGuid = 0;
|
||||
*ClassGuid = NULL;
|
||||
*FormSetTitle = 0;
|
||||
*FormSetHelp = 0;
|
||||
|
||||
//
|
||||
// Locate HII Database protocol
|
||||
//
|
||||
Status = gBS->LocateProtocol (
|
||||
&gEfiHiiDatabaseProtocolGuid,
|
||||
NULL,
|
||||
(VOID **) &HiiDatabase
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
//
|
||||
// Get HII PackageList
|
||||
//
|
||||
BufferSize = 0;
|
||||
HiiPackageList = NULL;
|
||||
Status = HiiDatabase->ExportPackageLists (HiiDatabase, Handle, &BufferSize, HiiPackageList);
|
||||
if (Status == EFI_BUFFER_TOO_SMALL) {
|
||||
HiiPackageList = EfiLibAllocatePool (BufferSize);
|
||||
ASSERT (HiiPackageList != NULL);
|
||||
|
||||
Status = HiiDatabase->ExportPackageLists (HiiDatabase, Handle, &BufferSize, HiiPackageList);
|
||||
}
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
//
|
||||
// Get Form package from this HII package List
|
||||
//
|
||||
Offset = sizeof (EFI_HII_PACKAGE_LIST_HEADER);
|
||||
Offset2 = 0;
|
||||
FormSet = NULL;
|
||||
EfiCopyMem (&PackageListLength, &HiiPackageList->PackageLength, sizeof (UINT32));
|
||||
|
||||
while (Offset < PackageListLength) {
|
||||
Package = ((UINT8 *) HiiPackageList) + Offset;
|
||||
EfiCopyMem (&PackageHeader, Package, sizeof (EFI_HII_PACKAGE_HEADER));
|
||||
|
||||
if (PackageHeader.Type == EFI_HII_PACKAGE_FORMS) {
|
||||
//
|
||||
// Search Class Opcode in this Form Package
|
||||
//
|
||||
Offset2 = sizeof (EFI_HII_PACKAGE_HEADER);
|
||||
while (Offset2 < PackageHeader.Length) {
|
||||
OpCodeData = Package + Offset2;
|
||||
|
||||
if (((EFI_IFR_OP_HEADER *) OpCodeData)->OpCode == EFI_IFR_FORM_SET_OP) {
|
||||
//
|
||||
// Find FormSet OpCode
|
||||
//
|
||||
EfiCopyMem (FormSetTitle, &((EFI_IFR_FORM_SET *) OpCodeData)->FormSetTitle, sizeof (EFI_STRING_ID));
|
||||
EfiCopyMem (FormSetHelp, &((EFI_IFR_FORM_SET *) OpCodeData)->Help, sizeof (EFI_STRING_ID));
|
||||
if (((EFI_IFR_OP_HEADER *) OpCodeData)->Length > ((UINTN) &((EFI_IFR_FORM_SET *) 0)->Flags)) {
|
||||
//
|
||||
// New version of formset OpCode
|
||||
//
|
||||
*NumberOfClassGuid = (UINT8) (((EFI_IFR_FORM_SET *) OpCodeData)->Flags & 0x3);
|
||||
*ClassGuid = EfiLibAllocateCopyPool (
|
||||
*NumberOfClassGuid * sizeof (EFI_GUID),
|
||||
((EFI_IFR_FORM_SET *) OpCodeData)->ClassGuid
|
||||
);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user