[Bug 24196] New: oleaut32: typelib registration should not fail bitness-neutral assemblies (32-bit typelib wrapped in 64-bit PE, x64 .NET 2.0 installer)
wine-bugs at winehq.org
wine-bugs at winehq.org
Sun Aug 29 06:54:17 CDT 2010
http://bugs.winehq.org/show_bug.cgi?id=24196
Summary: oleaut32: typelib registration should not fail
bitness-neutral assemblies (32-bit typelib wrapped in
64-bit PE, x64 .NET 2.0 installer)
Product: Wine
Version: 1.3.1
Platform: x86-64
OS/Version: Linux
Status: NEW
Severity: normal
Priority: P2
Component: oleaut32
AssignedTo: wine-bugs at winehq.org
ReportedBy: focht at gmx.net
Hello,
another x64 .NET Framework 2.0 installer bug.
The typelib registration fails for some assemblies:
--- snip ---
...
002c:Call KERNEL32.CreateProcessA(00000000,7fffec16f650
"\"C:\\windows\\Microsoft.NET\\Framework64\\v2.0.50727\\regtlibv12.exe\"
\"C:\\windows\\Microsoft.NET\\Framework64\\v2.0.50727\\System.Drawing.tlb\"",00000000,00000000,7fff00000001,00000000,00000000,00000000,7fffec8edfe8,7fffec8eb9e0)
ret=4fc035780
...
002e:Call oleaut32.LoadTypeLib(7ffff143f880
L"C:\\windows\\Microsoft.NET\\Framework64\\v2.0.50727\\System.Drawing.tlb",7ffff143f870)
ret=004027bf
...
002e:Call KERNEL32.LoadLibraryExW(7ffff143f360
L"C:\\windows\\Microsoft.NET\\Framework64\\v2.0.50727\\System.Drawing.tlb",00000000,0000000b)
ret=7ffff105ffb0
002e:Ret KERNEL32.LoadLibraryExW() retval=7fffefad0001 ret=7ffff105ffb0
...
002e:Ret oleaut32.LoadTypeLib() retval=00000000 ret=004027bf
002e:Call oleaut32.RegisterTypeLib(7ffff74d30d0,7ffff143f880
L"C:\\windows\\Microsoft.NET\\Framework64\\v2.0.50727\\System.Drawing.tlb",00000000)
ret=00402808
...
002e:Ret oleaut32.RegisterTypeLib() retval=800288bd ret=00402808
...
002c:Call msi.MsiRecordSetStringW(00000005,00000000,7fffec8ec620
L"RegisterTypeLib of
C:\\windows\\Microsoft.NET\\Framework64\\v2.0.50727\\System.Drawing.tlb failed
: 800288bd") ret=4fc0358bd
--- snip ---
The PE file containing typelib resources "System.Drawing.tlb" is a PE64 binary.
Dumping the typelib resource reveals:
--- snip ---
Offset 0 1 2 3 4 5 6 7 8 9 A B C D E F Ascii
000002B0 4D 53 46 54 02 00 01 00 00 00 00 00 09 04 00 00 MSFT.........
000002C0 00 00 00 00 41 00 00 00 02 00 00 00 00 00 00 00 ....A..........
000002D0 0C 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ...............
--- snip ---
flags: 0x41 -> indicates the typelib itself is 32 bit (SYSKIND = SYS_WIN32)
The folder "c:\windows\Microsoft.NET\Framework64\v2.0.50727\" contains
assemblies with following characteristics:
64-bit PE + 64 bit typelib part (flags = 0x43 -> SYSKIND = SYS_WIN64)
64-bit PE + 32 bit typelib part (flags = 0x41 -> SYSKIND = SYS_WIN32)
I verified that Wine msi correctly installs them into their appropriate 32 bit
and 64 bit folders.
The 32-bit counterparts from "c:\windows\Microsoft.NET\Framework\v2.0.50727\"
are all:
32-bit PE + 32 bit typelib part (flags = 0x41 -> SYSKIND = SYS_WIN32)
===
What causes the embedded typelib to be 32-bit?
Well, the .NET assemblies these typelibs belong to are flagged as "MSIL"
assemblies.
These are bitness-neutral assemblies that are portable and can run under any
platform.
When you look at 64-bit ->
"c:\windows\Microsoft.NET\Framework64\v2.0.50727\RedistList\FrameworkList.xml":
--- snip ---
<File AssemblyName="System.Drawing" Version="2.0.0.0"
PublicKeyToken="b03f5f7f11d50a3a" Culture="neutral"
ProcessorArchitecture="MSIL" FileVersion="2.0.50727.42" InGAC="true" />
--- snip ---
Example for bitness-aware assembly (managed C++ assemblies are automatically
platform specific):
64-bit ->
"c:\windows\Microsoft.NET\Framework64\v2.0.50727\RedistList\FrameworkList.xml":
--- snip ---
<File AssemblyName="System.Data" Version="2.0.0.0"
PublicKeyToken="b77a5c561934e089" Culture="neutral"
ProcessorArchitecture="AMD64" FileVersion="2.0.50727.42" InGAC="true" />
--- snip ---
32-bit ->
"c:\windows\Microsoft.NET\Framework\v2.0.50727\RedistList\FrameworkList.xml":
(the 64 bit .NET Framework 2.0 redist contains both: the 64 bit _and_ 32 bit
runtime)
--- snip ---
<File AssemblyName="System.Data" Version="2.0.0.0"
PublicKeyToken="b77a5c561934e089" Culture="neutral" ProcessorArchitecture="x86"
FileVersion="2.0.50727.42" InGAC="true" />
--- snip ---
I guess Wine should not fail on these bitness-neutral assemblies that contain
32-bit typelibs.
--- snip dlls/oleaut32/typelib.c ---
HRESULT WINAPI RegisterTypeLib(
ITypeLib * ptlib, /* [in] Pointer to the library*/
OLECHAR * szFullPath, /* [in] full Path of the library*/
OLECHAR * szHelpDir) /* [in] dir to the helpfile for the library,
may be NULL*/
{
...
if (ptlib == NULL || szFullPath == NULL)
return E_INVALIDARG;
if (FAILED(ITypeLib_GetLibAttr(ptlib, &attr)))
return E_FAIL;
TRACE("(%s,%d)", debugstr_w(szFullPath), attr->syskind);
#ifdef _WIN64
if (attr->syskind != SYS_WIN64) return TYPE_E_BADMODULEKIND;
#else
if (attr->syskind != SYS_WIN32 && attr->syskind != SYS_WIN16) return
TYPE_E_BADMODULEKIND;
#endif
...
}
--- snip dlls/oleaut32/typelib.c ---
Regards
--
Configure bugmail: http://bugs.winehq.org/userprefs.cgi?tab=email
Do not reply to this email, post in Bugzilla using the
above URL to reply.
------- You are receiving this mail because: -------
You are watching all bug changes.
More information about the wine-bugs
mailing list