mirror of
https://github.com/reactos/reactos.git
synced 2024-12-28 18:15:11 +00:00
[SDK] Add gen_baseaddress.py
This tool was already used to calculate the last baseaddress update. It is based on baseaddress.sh that has been floating around. CORE-11382
This commit is contained in:
parent
a3ddb8a4c2
commit
5a9dc5e791
4 changed files with 287 additions and 6 deletions
|
@ -1,3 +1,4 @@
|
|||
# Generated by sdk/tools/gen_baseaddress.py
|
||||
set(baseaddress_ntdll 0x7c920000) # should be above 0x7c920000
|
||||
set(baseaddress_kernel32 0x7c6b0000)
|
||||
set(baseaddress_msvcrt 0x7c5f0000)
|
||||
|
@ -62,7 +63,7 @@ set(baseaddress_sfc_os 0x79bf0000)
|
|||
set(baseaddress_snmpapi 0x79bc0000)
|
||||
set(baseaddress_spoolss 0x79b80000)
|
||||
set(baseaddress_usp10 0x79b00000)
|
||||
# Extra found dlls
|
||||
# Extra dlls
|
||||
set(baseaddress_acgenral 0x79ad0000)
|
||||
set(baseaddress_aclayers 0x79aa0000)
|
||||
set(baseaddress_acledit 0x79a70000)
|
||||
|
@ -342,7 +343,7 @@ set(baseaddress_xinput1_3 0x73680000)
|
|||
set(baseaddress_xinput9_1_0 0x73650000)
|
||||
set(baseaddress_xmllite 0x73610000)
|
||||
set(baseaddress_zipfldr 0x73570000)
|
||||
# Extra found files
|
||||
# Extra files
|
||||
set(baseaddress_access 0x734f0000)
|
||||
set(baseaddress_appwiz 0x73470000)
|
||||
set(baseaddress_cmicpl 0x73430000)
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
# Generated by sdk/tools/gen_baseaddress.py
|
||||
set(baseaddress_ntdll 0x7c920000) # should be above 0x7c920000
|
||||
set(baseaddress_kernel32 0x7c650000)
|
||||
set(baseaddress_msvcrt 0x7c530000)
|
||||
|
@ -62,7 +63,7 @@ set(baseaddress_sfc_os 0x79060000)
|
|||
set(baseaddress_snmpapi 0x79020000)
|
||||
set(baseaddress_spoolss 0x78fd0000)
|
||||
set(baseaddress_usp10 0x78f30000)
|
||||
# Extra found dlls
|
||||
# Extra dlls
|
||||
set(baseaddress_acgenral 0x78f00000)
|
||||
set(baseaddress_aclayers 0x78ec0000)
|
||||
set(baseaddress_acledit 0x78e90000)
|
||||
|
@ -342,7 +343,7 @@ set(baseaddress_xinput1_3 0x71520000)
|
|||
set(baseaddress_xinput9_1_0 0x714f0000)
|
||||
set(baseaddress_xmllite 0x71490000)
|
||||
set(baseaddress_zipfldr 0x713a0000)
|
||||
# Extra found files
|
||||
# Extra files
|
||||
set(baseaddress_access 0x71310000)
|
||||
set(baseaddress_appwiz 0x71290000)
|
||||
set(baseaddress_cmicpl 0x71250000)
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
# Generated by sdk/tools/gen_baseaddress.py
|
||||
set(baseaddress_ntdll 0x7c920000) # should be above 0x7c920000
|
||||
set(baseaddress_kernel32 0x7c700000)
|
||||
set(baseaddress_msvcrt 0x7c680000)
|
||||
|
@ -62,7 +63,7 @@ set(baseaddress_sfc_os 0x7a640000)
|
|||
set(baseaddress_snmpapi 0x7a620000)
|
||||
set(baseaddress_spoolss 0x7a5f0000)
|
||||
set(baseaddress_usp10 0x7a590000)
|
||||
# Extra found dlls
|
||||
# Extra dlls
|
||||
set(baseaddress_acgenral 0x7a570000)
|
||||
set(baseaddress_aclayers 0x7a550000)
|
||||
set(baseaddress_acledit 0x7a530000)
|
||||
|
@ -342,7 +343,7 @@ set(baseaddress_xinput1_3 0x75b20000)
|
|||
set(baseaddress_xinput9_1_0 0x75b00000)
|
||||
set(baseaddress_xmllite 0x75ad0000)
|
||||
set(baseaddress_zipfldr 0x75a80000)
|
||||
# Extra found files
|
||||
# Extra files
|
||||
set(baseaddress_access 0x75a00000)
|
||||
set(baseaddress_appwiz 0x75990000)
|
||||
set(baseaddress_cmicpl 0x75960000)
|
||||
|
|
278
sdk/tools/gen_baseaddress.py
Normal file
278
sdk/tools/gen_baseaddress.py
Normal file
|
@ -0,0 +1,278 @@
|
|||
'''
|
||||
PROJECT: ReactOS baseaddress updater
|
||||
LICENSE: MIT (https://spdx.org/licenses/MIT)
|
||||
PURPOSE: Update baseaddresses of all modules
|
||||
COPYRIGHT: Copyright 2017,2018 Mark Jansen (mark.jansen@reactos.org)
|
||||
'''
|
||||
|
||||
# FIXME: user32 always at 0x77a20000
|
||||
|
||||
import os
|
||||
import struct
|
||||
import sys
|
||||
try:
|
||||
import pefile
|
||||
except ImportError:
|
||||
print '# Please install pefile from pip or https://github.com/erocarrera/pefile'
|
||||
print '# Using fallback'
|
||||
print
|
||||
|
||||
DLL_EXTENSIONS = (
|
||||
'.dll'
|
||||
)
|
||||
|
||||
OTHER_EXTENSIONS = (
|
||||
'.acm', '.ax', '.cpl', '.drv', '.ocx'
|
||||
)
|
||||
|
||||
PRIORITIES = (
|
||||
'ntdll.dll',
|
||||
'kernel32.dll',
|
||||
'msvcrt.dll',
|
||||
'advapi32.dll',
|
||||
'gdi32.dll',
|
||||
'user32.dll',
|
||||
'dhcpcsvc.dll',
|
||||
'dnsapi.dll',
|
||||
'icmp.dll',
|
||||
'iphlpapi.dll',
|
||||
'ws2_32.dll',
|
||||
'ws2help.dll',
|
||||
'shlwapi.dll',
|
||||
'rpcrt4.dll',
|
||||
'comctl32.dll',
|
||||
'ole32.dll',
|
||||
'winspool.drv',
|
||||
'winmm.dll',
|
||||
'comdlg32.dll',
|
||||
'shell32.dll',
|
||||
'lz32.dll',
|
||||
'version.dll',
|
||||
'oleaut32.dll',
|
||||
'setupapi.dll',
|
||||
'mpr.dll',
|
||||
'crypt32.dll',
|
||||
'wininet.dll',
|
||||
'urlmon.dll',
|
||||
'psapi.dll',
|
||||
'imm32.dll',
|
||||
'msvfw32.dll',
|
||||
'dbghelp.dll',
|
||||
'devmgr.dll',
|
||||
'msacm32.dll',
|
||||
'netapi32.dll',
|
||||
'powrprof.dll',
|
||||
'secur32.dll',
|
||||
'wintrust.dll',
|
||||
'avicap32.dll',
|
||||
'cabinet.dll',
|
||||
'dsound.dll',
|
||||
'glu32.dll',
|
||||
'opengl32.dll',
|
||||
'riched20.dll',
|
||||
'smdll.dll',
|
||||
'userenv.dll',
|
||||
'uxtheme.dll',
|
||||
'cryptui.dll',
|
||||
'csrsrv.dll',
|
||||
'basesrv.dll',
|
||||
'winsrv.dll',
|
||||
'dplayx.dll',
|
||||
'gdiplus.dll',
|
||||
'msimg32.dll',
|
||||
'mswsock.dll',
|
||||
'oledlg.dll',
|
||||
'rasapi32.dll',
|
||||
'rsaenh.dll',
|
||||
'samlib.dll',
|
||||
'sensapi.dll',
|
||||
'sfc_os.dll',
|
||||
'snmpapi.dll',
|
||||
'spoolss.dll',
|
||||
'usp10.dll',
|
||||
)
|
||||
|
||||
EXCLUDE = (
|
||||
'bmfd.dll',
|
||||
'bootvid.dll',
|
||||
'freeldr_pe.dll',
|
||||
'ftfd.dll',
|
||||
'fusion.dll',
|
||||
'hal.dll',
|
||||
'halaacpi.dll',
|
||||
'halacpi.dll',
|
||||
'halapic.dll',
|
||||
'kbda1.dll',
|
||||
'kbda2.dll',
|
||||
'kbda3.dll',
|
||||
'kbdal.dll',
|
||||
'kbdarme.dll',
|
||||
'kbdarmw.dll',
|
||||
'kbdaze.dll',
|
||||
'kbdazel.dll',
|
||||
'kbdbe.dll',
|
||||
'kbdbga.dll',
|
||||
'kbdbgm.dll',
|
||||
'kbdbgt.dll',
|
||||
'kbdblr.dll',
|
||||
'kbdbr.dll',
|
||||
'kbdbur.dll',
|
||||
'kbdcan.dll',
|
||||
'kbdcr.dll',
|
||||
'kbdcz.dll',
|
||||
'kbdcz1.dll',
|
||||
'kbdda.dll',
|
||||
'kbddv.dll',
|
||||
'kbdes.dll',
|
||||
'kbdest.dll',
|
||||
'kbdfc.dll',
|
||||
'kbdfi.dll',
|
||||
'kbdfr.dll',
|
||||
'kbdgeo.dll',
|
||||
'kbdgerg.dll',
|
||||
'kbdgneo.dll',
|
||||
'kbdgr.dll',
|
||||
'kbdgrist.dll',
|
||||
'kbdhe.dll',
|
||||
'kbdheb.dll',
|
||||
'kbdhu.dll',
|
||||
'kbdic.dll',
|
||||
'kbdinasa.dll',
|
||||
'kbdinben.dll',
|
||||
'kbdindev.dll',
|
||||
'kbdinguj.dll',
|
||||
'kbdinmal.dll',
|
||||
'kbdir.dll',
|
||||
'kbdit.dll',
|
||||
'kbdja.dll',
|
||||
'kbdkaz.dll',
|
||||
'kbdko.dll',
|
||||
'kbdla.dll',
|
||||
'kbdlt1.dll',
|
||||
'kbdlv.dll',
|
||||
'kbdmac.dll',
|
||||
'kbdne.dll',
|
||||
'kbdno.dll',
|
||||
'kbdpl.dll',
|
||||
'kbdpl1.dll',
|
||||
'kbdpo.dll',
|
||||
'kbdro.dll',
|
||||
'kbdru.dll',
|
||||
'kbdru1.dll',
|
||||
'kbdsg.dll',
|
||||
'kbdsk.dll',
|
||||
'kbdsk1.dll',
|
||||
'kbdsw.dll',
|
||||
'kbdtat.dll',
|
||||
'kbdth0.dll',
|
||||
'kbdth1.dll',
|
||||
'kbdth2.dll',
|
||||
'kbdth3.dll',
|
||||
'kbdtuf.dll',
|
||||
'kbdtuq.dll',
|
||||
'kbduk.dll',
|
||||
'kbdur.dll',
|
||||
'kbdurs.dll',
|
||||
'kbdus.dll',
|
||||
'kbdusa.dll',
|
||||
'kbdusl.dll',
|
||||
'kbdusr.dll',
|
||||
'kbdusx.dll',
|
||||
'kbduzb.dll',
|
||||
'kbdvntc.dll',
|
||||
'kbdycc.dll',
|
||||
'kbdycl.dll',
|
||||
'kdcom.dll',
|
||||
'kdvbox.dll',
|
||||
'setupldr_pe.dll',
|
||||
'vgaddi.dll',
|
||||
'dllexport_test_dll1.dll',
|
||||
'dllexport_test_dll2.dll',
|
||||
'dllimport_test.dll',
|
||||
'MyEventProvider.dll',
|
||||
'w32kdll_2k3sp2.dll',
|
||||
'w32kdll_ros.dll',
|
||||
'w32kdll_xpsp2.dll',
|
||||
)
|
||||
|
||||
|
||||
def size_of_image_fallback(filename):
|
||||
with open(filename, 'rb') as fin:
|
||||
if fin.read(2) != 'MZ':
|
||||
print filename, 'No dos header found!'
|
||||
return 0
|
||||
fin.seek(0x3C)
|
||||
e_lfanew = struct.unpack('i', fin.read(4))[0]
|
||||
fin.seek(e_lfanew)
|
||||
if fin.read(4) != 'PE\0\0':
|
||||
print filename, 'No PE header found!'
|
||||
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
|
||||
|
||||
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 onefile(current_address, filename, size):
|
||||
name, ext = os.path.splitext(filename)
|
||||
postfix = ''
|
||||
if ext in('.acm', '.drv') and filename != 'winspool.drv':
|
||||
name = filename
|
||||
if current_address == 0:
|
||||
current_address = 0x7c920000
|
||||
postfix = ' # should be above 0x%08x' % current_address
|
||||
else:
|
||||
current_address = (current_address - size - 0x2000 - 0xffff) & 0xffff0000
|
||||
print 'set(baseaddress_%-30s 0x%08x)%s' % (name, current_address, postfix)
|
||||
return current_address
|
||||
|
||||
def run_dir(target):
|
||||
print '# Generated from', target
|
||||
print '# Generated by sdk/tools/gen_baseaddress.py'
|
||||
found_dlls = {}
|
||||
found_files = {}
|
||||
for root, _, files in os.walk(target):
|
||||
for dll in [filename for filename in files if filename.endswith(DLL_EXTENSIONS)]:
|
||||
if not dll in EXCLUDE and not dll.startswith('api-ms-win-'):
|
||||
found_dlls[dll] = size_of_image(os.path.join(root, dll))
|
||||
extrafiles = [filename for filename in files if filename.endswith(OTHER_EXTENSIONS)]
|
||||
for extrafile in extrafiles:
|
||||
if not extrafile in EXCLUDE:
|
||||
found_files[extrafile] = size_of_image(os.path.join(root, extrafile))
|
||||
|
||||
current_address = 0
|
||||
for curr in PRIORITIES:
|
||||
if curr in found_dlls:
|
||||
current_address = onefile(current_address, curr, found_dlls[curr])
|
||||
del found_dlls[curr]
|
||||
elif curr in found_files:
|
||||
current_address = onefile(current_address, curr, found_files[curr])
|
||||
del found_files[curr]
|
||||
else:
|
||||
print '# Did not find', curr, '!'
|
||||
|
||||
print '# Extra dlls'
|
||||
for curr in sorted(found_dlls):
|
||||
current_address = onefile(current_address, curr, found_dlls[curr])
|
||||
print '# Extra files'
|
||||
for curr in sorted(found_files):
|
||||
current_address = onefile(current_address, curr, found_files[curr])
|
||||
|
||||
def main(dirs):
|
||||
if len(dirs) < 1:
|
||||
trydir = os.getcwd()
|
||||
print '# No path specified, trying', trydir
|
||||
dirs = [trydir]
|
||||
for onedir in dirs:
|
||||
run_dir(onedir)
|
||||
|
||||
if __name__ == '__main__':
|
||||
main(sys.argv[1:])
|
Loading…
Reference in a new issue