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