rpcrt4: Implement fixed array functions.
This commit is contained in:
parent
c27db4cde6
commit
0f7e4a877a
|
@ -3188,6 +3188,20 @@ void WINAPI NdrConformantVaryingStructFree(PMIDL_STUB_MESSAGE pStubMsg,
|
||||||
EmbeddedPointerFree(pStubMsg, pMemory, pFormat);
|
EmbeddedPointerFree(pStubMsg, pMemory, pFormat);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
unsigned char type;
|
||||||
|
unsigned char alignment;
|
||||||
|
unsigned short total_size;
|
||||||
|
} NDR_SMFARRAY_FORMAT;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
unsigned char type;
|
||||||
|
unsigned char alignment;
|
||||||
|
unsigned long total_size;
|
||||||
|
} NDR_LGFARRAY_FORMAT;
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* NdrFixedArrayMarshall [RPCRT4.@]
|
* NdrFixedArrayMarshall [RPCRT4.@]
|
||||||
*/
|
*/
|
||||||
|
@ -3195,7 +3209,37 @@ unsigned char * WINAPI NdrFixedArrayMarshall(PMIDL_STUB_MESSAGE pStubMsg,
|
||||||
unsigned char *pMemory,
|
unsigned char *pMemory,
|
||||||
PFORMAT_STRING pFormat)
|
PFORMAT_STRING pFormat)
|
||||||
{
|
{
|
||||||
FIXME("stub\n");
|
const NDR_SMFARRAY_FORMAT *pSmFArrayFormat = (const NDR_SMFARRAY_FORMAT *)pFormat;
|
||||||
|
unsigned long total_size;
|
||||||
|
|
||||||
|
TRACE("(%p, %p, %p)\n", pStubMsg, pMemory, pFormat);
|
||||||
|
|
||||||
|
if ((pSmFArrayFormat->type != RPC_FC_SMFARRAY) &&
|
||||||
|
(pSmFArrayFormat->type != RPC_FC_LGFARRAY))
|
||||||
|
{
|
||||||
|
ERR("invalid format type %x\n", pSmFArrayFormat->type);
|
||||||
|
RpcRaiseException(RPC_S_INTERNAL_ERROR);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
ALIGN_POINTER(pStubMsg->Buffer, pSmFArrayFormat->alignment + 1);
|
||||||
|
|
||||||
|
if (pSmFArrayFormat->type == RPC_FC_SMFARRAY)
|
||||||
|
{
|
||||||
|
total_size = pSmFArrayFormat->total_size;
|
||||||
|
pFormat = (unsigned char *)(pSmFArrayFormat + 1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
const NDR_LGFARRAY_FORMAT *pLgFArrayFormat = (const NDR_LGFARRAY_FORMAT *)pFormat;
|
||||||
|
total_size = pLgFArrayFormat->total_size;
|
||||||
|
pFormat = (unsigned char *)(pLgFArrayFormat + 1);
|
||||||
|
}
|
||||||
|
memcpy(pStubMsg->Buffer, pMemory, total_size);
|
||||||
|
pStubMsg->Buffer += total_size;
|
||||||
|
|
||||||
|
pFormat = EmbeddedPointerMarshall(pStubMsg, pMemory, pFormat);
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3207,7 +3251,40 @@ unsigned char * WINAPI NdrFixedArrayUnmarshall(PMIDL_STUB_MESSAGE pStubMsg,
|
||||||
PFORMAT_STRING pFormat,
|
PFORMAT_STRING pFormat,
|
||||||
unsigned char fMustAlloc)
|
unsigned char fMustAlloc)
|
||||||
{
|
{
|
||||||
FIXME("stub\n");
|
const NDR_SMFARRAY_FORMAT *pSmFArrayFormat = (const NDR_SMFARRAY_FORMAT *)pFormat;
|
||||||
|
unsigned long total_size;
|
||||||
|
|
||||||
|
TRACE("(%p, %p, %p, %d)\n", pStubMsg, ppMemory, pFormat, fMustAlloc);
|
||||||
|
|
||||||
|
if ((pSmFArrayFormat->type != RPC_FC_SMFARRAY) &&
|
||||||
|
(pSmFArrayFormat->type != RPC_FC_LGFARRAY))
|
||||||
|
{
|
||||||
|
ERR("invalid format type %x\n", pSmFArrayFormat->type);
|
||||||
|
RpcRaiseException(RPC_S_INTERNAL_ERROR);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
ALIGN_POINTER(pStubMsg->Buffer, pSmFArrayFormat->alignment + 1);
|
||||||
|
|
||||||
|
if (pSmFArrayFormat->type == RPC_FC_SMFARRAY)
|
||||||
|
{
|
||||||
|
total_size = pSmFArrayFormat->total_size;
|
||||||
|
pFormat = (unsigned char *)(pSmFArrayFormat + 1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
const NDR_LGFARRAY_FORMAT *pLgFArrayFormat = (const NDR_LGFARRAY_FORMAT *)pFormat;
|
||||||
|
total_size = pLgFArrayFormat->total_size;
|
||||||
|
pFormat = (unsigned char *)(pLgFArrayFormat + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fMustAlloc || !*ppMemory)
|
||||||
|
*ppMemory = NdrAllocate(pStubMsg, total_size);
|
||||||
|
memcpy(*ppMemory, pStubMsg->Buffer, total_size);
|
||||||
|
pStubMsg->Buffer += total_size;
|
||||||
|
|
||||||
|
pFormat = EmbeddedPointerUnmarshall(pStubMsg, ppMemory, pFormat, fMustAlloc);
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3218,7 +3295,35 @@ void WINAPI NdrFixedArrayBufferSize(PMIDL_STUB_MESSAGE pStubMsg,
|
||||||
unsigned char *pMemory,
|
unsigned char *pMemory,
|
||||||
PFORMAT_STRING pFormat)
|
PFORMAT_STRING pFormat)
|
||||||
{
|
{
|
||||||
FIXME("stub\n");
|
const NDR_SMFARRAY_FORMAT *pSmFArrayFormat = (const NDR_SMFARRAY_FORMAT *)pFormat;
|
||||||
|
unsigned long total_size;
|
||||||
|
|
||||||
|
TRACE("(%p, %p, %p)\n", pStubMsg, pMemory, pFormat);
|
||||||
|
|
||||||
|
if ((pSmFArrayFormat->type != RPC_FC_SMFARRAY) &&
|
||||||
|
(pSmFArrayFormat->type != RPC_FC_LGFARRAY))
|
||||||
|
{
|
||||||
|
ERR("invalid format type %x\n", pSmFArrayFormat->type);
|
||||||
|
RpcRaiseException(RPC_S_INTERNAL_ERROR);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ALIGN_LENGTH(pStubMsg->BufferLength, pSmFArrayFormat->alignment + 1);
|
||||||
|
|
||||||
|
if (pSmFArrayFormat->type == RPC_FC_SMFARRAY)
|
||||||
|
{
|
||||||
|
total_size = pSmFArrayFormat->total_size;
|
||||||
|
pFormat = (unsigned char *)(pSmFArrayFormat + 1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
const NDR_LGFARRAY_FORMAT *pLgFArrayFormat = (const NDR_LGFARRAY_FORMAT *)pFormat;
|
||||||
|
total_size = pLgFArrayFormat->total_size;
|
||||||
|
pFormat = (unsigned char *)(pLgFArrayFormat + 1);
|
||||||
|
}
|
||||||
|
pStubMsg->BufferLength += total_size;
|
||||||
|
|
||||||
|
EmbeddedPointerBufferSize(pStubMsg, pMemory, pFormat);
|
||||||
}
|
}
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
|
@ -3227,8 +3332,38 @@ void WINAPI NdrFixedArrayBufferSize(PMIDL_STUB_MESSAGE pStubMsg,
|
||||||
unsigned long WINAPI NdrFixedArrayMemorySize(PMIDL_STUB_MESSAGE pStubMsg,
|
unsigned long WINAPI NdrFixedArrayMemorySize(PMIDL_STUB_MESSAGE pStubMsg,
|
||||||
PFORMAT_STRING pFormat)
|
PFORMAT_STRING pFormat)
|
||||||
{
|
{
|
||||||
FIXME("stub\n");
|
const NDR_SMFARRAY_FORMAT *pSmFArrayFormat = (const NDR_SMFARRAY_FORMAT *)pFormat;
|
||||||
|
unsigned long total_size;
|
||||||
|
|
||||||
|
TRACE("(%p, %p)\n", pStubMsg, pFormat);
|
||||||
|
|
||||||
|
if ((pSmFArrayFormat->type != RPC_FC_SMFARRAY) &&
|
||||||
|
(pSmFArrayFormat->type != RPC_FC_LGFARRAY))
|
||||||
|
{
|
||||||
|
ERR("invalid format type %x\n", pSmFArrayFormat->type);
|
||||||
|
RpcRaiseException(RPC_S_INTERNAL_ERROR);
|
||||||
return 0;
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
ALIGN_POINTER(pStubMsg->Buffer, pSmFArrayFormat->alignment + 1);
|
||||||
|
|
||||||
|
if (pSmFArrayFormat->type == RPC_FC_SMFARRAY)
|
||||||
|
{
|
||||||
|
total_size = pSmFArrayFormat->total_size;
|
||||||
|
pFormat = (unsigned char *)(pSmFArrayFormat + 1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
const NDR_LGFARRAY_FORMAT *pLgFArrayFormat = (const NDR_LGFARRAY_FORMAT *)pFormat;
|
||||||
|
total_size = pLgFArrayFormat->total_size;
|
||||||
|
pFormat = (unsigned char *)(pLgFArrayFormat + 1);
|
||||||
|
}
|
||||||
|
pStubMsg->Buffer += total_size;
|
||||||
|
pStubMsg->MemorySize += total_size;
|
||||||
|
|
||||||
|
EmbeddedPointerMemorySize(pStubMsg, pFormat);
|
||||||
|
|
||||||
|
return total_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
|
@ -3238,7 +3373,27 @@ void WINAPI NdrFixedArrayFree(PMIDL_STUB_MESSAGE pStubMsg,
|
||||||
unsigned char *pMemory,
|
unsigned char *pMemory,
|
||||||
PFORMAT_STRING pFormat)
|
PFORMAT_STRING pFormat)
|
||||||
{
|
{
|
||||||
FIXME("stub\n");
|
const NDR_SMFARRAY_FORMAT *pSmFArrayFormat = (const NDR_SMFARRAY_FORMAT *)pFormat;
|
||||||
|
|
||||||
|
TRACE("(%p, %p, %p)\n", pStubMsg, pMemory, pFormat);
|
||||||
|
|
||||||
|
if ((pSmFArrayFormat->type != RPC_FC_SMFARRAY) &&
|
||||||
|
(pSmFArrayFormat->type != RPC_FC_LGFARRAY))
|
||||||
|
{
|
||||||
|
ERR("invalid format type %x\n", pSmFArrayFormat->type);
|
||||||
|
RpcRaiseException(RPC_S_INTERNAL_ERROR);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pSmFArrayFormat->type == RPC_FC_SMFARRAY)
|
||||||
|
pFormat = (unsigned char *)(pSmFArrayFormat + 1);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
const NDR_LGFARRAY_FORMAT *pLgFArrayFormat = (const NDR_LGFARRAY_FORMAT *)pFormat;
|
||||||
|
pFormat = (unsigned char *)(pLgFArrayFormat + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
EmbeddedPointerFree(pStubMsg, pMemory, pFormat);
|
||||||
}
|
}
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
|
|
Loading…
Reference in New Issue