From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mga17.intel.com (mga17.intel.com [192.55.52.151]) by mx.groups.io with SMTP id smtpd.web12.7476.1630500844894862255 for ; Wed, 01 Sep 2021 05:54:05 -0700 Authentication-Results: mx.groups.io; dkim=pass header.i=@intel.onmicrosoft.com header.s=selector2-intel-onmicrosoft-com header.b=OG+trVJQ; spf=pass (domain: intel.com, ip: 192.55.52.151, mailfrom: chasel.chiu@intel.com) X-IronPort-AV: E=McAfee;i="6200,9189,10093"; a="198972173" X-IronPort-AV: E=Sophos;i="5.84,369,1620716400"; d="scan'208";a="198972173" Received: from orsmga004.jf.intel.com ([10.7.209.38]) by fmsmga107.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 01 Sep 2021 05:54:03 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.84,369,1620716400"; d="scan'208";a="577537911" Received: from fmsmsx603.amr.corp.intel.com ([10.18.126.83]) by orsmga004.jf.intel.com with ESMTP; 01 Sep 2021 05:54:03 -0700 Received: from fmsmsx611.amr.corp.intel.com (10.18.126.91) by fmsmsx603.amr.corp.intel.com (10.18.126.83) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2242.12; Wed, 1 Sep 2021 05:54:03 -0700 Received: from fmsmsx611.amr.corp.intel.com (10.18.126.91) by fmsmsx611.amr.corp.intel.com (10.18.126.91) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2242.10; Wed, 1 Sep 2021 05:54:02 -0700 Received: from fmsedg602.ED.cps.intel.com (10.1.192.136) by fmsmsx611.amr.corp.intel.com (10.18.126.91) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2242.10 via Frontend Transport; Wed, 1 Sep 2021 05:54:02 -0700 Received: from NAM12-DM6-obe.outbound.protection.outlook.com (104.47.59.172) by edgegateway.intel.com (192.55.55.71) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.1.2242.10; Wed, 1 Sep 2021 05:54:01 -0700 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=MdsjFl6MKFmtU40YKHXu1bD6I5sdRKBmFrRYbhfzj4RaTvkBRqAOBwOTo+f3iCS7G/ddALb5FpIDzTReUVxrF/D707ZcvQrKUYl95d3+phmdssVHFx8RtCjixdAuTO2tDZpn0MiLhWdFnYipYzp7/fnSAvfOnEzkEXnH2mYYYudx4K/xuAPWY4Aimnk5DOx3Z0RluTSyypWDet2agLW1O35nHhE8Gb8fqkfXdjSBRmfdCAh+XRPl7QrwJupxRjTu5XxcotqqQu+9OAZRcdoj5cC/jykXQLSf9w4dKINq8pnID8BSf+rR0MIkuyQW11Zkl+EjA2M2wsVm9oecRRa4hw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=8D/WMxayJbC2GSWtYAfruWv+WdqWnwYBWqF6ubrnDF8=; b=ZdyPAfViPUQqwDoJqsyDgJcmtO3xCVNQ3Y7Tjy32/sFGHL4HvO4SWtaAW/9Kocf1smPK0KUqYuhoBZL/WxEnpaIpImPA3/CBqUnVMGOsUqagdRqJ4KRpOlBhZeLeS9ik+HYufoFmyAiUeDbjJRG+vMYtUcBvxWK/p517+j3jB8HedYrhBGoGcEruE7WCRYcd3PcqP9JiUDp6JYuSsbd9g5NhdXaxWNDXrqks9AHKeaugmodyGwDS/oCJv+TxoRHX6jiJ8th9AD/khB1x00QGO3PfAfj3/a77bI9+CVrV1wTCa1DKV1KaF6VxEZDDB09iqRrApDBAozlsQ4rxcPbekw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=intel.com; dmarc=pass action=none header.from=intel.com; dkim=pass header.d=intel.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=intel.onmicrosoft.com; s=selector2-intel-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=8D/WMxayJbC2GSWtYAfruWv+WdqWnwYBWqF6ubrnDF8=; b=OG+trVJQOcyl8jJ3tm5J3QUUtw1PpWCqE0WuP8o718VDfI1p4V8vvBp1L7hE4aKsaiz5kgkUYJ4gDwBYEo1YiP4oXwrg14nsh3WvZO1dbm7xtTcA96igv4hs2EvndR8UQ+luTzwudnRmVwV5rE9fwrb9Xck/W/4h7rJYUZw2Nyc= Received: from BN9PR11MB5483.namprd11.prod.outlook.com (2603:10b6:408:104::10) by BN6PR11MB3860.namprd11.prod.outlook.com (2603:10b6:405:77::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4457.23; Wed, 1 Sep 2021 12:53:58 +0000 Received: from BN9PR11MB5483.namprd11.prod.outlook.com ([fe80::882:4e40:b0e4:239e]) by BN9PR11MB5483.namprd11.prod.outlook.com ([fe80::882:4e40:b0e4:239e%6]) with mapi id 15.20.4457.024; Wed, 1 Sep 2021 12:53:58 +0000 From: "Chiu, Chasel" To: "Loo, Tung Lun" , "devel@edk2.groups.io" CC: "Ma, Maurice" , "Desimone, Nathaniel L" , "Zeng, Star" Subject: Re: [PATCH] IntelFsp2Pkg: Support Config File and Binary delta comparison Thread-Topic: [PATCH] IntelFsp2Pkg: Support Config File and Binary delta comparison Thread-Index: AQHXkzuWsfXmAVOSk0mZdLHagBSKr6uPOkyw Date: Wed, 1 Sep 2021 12:53:57 +0000 Message-ID: References: <20210817074312.1313-1-tung.lun.loo@intel.com> In-Reply-To: <20210817074312.1313-1-tung.lun.loo@intel.com> Accept-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: dlp-product: dlpe-windows dlp-reaction: no-action dlp-version: 11.6.200.16 authentication-results: intel.com; dkim=none (message not signed) header.d=none;intel.com; dmarc=none action=none header.from=intel.com; x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: cb51fe4b-70f5-4ddd-c9f9-08d96d479045 x-ms-traffictypediagnostic: BN6PR11MB3860: x-ms-exchange-transport-forked: True x-microsoft-antispam-prvs: x-ms-oob-tlc-oobclassifiers: OLM:109; x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: 0tSdjb9Bzol24MLfG6vOWCBJB9WEOITsTt1kgSm3xAGR/i4BQ4TCnS1+QqkphRUQm/nFL8SR7o2jDVu4SG/ypJJ6xSQP9xknXQ86hP4/9ZFO4F1Y1AH6vGnFdtMYt1nbGBuaGjpPSWxT7S4ms7FJaM3aZ+ZN/Uku9EI99mp+wjz1np3QoJ4cjQLt8MW17xlMnNIyGCnPRlvCKLRYacFlCivV9p1DQg+GaGXVZGfVdnrilSZlyguq1M7DQRvpCdNk+pmuvGz5moS17PUAFNG1tK41GfQIXwIIqoD7PSWIbOJGyj/3L+RTy0c/hwQmUV+6Fsu3bbnpxjaxw7jMkrh/pQf6SdO3JZs5JDa6e6ZcJhoIA43nWrsWJ/qw6ObHGtZ6vQJ9ZplXvwOVW9T7uTM8JuK3T/59YAG6ZjrDhg/mgqmZ1njLS1uUy5sCaDHOvr8i+gFoCslq7XvFeCH35yziGZLwOkvZ44t+oSvDnsfj3c3xrDi0HxKNW1KM5CwdojJdW7jLLrz2uneqbL5/oBwBsjEhExmBdiCdS4vSCSLXqqIYB1dltb6n7FsNe8eo5pRPVEthOOxhXZQ6WVcFvRBNU9tKnQbUTlKoPJ5Snd38wBJROkFot9i4m35EpUoAkfeFPxIqIN5g4IX/aR9udww2LPq4LqIN2CwAC7J2rn/OuJmDe56LXwVbXh6S0iKV/ityZsIByTwYQG2+9JCNPPRTC/RQ9KbtsDzek7zHasR9omdJA8a30RSDnq9lLXFCT2xPud8mu7J7uh6ZBg/ve7I0C3JKDWKFoPNUa/XbYxYUlmRXm6ACOb0P4Q6TFoVEGDhCUPXwvRqE9sYWi9uBwT7trA== x-forefront-antispam-report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:BN9PR11MB5483.namprd11.prod.outlook.com;PTR:;CAT:NONE;SFS:(4636009)(396003)(366004)(346002)(136003)(39860400002)(376002)(33656002)(122000001)(55016002)(966005)(316002)(9686003)(19627235002)(5660300002)(52536014)(2906002)(38070700005)(38100700002)(4326008)(76116006)(83380400001)(66946007)(64756008)(66446008)(107886003)(86362001)(8936002)(8676002)(71200400001)(66476007)(186003)(54906003)(478600001)(110136005)(26005)(66556008)(7696005)(53546011)(6506007);DIR:OUT;SFP:1102; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?us-ascii?Q?F3c8Mju4I22+ZRDh0s3FMT9y0vwMZ8FZBGK6qmiGGmKY6hJj8Aq2TrZYO7V8?= =?us-ascii?Q?akJRlgD1icj0tecrY12bTWvmmi20JFSOrMg/srEtUDsK1cgMkTqRlzqDV4Ii?= =?us-ascii?Q?6W7RaCvhQcJt6I55u9TdJ9oRrmM6Cr7Y+vzJdRddzeZFNAXfYV4RErMisrUV?= =?us-ascii?Q?Ipv6+yWfPVK/Wapm37ZOy/FBpVqY3tUAhCZptcmWkpnGweYHlPAFzPK9UR3s?= =?us-ascii?Q?WZwEVIF7E432BicOG6Hx3s1BPKtJ88AB1RhvZ0l1g8gw1eGb5xdJIQf4Z6qO?= =?us-ascii?Q?b2NQLbYnfwMinzZHTdIjtnGrU8J6kAgGWl09n8Jwv85JvlMhIjo4uFBhDK9w?= =?us-ascii?Q?+3tK4DAHiaSsvzKZ/0ARKJqYstXRQIQwpZzb14s9FDro23jKfuNhDn5cHxUt?= =?us-ascii?Q?nhqYHB4qGmjN0g9nXEjq5ZNRPKAZ5N3PZled/Tol4gK2NJqqC/jjfcH2V45H?= =?us-ascii?Q?n9Eixq8GfrsL/VPFNzY+ZK+vtnOYSeUUgE2ouSEA9bVp140qALJ/yFaGfabj?= =?us-ascii?Q?1/E93uZvUEcw3sfRV425Rj+WkgVuhJd3hDfT5YMJ8A32jfw7TP0ZyzIaewtp?= =?us-ascii?Q?VmAgXaF8mFWIBaHxhhKN6ev/Nh+LMVz4fXUuvQ3S2wQo55/Iv2CV77wAMrPk?= =?us-ascii?Q?6feyDbdPM790OfEj6/mC7lUMp2P8+cfninhdibMgF/ybCy8VNG+XfPgPz5Od?= =?us-ascii?Q?q02dnDXuhGzhbg8uS4vj9OPkdu/S0iWHkpEoR9eI35XHQSDJM4Q1PwuGO2RC?= =?us-ascii?Q?/CwgDkhrK9gF7fmfjpt08heXZOgPmk1i5Qjxk20bgzpW3i21BgT67F/nZaI4?= =?us-ascii?Q?mRf6qR0zpYlYFZRY0GBPhZ88D1nfsXd4RI0DhJQwMZh5+k2f17++eBUYVTvd?= =?us-ascii?Q?PYFMU2dsjvD3suRuzKERPSZ3LqEUsnK8PxmmDX1OJr8frbgcg0G5ZlD71ysf?= =?us-ascii?Q?AER4kV3yXGhNYxwKQZISlPIvARnxa6TUvrf73J+FVW0Nr8UGOTjuULuplgfM?= =?us-ascii?Q?72rPEn//6SzUFcWp1echmIDjpjq6Niza5jVjMqrHnFy9d6LqzZGRvCQ2OIs5?= =?us-ascii?Q?m1gy3xpbXFaau4HC1zgQFgTvyGnR0DfKQTorsTKb8XQfP9TMso67jsEDpvun?= =?us-ascii?Q?y46sIBwZIVD0nUx0e13pqyt5i4Q18HtsIFTt2cLPVasdOR2cnzDdNJoGz0gv?= =?us-ascii?Q?8ryGAsgteWSMR9GuPQmZv37wJFAOy6eSH/xUcsoKxC772Ug0UJFuuvEb4wio?= =?us-ascii?Q?AgeuwK1puQvUilFKOBekStBXQfLi8gJHqVhGHhGfTMkidmRmnjfrBMBO3b+8?= =?us-ascii?Q?4xW7FvR+zyv5gKi5lBIKW5c8?= MIME-Version: 1.0 X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: BN9PR11MB5483.namprd11.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: cb51fe4b-70f5-4ddd-c9f9-08d96d479045 X-MS-Exchange-CrossTenant-originalarrivaltime: 01 Sep 2021 12:53:57.7994 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 46c98d88-e344-4ed4-8496-4ed7712e255d X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: nvi7a6y3nYVaNv+VSlFvI6idoZ30uPSO/rNvJv6dQRIoYV67lQKzzqXZev/SqQ8N21F1I2PLLiuqoOzNOqLMDg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: BN6PR11MB3860 Return-Path: chasel.chiu@intel.com X-OriginatorOrg: intel.com Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Pushed: https://github.com/tianocore/edk2/commit/12e33dca4c0612a0975265e5ba= 641c6261a26455 Thanks, Chasel > -----Original Message----- > From: Loo, Tung Lun > Sent: Tuesday, August 17, 2021 3:43 PM > To: devel@edk2.groups.io > Cc: Loo, Tung Lun ; Ma, Maurice > ; Desimone, Nathaniel L > ; Zeng, Star ; Chiu, > Chasel > Subject: [PATCH] IntelFsp2Pkg: Support Config File and Binary delta compa= rison >=20 > From: "Loo, Tung Lun" >=20 > BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=3D3567 >=20 > This patch is to enable config editor to have a new feature that can spel= l out the > delta between the default configuration files' > data, such as YAML and BSF, against the data stored in the binary. > This can help users understand and track the difference when modification= s are > made. >=20 > Cc: Maurice Ma > Cc: Nate DeSimone > Cc: Star Zeng > Cc: Chasel Chiu > Signed-off-by: Loo Tung Lun > --- > IntelFsp2Pkg/Tools/ConfigEditor/ConfigEditor.py | 43 > ++++++++++++++++++++++++++++++++++++++----- > IntelFsp2Pkg/Tools/ConfigEditor/GenYamlCfg.py | 121 > +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > +++++++++++++++++++++++++++++++++++++++++++++++--------- > 2 files changed, 150 insertions(+), 14 deletions(-) >=20 > diff --git a/IntelFsp2Pkg/Tools/ConfigEditor/ConfigEditor.py > b/IntelFsp2Pkg/Tools/ConfigEditor/ConfigEditor.py > index 008c7d7a16..680b90e09d 100644 > --- a/IntelFsp2Pkg/Tools/ConfigEditor/ConfigEditor.py > +++ b/IntelFsp2Pkg/Tools/ConfigEditor/ConfigEditor.py > @@ -807,12 +807,12 @@ class application(tkinter.Frame): > self.page_id =3D '' self.page_list =3D {} self.c= onf_list =3D {}+ > self.cfg_page_dict =3D {} self.cfg_data_obj =3D None self= .org_cfg_data_bin > =3D None self.in_left =3D state() self.in_right =3D state= () self.search_text =3D > ''- self.binseg_dict =3D {} # Check if current directory = contains a file with > a .yaml extension # if not default self.last_dir to a Platform di= rectory where > it is@@ -1009,10 +1009,17 @@ class application(tkinter.Frame): > return visible if self.cfg_data_obj.binseg_dict: = str_split =3D > item['path'].split('.')- if self.cfg_data_obj.binseg_dict[str_= split[-2]] =3D=3D -1:- > visible =3D False- widget.grid_remove()- re= turn visible+ if > str_split[-2] not in CGenYamlCfg.available_fv and \+ s= tr_split[-2] not > in CGenYamlCfg.missing_fv:+ if self.cfg_data_obj.binseg_di= ct[str_split[- > 3]] =3D=3D -1:+ visible =3D False+ = widget.grid_remove()+ > return visible+ else:+ if self.cfg_data_obj.bin= seg_dict[str_split[-2]] > =3D=3D -1:+ visible =3D False+ widg= et.grid_remove()+ > return visible result =3D 1 if item['condition']: = result =3D > self.evaluate_condition(item)@@ -1371,8 +1378,34 @@ class > application(tkinter.Frame): > self.clear_widgets_inLayout() > self.on_config_page_select_change(None) + def set_config_data_page(sel= f):+ > page_id_list =3D []+ for idx, page in enumerate(+ > self.cfg_data_obj._cfg_page['root']['child']):+ > page_id_list.append(list(page.keys())[0])+ page_list =3D > self.cfg_data_obj.get_cfg_list(page_id_list[idx])+ > self.cfg_page_dict[page_id_list[idx]] =3D 0+ for item in page_= list:+ > str_split =3D item['path'].split('.')+ if str_split[-2] no= t in > CGenYamlCfg.available_fv and \+ str_split[-2] not = in > CGenYamlCfg.missing_fv:+ if self.cfg_data_obj.binseg_d= ict[str_split[- > 3]] !=3D -1:+ self.cfg_page_dict[page_id_list[idx]= ] +=3D 1+ else:+ > if self.cfg_data_obj.binseg_dict[str_split[-2]] !=3D -1:+ > self.cfg_page_dict[page_id_list[idx]] +=3D 1+ removed_page =3D 0+ = for idx, > id in enumerate(page_id_list):+ if self.cfg_page_dict[id] =3D= =3D 0:+ del > self.cfg_data_obj._cfg_page['root']['child'][idx-removed_page] # noqa: E= 501+ > removed_page +=3D 1+ def reload_config_data_from_bin(self, bin_dat): > self.cfg_data_obj.load_default_from_bin(bin_dat)+ > self.set_config_data_page()+ self.left.delete(*self.left.get_child= ren())+ > self.build_config_page_tree(self.cfg_data_obj.get_cfg_page()['root'],+ > '') self.refresh_config_data_page() def set_config_item_valu= e(self, item, > value_str):diff --git a/IntelFsp2Pkg/Tools/ConfigEditor/GenYamlCfg.py > b/IntelFsp2Pkg/Tools/ConfigEditor/GenYamlCfg.py > index 611a9a9c72..b593885807 100644 > --- a/IntelFsp2Pkg/Tools/ConfigEditor/GenYamlCfg.py > +++ b/IntelFsp2Pkg/Tools/ConfigEditor/GenYamlCfg.py > @@ -13,6 +13,7 @@ import string > import operator as op import ast import tkinter.messagebox as > messagebox+import tkinter from datetime import date from collections imp= ort > OrderedDict@@ -583,7 +584,6 @@ class CGenYamlCfg: > self._mode =3D '' self._debug =3D False self._ma= cro_dict =3D {}- > self.bin_offset =3D [] self.binseg_dict =3D {} self.initi= alize() @@ -1046,6 > +1046,7 @@ option format '%s' !" % option) > try: value =3D self.reformat_value_s= tr(act_cfg['value'], > act_cfg['length'])+ except Exception: = value =3D act_cfg['value'] > length =3D bit_len // 8@@ -1298,18 +1299,85 @@ option format '%s' !" % op= tion) > self.traverse_cfg_tree(_get_field_value, top) return res= ult + data_diff > =3D ''++ def find_data_difference(self, act_val, act_cfg):+ # c= hecks for any > difference between BSF and Binary file+ config_val =3D ''+ = if act_val !=3D > act_cfg['value']:++ if 'DEC' in act_cfg['type']:+ = bsf_val =3D '0x%x' % > int(act_val)+ if bsf_val !=3D act_cfg['value']:+ = config_val =3D > bsf_val+ else:+ config_val =3D ''+ = else:+ > config_val =3D act_val++ available_fv1 =3D 'none'+ = available_fv2 =3D > 'none'++ if self.detect_fsp():+ if len(self.ava= ilable_fv) >=3D 1:+ > if len(self.available_fv) > 1:+ available_fv1 =3D = self.available_fv[1]+ > if self.available_fv[2]:+ available_fv2 =3D se= lf.available_fv[2]+ > else:+ available_fv1 =3D self.available_fv[1]+ = if act_cfg['length'] > =3D=3D 16:+ config_val =3D int(config_val, 16)+ = config_val =3D '0x%x' > % config_val+ act_cfg['value'] =3D int(+ = act_cfg['value'], > 16)+ act_cfg['value'] =3D '0x%x' % \+ = act_cfg['value']++ > if config_val:+ string =3D ('.' + act_cfg['cname'])+ = if > (act_cfg['path'].endswith(self.available_fv[0] + string)+ = or > act_cfg['path'].endswith(available_fv1 + string)+ or > act_cfg['path'].endswith(available_fv2 + string)) \+ a= nd 'BsfSkip' not in > act_cfg['cname'] \+ and 'Reserved' not in act_cfg[= 'name']:+ > if act_cfg['option'] !=3D '':+ if act_cfg['length'= ] =3D=3D 8:+ > config_val =3D int(config_val, 16)+ config_val= =3D '0x%x' % > config_val+ act_cfg['value'] =3D int(+ > act_cfg['value'], 16)+ act_cfg['value'] =3D '0= x%x' % \+ > act_cfg['value']+ option =3D act_cfg['option']++ = cfg_val =3D > ''+ bin_val =3D ''+ for i i= n option.split(','):+ if > act_cfg['value'] in i:+ bin_val =3D i+ = elif config_val > in i:+ cfg_val =3D i+ = if cfg_val !=3D '' and bin_val !=3D '':+ > self.data_diff +=3D '\n\nBinary: ' \+ = + act_cfg['name'] \+ > + ': ' + bin_val.replace(' ', '') \+ + '\n= Config file: ' \+ > + act_cfg['name'] + ': ' \+ + cfg_val.repl= ace(' ', '') + '\n'+ > else:+ self.data_diff +=3D '\n\nBinary: ' \= + + > act_cfg['name'] + ': ' + act_cfg['value'] \+ += '\nConfig file: ' + > act_cfg['name'] \+ + ': ' + config_val + '\n'+= def > set_field_value(self, top, value_bytes, force=3DFalse): def > _set_field_value(name, cfgs, level): if 'indx' not in cfgs: = return > act_cfg =3D self.get_item_by_index(cfgs['indx']) actual_offse= t =3D > act_cfg['offset'] - struct_info['offset']- set_value =3D True-= for each in > self.bin_offset:- if actual_offset in range(each[0], (each= [0] + each[2]) * > 8):- if each[1] < 0:- set_value= =3D False- if set_value > and force or act_cfg['value'] =3D=3D '':+ if force or act_cfg[= 'value'] =3D=3D '': > value =3D get_bits_from_bytes(full_bytes, = actual_offset, > act_cfg['length'])@@ -1321,6 +1389,7 @@ option format '%s' !" % option) > act_val) = act_cfg['value'] =3D > self.format_value_to_str( value, act_cfg['length'], a= ct_val)+ > self.find_data_difference(act_val, act_cfg) if 'indx' in top: = # it is > config option@@ -1438,6 +1507,9 @@ for '%s' !" % (act_cfg['value'], > act_cfg['path'])) > return bin_segs + available_fv =3D []+ missing_fv =3D []+= def > extract_cfg_from_bin(self, bin_data): # get cfg bin length = cfg_bins =3D > bytearray()@@ -1445,12 +1517,12 @@ for '%s' !" % (act_cfg['value'], > act_cfg['path'])) > Dummy_offset =3D 0 for each in bin_segs: if = each[1] !=3D -1:- > self.bin_offset.append([Dummy_offset, each[1], each[2]]) > cfg_bins.extend(bin_data[each[1]:each[1] + each[2]])+ > self.available_fv.append(each[0]) else:+ > self.missing_fv.append(each[0]) string =3D each[0] + ' is= not availabe.' > messagebox.showinfo('', string)- self.bin_offset.append([D= ummy_offset, > each[1], each[2]]) cfg_bins.extend(bytearray(each[2])) > Dummy_offset +=3D each[2] return cfg_bins@@ -1476,10 +1548,41 @@ = for > '%s' !" % (act_cfg['value'], act_cfg['path'])) > print('Patched the loaded binary successfully !') return= bin_data + def > show_data_difference(self, data_diff):+ # Displays if any data dif= ference > detected in BSF and Binary file+ pop_up_text =3D 'There are differ= ences in > Config file and binary '\+ 'data detected!\n'+ pop_up_t= ext +=3D > data_diff++ window =3D tkinter.Tk()+ window.title("Data Dif= ference")+ > window.resizable(1, 1)+ # Window Size+ window.geometry("800= x400")+ > frame =3D tkinter.Frame(window, height=3D800, width=3D700)+ > frame.pack(side=3Dtkinter.BOTTOM)+ # Vertical (y) Scroll Bar+ = scroll =3D > tkinter.Scrollbar(window)+ scroll.pack(side=3Dtkinter.RIGHT, fill= =3Dtkinter.Y)++ > text =3D tkinter.Text(window, wrap=3Dtkinter.NONE,+ > yscrollcommand=3Dscroll.set,+ width=3D700, hei= ght=3D400)+ > text.insert(tkinter.INSERT, pop_up_text)+ text.pack()+ # Co= nfigure the > scrollbars+ scroll.config(command=3Dtext.yview)+ exit_butto= n =3D > tkinter.Button(+ window, text=3D"Close", command=3Dwindow.dest= roy)+ > exit_button.pack(in_=3Dframe, side=3Dtkinter.RIGHT, padx=3D20, pady=3D10)= + def > load_default_from_bin(self, bin_data): self._old_bin =3D bin_data > cfg_bins =3D self.extract_cfg_from_bin(bin_data) > self.set_field_value(self._cfg_tree, cfg_bins, True)++ if self.dat= a_diff:+ > self.show_data_difference(self.data_diff) return cfg_bins de= f > generate_binary_array(self, path=3D''):-- > 2.26.2.windows.1