Rob Shearman : rpcrt4: Implement marshalling/
unmarshalling for the range NDR type.
Alexandre Julliard
julliard at wine.codeweavers.com
Tue Jun 26 07:11:47 CDT 2007
Module: wine
Branch: master
Commit: d36f02eaa91fbd564108fa87b54542ec361e9aac
URL: http://source.winehq.org/git/wine.git/?a=commit;h=d36f02eaa91fbd564108fa87b54542ec361e9aac
Author: Rob Shearman <rob at codeweavers.com>
Date: Mon Jun 25 14:28:40 2007 +0100
rpcrt4: Implement marshalling/unmarshalling for the range NDR type.
---
dlls/rpcrt4/ndr_marshall.c | 236 +++++++++++++++++++++++++++++++++++++++++---
1 files changed, 221 insertions(+), 15 deletions(-)
diff --git a/dlls/rpcrt4/ndr_marshall.c b/dlls/rpcrt4/ndr_marshall.c
index 0eb2e10..1bd2764 100644
--- a/dlls/rpcrt4/ndr_marshall.c
+++ b/dlls/rpcrt4/ndr_marshall.c
@@ -151,9 +151,14 @@ const NDR_MARSHALL NdrMarshaller[NDR_TABLE_SIZE] = {
NdrXmitOrRepAsMarshall, NdrXmitOrRepAsMarshall,
/* 0x2f */
NdrInterfacePointerMarshall,
- /* 0xb0 */
- 0, 0, 0, 0,
- NdrUserMarshalMarshall
+ /* 0x30 */
+ 0,
+ /* 0xb1 */
+ 0, 0, 0,
+ NdrUserMarshalMarshall,
+ 0, 0,
+ /* 0xb7 */
+ NdrRangeMarshall
};
const NDR_UNMARSHALL NdrUnmarshaller[NDR_TABLE_SIZE] = {
0,
@@ -188,9 +193,14 @@ const NDR_UNMARSHALL NdrUnmarshaller[NDR_TABLE_SIZE] = {
NdrXmitOrRepAsUnmarshall, NdrXmitOrRepAsUnmarshall,
/* 0x2f */
NdrInterfacePointerUnmarshall,
- /* 0xb0 */
- 0, 0, 0, 0,
- NdrUserMarshalUnmarshall
+ /* 0x30 */
+ 0,
+ /* 0xb1 */
+ 0, 0, 0,
+ NdrUserMarshalUnmarshall,
+ 0, 0,
+ /* 0xb7 */
+ NdrRangeUnmarshall
};
const NDR_BUFFERSIZE NdrBufferSizer[NDR_TABLE_SIZE] = {
0,
@@ -225,9 +235,14 @@ const NDR_BUFFERSIZE NdrBufferSizer[NDR_TABLE_SIZE] = {
NdrXmitOrRepAsBufferSize, NdrXmitOrRepAsBufferSize,
/* 0x2f */
NdrInterfacePointerBufferSize,
- /* 0xb0 */
- 0, 0, 0, 0,
- NdrUserMarshalBufferSize
+ /* 0x30 */
+ 0,
+ /* 0xb1 */
+ 0, 0, 0,
+ NdrUserMarshalBufferSize,
+ 0, 0,
+ /* 0xb7 */
+ NdrRangeBufferSize
};
const NDR_MEMORYSIZE NdrMemorySizer[NDR_TABLE_SIZE] = {
0,
@@ -262,9 +277,14 @@ const NDR_MEMORYSIZE NdrMemorySizer[NDR_TABLE_SIZE] = {
NdrXmitOrRepAsMemorySize, NdrXmitOrRepAsMemorySize,
/* 0x2f */
NdrInterfacePointerMemorySize,
- /* 0xb0 */
- 0, 0, 0, 0,
- NdrUserMarshalMemorySize
+ /* 0x30 */
+ 0,
+ /* 0xb1 */
+ 0, 0, 0,
+ NdrUserMarshalMemorySize,
+ 0, 0,
+ /* 0xb7 */
+ NdrRangeMemorySize
};
const NDR_FREE NdrFreer[NDR_TABLE_SIZE] = {
0,
@@ -298,9 +318,14 @@ const NDR_FREE NdrFreer[NDR_TABLE_SIZE] = {
NdrXmitOrRepAsFree, NdrXmitOrRepAsFree,
/* 0x2f */
NdrInterfacePointerFree,
- /* 0xb0 */
- 0, 0, 0, 0,
- NdrUserMarshalFree
+ /* 0x30 */
+ 0,
+ /* 0xb1 */
+ 0, 0, 0,
+ NdrUserMarshalFree,
+ 0, 0,
+ /* 0xb7 */
+ NdrRangeFree
};
void * WINAPI NdrAllocate(MIDL_STUB_MESSAGE *pStubMsg, size_t len)
@@ -5047,6 +5072,187 @@ void WINAPI NdrXmitOrRepAsFree(PMIDL_STUB_MESSAGE pStubMsg,
FIXME("stub\n");
}
+#include "pshpack1.h"
+typedef struct
+{
+ unsigned char type;
+ unsigned char flags_type; /* flags in upper nibble, type in lower nibble */
+ ULONG low_value;
+ ULONG high_value;
+} NDR_RANGE;
+#include "poppack.h"
+
+/***********************************************************************
+ * NdrRangeMarshall [internal]
+ */
+unsigned char *WINAPI NdrRangeMarshall(
+ PMIDL_STUB_MESSAGE pStubMsg,
+ unsigned char *pMemory,
+ PFORMAT_STRING pFormat)
+{
+ NDR_RANGE *pRange = (NDR_RANGE *)pFormat;
+ unsigned char base_type;
+
+ TRACE("pStubMsg %p, pMemory %p, type 0x%02x\n", pStubMsg, pMemory, *pFormat);
+
+ if (pRange->type != RPC_FC_RANGE)
+ {
+ ERR("invalid format type %x\n", pRange->type);
+ RpcRaiseException(RPC_S_INTERNAL_ERROR);
+ return NULL;
+ }
+
+ base_type = pRange->flags_type & 0xf;
+
+ return NdrBaseTypeMarshall(pStubMsg, pMemory, &base_type);
+}
+
+/***********************************************************************
+ * NdrRangeUnmarshall
+ */
+unsigned char *WINAPI NdrRangeUnmarshall(
+ PMIDL_STUB_MESSAGE pStubMsg,
+ unsigned char **ppMemory,
+ PFORMAT_STRING pFormat,
+ unsigned char fMustAlloc)
+{
+ NDR_RANGE *pRange = (NDR_RANGE *)pFormat;
+ unsigned char base_type;
+
+ TRACE("pStubMsg: %p, ppMemory: %p, type: 0x%02x, fMustAlloc: %s\n", pStubMsg, ppMemory, *pFormat, fMustAlloc ? "true" : "false");
+
+ if (pRange->type != RPC_FC_RANGE)
+ {
+ ERR("invalid format type %x\n", pRange->type);
+ RpcRaiseException(RPC_S_INTERNAL_ERROR);
+ return NULL;
+ }
+ base_type = pRange->flags_type & 0xf;
+
+ TRACE("base_type = 0x%02x, low_value = %d, high_value = %d\n",
+ base_type, pRange->low_value, pRange->high_value);
+
+#define RANGE_UNMARSHALL(type, format_spec) \
+ do \
+ { \
+ ALIGN_POINTER(pStubMsg->Buffer, sizeof(type)); \
+ if (fMustAlloc || !*ppMemory) \
+ *ppMemory = NdrAllocate(pStubMsg, sizeof(type)); \
+ if ((*(type *)pStubMsg->Buffer < (type)pRange->low_value) || \
+ (*(type *)pStubMsg->Buffer > (type)pRange->high_value)) \
+ { \
+ ERR("value exceeded bounds: " format_spec ", low: " format_spec ", high: " format_spec "\n", \
+ *(type *)pStubMsg->Buffer, (type)pRange->low_value, \
+ (type)pRange->high_value); \
+ RpcRaiseException(RPC_S_INVALID_BOUND); \
+ return NULL; \
+ } \
+ TRACE("*ppMemory: %p\n", *ppMemory); \
+ **(type **)ppMemory = *(type *)pStubMsg->Buffer; \
+ pStubMsg->Buffer += sizeof(type); \
+ } while (0)
+
+ switch(base_type)
+ {
+ case RPC_FC_CHAR:
+ case RPC_FC_SMALL:
+ RANGE_UNMARSHALL(UCHAR, "%d");
+ TRACE("value: 0x%02x\n", **(UCHAR **)ppMemory);
+ break;
+ case RPC_FC_BYTE:
+ case RPC_FC_USMALL:
+ RANGE_UNMARSHALL(CHAR, "%u");
+ TRACE("value: 0x%02x\n", **(UCHAR **)ppMemory);
+ break;
+ case RPC_FC_WCHAR: /* FIXME: valid? */
+ case RPC_FC_USHORT:
+ RANGE_UNMARSHALL(USHORT, "%u");
+ TRACE("value: 0x%04x\n", **(USHORT **)ppMemory);
+ break;
+ case RPC_FC_SHORT:
+ RANGE_UNMARSHALL(SHORT, "%d");
+ TRACE("value: 0x%04x\n", **(USHORT **)ppMemory);
+ break;
+ case RPC_FC_LONG:
+ RANGE_UNMARSHALL(LONG, "%d");
+ TRACE("value: 0x%08x\n", **(ULONG **)ppMemory);
+ break;
+ case RPC_FC_ULONG:
+ RANGE_UNMARSHALL(ULONG, "%u");
+ TRACE("value: 0x%08x\n", **(ULONG **)ppMemory);
+ break;
+ case RPC_FC_ENUM16:
+ case RPC_FC_ENUM32:
+ FIXME("Unhandled enum type\n");
+ break;
+ case RPC_FC_ERROR_STATUS_T: /* FIXME: valid? */
+ case RPC_FC_FLOAT:
+ case RPC_FC_DOUBLE:
+ case RPC_FC_HYPER:
+ default:
+ ERR("invalid range base type: 0x%02x\n", base_type);
+ RpcRaiseException(RPC_S_INTERNAL_ERROR);
+ }
+
+ return NULL;
+}
+
+/***********************************************************************
+ * NdrRangeBufferSize [internal]
+ */
+void WINAPI NdrRangeBufferSize(
+ PMIDL_STUB_MESSAGE pStubMsg,
+ unsigned char *pMemory,
+ PFORMAT_STRING pFormat)
+{
+ NDR_RANGE *pRange = (NDR_RANGE *)pFormat;
+ unsigned char base_type;
+
+ TRACE("pStubMsg %p, pMemory %p, type 0x%02x\n", pStubMsg, pMemory, *pFormat);
+
+ if (pRange->type != RPC_FC_RANGE)
+ {
+ ERR("invalid format type %x\n", pRange->type);
+ RpcRaiseException(RPC_S_INTERNAL_ERROR);
+ }
+ base_type = pRange->flags_type & 0xf;
+
+ NdrBaseTypeBufferSize(pStubMsg, pMemory, &base_type);
+}
+
+/***********************************************************************
+ * NdrRangeMemorySize [internal]
+ */
+ULONG WINAPI NdrRangeMemorySize(
+ PMIDL_STUB_MESSAGE pStubMsg,
+ PFORMAT_STRING pFormat)
+{
+ NDR_RANGE *pRange = (NDR_RANGE *)pFormat;
+ unsigned char base_type;
+
+ if (pRange->type != RPC_FC_RANGE)
+ {
+ ERR("invalid format type %x\n", pRange->type);
+ RpcRaiseException(RPC_S_INTERNAL_ERROR);
+ return 0;
+ }
+ base_type = pRange->flags_type & 0xf;
+
+ return NdrBaseTypeMemorySize(pStubMsg, &base_type);
+}
+
+/***********************************************************************
+ * NdrRangeFree [internal]
+ */
+void WINAPI NdrRangeFree(PMIDL_STUB_MESSAGE pStubMsg,
+ unsigned char *pMemory,
+ PFORMAT_STRING pFormat)
+{
+ TRACE("pStubMsg %p pMemory %p type 0x%02x\n", pStubMsg, pMemory, *pFormat);
+
+ /* nothing to do */
+}
+
/***********************************************************************
* NdrBaseTypeMarshall [internal]
*/
More information about the wine-cvs
mailing list