http://bugs.winehq.org/show_bug.cgi?id=14639
Anastasius Focht focht@gmx.net changed:
What |Removed |Added ---------------------------------------------------------------------------- CC| |focht@gmx.net
--- Comment #1 from Anastasius Focht focht@gmx.net 2008-07-26 10:42:41 --- Hello,
the behaviour you are observing (e.g. SetPriorityClass() call with priority class param = -1) is a result of earlier damage. To be honest, the real problem is not visible using (relay/olerelay) trace output, one has to debug through the mess.
It's a COM proxy/server call which imbalances the stack, resulting in funny behaviour ... Pure coincidence due to a combination of compiler generated EH prolog/epilog code prevents a page fault and actually disguises the location. The real problem is that wine doesn't handle VT_USERDEFINED args in typelib marshaler properly.
Consider the following typelib info snippet:
--- snip --- ..
typedef struct tag_NGenPrivateAttributes { unsigned long Flags; unsigned long ZapStats; BSTR DbgDir; } _NGenPrivateAttributes;
interface ICorSvcSetPrivateAttributes : IUnknown { HRESULT _stdcall SetNGenPrivateAttributes([in] _NGenPrivateAttributes ngenPrivateAttributes); };
.. --- snip ---
When the proxy entry point code for SetNGenPrivateAttributes() method is setup, the size of argument stack is calculated by _argsize(). Because of fall through, VT_USERDEFINED argument size will be ever one DWORD, which is incorrect.
The custom type (struct) is passed by value. In this example, 3 DWORDs are put on stack (0,0,NULL). Wine has to take care of this, recursively walking through type descriptors for VT_USERDEFINED args, calculating the sizes of the structure fields so the stack can be properly cleaned up after returning from proxy.
I hope I gave enough information fix this...
Regards