CHAR16 * ConsistMappingGenMappingName ( EFI_DEVICE_PATH_PROTOCOL *DevicePath, EFI_DEVICE_PATH_PROTOCOL **HIDevicePathTable ) { POOL_PRINT Str; DEVICE_CONSIST_MAPPING_INFO MappingInfo; EFI_DEVICE_PATH_PROTOCOL *HIDevicePath; UINTN Index; UINTN NewSize; HIDevicePath = GetHIDevicePath (DevicePath); if (HIDevicePath == NULL) { return NULL; } for (Index = 0; HIDevicePathTable[Index] != NULL; Index++) { if (DevicePathCompare (HIDevicePathTable[Index], HIDevicePath) == 0) { break; } } FreePool (HIDevicePath); if (HIDevicePathTable[Index] == NULL) { return NULL; } MappingInfo.HI = Index; MappingInfo.MTD = MTDTypeUnknown; MappingInfo.Digital = FALSE; GetDeviceConsistMappingInfo (&MappingInfo, DevicePath); SetMem (&Str, sizeof (Str), 0); for (Index = 0; mMTDName[Index].MTDType != MTDTypeEnd; Index++) { if (MappingInfo.MTD == mMTDName[Index].MTDType) { break; } } if (mMTDName[Index].MTDType != MTDTypeEnd) { CatPrint (&Str, L"%s", mMTDName[Index].Name); } CatPrint (&Str, L"%d", (UINTN) MappingInfo.HI); if (MappingInfo.CSD.str != NULL) { CatPrint (&Str, L"%s", MappingInfo.CSD.str); FreePool (MappingInfo.CSD.str); } NewSize = (Str.len + 1) * sizeof (CHAR16); Str.str = ReallocatePool (Str.str, NewSize, NewSize); Str.str[Str.len] = 0; return Str.str; }
EFIAPI ShellCommandConsistMappingGenMappingName ( IN EFI_DEVICE_PATH_PROTOCOL *DevicePath, IN EFI_DEVICE_PATH_PROTOCOL **Table ) { POOL_PRINT Str; DEVICE_CONSIST_MAPPING_INFO MappingInfo; EFI_DEVICE_PATH_PROTOCOL *HIDevicePath; UINTN Index; UINTN NewSize; ASSERT(DevicePath != NULL); ASSERT(Table != NULL); HIDevicePath = GetHIDevicePath (DevicePath); if (HIDevicePath == NULL) { return NULL; } for (Index = 0; Table[Index] != NULL; Index++) { if (DevicePathCompare (&Table[Index], &HIDevicePath) == 0) { break; } } FreePool (HIDevicePath); if (Table[Index] == NULL) { return NULL; } MappingInfo.Hi = Index; MappingInfo.Mtd = MTDTypeUnknown; MappingInfo.Digital = FALSE; GetDeviceConsistMappingInfo (&MappingInfo, DevicePath); SetMem (&Str, sizeof (Str), 0); for (Index = 0; mMTDName[Index].MTDType != MTDTypeEnd; Index++) { if (MappingInfo.Mtd == mMTDName[Index].MTDType) { break; } } if (mMTDName[Index].MTDType != MTDTypeEnd) { CatPrint (&Str, L"%s", mMTDName[Index].Name); } CatPrint (&Str, L"%d", (UINTN) MappingInfo.Hi); if (MappingInfo.Csd.Str != NULL) { CatPrint (&Str, L"%s", MappingInfo.Csd.Str); FreePool (MappingInfo.Csd.Str); } if (Str.Str != NULL) { CatPrint (&Str, L":"); } NewSize = (Str.Len + 1) * sizeof (CHAR16); Str.Str = ReallocatePool (Str.Len, NewSize, Str.Str); if (Str.Str == NULL) { return (NULL); } Str.Str[Str.Len] = CHAR_NULL; return Str.Str; }
/** Function to initialize the table for creating consistent map names. @param[out] Table The pointer to pointer to pointer to DevicePathProtocol object. @retval EFI_SUCCESS The table was created successfully. **/ EFI_STATUS EFIAPI ShellCommandConsistMappingInitialize ( OUT EFI_DEVICE_PATH_PROTOCOL ***Table ) { EFI_HANDLE *HandleBuffer; UINTN HandleNum; UINTN HandleLoop; EFI_DEVICE_PATH_PROTOCOL **TempTable; EFI_DEVICE_PATH_PROTOCOL *DevicePath; EFI_DEVICE_PATH_PROTOCOL *HIDevicePath; UINTN Index; EFI_STATUS Status; HandleBuffer = NULL; Status = gBS->LocateHandleBuffer ( AllHandles, NULL, NULL, &HandleNum, &HandleBuffer ); ASSERT_EFI_ERROR(Status); TempTable = AllocateZeroPool ((HandleNum + 1) * sizeof (EFI_DEVICE_PATH_PROTOCOL *)); if (TempTable == NULL) { return EFI_OUT_OF_RESOURCES; } for (HandleLoop = 0 ; HandleLoop < HandleNum ; HandleLoop++) { DevicePath = DevicePathFromHandle (HandleBuffer[HandleLoop]); if (DevicePath == NULL) { continue; } HIDevicePath = GetHIDevicePath (DevicePath); if (HIDevicePath == NULL) { continue; } for (Index = 0; TempTable[Index] != NULL; Index++) { if (DevicePathCompare (&TempTable[Index], &HIDevicePath) == 0) { FreePool (HIDevicePath); break; } } if (TempTable[Index] == NULL) { TempTable[Index] = HIDevicePath; } } for (Index = 0; TempTable[Index] != NULL; Index++); PerformQuickSort(TempTable, Index, sizeof(EFI_DEVICE_PATH_PROTOCOL*), DevicePathCompare); *Table = TempTable; if (HandleBuffer != NULL) { FreePool (HandleBuffer); } return EFI_SUCCESS; }
/** Find the EFI_HII_HANDLE by device path. @param[in] DevPath1 The Device Path to match. @param[out] HiiHandle The EFI_HII_HANDLE after the converstion. @param[in] HiiDb The Hii database protocol @retval EFI_SUCCESS The operation was successful. @retval EFI_NOT_FOUND There was no EFI_HII_HANDLE found for that deviec path. **/ EFI_STATUS EFIAPI FindHiiHandleViaDevPath( IN CONST EFI_DEVICE_PATH_PROTOCOL *DevPath1, OUT EFI_HII_HANDLE *HiiHandle, IN EFI_HII_DATABASE_PROTOCOL *HiiDb ) { EFI_HII_HANDLE *HandleBuffer; UINTN HandleBufferSize; VOID *MainBuffer; UINTN MainBufferSize; EFI_HII_PACKAGE_LIST_HEADER *PackageListHeader; EFI_HII_PACKAGE_HEADER *PackageHeader; UINTN LoopVariable; EFI_DEVICE_PATH_PROTOCOL *DevPath2; EFI_STATUS Status; ASSERT(DevPath1 != NULL); ASSERT(HiiHandle != NULL); ASSERT(*HiiHandle == NULL); ASSERT(HiiDb != NULL); HandleBufferSize = 0; HandleBuffer = NULL; Status = HiiDb->ListPackageLists(HiiDb, EFI_HII_PACKAGE_DEVICE_PATH, NULL, &HandleBufferSize, HandleBuffer); if (Status == EFI_BUFFER_TOO_SMALL) { HandleBuffer = AllocateZeroPool(HandleBufferSize); ASSERT (HandleBuffer != NULL); Status = HiiDb->ListPackageLists(HiiDb, EFI_HII_PACKAGE_DEVICE_PATH, NULL, &HandleBufferSize, HandleBuffer); } if (EFI_ERROR(Status)) { SHELL_FREE_NON_NULL(HandleBuffer); return (Status); } if (HandleBuffer == NULL) { return EFI_NOT_FOUND; } for (LoopVariable = 0 ; LoopVariable < (HandleBufferSize/sizeof(HandleBuffer[0])) && *HiiHandle == NULL ; LoopVariable++) { MainBufferSize = 0; MainBuffer = NULL; Status = HiiDb->ExportPackageLists(HiiDb, HandleBuffer[LoopVariable], &MainBufferSize, MainBuffer); if (Status == EFI_BUFFER_TOO_SMALL) { MainBuffer = AllocateZeroPool(MainBufferSize); ASSERT (MainBuffer != NULL); Status = HiiDb->ExportPackageLists(HiiDb, HandleBuffer[LoopVariable], &MainBufferSize, MainBuffer); } // // Enumerate through the block of returned memory. // This should actually be a small block, but we need to be sure. // for (PackageListHeader = (EFI_HII_PACKAGE_LIST_HEADER*)MainBuffer ; PackageListHeader != NULL && ((CHAR8*)PackageListHeader) < (((CHAR8*)MainBuffer)+MainBufferSize) && *HiiHandle == NULL ; PackageListHeader = (EFI_HII_PACKAGE_LIST_HEADER*)(((CHAR8*)(PackageListHeader)) + PackageListHeader->PackageLength )) { for (PackageHeader = (EFI_HII_PACKAGE_HEADER*)(((CHAR8*)(PackageListHeader))+sizeof(EFI_HII_PACKAGE_LIST_HEADER)) ; PackageHeader != NULL && ((CHAR8*)PackageHeader) < (((CHAR8*)MainBuffer)+MainBufferSize) && PackageHeader->Type != EFI_HII_PACKAGE_END && *HiiHandle == NULL ; PackageHeader = (EFI_HII_PACKAGE_HEADER*)(((CHAR8*)(PackageHeader))+PackageHeader->Length)) { if (PackageHeader->Type == EFI_HII_PACKAGE_DEVICE_PATH) { DevPath2 = (EFI_DEVICE_PATH_PROTOCOL*)(((CHAR8*)PackageHeader) + sizeof(EFI_HII_PACKAGE_HEADER)); if (DevicePathCompare(&DevPath1, &DevPath2) == 0) { *HiiHandle = HandleBuffer[LoopVariable]; break; } } } } SHELL_FREE_NON_NULL(MainBuffer); } SHELL_FREE_NON_NULL(HandleBuffer); if (*HiiHandle == NULL) { return (EFI_NOT_FOUND); } return (EFI_SUCCESS); }
EFI_STATUS ConsistMappingCreateHIDevicePathTable ( EFI_DEVICE_PATH_PROTOCOL ***HIDevicePathTable ) /*++ Routine Description: Create the empty mapping table. Arguments: HIDevicePathTable - The device table Returns: EFI_OUT_OF_RESOURCES - Out of resources EFI_SUCCESS - Success --*/ { EFI_HANDLE *Handle; UINTN HandleNum; EFI_DEVICE_PATH_PROTOCOL **Table; EFI_DEVICE_PATH_PROTOCOL *DevicePath; EFI_DEVICE_PATH_PROTOCOL *HIDevicePath; UINTN Index; Handle = NULL; ShellInitHandleEnumerator (); HandleNum = ShellGetHandleNum (); Table = AllocateZeroPool ((HandleNum + 1) * sizeof (EFI_DEVICE_PATH_PROTOCOL *)); if (HIDevicePathTable == NULL) { ShellCloseHandleEnumerator (); return EFI_OUT_OF_RESOURCES; } for (ShellNextHandle (&Handle); Handle != NULL; ShellNextHandle (&Handle)) { DevicePath = DevicePathFromHandle (*Handle); if (DevicePath == NULL) { continue; } HIDevicePath = GetHIDevicePath (DevicePath); if (HIDevicePath == NULL) { continue; } for (Index = 0; Table[Index] != NULL; Index++) { if (DevicePathCompare (Table[Index], HIDevicePath) == 0) { FreePool (HIDevicePath); break; } } if (Table[Index] == NULL) { Table[Index] = HIDevicePath; } } ShellCloseHandleEnumerator (); for (Index = 0; Table[Index] != NULL; Index++) ; DevicePathConsistMappingSort (Table, Index); *HIDevicePathTable = Table; return EFI_SUCCESS; }