Robert Shearman : rpcrt4:
Implement marshaling and unmarshaling for enum types.
Alexandre Julliard
julliard at wine.codeweavers.com
Thu Mar 2 05:17:31 CST 2006
Module: wine
Branch: refs/heads/master
Commit: e8877ede800d3fc7b7f79a89bd32c879842ccb84
URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=e8877ede800d3fc7b7f79a89bd32c879842ccb84
Author: Robert Shearman <rob at codeweavers.com>
Date: Wed Mar 1 12:21:56 2006 +0000
rpcrt4: Implement marshaling and unmarshaling for enum types.
---
dlls/rpcrt4/ndr_marshall.c | 24 ++++++++++++++++++++----
1 files changed, 20 insertions(+), 4 deletions(-)
diff --git a/dlls/rpcrt4/ndr_marshall.c b/dlls/rpcrt4/ndr_marshall.c
index 3045b42..b77c281 100644
--- a/dlls/rpcrt4/ndr_marshall.c
+++ b/dlls/rpcrt4/ndr_marshall.c
@@ -26,6 +26,7 @@
#include <stdio.h>
#include <string.h>
#include <assert.h>
+#include <limits.h>
#include "windef.h"
#include "winbase.h"
@@ -2985,6 +2986,7 @@ static unsigned char *WINAPI NdrBaseType
case RPC_FC_LONG:
case RPC_FC_ULONG:
case RPC_FC_ERROR_STATUS_T:
+ case RPC_FC_ENUM32:
ALIGN_POINTER(pStubMsg->Buffer, sizeof(ULONG) - 1);
*(ULONG *)pStubMsg->Buffer = *(ULONG *)pMemory;
pStubMsg->Buffer += sizeof(ULONG);
@@ -3007,7 +3009,14 @@ static unsigned char *WINAPI NdrBaseType
TRACE("value: %s\n", wine_dbgstr_longlong(*(ULONGLONG*)pMemory));
break;
case RPC_FC_ENUM16:
- case RPC_FC_ENUM32:
+ /* only 16-bits on the wire, so do a sanity check */
+ if (*(UINT *)pMemory > USHRT_MAX)
+ RpcRaiseException(RPC_X_ENUM_VALUE_OUT_OF_RANGE);
+ ALIGN_POINTER(pStubMsg->Buffer, sizeof(USHORT) - 1);
+ *(USHORT *)pStubMsg->Buffer = *(UINT *)pMemory;
+ pStubMsg->Buffer += sizeof(USHORT);
+ TRACE("value: 0x%04x\n", *(UINT *)pMemory);
+ break;
default:
FIXME("Unhandled base type: 0x%02x\n", *pFormat);
}
@@ -3055,6 +3064,7 @@ static unsigned char *WINAPI NdrBaseType
case RPC_FC_LONG:
case RPC_FC_ULONG:
case RPC_FC_ERROR_STATUS_T:
+ case RPC_FC_ENUM32:
ALIGN_POINTER(pStubMsg->Buffer, sizeof(ULONG) - 1);
**(ULONG **)ppMemory = *(ULONG *)pStubMsg->Buffer;
pStubMsg->Buffer += sizeof(ULONG);
@@ -3079,7 +3089,12 @@ static unsigned char *WINAPI NdrBaseType
TRACE("value: %s\n", wine_dbgstr_longlong(**(ULONGLONG **)ppMemory));
break;
case RPC_FC_ENUM16:
- case RPC_FC_ENUM32:
+ ALIGN_POINTER(pStubMsg->Buffer, sizeof(USHORT) - 1);
+ /* 16-bits on the wire, but int in memory */
+ **(UINT **)ppMemory = *(USHORT *)pStubMsg->Buffer;
+ pStubMsg->Buffer += sizeof(USHORT);
+ TRACE("value: 0x%08x\n", **(UINT **)ppMemory);
+ break;
default:
FIXME("Unhandled base type: 0x%02x\n", *pFormat);
}
@@ -3110,11 +3125,13 @@ static void WINAPI NdrBaseTypeBufferSize
case RPC_FC_WCHAR:
case RPC_FC_SHORT:
case RPC_FC_USHORT:
+ case RPC_FC_ENUM16:
ALIGN_LENGTH(pStubMsg->BufferLength, sizeof(USHORT) - 1);
pStubMsg->BufferLength += sizeof(USHORT);
break;
case RPC_FC_LONG:
case RPC_FC_ULONG:
+ case RPC_FC_ENUM32:
ALIGN_LENGTH(pStubMsg->BufferLength, sizeof(ULONG) - 1);
pStubMsg->BufferLength += sizeof(ULONG);
break;
@@ -3134,8 +3151,6 @@ static void WINAPI NdrBaseTypeBufferSize
ALIGN_LENGTH(pStubMsg->BufferLength, sizeof(error_status_t) - 1);
pStubMsg->BufferLength += sizeof(error_status_t);
break;
- case RPC_FC_ENUM16:
- case RPC_FC_ENUM32:
default:
FIXME("Unhandled base type: 0x%02x\n", *pFormat);
}
@@ -3172,6 +3187,7 @@ static unsigned long WINAPI NdrBaseTypeM
return sizeof(error_status_t);
case RPC_FC_ENUM16:
case RPC_FC_ENUM32:
+ return sizeof(INT);
default:
FIXME("Unhandled base type: 0x%02x\n", *pFormat);
return 0;
More information about the wine-cvs
mailing list