--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bintools/petools/pefile/pe_utl.cpp Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,94 @@
+// Copyright (c) 1996-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+#include <e32std.h>
+#include <e32std_private.h>
+#include "pe_file.h"
+#include <string.h>
+#include "e32image.h"
+#include "h_utl.h"
+
+TInt PEFile::CmpSectionName(PIMAGE_SECTION_HEADER apSectionHeader, char *aName)
+//
+// Returns true if the name of the pe section is the same as aName
+//
+ {
+
+ return (strnicmp((const char *)apSectionHeader->Name, aName, IMAGE_SIZEOF_SHORT_NAME)==0);
+ }
+
+TInt PEFile::VirtualAddressInSection(TUint aVA, PIMAGE_SECTION_HEADER aHeader)
+//
+// Returns true if the virtual address is in the section
+//
+ {
+
+ TUint start = iLinkedBase + aHeader->VirtualAddress;
+ TUint finish = start + aHeader->Misc.VirtualSize;
+ return (aVA>=start) && (aVA<finish);
+ }
+
+TUint PEFile::DistanceFromSection(TUint aVA, PIMAGE_SECTION_HEADER aHeader)
+//
+// Returns the minimum distance from aVA to any address in the specified section
+//
+ {
+
+ TUint start = iLinkedBase + aHeader->VirtualAddress;
+ TUint finish = start + aHeader->Misc.VirtualSize;
+ if (aVA>=start)
+ {
+ if (aVA<finish)
+ return 0;
+ return aVA - finish + 1;
+ }
+ return start - aVA;
+ }
+
+TInt PEFile::FindSectionByVa(TUint aVA, TUint aTryToBeClever)
+ {
+ TInt i;
+ TInt s = -1;
+ if (aTryToBeClever == 0)
+ {
+ for (i=0; i<KNumberOfSections; i++)
+ if (iSectionHeader[i])
+ if (VirtualAddressInSection(aVA, iSectionHeader[i]))
+ s=i;
+ }
+ if (aTryToBeClever == 1)
+ {
+ // Find the minimum distance from the specified address to any section
+ TUint dist = KMaxTUint;
+ for (i=0; i<KNumberOfSections; i++)
+ {
+ if (!iSectionHeader[i])
+ continue;
+ TUint d = DistanceFromSection(aVA, iSectionHeader[i]);
+ if (d < dist)
+ {
+ dist = d;
+ s = i;
+ }
+ else if (d == dist)
+ {
+ s = -1; // Ambiguous :-(
+ }
+ }
+ if (dist >= 0x1000u)
+ s = -1; // too far for comfort
+ }
+ return s;
+ }