⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ndr_marshall.c

📁 ReactOS是一些高手根据Windows XP的内核编写出的类XP。内核实现机理和API函数调用几乎相同。甚至可以兼容XP的程序。喜欢研究系统内核的人可以看一看。
💻 C
📖 第 1 页 / 共 5 页
字号:
static unsigned long EmbeddedComplexSize(PMIDL_STUB_MESSAGE pStubMsg,                                         PFORMAT_STRING pFormat){  switch (*pFormat) {  case RPC_FC_STRUCT:  case RPC_FC_PSTRUCT:  case RPC_FC_CSTRUCT:  case RPC_FC_BOGUS_STRUCT:  case RPC_FC_SMFARRAY:  case RPC_FC_SMVARRAY:    return *(const WORD*)&pFormat[2];  case RPC_FC_USER_MARSHAL:    return *(const WORD*)&pFormat[4];  case RPC_FC_NON_ENCAPSULATED_UNION:    pFormat += 2;    if (pStubMsg->fHasNewCorrDesc)        pFormat += 6;    else        pFormat += 4;    pFormat += *(const SHORT*)pFormat;    return *(const SHORT*)pFormat;  case RPC_FC_IP:    return sizeof(void *);  default:    FIXME("unhandled embedded type %02x\n", *pFormat);  }  return 0;}static unsigned long EmbeddedComplexMemorySize(PMIDL_STUB_MESSAGE pStubMsg,                                               PFORMAT_STRING pFormat){  NDR_MEMORYSIZE m = NdrMemorySizer[*pFormat & NDR_TABLE_MASK];  if (!m)  {    FIXME("no memorysizer for data type=%02x\n", *pFormat);    return 0;  }  return m(pStubMsg, pFormat);}static unsigned char * ComplexMarshall(PMIDL_STUB_MESSAGE pStubMsg,                                       unsigned char *pMemory,                                       PFORMAT_STRING pFormat,                                       PFORMAT_STRING pPointer){  PFORMAT_STRING desc;  NDR_MARSHALL m;  unsigned long size;  while (*pFormat != RPC_FC_END) {    switch (*pFormat) {    case RPC_FC_BYTE:    case RPC_FC_CHAR:    case RPC_FC_SMALL:    case RPC_FC_USMALL:      TRACE("byte=%d <= %p\n", *(WORD*)pMemory, pMemory);      memcpy(pStubMsg->Buffer, pMemory, 1);      pStubMsg->Buffer += 1;      pMemory += 1;      break;    case RPC_FC_WCHAR:    case RPC_FC_SHORT:    case RPC_FC_USHORT:      TRACE("short=%d <= %p\n", *(WORD*)pMemory, pMemory);      memcpy(pStubMsg->Buffer, pMemory, 2);      pStubMsg->Buffer += 2;      pMemory += 2;      break;    case RPC_FC_LONG:    case RPC_FC_ULONG:    case RPC_FC_ENUM32:      TRACE("long=%d <= %p\n", *(DWORD*)pMemory, pMemory);      memcpy(pStubMsg->Buffer, pMemory, 4);      pStubMsg->Buffer += 4;      pMemory += 4;      break;    case RPC_FC_HYPER:      TRACE("longlong=%s <= %p\n", wine_dbgstr_longlong(*(ULONGLONG*)pMemory), pMemory);      memcpy(pStubMsg->Buffer, pMemory, 8);      pStubMsg->Buffer += 8;      pMemory += 8;      break;    case RPC_FC_POINTER:    {      unsigned char *saved_buffer;      int pointer_buffer_mark_set = 0;      TRACE("pointer=%p <= %p\n", *(unsigned char**)pMemory, pMemory);      saved_buffer = pStubMsg->Buffer;      if (pStubMsg->PointerBufferMark)      {        pStubMsg->Buffer = pStubMsg->PointerBufferMark;        pStubMsg->PointerBufferMark = NULL;        pointer_buffer_mark_set = 1;      }      else        pStubMsg->Buffer += 4; /* for pointer ID */      PointerMarshall(pStubMsg, saved_buffer, *(unsigned char**)pMemory, pPointer);      if (pointer_buffer_mark_set)      {        STD_OVERFLOW_CHECK(pStubMsg);        pStubMsg->PointerBufferMark = pStubMsg->Buffer;        pStubMsg->Buffer = saved_buffer + 4;      }      pPointer += 4;      pMemory += 4;      break;    }    case RPC_FC_ALIGNM4:      ALIGN_POINTER(pMemory, 4);      break;    case RPC_FC_ALIGNM8:      ALIGN_POINTER(pMemory, 8);      break;    case RPC_FC_STRUCTPAD1:    case RPC_FC_STRUCTPAD2:    case RPC_FC_STRUCTPAD3:    case RPC_FC_STRUCTPAD4:    case RPC_FC_STRUCTPAD5:    case RPC_FC_STRUCTPAD6:    case RPC_FC_STRUCTPAD7:      pMemory += *pFormat - RPC_FC_STRUCTPAD1 + 1;      break;    case RPC_FC_EMBEDDED_COMPLEX:      pMemory += pFormat[1];      pFormat += 2;      desc = pFormat + *(const SHORT*)pFormat;      size = EmbeddedComplexSize(pStubMsg, desc);      TRACE("embedded complex (size=%ld) <= %p\n", size, pMemory);      m = NdrMarshaller[*desc & NDR_TABLE_MASK];      if (m)      {        /* for some reason interface pointers aren't generated as         * RPC_FC_POINTER, but instead as RPC_FC_EMBEDDED_COMPLEX, yet         * they still need the derefencing treatment that pointers are         * given */        if (*desc == RPC_FC_IP)          m(pStubMsg, *(unsigned char **)pMemory, desc);        else          m(pStubMsg, pMemory, desc);      }      else FIXME("no marshaller for embedded type %02x\n", *desc);      pMemory += size;      pFormat += 2;      continue;    case RPC_FC_PAD:      break;    default:      FIXME("unhandled format 0x%02x\n", *pFormat);    }    pFormat++;  }  return pMemory;}static unsigned char * ComplexUnmarshall(PMIDL_STUB_MESSAGE pStubMsg,                                         unsigned char *pMemory,                                         PFORMAT_STRING pFormat,                                         PFORMAT_STRING pPointer){  PFORMAT_STRING desc;  NDR_UNMARSHALL m;  unsigned long size;  while (*pFormat != RPC_FC_END) {    switch (*pFormat) {    case RPC_FC_BYTE:    case RPC_FC_CHAR:    case RPC_FC_SMALL:    case RPC_FC_USMALL:      memcpy(pMemory, pStubMsg->Buffer, 1);      TRACE("byte=%d => %p\n", *(WORD*)pMemory, pMemory);      pStubMsg->Buffer += 1;      pMemory += 1;      break;    case RPC_FC_WCHAR:    case RPC_FC_SHORT:    case RPC_FC_USHORT:      memcpy(pMemory, pStubMsg->Buffer, 2);      TRACE("short=%d => %p\n", *(WORD*)pMemory, pMemory);      pStubMsg->Buffer += 2;      pMemory += 2;      break;    case RPC_FC_LONG:    case RPC_FC_ULONG:    case RPC_FC_ENUM32:      memcpy(pMemory, pStubMsg->Buffer, 4);      TRACE("long=%d => %p\n", *(DWORD*)pMemory, pMemory);      pStubMsg->Buffer += 4;      pMemory += 4;      break;    case RPC_FC_HYPER:      memcpy(pMemory, pStubMsg->Buffer, 8);      TRACE("longlong=%s => %p\n", wine_dbgstr_longlong(*(ULONGLONG*)pMemory), pMemory);      pStubMsg->Buffer += 8;      pMemory += 8;      break;    case RPC_FC_POINTER:    {      unsigned char *saved_buffer;      int pointer_buffer_mark_set = 0;      TRACE("pointer => %p\n", pMemory);      ALIGN_POINTER(pStubMsg->Buffer, 4);      saved_buffer = pStubMsg->Buffer;      if (pStubMsg->PointerBufferMark)      {        pStubMsg->Buffer = pStubMsg->PointerBufferMark;        pStubMsg->PointerBufferMark = NULL;        pointer_buffer_mark_set = 1;      }      else        pStubMsg->Buffer += 4; /* for pointer ID */      PointerUnmarshall(pStubMsg, saved_buffer, (unsigned char**)pMemory, pPointer, TRUE);      if (pointer_buffer_mark_set)      {        STD_OVERFLOW_CHECK(pStubMsg);        pStubMsg->PointerBufferMark = pStubMsg->Buffer;        pStubMsg->Buffer = saved_buffer + 4;      }      pPointer += 4;      pMemory += 4;      break;    }    case RPC_FC_ALIGNM4:      ALIGN_POINTER(pMemory, 4);      break;    case RPC_FC_ALIGNM8:      ALIGN_POINTER(pMemory, 8);      break;    case RPC_FC_STRUCTPAD1:    case RPC_FC_STRUCTPAD2:    case RPC_FC_STRUCTPAD3:    case RPC_FC_STRUCTPAD4:    case RPC_FC_STRUCTPAD5:    case RPC_FC_STRUCTPAD6:    case RPC_FC_STRUCTPAD7:      pMemory += *pFormat - RPC_FC_STRUCTPAD1 + 1;      break;    case RPC_FC_EMBEDDED_COMPLEX:      pMemory += pFormat[1];      pFormat += 2;      desc = pFormat + *(const SHORT*)pFormat;      size = EmbeddedComplexSize(pStubMsg, desc);      TRACE("embedded complex (size=%ld) => %p\n", size, pMemory);      m = NdrUnmarshaller[*desc & NDR_TABLE_MASK];      memset(pMemory, 0, size); /* just in case */      if (m)      {        /* for some reason interface pointers aren't generated as         * RPC_FC_POINTER, but instead as RPC_FC_EMBEDDED_COMPLEX, yet         * they still need the derefencing treatment that pointers are         * given */        if (*desc == RPC_FC_IP)          m(pStubMsg, (unsigned char **)pMemory, desc, FALSE);        else          m(pStubMsg, &pMemory, desc, FALSE);      }      else FIXME("no unmarshaller for embedded type %02x\n", *desc);      pMemory += size;      pFormat += 2;      continue;    case RPC_FC_PAD:      break;    default:      FIXME("unhandled format %d\n", *pFormat);    }    pFormat++;  }  return pMemory;}static unsigned char * ComplexBufferSize(PMIDL_STUB_MESSAGE pStubMsg,                                         unsigned char *pMemory,                                         PFORMAT_STRING pFormat,                                         PFORMAT_STRING pPointer){  PFORMAT_STRING desc;  NDR_BUFFERSIZE m;  unsigned long size;  while (*pFormat != RPC_FC_END) {    switch (*pFormat) {    case RPC_FC_BYTE:    case RPC_FC_CHAR:    case RPC_FC_SMALL:    case RPC_FC_USMALL:      pStubMsg->BufferLength += 1;      pMemory += 1;      break;    case RPC_FC_WCHAR:    case RPC_FC_SHORT:    case RPC_FC_USHORT:      pStubMsg->BufferLength += 2;      pMemory += 2;      break;    case RPC_FC_LONG:    case RPC_FC_ULONG:    case RPC_FC_ENUM32:      pStubMsg->BufferLength += 4;      pMemory += 4;      break;    case RPC_FC_HYPER:      pStubMsg->BufferLength += 8;      pMemory += 8;      break;    case RPC_FC_POINTER:      if (!pStubMsg->IgnoreEmbeddedPointers)      {        int saved_buffer_length = pStubMsg->BufferLength;        pStubMsg->BufferLength = pStubMsg->PointerLength;        pStubMsg->PointerLength = 0;        if(!pStubMsg->BufferLength)          ERR("BufferLength == 0??\n");        PointerBufferSize(pStubMsg, *(unsigned char**)pMemory, pPointer);        pStubMsg->PointerLength = pStubMsg->BufferLength;        pStubMsg->BufferLength = saved_buffer_length;      }      pStubMsg->BufferLength += 4;      pPointer += 4;      pMemory += 4;      break;    case RPC_FC_ALIGNM4:      ALIGN_POINTER(pMemory, 4);      break;    case RPC_FC_ALIGNM8:      ALIGN_POINTER(pMemory, 8);      break;    case RPC_FC_STRUCTPAD1:    case RPC_FC_STRUCTPAD2:    case RPC_FC_STRUCTPAD3:    case RPC_FC_STRUCTPAD4:    case RPC_FC_STRUCTPAD5:    case RPC_FC_STRUCTPAD6:    case RPC_FC_STRUCTPAD7:      pMemory += *pFormat - RPC_FC_STRUCTPAD1 + 1;      break;    case RPC_FC_EMBEDDED_COMPLEX:      pMemory += pFormat[1];      pFormat += 2;      desc = pFormat + *(const SHORT*)pFormat;      size = EmbeddedComplexSize(pStubMsg, desc);      m = NdrBufferSizer[*desc & NDR_TABLE_MASK];      if (m)      {        /* for some reason interface pointers aren't generated as         * RPC_FC_POINTER, but instead as RPC_FC_EMBEDDED_COMPLEX, yet         * they still need the derefencing treatment that pointers are         * given */        if (*desc == RPC_FC_IP)          m(pStubMsg, *(unsigned char **)pMemory, desc);        else          m(pStubMsg, pMemory, desc);      }      else FIXME("no buffersizer for embedded type %02x\n", *desc);      pMemory += size;      pFormat += 2;      continue;    case RPC_FC_PAD:      break;    default:      FIXME("unhandled format 0x%02x\n", *pFormat);    }    pFormat++;  }  return pMemory;}static unsigned char * ComplexFree(PMIDL_STUB_MESSAGE pStubMsg,                                   unsigned char *pMemory,                                   PFORMAT_STRING pFormat,                                   PFORMAT_STRING pPointer){  PFORMAT_STRING desc;  NDR_FREE m;  unsigned long size;  while (*pFormat != RPC_FC_END) {    switch (*pFormat) {    case RPC_FC_BYTE:    case RPC_FC_CHAR:    case RPC_FC_SMALL:    case RPC_FC_USMALL:      pMemory += 1;      break;    case RPC_FC_WCHAR:    case RPC_FC_SHORT:    case RPC_FC_USHORT:      pMemory += 2;      break;    case RPC_FC_LONG:    case RPC_FC_ULONG:    case RPC_FC_ENUM32:      pMemory += 4;      break;    case RPC_FC_HYPER:      pMemory += 8;      break;    case RPC_FC_POINTER:      NdrPointerFree(pStubMsg, *(unsigned char**)pMemory, pPointer);      pPointer += 4;      pMemory += 4;      break;    case RPC_FC_ALIGNM4:      ALIGN_POINTER(pMemory, 4);      break;    case RPC_FC_ALIGNM8:      ALIGN_POINTER(pMemory, 8);      break;    case RPC_FC_STRUCTPAD1:    case RPC_FC_STRUCTPAD2:    case RPC_FC_STRUCTPAD3:    case RPC_FC_STRUCTPAD4:    case RPC_FC_STRUCTPAD5:    case RPC_FC_STRUCTPAD6:    case RPC_FC_STRUCTPAD7:      pMemory += *pFormat - RPC_FC_STRUCTPAD1 + 1;      break;    case RPC_FC_EMBEDDED_COMPLEX:      pMemory += pFormat[1];      pFormat += 2;      desc = pForma

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -