Resolving already resolved ordinal for Borland style imports

Uwe Bonnes bon at elektron.ikp.physik.tu-darmstadt.de
Wed Oct 3 08:00:27 CDT 2001


Hallo,

some programm using a dll with Borland style imports crashes if the dll is
loaded a second time. When PE_fixup_imports is called for the first time,
resolving goes fine (_relay,+win32 log, with BON: -line additional, hopefully
selfexplaining output)

trace:win32:PE_LoadLibraryExA BON:D:\wine95\system\netapi32.dll
trace:win32:dump_exports *******EXPORT DATA*******
trace:win32:dump_exports Module name is NETAPI32.dll, 1 functions, 1 names
trace:win32:dump_exports  Ord    RVA     Addr   Name
   1 00001000 0x7fad1000  Netbios
trace:win32:PE_fixup_imports Dumping imports list
trace:win32:PE_LoadLibraryExA BON:D:\wine95\system\netbios.dll
trace:win32:dump_exports *******EXPORT DATA*******
trace:win32:dump_exports Module name is NETBIOS.dll, 6 functions, 6 names
trace:win32:dump_exports  Ord    RVA     Addr   Name
   1 00001a37 0x7f6f1a37  NetbiosAddthd
   2 000019eb 0x7f6f19eb  NetbiosDelete
   3 00001a96 0x7f6f1a96  NetbiosDelthd
   4 000019b1 0x7f6f19b1  NetbiosInitialize
   5 0000186b 0x7f6f186b  PostRoutineCaller
   6 0000102e 0x7f6f102e  _Netbios
trace:win32:PE_fixup_imports Dumping imports list
trace:win32:PE_fixup_imports Borland style imports used
trace:win32:PE_fixup_imports BON:load_addr 7f6f0000
trace:win32:PE_fixup_imports BON:thunk 0x602c
trace:win32:PE_fixup_imports BON:ordinal 6080
                                         ^^^^
trace:win32:PE_fixup_imports BON:name KERNEL32.dll
trace:win32:PE_fixup_imports BON:pe_name 0x7f6f6080
trace:win32:PE_fixup_imports BON:pe_name->Hint 94
trace:win32:PE_fixup_imports BON:pe_name->Name 0x7f6f6082
trace:win32:PE_fixup_imports --- EnterCriticalSection KERNEL32.dll.94

Now ordinal is replace by the function pointer in PE_fixup_imports. The second
PE_LoadLibraryExA however goes astray, as it tries to resolve the function
pointer as an ordinal in PE_fixup_imports.


trace:win32:PE_LoadLibraryExA BON:D:\wine95\system\netapi32.dll
trace:win32:dump_exports *******EXPORT DATA*******
trace:win32:dump_exports Module name is NETAPI32.dll, 1 functions, 1 names
trace:win32:dump_exports  Ord    RVA     Addr   Name
   1 00001000 0x7fad1000  Netbios
trace:win32:PE_fixup_imports Dumping imports list
trace:win32:PE_LoadLibraryExA BON:D:\wine95\system\netbios.dll
trace:win32:dump_exports *******EXPORT DATA*******
trace:win32:dump_exports Module name is NETBIOS.dll, 6 functions, 6 names
trace:win32:dump_exports  Ord    RVA     Addr   Name
   1 00001a37 0x7f6f1a37  NetbiosAddthd
   2 000019eb 0x7f6f19eb  NetbiosDelete
   3 00001a96 0x7f6f1a96  NetbiosDelthd
   4 000019b1 0x7f6f19b1  NetbiosInitialize
   5 0000186b 0x7f6f186b  PostRoutineCaller
   6 0000102e 0x7f6f102e  _Netbios
trace:win32:PE_fixup_imports Dumping imports list
trace:win32:PE_fixup_imports Borland style imports used
trace:win32:PE_fixup_imports BON:load_addr 7f6f0000
trace:win32:PE_fixup_imports BON:thunk 0x602c
trace:win32:PE_fixup_imports BON:ordinal 4010d724
                                         ^^^^^^^^
trace:win32:PE_fixup_imports BON:name KERNEL32.dll
trace:win32:PE_fixup_imports BON:pe_name 0xbf7fd724
BON: 4010d724
086723f8:Call kernel32.UnhandledExceptionFilter(404b4b00) ret=00454633

What is the right solution? Only treat the value as an ordinal if it is
smaller then 0x10000( I susbpect that an dll may only have 0xffff entries or
the IMAGE_SNAP_BY_ORDINAL wouldn't work)? Or is it an error that we call
PE_fixup_imports for the second time at all for an already resolved dll?

Bye

Uwe Bonnes                bon at elektron.ikp.physik.tu-darmstadt.de

Free Software: If you contribute nothing, expect nothing
--




More information about the wine-devel mailing list