https://git.reactos.org/?p=reactos.git;a=commitdiff;h=1e568ce62d3fc3a30ef46…
commit 1e568ce62d3fc3a30ef460668aaacbafba071c25
Author: Mark Jansen <mark.jansen(a)reactos.org>
AuthorDate: Sat Sep 1 21:09:18 2018 +0200
Commit: Timo Kreuzer <timo.kreuzer(a)reactos.org>
CommitDate: Wed Dec 12 00:41:07 2018 +0100
[SDK] Update gen_baseaddress.
* Speed up the script by using the fallback by default
* Suggest what cmake file to edit
* Add support for x64 modules (addresses not updated yet)
CORE-14923
---
sdk/tools/gen_baseaddress.py | 72 +++++++++++++++++++++++++++++++++++---------
1 file changed, 57 insertions(+), 15 deletions(-)
diff --git a/sdk/tools/gen_baseaddress.py b/sdk/tools/gen_baseaddress.py
index 5219a4ee32..3a4c1e68d5 100644
--- a/sdk/tools/gen_baseaddress.py
+++ b/sdk/tools/gen_baseaddress.py
@@ -190,6 +190,16 @@ EXCLUDE = (
'w32kdll_xpsp2.dll',
)
+IMAGE_NT_OPTIONAL_HDR32_MAGIC = 0x10b
+IMAGE_NT_OPTIONAL_HDR64_MAGIC = 0x20b
+
+IMAGE_TYPES = {
+ IMAGE_NT_OPTIONAL_HDR32_MAGIC: 0,
+ IMAGE_NT_OPTIONAL_HDR64_MAGIC: 0
+}
+
+def is_x64():
+ return IMAGE_TYPES[IMAGE_NT_OPTIONAL_HDR64_MAGIC] >
IMAGE_TYPES[IMAGE_NT_OPTIONAL_HDR32_MAGIC]
def size_of_image_fallback(filename):
with open(filename, 'rb') as fin:
@@ -204,25 +214,30 @@ def size_of_image_fallback(filename):
return 0
fin.seek(e_lfanew + 0x18)
pe_magic = struct.unpack('h', fin.read(2))[0]
- if pe_magic != 0x10b:
- print(filename, 'is not a 32 bit exe!')
- return 0
- fin.seek(e_lfanew + 0x50)
- pe_size_of_image = struct.unpack('i', fin.read(4))[0]
- return pe_size_of_image
+ if pe_magic in IMAGE_TYPES.keys():
+ IMAGE_TYPES[pe_magic] += 1
+ fin.seek(e_lfanew + 0x50)
+ pe_size_of_image = struct.unpack('i', fin.read(4))[0]
+ return pe_size_of_image
+ print(filename, 'Unknown executable format!')
+ return 0
-def size_of_image(filename):
- if 'pefile' in globals():
- return pefile.PE(filename, fast_load=True).OPTIONAL_HEADER.SizeOfImage
- return size_of_image_fallback(filename)
+def size_of_image_verify(filename):
+ pefile_size = pefile.PE(filename, fast_load=True).OPTIONAL_HEADER.SizeOfImage
+ custom_size = size_of_image_fallback(filename)
+ assert custom_size == pefile_size, filename
+ return custom_size
+
+SIZE_OF_IMAGE_FN = size_of_image_fallback
class Module(object):
- def __init__(self, name, address, size):
+ def __init__(self, name, address, size, filename):
self._name = name
self.address = address
self.size = size
self._reserved = address != 0
+ self.filename = filename
def gen_baseaddress(self):
name, ext = os.path.splitext(self._name)
@@ -254,14 +269,14 @@ class MemoryLayout(object):
self.reserved[name] = (address, 0)
def add(self, filename, name):
- size = size_of_image(filename)
+ size = SIZE_OF_IMAGE_FN(filename)
addr = 0
if name in self.found:
return # Assume duplicate files (rshell, ...) are 1:1 copies
if name in self.reserved:
addr = self.reserved[name][0]
self.reserved[name] = (addr, size)
- self.found[name] = Module(name, addr, size)
+ self.found[name] = Module(name, addr, size, filename)
def _next_address(self, size):
if self.start_at:
@@ -314,6 +329,22 @@ class MemoryLayout(object):
for obj in self.addresses:
obj.gen_baseaddress()
+def guess_version(ntdll_path):
+ if 'pefile' in globals():
+ ntdll_pe = pefile.PE(ntdll_path, fast_load=True)
+ names = [sect.Name.strip('\0') for sect in ntdll_pe.sections]
+ count = '|'.join(names).count('/')
+ if '.rossym' in names:
+ print('# This should probably go in baseaddress.cmake')
+ elif is_x64():
+ print('# This should probably go in baseaddress_msvc_x64.cmake')
+ elif count == 0:
+ print('# This should probably go in baseaddress_msvc.cmake')
+ elif count > 3:
+ print('# This should probably go in baseaddress_dwarf.cmake')
+ else:
+ print('# No clue where to put this')
+
def run_dir(target):
print('# Generated from', target)
print('# Generated by sdk/tools/gen_baseaddress.py')
@@ -323,10 +354,13 @@ def run_dir(target):
for dll in [filename for filename in files if
filename.endswith(ALL_EXTENSIONS)]:
if not dll in EXCLUDE and not dll.startswith('api-ms-win-'):
layout.add(os.path.join(root, dll), dll)
+ ntdll_path = layout.found['ntdll.dll'].filename
+ guess_version(ntdll_path)
layout.update(PRIORITIES)
layout.gen_baseaddress()
-def main(dirs):
+def main():
+ dirs = sys.argv[1:]
if len(dirs) < 1:
trydir = os.getcwd()
print('# No path specified, trying', trydir)
@@ -334,5 +368,13 @@ def main(dirs):
for onedir in dirs:
run_dir(onedir)
+
+def profile():
+ import cProfile
+ # pyprof2calltree -k -i test.cprof
+ cProfile.run('main()', filename='test.cprof')
+
if __name__ == '__main__':
- main(sys.argv[1:])
+ #profile()
+ #SIZE_OF_IMAGE_FN = size_of_image_verify
+ main()