winmm 16/32 code split

Eric Pouech eric.pouech at
Tue Oct 15 14:04:23 CDT 2002

Alexandre Julliard a écrit :
> Eric Pouech <eric.pouech at> writes:
> > agreed. but if you really want to split, the glue code must be generated
> > from the 16 bit code only, thus the 32 bit code cannot link directly to
> > the glue code (the kind of pointer you suggested in some previous mail).
> It seems we are still not understanding each other. Of course the glue
> code would be in 16-bit code with that technique; *everything* would
> be in the 16-bit code except for an extra field in the 32-bit
> structure. SetAbortProc16 is a good example of what I mean.
unfortunately, this doesn't apply to (directly) to the mmio interface:
- most (*) the outter functions (mmioOpen/mmioClose...) use a handle to
  mmio object
- the mmioXXX functions are mapped (from some of them) to ioProc which
  handle part of the work (one parameter of ioProc being a message
  describing the action to be taken)
- so far, nothing really new, the plain old service/driver architecture
(*) however, what some API designs for mmio don't work with your scheme:
	+ ioProc get a handle thru the MMIOINFO structure
	+ however, this field is not always filled (for example, the 
	  message MMIOM_RENAME doesn't use it)

which leaves as solutions (assuming we store the 16 bit segmented
for the ioProc in the 32 bit part)
1/ use reserved fields of MMIOINFO to store this pointer
1bis/ use extra fields of MMIOINFO to store this pointer. for example, 
   ensure that when a ioProc is called, the pointer to MMIOINFO points 
   to a MMIOINFO struct contiguous to some extra information. this 
   extra information would then be used in the "proxy" (32=>16) ioProc
   1bis would a bit safer since, even if MS says the fields are
   values stored in them are passed to the ioProc (but I don't know of
   any app making use of it)
2/ from 32 bit code, call a wrapper for the 16 bit call, with an extra
   parameter compared to the standard ioProc (the segmented address of
   callback). It's what is done in user32/ddeml. However, to let the
   16 bit DLL to be splitted, the wrapper function must called thru
   a pointer (the 16 bit library would initialize this pointer if it's
   loaded, as you suggested before).

sorry for making this discussion so long, but I'd prefer there's an 
agreement and a clear scheme defined so that it can be safely applied
across all DLLs. There are lots of ways for doing it, but it's better
we select a few of them. It'll be easier to maintain.


More information about the wine-devel mailing list