If not given TargetFvName, all the existed target Ffs will be deleted'")\r
parser.add_argument("-e", "--Extract", dest="Extract", nargs='+',\r
help="Extract a Ffs Info: '-e inputfile TargetFvName(Optional) TargetFfsName outputfile\\r
- If not given TargetFvName, the first found target Ffs will be extracted'")\r
+ If not given TargetFvName, the first found target Ffs will be extracted.\\r
+ If only given TargetFvName, not given TargetFfsName, the TargetFv will be extracted to output file'")\r
parser.add_argument("-a", "--Add", dest="Add", nargs='+',\r
help="Add a Ffs into a FV:'-a inputfile TargetFvName newffsfile outputfile'")\r
parser.add_argument("-r", "--Replace", dest="Replace", nargs='+',\r
FmmtParser.WholeFvTree.FindNode(TargetFfs_name, FmmtParser.WholeFvTree.Findlist)\r
# Choose the Specfic DeleteFfs with Fv info\r
if Fv_name:\r
- for item in FmmtParser.WholeFvTree.Findlist:\r
- if item.Parent.key != Fv_name and item.Parent.Data.Name != Fv_name:\r
- FmmtParser.WholeFvTree.Findlist.remove(item)\r
+ FindNum = len(FmmtParser.WholeFvTree.Findlist)\r
+ for index in range(FindNum-1, -1, -1):\r
+ if FmmtParser.WholeFvTree.Findlist[index].Parent.key != Fv_name and FmmtParser.WholeFvTree.Findlist[index].Parent.Data.Name != Fv_name:\r
+ FmmtParser.WholeFvTree.Findlist.remove(FmmtParser.WholeFvTree.Findlist[index])\r
Status = False\r
if FmmtParser.WholeFvTree.Findlist != []:\r
for Delete_Ffs in FmmtParser.WholeFvTree.Findlist:\r
new_ffs.Data.PadData = GetPadSize(new_ffs.Data.Size, FFS_COMMON_ALIGNMENT) * b'\xff'\r
FmmtParser.WholeFvTree.FindNode(Ffs_name, FmmtParser.WholeFvTree.Findlist)\r
if Fv_name:\r
- for item in FmmtParser.WholeFvTree.Findlist:\r
- if item.Parent.key != Fv_name and item.Parent.Data.Name != Fv_name:\r
- FmmtParser.WholeFvTree.Findlist.remove(item)\r
+ FindNum = len(FmmtParser.WholeFvTree.Findlist)\r
+ for index in range(FindNum-1, -1, -1):\r
+ if FmmtParser.WholeFvTree.Findlist[index].Parent.key != Fv_name and FmmtParser.WholeFvTree.Findlist[index].Parent.Data.Name != Fv_name:\r
+ FmmtParser.WholeFvTree.Findlist.remove(FmmtParser.WholeFvTree.Findlist[index])\r
if FmmtParser.WholeFvTree.Findlist != []:\r
for TargetFfs in FmmtParser.WholeFvTree.Findlist:\r
FfsMod = FvHandler(newFmmtParser.WholeFvTree.Child[0], TargetFfs)\r
logger.debug('Done!')\r
FmmtParser.WholeFvTree.FindNode(Ffs_name, FmmtParser.WholeFvTree.Findlist)\r
if Fv_name:\r
- for item in FmmtParser.WholeFvTree.Findlist:\r
- if item.Parent.key != Fv_name and item.Parent.Data.Name != Fv_name:\r
- FmmtParser.WholeFvTree.Findlist.remove(item)\r
+ FindNum = len(FmmtParser.WholeFvTree.Findlist)\r
+ for index in range(FindNum-1, -1, -1):\r
+ if FmmtParser.WholeFvTree.Findlist[index].Parent.key != Fv_name and FmmtParser.WholeFvTree.Findlist[index].Parent.Data.Name != Fv_name:\r
+ FmmtParser.WholeFvTree.Findlist.remove(FmmtParser.WholeFvTree.Findlist[index])\r
if FmmtParser.WholeFvTree.Findlist != []:\r
TargetNode = FmmtParser.WholeFvTree.Findlist[0]\r
- TargetFv = TargetNode.Parent\r
- if TargetFv.Data.Header.Attributes & EFI_FVB2_ERASE_POLARITY:\r
- TargetNode.Data.Header.State = c_uint8(\r
- ~TargetNode.Data.Header.State)\r
- FinalData = struct2stream(TargetNode.Data.Header) + TargetNode.Data.Data\r
- with open(outputfile, "wb") as f:\r
- f.write(FinalData)\r
- logger.debug('Extract ffs data is saved in {}.'.format(outputfile))\r
+ if TargetNode.type == FV_TREE or SEC_FV_TREE or DATA_FV_TREE:\r
+ FinalData = struct2stream(TargetNode.Data.Header) + TargetNode.Data.Data\r
+ with open(outputfile, "wb") as f:\r
+ f.write(FinalData)\r
+ logger.debug('Extract fv data is saved in {}.'.format(outputfile))\r
+ else:\r
+ TargetFv = TargetNode.Parent\r
+ if TargetFv.Data.Header.Attributes & EFI_FVB2_ERASE_POLARITY:\r
+ TargetNode.Data.Header.State = c_uint8(\r
+ ~TargetNode.Data.Header.State)\r
+ FinalData = struct2stream(TargetNode.Data.Header) + TargetNode.Data.Data\r
+ with open(outputfile, "wb") as f:\r
+ f.write(FinalData)\r
+ logger.debug('Extract ffs data is saved in {}.'.format(outputfile))\r
else:\r
- logger.error('Target Ffs not found!!!')\r
+ logger.error('Target Ffs/Fv not found!!!')\r
def CompressData(self, TargetTree) -> None:\r
TreePath = TargetTree.GetTreePath()\r
pos = len(TreePath)\r
- self.Status = False\r
while pos:\r
if not self.Status:\r
if TreePath[pos-1].type == SECTION_TREE and TreePath[pos-1].Data.Type == 0x02:\r
~self.NewFfs.Data.Header.State)\r
# If TargetFv have enough free space, just move part of the free space to NewFfs, split free space to NewFfs and new free space.\r
if TargetLen < 0:\r
- self.Status = True\r
self.TargetFfs.Data.Data = b'\xff' * (-TargetLen)\r
TargetFv.Data.Free_Space = (-TargetLen)\r
TargetFv.Data.ModFvExt()\r
ModifyFfsType(self.NewFfs)\r
# Recompress from the Fv node to update all the related node data.\r
self.CompressData(TargetFv)\r
- elif TargetLen == 0:\r
self.Status = True\r
+ elif TargetLen == 0:\r
TargetFv.Child.remove(self.TargetFfs)\r
TargetFv.insertChild(self.NewFfs)\r
ModifyFfsType(self.NewFfs)\r
# Recompress from the Fv node to update all the related node data.\r
self.CompressData(TargetFv)\r
+ self.Status = True\r
# If TargetFv do not have enough free space, need move part of the free space of TargetFv's parent Fv to TargetFv/NewFfs.\r
else:\r
if TargetFv.type == FV_TREE:\r