Eric Pouech <[email protected]> writes:

> @@ -145,14 +146,101 @@ HDDEDATA       WDML_InvokeCallback16(PFNCALLBACK pfn, 
> UINT uType, UINT uFmt,
>      return ret;
>  }
>  
> +#define MAX_THUNKS      32
> +/* As DDEML doesn't provide a way to get back to an InstanceID when
> + * a callback is run, we use thunk in order to implement simply the
> + * 32bit->16bit callback mechanism.
> + * For each 16bit instance, we create a thunk, which will be passed as
> + * a 32bit callback. This thunk also stores (in the code!) the 16bit
> + * address of the 16bit callback, and passes it back to
> + * WDML_InvokeCallback16.
> + * The code below is mainly to create the thunks themselved
> + */
> +static struct ddeml_thunk
> +{
> +    DWORD       instId;     /*      instance ID                              
>        */
> +    SEGPTR      pfn16;      /*      16bit callback address                   
>        */
> +                            /* start:                     ; 32bit callback   
>        */
> +    BYTE        call;       /*      call get_eip                             
>        */
> +    DWORD       call_rel32; /*                                               
>        */
> +                            /* get_eip:                                      
>        */
> +    BYTE        pop_eax;    /*      pop %eax              ; eip of get_eip   
>        */
> +    BYTE        pop_ecx;    /*      pop %ecx              ; return address   
>        */
> +    BYTE        push_pfn[3];/*      pushl -0x9(%eax)      ; push pfn16       
>        */
> +    BYTE        push_ecx;   /*      pushl %ecx                               
>        */
> +    BYTE        push;       /*      push $DDEML_InstanceCallback16           
>        */
> +    DWORD       cb16;       /*                                               
>        */
> +    BYTE        ret;        /*      ret                   ; jmp 
> DDEML_InstanceCal...*/
> +} *DDEML16_Thunks;

It doesn't really make sense to build position-independent code for a
thunk that is at a known address. Plus you don't even need the address,
a simple pushl $pfn16 would work just as well. Look at how winproc
thunks are done.

-- 
Alexandre Julliard
[email protected]


Reply via email to