From nobody Sat Nov 2 12:19:44 2024 Delivered-To: importer@patchew.org Received-SPF: none (zoho.com: 198.145.21.10 is neither permitted nor denied by domain of lists.01.org) client-ip=198.145.21.10; envelope-from=edk2-devel-bounces@lists.01.org; helo=ml01.01.org; Authentication-Results: mx.zoho.com; spf=none (zoho.com: 198.145.21.10 is neither permitted nor denied by domain of lists.01.org) smtp.mailfrom=edk2-devel-bounces@lists.01.org; Return-Path: Received: from ml01.01.org (ml01.01.org [198.145.21.10]) by mx.zohomail.com with SMTPS id 1491527911772127.24489639160481; Thu, 6 Apr 2017 18:18:31 -0700 (PDT) Received: from [127.0.0.1] (localhost [IPv6:::1]) by ml01.01.org (Postfix) with ESMTP id A8E5A20D77DDA; Thu, 6 Apr 2017 18:18:28 -0700 (PDT) Received: from mga06.intel.com (mga06.intel.com [134.134.136.31]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id E9EA820083178 for ; Thu, 6 Apr 2017 18:18:26 -0700 (PDT) Received: from orsmga004.jf.intel.com ([10.7.209.38]) by orsmga104.jf.intel.com with ESMTP; 06 Apr 2017 18:18:26 -0700 Received: from jfan12-desk.ccr.corp.intel.com ([10.239.158.57]) by orsmga004.jf.intel.com with ESMTP; 06 Apr 2017 18:18:25 -0700 X-Original-To: edk2-devel@lists.01.org X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.37,162,1488873600"; d="scan'208";a="74765713" From: Jeff Fan To: edk2-devel@lists.01.org Date: Fri, 7 Apr 2017 09:18:19 +0800 Message-Id: <20170407011823.12664-2-jeff.fan@intel.com> X-Mailer: git-send-email 2.9.3.windows.2 In-Reply-To: <20170407011823.12664-1-jeff.fan@intel.com> References: <20170407011823.12664-1-jeff.fan@intel.com> Subject: [edk2] [PATCH v2 1/5] MdePkg/PeCoffGetEntryPointLib: Add PeCoffSerachImageBase() X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.22 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Michael Kinney , Jiewen Yao , Liming Gao MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Errors-To: edk2-devel-bounces@lists.01.org Sender: "edk2-devel" X-ZohoMail: RSF_4 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" This new API only works on DEBUG build. It will search the PE/COFF image ba= se forward the input address in this PE/COFF image and returns it. Cc: Jiewen Yao Cc: Michael Kinney Cc: Liming Gao Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Jeff Fan --- MdePkg/Include/Library/PeCoffGetEntryPointLib.h | 20 +++++- .../PeCoffGetEntryPoint.c | 72 ++++++++++++++++++= +++- 2 files changed, 90 insertions(+), 2 deletions(-) diff --git a/MdePkg/Include/Library/PeCoffGetEntryPointLib.h b/MdePkg/Inclu= de/Library/PeCoffGetEntryPointLib.h index e517ca2..647503b 100644 --- a/MdePkg/Include/Library/PeCoffGetEntryPointLib.h +++ b/MdePkg/Include/Library/PeCoffGetEntryPointLib.h @@ -1,7 +1,7 @@ /** @file Provides a service to retrieve the PE/COFF entry point from a PE/COFF im= age. =20 -Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.
+Copyright (c) 2006 - 2017, Intel Corporation. All rights reserved.
This program and the accompanying materials are licensed and made availabl= e under=20 the terms and conditions of the BSD License that accompanies this distribu= tion. =20 The full text of the license may be found at @@ -101,4 +101,22 @@ PeCoffGetSizeOfHeaders ( IN VOID *Pe32Data ); =20 +/** + Returns PE/COFF image base specified by the address in this PE/COFF imag= e. + + On DEBUG build, searches the PE/COFF image base forward the address in t= his + PE/COFF image and returns it. + + @param Address Address located in one PE/COFF image. + + @retval 0 RELEASE build or cannot find the PE/COFF image base. + @retval others PE/COFF image base found. + +**/ +UINTN +EFIAPI +PeCoffSerachImageBase ( + IN UINTN Address + ); + #endif diff --git a/MdePkg/Library/BasePeCoffGetEntryPointLib/PeCoffGetEntryPoint.= c b/MdePkg/Library/BasePeCoffGetEntryPointLib/PeCoffGetEntryPoint.c index 0fb7e84..00f6d7d 100644 --- a/MdePkg/Library/BasePeCoffGetEntryPointLib/PeCoffGetEntryPoint.c +++ b/MdePkg/Library/BasePeCoffGetEntryPointLib/PeCoffGetEntryPoint.c @@ -2,7 +2,7 @@ Provides the services to get the entry point to a PE/COFF image that has= either been=20 loaded into memory or is executing at it's linked address. =20 - Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.
+ Copyright (c) 2006 - 2017, Intel Corporation. All rights reserved.
Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.
This program and the accompanying materials are licensed and made available under the terms and conditions of the BS= D License @@ -22,6 +22,8 @@ =20 #include =20 +#define PE_COFF_IMAGE_ALIGN_SIZE 4 + /** Retrieves and returns a pointer to the entry point to a PE/COFF image th= at has been loaded into system memory with the PE/COFF Loader Library functions. @@ -316,3 +318,71 @@ PeCoffGetSizeOfHeaders ( return (UINT32) SizeOfHeaders; } =20 +/** + Returns PE/COFF image base is loaded in system memory where the input ad= dress is in. + + On DEBUG build, searches the PE/COFF image base forward the input addres= s and + returns it. + + @param Address Address located in one PE/COFF image. + + @retval 0 RELEASE build or cannot find the PE/COFF image base. + @retval others PE/COFF image base found. + +**/ +UINTN +EFIAPI +PeCoffSerachImageBase ( + IN UINTN Address + ) +{ + UINTN Pe32Data; + + Pe32Data =3D 0; + + DEBUG_CODE ( + EFI_IMAGE_DOS_HEADER *DosHdr; + EFI_IMAGE_OPTIONAL_HEADER_PTR_UNION Hdr; + + // + // Find Image Base + // + Pe32Data =3D Address & ~(PE_COFF_IMAGE_ALIGN_SIZE - 1); + while (Pe32Data !=3D 0) { + DosHdr =3D (EFI_IMAGE_DOS_HEADER *) Pe32Data; + if (DosHdr->e_magic =3D=3D EFI_IMAGE_DOS_SIGNATURE) { + // + // DOS image header is present, so read the PE header after the DO= S image header. + // + Hdr.Pe32 =3D (EFI_IMAGE_NT_HEADERS32 *)(Pe32Data + (UINTN) ((DosHd= r->e_lfanew) & 0x0ffff)); + // + // Make sure PE header address does not overflow and is less than = the initial address. + // + if (((UINTN)Hdr.Pe32 > Pe32Data) && ((UINTN)Hdr.Pe32 < Address)) { + if (Hdr.Pe32->Signature =3D=3D EFI_IMAGE_NT_SIGNATURE) { + break; + } + } + } else { + // + // DOS image header is not present, TE header is at the image base. + // + Hdr.Pe32 =3D (EFI_IMAGE_NT_HEADERS32 *)Pe32Data; + if ((Hdr.Te->Signature =3D=3D EFI_TE_IMAGE_HEADER_SIGNATURE) && + ((Hdr.Te->Machine =3D=3D IMAGE_FILE_MACHINE_I386) || (Hdr.Te-= >Machine =3D=3D IMAGE_FILE_MACHINE_IA64) || + (Hdr.Te->Machine =3D=3D IMAGE_FILE_MACHINE_EBC) || (Hdr.Te-= >Machine =3D=3D IMAGE_FILE_MACHINE_X64) || + (Hdr.Te->Machine =3D=3D IMAGE_FILE_MACHINE_ARM64) || (Hdr.Te-= >Machine =3D=3D IMAGE_FILE_MACHINE_ARMTHUMB_MIXED)) + ) { + break; + } + } + + // + // Not found the image base, check the previous aligned address + // + Pe32Data -=3D PE_COFF_IMAGE_ALIGN_SIZE; + } + ); + + return Pe32Data; +} --=20 2.9.3.windows.2 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel