Robert Shearman : rpcrt4: Fix the stack offset for the old format stubless code when an object' s method is being called.

Alexandre Julliard julliard at wine.codeweavers.com
Wed Aug 9 16:18:46 CDT 2006


Module: wine
Branch: refs/heads/master
Commit: 64828b75203d26ba2314742920c76fcf1f0fa89c
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=64828b75203d26ba2314742920c76fcf1f0fa89c

Author: Robert Shearman <rob at codeweavers.com>
Date:   Wed Aug  9 18:16:16 2006 +0100

rpcrt4: Fix the stack offset for the old format stubless code when an object's method is being called.

---

 dlls/rpcrt4/ndr_stubless.c |   22 ++++++++++++++++------
 1 files changed, 16 insertions(+), 6 deletions(-)

diff --git a/dlls/rpcrt4/ndr_stubless.c b/dlls/rpcrt4/ndr_stubless.c
index 2e56c98..e7c54e3 100644
--- a/dlls/rpcrt4/ndr_stubless.c
+++ b/dlls/rpcrt4/ndr_stubless.c
@@ -834,15 +834,19 @@ #endif
                 {
                     NDR_PARAM_OI_BASETYPE * pParam =
                         (NDR_PARAM_OI_BASETYPE *)&pFormat[current_offset];
-                    unsigned char * pArg = ARG_FROM_OFFSET(stubMsg, current_stack_offset);
+                    /* note: current_stack_offset starts after the This pointer
+                     * if present, so adjust this */
+                    unsigned short current_stack_offset_adjusted = current_stack_offset +
+                        ((pProcHeader->Oi_flags & RPC_FC_PROC_OIF_OBJECT) ? sizeof(void *) : 0);
+                    unsigned char * pArg = ARG_FROM_OFFSET(stubMsg, current_stack_offset_adjusted);
 
                     /* no more parameters; exit loop */
-                    if (current_stack_offset > stack_size)
+                    if (current_stack_offset_adjusted >= stack_size)
                         break;
 
                     TRACE("param[%d]: old format\n", i);
                     TRACE("\tparam_direction: %x\n", pParam->param_direction);
-                    TRACE("\tstack_offset: 0x%x\n", current_stack_offset);
+                    TRACE("\tstack_offset: 0x%x\n", current_stack_offset_adjusted);
                     TRACE("\tmemory addr (before): %p\n", pArg);
 
                     if (pParam->param_direction == RPC_FC_IN_PARAM_BASETYPE ||
@@ -1420,13 +1424,19 @@ #endif
                 {
                     NDR_PARAM_OI_BASETYPE *pParam =
                         (NDR_PARAM_OI_BASETYPE *)&pFormat[current_offset];
-                    unsigned char *pArg = (unsigned char *)(args+current_stack_offset);
+                    /* note: current_stack_offset starts after the This pointer
+                     * if present, so adjust this */
+                    unsigned short current_stack_offset_adjusted = current_stack_offset +
+                        ((pProcHeader->Oi_flags & RPC_FC_PROC_OIF_OBJECT) ? sizeof(void *) : 0);
+                    unsigned char *pArg = (unsigned char *)(args+current_stack_offset_adjusted);
 
                     /* no more parameters; exit loop */
-                    if (current_stack_offset > stack_size)
+                    if (current_stack_offset_adjusted >= stack_size)
                         break;
 
-                    TRACE("param[%d]: old format\n\tparam_direction: 0x%x\n", i, pParam->param_direction);
+                    TRACE("param[%d]: old format\n", i);
+                    TRACE("\tparam_direction: 0x%x\n", pParam->param_direction);
+                    TRACE("\tstack_offset: %x\n", current_stack_offset_adjusted);
 
                     if (pParam->param_direction == RPC_FC_IN_PARAM_BASETYPE ||
                         pParam->param_direction == RPC_FC_RETURN_PARAM_BASETYPE)




More information about the wine-cvs mailing list