please don't apply RPC Merge D_PL1

Greg Turner gmturner007 at ameritech.net
Tue Oct 15 11:40:50 CDT 2002


On Tuesday 15 October 2002 10:53 am, Ove Kaaven wrote:
> On Mon, 14 Oct 2002, Greg Turner wrote:
> > well, that sounds about right, but how to detect such a thing...?
> > I guess I need to learn how to create 'on change some ram'
> > breakpoints,
>
> That's called "watchpoints". In gdb, you can set such a watchpoint with:
> watch *(int*)0xaddress
>
> > not to mention track down these datastructures
> > in memory (or perhaps learn how to get debug symbols for
> > w32-native-compiled stuff generated).
>
> Well you can just use the pointer given to NdrClientCall2, right?

yes, but by then it's too late; besides, by the time we're in NdrClientCall2,
I no longer trust anything I see.  To pursue this, I need to snag it
as early as possible.  I was able to produce a .pdb file using the
compiler.  Winedbg loads it but still no dice.  I'd almost rather just
get to the raw data than worry about debug symbols in this case.
I can put some magic numbers in there and grep the various
allocated memory places, to generate some nice re-usable 
offsets.  Anyhow, if it's a calling convention problem as discussed
below, then presumably I would find no memory corruption, so I will
look into that first.

>
> > Serveral differences worth noting:
> >
> > o Many more dlls loaded in the winelib version (why?)
>
> Perhaps you have lots of unneeded import statements in your Winelib app's
> .spec file.

that sounds right.  winemaker seemed to generate a lot of
superflous deps (and failed to generate the rpcrt4 one).

> > My theories:
> >
> > o it's the try/except macros; they're causing stack corruption or
> > something (they occur right before the NdrClientCall2)
> > o it's MIDL_user_allocate somehow (nah)
> > o it's a problem with dll loading (lets hope not)
>
> o it's a calling convention problem (stdcall/cdecl, argument count, return
> value). This theory is substantiated by the difference in the pFormat
> argument. Perhaps gcc wants to return the CLIENT_CALL_RETURN structure in
> a way that isn't compatible with what Microsoft compilers expect (wants
> stack space reserved for it by the caller or something?)... I think we've
> had issues with gcc and returning structures before. If this is it, rpcrt4
> probably need to return it as just LONG_PTR in the code, not
> CLIENT_CALL_RETURN?

I like this theory, it has recently occured to me too.  I will try compiling the 
sample using stdcall and see if that has an effect, after work.  Also,
in the winelib version, I changed main() to stdcall from cdecl (!) which
I took to mean that winelib framework didn't want that calling convention.

As for fixing it... this may be a bit beyond me; but I'll look into what
you reccomend.  If gcc and msvc use incompatible cdecl conventions
then that's a pretty serious problem, right, not just for rpcrt4?  Looks
like to fix I will need to read some machine code.

If there's a fundamental problem here, I guess this would mean 
we'd have to install gcc<->msvc cdecl thunks somewhere to
properly fix the problem?  Well, perhaps not, just thinking out loud.
I'll look into this tonight; I bet you are on to something here.

-- 
gmt

"It has been well said that really up-to-date liberals
do not care what people do, as long as it is compulsory."

-George F. Will




More information about the wine-devel mailing list