\r
This is a internal function.\r
\r
- @param ImageBlock Points to the beginning of a series of image blocks stored in order.\r
+ @param ImageBlocks Points to the beginning of a series of image blocks stored in order.\r
@param ImageId If input ImageId is 0, output the image id of the EFI_HII_IIBT_END_BLOCK;\r
else use this id to find its corresponding image block address.\r
\r
@return The image block address when input ImageId is not zero; otherwise return NULL.\r
\r
**/\r
-UINT8*\r
+EFI_HII_IMAGE_BLOCK *\r
GetImageIdOrAddress (\r
- IN UINT8 *ImageBlock,\r
- IN OUT EFI_IMAGE_ID *ImageId\r
+ IN EFI_HII_IMAGE_BLOCK *ImageBlocks,\r
+ IN OUT EFI_IMAGE_ID *ImageId\r
)\r
{\r
EFI_IMAGE_ID ImageIdCurrent;\r
- UINT8 *ImageBlockHdr;\r
- UINT8 Length8;\r
- UINT16 Length16;\r
- UINT32 Length32;\r
- EFI_HII_IIBT_IMAGE_1BIT_BLOCK Iibt1bit;\r
- EFI_HII_IIBT_IMAGE_4BIT_BLOCK Iibt4bit;\r
- EFI_HII_IIBT_IMAGE_8BIT_BLOCK Iibt8bit;\r
- UINT16 Width;\r
- UINT16 Height;\r
-\r
- ASSERT (ImageBlock != NULL && ImageId != NULL);\r
-\r
- ImageBlockHdr = ImageBlock;\r
- ImageIdCurrent = 1;\r
-\r
- while (((EFI_HII_IMAGE_BLOCK *) ImageBlock)->BlockType != EFI_HII_IIBT_END) {\r
- if (*ImageId > 0) {\r
+ EFI_HII_IMAGE_BLOCK *CurrentImageBlock;\r
+ UINTN Length;\r
+\r
+ ASSERT (ImageBlocks != NULL && ImageId != NULL);\r
+ CurrentImageBlock = ImageBlocks;\r
+ ImageIdCurrent = 1;\r
+\r
+ while (CurrentImageBlock->BlockType != EFI_HII_IIBT_END) {\r
+ if (*ImageId != 0) {\r
if (*ImageId == ImageIdCurrent) {\r
//\r
// If the found image block is a duplicate block, update the ImageId to\r
// find the previous defined image block.\r
//\r
- if (((EFI_HII_IMAGE_BLOCK *) ImageBlock)->BlockType == EFI_HII_IIBT_DUPLICATE) {\r
- CopyMem (ImageId, ImageBlock + sizeof (EFI_HII_IMAGE_BLOCK), sizeof (EFI_IMAGE_ID));\r
+ if (CurrentImageBlock->BlockType == EFI_HII_IIBT_DUPLICATE) {\r
+ *ImageId = ReadUnaligned16 ((VOID *) &((EFI_HII_IIBT_DUPLICATE_BLOCK *) CurrentImageBlock)->ImageId);\r
ASSERT (*ImageId != ImageIdCurrent);\r
- ImageBlock = ImageBlockHdr;\r
+ ASSERT (*ImageId != 0);\r
+ CurrentImageBlock = ImageBlocks;\r
ImageIdCurrent = 1;\r
continue;\r
}\r
\r
- return ImageBlock;\r
+ return CurrentImageBlock;\r
}\r
if (*ImageId < ImageIdCurrent) {\r
//\r
return NULL;\r
}\r
}\r
- switch (((EFI_HII_IMAGE_BLOCK *) ImageBlock)->BlockType) {\r
+ switch (CurrentImageBlock->BlockType) {\r
case EFI_HII_IIBT_EXT1:\r
- Length8 = *(UINT8*)((UINTN)ImageBlock + sizeof (EFI_HII_IMAGE_BLOCK) + sizeof (UINT8));\r
- ImageBlock += Length8;\r
+ Length = ((EFI_HII_IIBT_EXT1_BLOCK *) CurrentImageBlock)->Length;\r
break;\r
case EFI_HII_IIBT_EXT2:\r
- CopyMem (\r
- &Length16,\r
- (UINT8*)((UINTN)ImageBlock + sizeof (EFI_HII_IMAGE_BLOCK) + sizeof (UINT8)),\r
- sizeof (UINT16)\r
- );\r
- ImageBlock += Length16;\r
+ Length = ReadUnaligned16 (&((EFI_HII_IIBT_EXT2_BLOCK *) CurrentImageBlock)->Length);\r
break;\r
case EFI_HII_IIBT_EXT4:\r
- CopyMem (\r
- &Length32,\r
- (UINT8*)((UINTN)ImageBlock + sizeof (EFI_HII_IMAGE_BLOCK) + sizeof (UINT8)),\r
- sizeof (UINT32)\r
- );\r
- ImageBlock += Length32;\r
+ Length = ReadUnaligned32 ((VOID *) &((EFI_HII_IIBT_EXT4_BLOCK *) CurrentImageBlock)->Length);\r
break;\r
\r
case EFI_HII_IIBT_IMAGE_1BIT:\r
case EFI_HII_IIBT_IMAGE_1BIT_TRANS:\r
- CopyMem (&Iibt1bit, ImageBlock, sizeof (EFI_HII_IIBT_IMAGE_1BIT_BLOCK));\r
- ImageBlock += sizeof (EFI_HII_IIBT_IMAGE_1BIT_BLOCK) - sizeof (UINT8) +\r
- BITMAP_LEN_1_BIT (Iibt1bit.Bitmap.Width, Iibt1bit.Bitmap.Height);\r
+ Length = sizeof (EFI_HII_IIBT_IMAGE_1BIT_BLOCK) - sizeof (UINT8) +\r
+ BITMAP_LEN_1_BIT (\r
+ ReadUnaligned16 (&((EFI_HII_IIBT_IMAGE_1BIT_BLOCK *) CurrentImageBlock)->Bitmap.Width),\r
+ ReadUnaligned16 (&((EFI_HII_IIBT_IMAGE_1BIT_BLOCK *) CurrentImageBlock)->Bitmap.Height)\r
+ );\r
ImageIdCurrent++;\r
break;\r
\r
case EFI_HII_IIBT_IMAGE_4BIT:\r
case EFI_HII_IIBT_IMAGE_4BIT_TRANS:\r
- CopyMem (&Iibt4bit, ImageBlock, sizeof (EFI_HII_IIBT_IMAGE_4BIT_BLOCK));\r
- ImageBlock += sizeof (EFI_HII_IIBT_IMAGE_4BIT_BLOCK) - sizeof (UINT8) +\r
- BITMAP_LEN_4_BIT (Iibt4bit.Bitmap.Width, Iibt4bit.Bitmap.Height);\r
+ Length = sizeof (EFI_HII_IIBT_IMAGE_4BIT_BLOCK) - sizeof (UINT8) +\r
+ BITMAP_LEN_4_BIT (\r
+ ReadUnaligned16 (&((EFI_HII_IIBT_IMAGE_4BIT_BLOCK *) CurrentImageBlock)->Bitmap.Width),\r
+ ReadUnaligned16 (&((EFI_HII_IIBT_IMAGE_4BIT_BLOCK *) CurrentImageBlock)->Bitmap.Height)\r
+ );\r
ImageIdCurrent++;\r
break;\r
\r
case EFI_HII_IIBT_IMAGE_8BIT:\r
case EFI_HII_IIBT_IMAGE_8BIT_TRANS:\r
- CopyMem (&Iibt8bit, ImageBlock, sizeof (EFI_HII_IIBT_IMAGE_8BIT_BLOCK));\r
- ImageBlock += sizeof (EFI_HII_IIBT_IMAGE_8BIT_BLOCK) - sizeof (UINT8) +\r
- BITMAP_LEN_8_BIT (Iibt8bit.Bitmap.Width, Iibt8bit.Bitmap.Height);\r
+ Length = sizeof (EFI_HII_IIBT_IMAGE_8BIT_BLOCK) - sizeof (UINT8) +\r
+ BITMAP_LEN_8_BIT (\r
+ ReadUnaligned16 (&((EFI_HII_IIBT_IMAGE_8BIT_BLOCK *) CurrentImageBlock)->Bitmap.Width),\r
+ ReadUnaligned16 (&((EFI_HII_IIBT_IMAGE_8BIT_BLOCK *) CurrentImageBlock)->Bitmap.Height)\r
+ );\r
ImageIdCurrent++;\r
break;\r
\r
case EFI_HII_IIBT_IMAGE_24BIT:\r
case EFI_HII_IIBT_IMAGE_24BIT_TRANS:\r
- CopyMem (&Width, ImageBlock + sizeof (EFI_HII_IMAGE_BLOCK), sizeof (UINT16));\r
- CopyMem (\r
- &Height,\r
- ImageBlock + sizeof (EFI_HII_IMAGE_BLOCK) + sizeof (UINT16),\r
- sizeof (UINT16)\r
- );\r
- ImageBlock += sizeof (EFI_HII_IIBT_IMAGE_24BIT_BLOCK) - sizeof (EFI_HII_RGB_PIXEL) +\r
- BITMAP_LEN_24_BIT (Width, Height);\r
+ Length = sizeof (EFI_HII_IIBT_IMAGE_24BIT_BLOCK) - sizeof (EFI_HII_RGB_PIXEL) +\r
+ BITMAP_LEN_24_BIT (\r
+ ReadUnaligned16 ((VOID *) &((EFI_HII_IIBT_IMAGE_24BIT_BLOCK *) CurrentImageBlock)->Bitmap.Width),\r
+ ReadUnaligned16 ((VOID *) &((EFI_HII_IIBT_IMAGE_24BIT_BLOCK *) CurrentImageBlock)->Bitmap.Height)\r
+ );\r
ImageIdCurrent++;\r
break;\r
\r
case EFI_HII_IIBT_DUPLICATE:\r
- ImageBlock += sizeof (EFI_HII_IIBT_DUPLICATE_BLOCK);\r
+ Length = sizeof (EFI_HII_IIBT_DUPLICATE_BLOCK);\r
ImageIdCurrent++;\r
break;\r
\r
case EFI_HII_IIBT_IMAGE_JPEG:\r
- CopyMem (&Length32, ImageBlock + sizeof (EFI_HII_IMAGE_BLOCK), sizeof (UINT32));\r
- ImageBlock += Length32;\r
+ Length = ReadUnaligned32 ((VOID *) &((EFI_HII_IIBT_JPEG_BLOCK *) CurrentImageBlock)->Size);\r
ImageIdCurrent++;\r
break;\r
\r
case EFI_HII_IIBT_SKIP1:\r
- Length8 = *(ImageBlock + sizeof (EFI_HII_IMAGE_BLOCK));\r
- ImageBlock += sizeof (EFI_HII_IIBT_SKIP1_BLOCK);\r
- ImageIdCurrent = (UINT16) (ImageIdCurrent + Length8);\r
+ Length = sizeof (EFI_HII_IIBT_SKIP1_BLOCK);\r
+ ImageIdCurrent += ((EFI_HII_IIBT_SKIP1_BLOCK *) CurrentImageBlock)->SkipCount;\r
break;\r
\r
case EFI_HII_IIBT_SKIP2:\r
- CopyMem (&Length16, ImageBlock + sizeof (EFI_HII_IMAGE_BLOCK), sizeof (UINT16));\r
- ImageBlock += sizeof (EFI_HII_IIBT_SKIP2_BLOCK);\r
- ImageIdCurrent = (UINT16) (ImageIdCurrent + Length16);\r
+ Length = sizeof (EFI_HII_IIBT_SKIP2_BLOCK);\r
+ ImageIdCurrent += ReadUnaligned16 ((VOID *) &((EFI_HII_IIBT_SKIP2_BLOCK *) CurrentImageBlock)->SkipCount);\r
break;\r
\r
default:\r
// Unknown image blocks can not be skipped, processing halts.\r
//\r
ASSERT (FALSE);\r
+ Length = 0;\r
+ break;\r
}\r
+\r
+ CurrentImageBlock = (EFI_HII_IMAGE_BLOCK *) ((UINT8 *) CurrentImageBlock + Length);\r
+\r
}\r
\r
//\r
//\r
if (*ImageId == 0) {\r
*ImageId = ImageIdCurrent;\r
- return ImageBlock;\r
+ return CurrentImageBlock;\r
}\r
\r
return NULL;\r
ImagePackage->ImageBlockSize - sizeof (EFI_HII_IIBT_END_BLOCK)\r
);\r
FreePool (ImagePackage->ImageBlock);\r
- ImagePackage->ImageBlock = ImageBlock;\r
+ ImagePackage->ImageBlock = (EFI_HII_IMAGE_BLOCK *) ImageBlock;\r
ImageBlock += ImagePackage->ImageBlockSize - sizeof (EFI_HII_IIBT_END_BLOCK);\r
//\r
// Temp memory to store new block.\r
// Fill in image blocks.\r
//\r
ImagePackage->ImageBlockSize = (UINT32) BlockSize;\r
- ImagePackage->ImageBlock = (UINT8 *) AllocateZeroPool (BlockSize);\r
+ ImagePackage->ImageBlock = AllocateZeroPool (BlockSize);\r
if (ImagePackage->ImageBlock == NULL) {\r
FreePool (ImagePackage);\r
return EFI_OUT_OF_RESOURCES;\r
}\r
- ImageBlock = ImagePackage->ImageBlock;\r
+ ImageBlock = (UINT8 *) ImagePackage->ImageBlock;\r
\r
//\r
// Temp memory to store new block.\r
// Find the image block specified by ImageId\r
//\r
LocalImageId = ImageId;\r
- ImageBlock = GetImageIdOrAddress (ImagePackage->ImageBlock, &LocalImageId);\r
+ ImageBlock = (UINT8 *) GetImageIdOrAddress (ImagePackage->ImageBlock, &LocalImageId);\r
if (ImageBlock == NULL) {\r
return EFI_NOT_FOUND;\r
}\r
// Find the image block specified by ImageId\r
//\r
LocalImageId = ImageId;\r
- ImageBlock = GetImageIdOrAddress (ImagePackage->ImageBlock, &LocalImageId);\r
+ ImageBlock = (UINT8 *) GetImageIdOrAddress (ImagePackage->ImageBlock, &LocalImageId);\r
if (ImageBlock == NULL) {\r
return EFI_NOT_FOUND;\r
}\r
}\r
\r
BlockPtr = Block;\r
- Part1Size = (UINT32) (ImageBlock - ImagePackage->ImageBlock);\r
+ Part1Size = (UINT32) (ImageBlock - (UINT8 *) ImagePackage->ImageBlock);\r
Part2Size = ImagePackage->ImageBlockSize - Part1Size - OldBlockSize;\r
CopyMem (BlockPtr, ImagePackage->ImageBlock, Part1Size);\r
BlockPtr += Part1Size;\r
\r
FreePool (ImagePackage->ImageBlock);\r
FreePool (NewBlock);\r
- ImagePackage->ImageBlock = Block;\r
+ ImagePackage->ImageBlock = (EFI_HII_IMAGE_BLOCK *) Block;\r
ImagePackage->ImageBlockSize = BlockSize;\r
ImagePackage->ImagePkgHdr.Header.Length += NewBlockSize - OldBlockSize;\r
PackageListNode->PackageListHdr.PackageLength += NewBlockSize - OldBlockSize;\r