[Bug 34711] Terraria Server 1.2.0.x fails on startup ( needs CLSID_UPnPNAT {ae1e00aa-3fd5-403c-8a27-2bbdc30cd0e1})

wine-bugs at winehq.org wine-bugs at winehq.org
Tue Oct 16 19:37:13 CDT 2018


https://bugs.winehq.org/show_bug.cgi?id=34711

Anastasius Focht <focht at gmx.net> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|RESOLVED                    |REOPENED
         Resolution|FIXED                       |---

--- Comment #3 from Anastasius Focht <focht at gmx.net> ---
Hello folks,

too soon. No, unfortunately not fixed.

*
https://source.winehq.org/git/wine.git/commitdiff/c71abc386b5f84c19fed7dd69ff5cc19b100a24e
("include: Add natupnp.idl.")

*
https://source.winehq.org/git/wine.git/commitdiff/bd9610535369500dff1dfde0fc49abedc463675c
("hnetcfg: Register NATUPnP interface.")

*
https://source.winehq.org/git/wine.git/commitdiff/449833b48aabe25ef500fe12b2b00e83bd9b2efd
("hnetcfg: Support IUPnPNAT interface.
")

*
https://source.winehq.org/git/wine.git/commitdiff/d65bd95ecd4fee57cbfe17b375f0b0325f9e076e
("hnetcfg: Link to uuid library.")

The old archive to reproduce with is no longer present on the main site.
I found a copy here:

http://wc3dota.persiangig.com/.Srl0nxC6Ke/Terraria/terraria-server-12031.zip

New version:

http://terraria.org/system/dedicated_servers/archives/000/000/032/original/terraria-server-1353.zip

It crashes. Running under managed CLR debugger shows:

--- snip ---
...
0035:trace:loaddll:load_builtin_dll Loaded
L"C:\\windows\\system32\\hnetcfg.dll" at 0x7d060000: builtin
0035:fixme:hnetcfg:hnetcfg_cf_QueryInterface interface
{00000003-0000-0000-c000-000000000046} not implemented
0035:fixme:hnetcfg:hnetcfg_cf_QueryInterface interface
{00000019-0000-0000-c000-000000000046} not implemented
0035:fixme:hnetcfg:hnetcfg_cf_QueryInterface interface
{b196b28f-bab4-101a-b69c-00aa00341d07} not implemented
0035:err:ole:marshal_object Failed to create an IRpcStubBuffer from IPSFactory
for {b196b28f-bab4-101a-b69c-00aa00341d07} with error 0x80004002
0032:err:ole:ClientIdentity_QueryMultipleInterfaces
IRemUnknown_RemQueryInterface failed with error 0x80004002
0035:fixme:hnetcfg:upnpnat_QueryInterface interface
{00000003-0000-0000-c000-000000000046} not implemented
0035:fixme:hnetcfg:upnpnat_QueryInterface interface
{00000003-0000-0000-c000-000000000046} not implemented
0035:fixme:hnetcfg:upnpnat_QueryInterface interface
{00000019-0000-0000-c000-000000000046} not implemented
0035:fixme:hnetcfg:upnpnat_QueryInterface interface
{c3fcc19e-a970-11d2-8b5a-00a0c9b7c9c4} not implemented
0035:fixme:hnetcfg:upnpnat_QueryInterface interface
{c3fcc19e-a970-11d2-8b5a-00a0c9b7c9c4} not implemented
0032:err:ole:ClientIdentity_QueryMultipleInterfaces
IRemUnknown_RemQueryInterface failed with error 0x80004002
0035:fixme:hnetcfg:upnpnat_QueryInterface interface
{b196b283-bab4-101a-b69c-00aa00341d07} not implemented
0035:err:ole:marshal_object Failed to create an IRpcStubBuffer from IPSFactory
for {b196b283-bab4-101a-b69c-00aa00341d07} with error 0x80004002
0032:err:ole:ClientIdentity_QueryMultipleInterfaces
IRemUnknown_RemQueryInterface failed with error 0x80004002
0035:err:ole:marshal_object couldn't get IPSFactory buffer for interface
{00000144-0000-0000-c000-000000000046}
0032:err:ole:ClientIdentity_QueryMultipleInterfaces
IRemUnknown_RemQueryInterface failed with error 0x80004002
0035:err:ole:marshal_object couldn't get IPSFactory buffer for interface
{b171c812-cc76-485a-94d8-b6b3a2794e99}
0032:err:ole:ClientIdentity_QueryMultipleInterfaces
IRemUnknown_RemQueryInterface failed with error 0x80004002
0035:err:ole:marshal_object couldn't get IPSFactory buffer for interface
{b171c812-cc76-485a-94d8-b6b3a2794e99}
0032:err:ole:ClientIdentity_QueryMultipleInterfaces
IRemUnknown_RemQueryInterface failed with error 0x80004002
(31.32): C++ EH exception - code e06d7363 (first chance)
0030:fixme:ntdll:RtlGetUnloadEventTrace stub!
0030:trace:loaddll:load_builtin_dll Loaded
L"C:\\windows\\system32\\wtsapi32.dll" at 0xf7df0000: builtin
0030:trace:loaddll:load_native_dll Loaded
L"C:\\windows\\Microsoft.NET\\Framework\\v4.0.30319\\mscordacwks.dll" at
0x7a820000: native
There is no current managed exception on this thread
OS Thread Id: 0x32 (0)
Child SP IP       Call Site
0033d664 7b43c87b [HelperMethodFrame_1OBJ: 0033d664] 
0033d6c0 0389014c Terraria.Netplay..cctor()
0033d928 791421db [GCFrame: 0033d928] 
0033f30c 791421db [PrestubMethodFrame: 0033f30c]
Terraria.ProgramServer.Main(System.String[])
0033f548 791421db [GCFrame: 0033f548] 
0032:fixme:ntdll:EtwRegisterTraceGuidsW (0xc405ba, (nil),
{8e9f5090-2d75-4d03-8a81-e5afbf85daf1}, 1, 0x33b930, (null), (null), 0xfb2d64):
stub
0032:fixme:ntdll:EtwRegisterTraceGuidsW   register trace class
{8e9f5090-2d75-4d03-8a81-e5afbf85daf1}
(31.32): CLR exception - code e0434352 (first chance)
Exception object: 00f9d5e4
Exception type:   System.InvalidCastException
Message:          Unable to cast COM object of type 'System.__ComObject' to
interface type 'NATUPNPLib.UPnPNAT'. This operation failed because the
QueryInterface call on the COM component for the interface with IID
'{B171C812-CC76-485A-94D8-B6B3A2794E99}' failed due to the following error:
Exception from HRESULT: 0x80004002 (E_NOINTERFACE).
InnerException:   <none>
StackTrace (generated):
<none>
StackTraceString: <none>
HResult: 80004002
OS Thread Id: 0x32 (0)
Child SP IP       Call Site
0033d664 7b43c87b [HelperMethodFrame_1OBJ: 0033d664] 
0033d6c0 0389014c Terraria.Netplay..cctor()
0033d928 791421db [GCFrame: 0033d928] 
0033f30c 791421db [PrestubMethodFrame: 0033f30c]
Terraria.ProgramServer.Main(System.String[])
0033f548 791421db [GCFrame: 0033f548] 
First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
--- snip ---

"Unable to cast COM object of type 'System.__ComObject' to interface type
'NATUPNPLib.UPnPNAT'. This operation failed because the QueryInterface call on
the COM component for the interface with IID
'{B171C812-CC76-485A-94D8-B6B3A2794E99}' failed due to the following error:
Exception from HRESULT: 0x80004002 (E_NOINTERFACE)."

Cross-thread marshalling doesn't work here. Each thread must have access to the
type information (registry) that describes the COM object to be able to
unmarshal the object from the source thread.

Wine source:

https://source.winehq.org/git/wine.git/blob/HEAD:/include/natupnp.idl#l205

--- snip ---
 187 [
 188     object,
 189     uuid(b171c812-cc76-485a-94d8-b6b3a2794e99),
 190     dual,
 191     pointer_default(unique)
 192 ]
 193 interface IUPnPNAT : IDispatch
 194 {
 195     [propget, id(1)]
 196     HRESULT StaticPortMappingCollection ([out, retval]
IStaticPortMappingCollection **collection);
 197 
 198     [propget, id(2)]
 199     HRESULT DynamicPortMappingCollection ([out, retval]
IDynamicPortMappingCollection **collection);
 200 
 201     [propget, id(3)]
 202     HRESULT NATEventManager ([out, retval] INATEventManager **manager);
 203 };
 204 
 205 [
 206     id(2),
 207     uuid(1c565858-f302-471e-b409-f180aa4abec6),
 208     version(1.0)
 209 ]
 210 library NATUPNPLib
 211 {
 212     importlib("stdole2.tlb");
 213 
 214     [
 215         vi_progid("HNetCfg.NATUPnP"),
 216         progid("HNetCfg.NATUPnP.1"),
 217         threading(apartment),
 218         uuid(ae1e00aa-3fd5-403c-8a27-2bbdc30cd0e1)
 219     ]
 220     coclass UPnPNAT
 221     {
 222         [default] interface IUPnPNAT;
 223     };
 224 };
--- snip ---

It seems for Wine's MIDL the interface in question needs to be defined *inside*
the 'library' block and have 'oleautomation' attribute. Otherwise it's not
getting registered under 'HKEY_CLASSES_ROOT\\Interface\\{IID}\\...'
(proxy/stub).

I was surprised about that behaviour since the interface was referenced by the
coclass within the library block and had 'dual' attribute.

http://diranieh.com/IDL/Structure.htm

--- quote ---
Interface location     [oleautomation]/ [dual] defined     

Inside library  block   Interface uses Universal Marshaler
                        Interface appears in type library

Outside library block   Interface uses Universal Marshaler
                        Interface does not appear in type  library (unless
referenced, perhaps in  the coclass section)

---

Interface location      [oleautomation]/ [dual] not defined

Inside library  block   AVOID. NO INTERCEPTION CODE GENERATED!

Outside library block   Interface does not use Universal Marshaler. Need to 
build proxy/stub DLL.
                        Interface does not appear in type library (unless
referenced,  perhaps in the coclass section)
--- quote ---

With that fixed, cross-thread marshalling (using std marshaler) works and it
runs into next problem (unimpl. method/stub).

$ wine --version
wine-3.18-75-ge55aca8f49

Regards

-- 
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