📄 ndr_marshall.c
字号:
TRACE("type=%d, attr=%d\n", type, attr);
pFormat += 2;
if (attr & RPC_FC_P_SIMPLEPOINTER) desc = pFormat;
else desc = pFormat + *(const SHORT*)pFormat;
if (attr & RPC_FC_P_DEREF) {
Pointer = *(unsigned char**)Pointer;
TRACE("deref => %p\n", Pointer);
}
switch (type) {
case RPC_FC_RP: /* ref pointer (always non-null) */
break;
case RPC_FC_OP:
case RPC_FC_UP:
pStubMsg->BufferLength += 4;
/* NULL pointer has no further representation */
if (!Pointer)
return;
break;
case RPC_FC_FP:
default:
FIXME("unhandled ptr type=%02x\n", type);
RpcRaiseException(RPC_X_BAD_STUB_DATA);
}
m = NdrBufferSizer[*desc & NDR_TABLE_MASK];
if (m) m(pStubMsg, Pointer, desc);
else FIXME("no buffersizer for data type=%02x\n", *desc);
}
/***********************************************************************
* PointerMemorySize [RPCRT4.@]
*/
unsigned long WINAPI PointerMemorySize(PMIDL_STUB_MESSAGE pStubMsg,
unsigned char *Buffer,
PFORMAT_STRING pFormat)
{
unsigned type = pFormat[0], attr = pFormat[1];
PFORMAT_STRING desc;
NDR_MEMORYSIZE m;
FIXME("(%p,%p,%p): stub\n", pStubMsg, Buffer, pFormat);
TRACE("type=%d, attr=", type); dump_pointer_attr(attr);
pFormat += 2;
if (attr & RPC_FC_P_SIMPLEPOINTER) desc = pFormat;
else desc = pFormat + *(const SHORT*)pFormat;
if (attr & RPC_FC_P_DEREF) {
TRACE("deref\n");
}
switch (type) {
case RPC_FC_RP: /* ref pointer (always non-null) */
break;
default:
FIXME("unhandled ptr type=%02x\n", type);
RpcRaiseException(RPC_X_BAD_STUB_DATA);
}
m = NdrMemorySizer[*desc & NDR_TABLE_MASK];
if (m) m(pStubMsg, desc);
else FIXME("no memorysizer for data type=%02x\n", *desc);
return 0;
}
/***********************************************************************
* PointerFree [RPCRT4.@]
*/
void WINAPI PointerFree(PMIDL_STUB_MESSAGE pStubMsg,
unsigned char *Pointer,
PFORMAT_STRING pFormat)
{
unsigned type = pFormat[0], attr = pFormat[1];
PFORMAT_STRING desc;
NDR_FREE m;
TRACE("(%p,%p,%p)\n", pStubMsg, Pointer, pFormat);
TRACE("type=%d, attr=", type); dump_pointer_attr(attr);
if (attr & RPC_FC_P_DONTFREE) return;
pFormat += 2;
if (attr & RPC_FC_P_SIMPLEPOINTER) desc = pFormat;
else desc = pFormat + *(const SHORT*)pFormat;
if (attr & RPC_FC_P_DEREF) {
Pointer = *(unsigned char**)Pointer;
TRACE("deref => %p\n", Pointer);
}
if (!Pointer) return;
m = NdrFreer[*desc & NDR_TABLE_MASK];
if (m) m(pStubMsg, Pointer, desc);
/* hmm... is this sensible?
* perhaps we should check if the memory comes from NdrAllocate,
* and deallocate only if so - checking if the pointer is between
* BufferStart and BufferEnd is probably no good since the buffer
* may be reallocated when the server wants to marshal the reply */
switch (*desc) {
case RPC_FC_BOGUS_STRUCT:
case RPC_FC_BOGUS_ARRAY:
case RPC_FC_USER_MARSHAL:
break;
default:
FIXME("unhandled data type=%02x\n", *desc);
case RPC_FC_CARRAY:
case RPC_FC_C_CSTRING:
case RPC_FC_C_WSTRING:
if (pStubMsg->ReuseBuffer) goto notfree;
break;
case RPC_FC_IP:
goto notfree;
}
if (attr & RPC_FC_P_ONSTACK) {
TRACE("not freeing stack ptr %p\n", Pointer);
return;
}
TRACE("freeing %p\n", Pointer);
NdrFree(pStubMsg, Pointer);
return;
notfree:
TRACE("not freeing %p\n", Pointer);
}
/***********************************************************************
* EmbeddedPointerMarshall
*/
unsigned char * WINAPI EmbeddedPointerMarshall(PMIDL_STUB_MESSAGE pStubMsg,
unsigned char *pMemory,
PFORMAT_STRING pFormat)
{
unsigned char *Mark = pStubMsg->BufferMark;
unsigned long Offset = pStubMsg->Offset;
unsigned ofs, rep, count, stride, xofs;
TRACE("(%p,%p,%p)\n", pStubMsg, pMemory, pFormat);
if (*pFormat != RPC_FC_PP) return NULL;
pFormat += 2;
while (pFormat[0] != RPC_FC_END) {
switch (pFormat[0]) {
default:
FIXME("unknown repeat type %d\n", pFormat[0]);
case RPC_FC_NO_REPEAT:
rep = 1;
stride = 0;
ofs = 0;
count = 1;
xofs = 0;
pFormat += 2;
break;
case RPC_FC_FIXED_REPEAT:
rep = *(const WORD*)&pFormat[2];
stride = *(const WORD*)&pFormat[4];
ofs = *(const WORD*)&pFormat[6];
count = *(const WORD*)&pFormat[8];
xofs = 0;
pFormat += 10;
break;
case RPC_FC_VARIABLE_REPEAT:
rep = pStubMsg->MaxCount;
stride = *(const WORD*)&pFormat[2];
ofs = *(const WORD*)&pFormat[4];
count = *(const WORD*)&pFormat[6];
xofs = (pFormat[1] == RPC_FC_VARIABLE_OFFSET) ? Offset * stride : 0;
pFormat += 8;
break;
}
/* ofs doesn't seem to matter in this context */
while (rep) {
PFORMAT_STRING info = pFormat;
unsigned char *membase = pMemory + xofs;
unsigned u;
for (u=0; u<count; u++,info+=8) {
unsigned char *memptr = membase + *(const SHORT*)&info[0];
unsigned char *bufptr = Mark + *(const SHORT*)&info[2];
PointerMarshall(pStubMsg, bufptr, *(unsigned char**)memptr, info+4);
}
rep--;
}
pFormat += 8 * count;
}
STD_OVERFLOW_CHECK(pStubMsg);
return NULL;
}
/***********************************************************************
* EmbeddedPointerUnmarshall
*/
unsigned char * WINAPI EmbeddedPointerUnmarshall(PMIDL_STUB_MESSAGE pStubMsg,
unsigned char **ppMemory,
PFORMAT_STRING pFormat,
unsigned char fMustAlloc)
{
unsigned char *Mark = pStubMsg->BufferMark;
unsigned long Offset = pStubMsg->Offset;
unsigned ofs, rep, count, stride, xofs;
TRACE("(%p,%p,%p,%d)\n", pStubMsg, ppMemory, pFormat, fMustAlloc);
if (*pFormat != RPC_FC_PP) return NULL;
pFormat += 2;
while (pFormat[0] != RPC_FC_END) {
switch (pFormat[0]) {
default:
FIXME("unknown repeat type %d\n", pFormat[0]);
case RPC_FC_NO_REPEAT:
rep = 1;
stride = 0;
ofs = 0;
count = 1;
xofs = 0;
pFormat += 2;
break;
case RPC_FC_FIXED_REPEAT:
rep = *(const WORD*)&pFormat[2];
stride = *(const WORD*)&pFormat[4];
ofs = *(const WORD*)&pFormat[6];
count = *(const WORD*)&pFormat[8];
xofs = 0;
pFormat += 10;
break;
case RPC_FC_VARIABLE_REPEAT:
rep = pStubMsg->MaxCount;
stride = *(const WORD*)&pFormat[2];
ofs = *(const WORD*)&pFormat[4];
count = *(const WORD*)&pFormat[6];
xofs = (pFormat[1] == RPC_FC_VARIABLE_OFFSET) ? Offset * stride : 0;
pFormat += 8;
break;
}
/* ofs doesn't seem to matter in this context */
while (rep) {
PFORMAT_STRING info = pFormat;
unsigned char *membase = *ppMemory + xofs;
unsigned u;
for (u=0; u<count; u++,info+=8) {
unsigned char *memptr = membase + *(const SHORT*)&info[0];
unsigned char *bufptr = Mark + *(const SHORT*)&info[2];
PointerUnmarshall(pStubMsg, bufptr, (unsigned char**)memptr, info+4, fMustAlloc);
}
rep--;
}
pFormat += 8 * count;
}
return NULL;
}
/***********************************************************************
* EmbeddedPointerBufferSize
*/
void WINAPI EmbeddedPointerBufferSize(PMIDL_STUB_MESSAGE pStubMsg,
unsigned char *pMemory,
PFORMAT_STRING pFormat)
{
unsigned long Offset = pStubMsg->Offset;
unsigned ofs, rep, count, stride, xofs;
TRACE("(%p,%p,%p)\n", pStubMsg, pMemory, pFormat);
if (*pFormat != RPC_FC_PP) return;
pFormat += 2;
while (pFormat[0] != RPC_FC_END) {
switch (pFormat[0]) {
default:
FIXME("unknown repeat type %d\n", pFormat[0]);
case RPC_FC_NO_REPEAT:
rep = 1;
stride = 0;
ofs = 0;
count = 1;
xofs = 0;
pFormat += 2;
break;
case RPC_FC_FIXED_REPEAT:
rep = *(const WORD*)&pFormat[2];
stride = *(const WORD*)&pFormat[4];
ofs = *(const WORD*)&pFormat[6];
count = *(const WORD*)&pFormat[8];
xofs = 0;
pFormat += 10;
break;
case RPC_FC_VARIABLE_REPEAT:
rep = pStubMsg->MaxCount;
stride = *(const WORD*)&pFormat[2];
ofs = *(const WORD*)&pFormat[4];
count = *(const WORD*)&pFormat[6];
xofs = (pFormat[1] == RPC_FC_VARIABLE_OFFSET) ? Offset * stride : 0;
pFormat += 8;
break;
}
/* ofs doesn't seem to matter in this context */
while (rep) {
PFORMAT_STRING info = pFormat;
unsigned char *membase = pMemory + xofs;
unsigned u;
for (u=0; u<count; u++,info+=8) {
unsigned char *memptr = membase + *(const SHORT*)&info[0];
PointerBufferSize(pStubMsg, *(unsigned char**)memptr, info+4);
}
rep--;
}
pFormat += 8 * count;
}
}
/***********************************************************************
* EmbeddedPointerMemorySize
*/
unsigned long WINAPI EmbeddedPointerMemorySize(PMIDL_STUB_MESSAGE pStubMsg,
PFORMAT_STRING pFormat)
{
unsigned long Offset = pStubMsg->Offset;
unsigned char *Mark = pStubMsg->BufferMark;
unsigned ofs, rep, count, stride, xofs;
FIXME("(%p,%p): stub\n", pStubMsg, pFormat);
if (*pFormat != RPC_FC_PP) return 0;
pFormat += 2;
while (pFormat[0] != RPC_FC_END) {
switch (pFormat[0]) {
default:
FIXME("unknown repeat type %d\n", pFormat[0]);
case RPC_FC_NO_REPEAT:
rep = 1;
stride = 0;
ofs = 0;
count = 1;
xofs = 0;
pFormat += 2;
break;
case RPC_FC_FIXED_REPEAT:
rep = *(const WORD*)&pFormat[2];
stride = *(const WORD*)&pFormat[4];
ofs = *(const WORD*)&pFormat[6];
count = *(const WORD*)&pFormat[8];
xofs = 0;
pFormat += 10;
break;
case RPC_FC_VARIABLE_REPEAT:
rep = pStubMsg->MaxCount;
stride = *(const WORD*)&pFormat[2];
ofs = *(const WORD*)&pFormat[4];
count = *(const WORD*)&pFormat[6];
xofs = (pFormat[1] == RPC_FC_VARIABLE_OFFSET) ? Offset * stride : 0;
pFormat += 8;
break;
}
/* ofs doesn't seem to matter in this context */
while (rep) {
PFORMAT_STRING info = pFormat;
unsigned u;
for (u=0; u<count; u++,info+=8) {
unsigned char *bufptr = Mark + *(const SHORT*)&info[2];
PointerMemorySize(pStubMsg, bufptr, info+4);
}
rep--;
}
pFormat += 8 * count;
}
return 0;
}
/***********************************************************************
* EmbeddedPointerFree
*/
void WINAPI EmbeddedPointerFree(PMIDL_STUB_MESSAGE pStubMsg,
unsigned char *pMemory,
PFORMAT_STRING pFormat)
{
unsigned long Offset = pStubMsg->Offset;
unsigned ofs, rep, count, stride, xofs;
TRACE("(%p,%p,%p)\n", pStubMsg, pMemory, pFormat);
if (*pFormat != RPC_FC_PP) return;
pFormat += 2;
while (pFormat[0] != RPC_FC_END) {
switch (pFormat[0]) {
default:
FIXME("unknown repeat type %d\n", pFormat[0]);
case RPC_FC_NO_REPEAT:
rep = 1;
stride = 0;
ofs = 0;
count = 1;
xofs = 0;
pFormat += 2;
break;
case RPC_FC_FIXED_REPEAT:
rep = *(const WORD*)&pFormat[2];
stride = *(const WORD*)&pFormat[4];
ofs = *(const WORD*)&pFormat[6];
count = *(const WORD*)&pFormat[8];
xofs = 0;
pFormat += 10;
break;
case RPC_FC_VARIABLE_REPEAT:
rep = pStubMsg->MaxCount;
stride = *(const WORD*)&pFormat[2];
ofs = *(const WORD*)&pFormat[4];
count = *(const WORD*)&pFormat[6];
xofs = (pFormat[1] == RPC_FC_VARIABLE_OFFSET) ? Offset * stride : 0;
pFormat += 8;
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -