void *IPC_BufferFill(IPC_Buffer Buffer, void *SourcePtr, IPC_U32 SourceLength) { IPC_Buffer_T *BufferPtr; IPC_U32 MaxDataSize; if (SourceLength == 0) return NULL; BufferPtr = IPC_BufferToPtr(Buffer); if (BufferPtr == 0) { IPC_TRACE(IPC_Channel_Error, "IPC_BufferFill", "Invalid Buffer %d", Buffer, 0, 0, 0); return NULL; } MaxDataSize = IPC_PoolMaxDataSize(BufferPtr->Pool); if (MaxDataSize < SourceLength) { IPC_TRACE(IPC_Channel_Error, "IPC_BufferFill", "Buffer %08X, Length %d too big", Buffer, SourceLength, 0, 0); return NULL; } IPC_TRACE(IPC_Channel_Data, "IPC_BufferFill", "Buffer %08X, From %08P, Length %d", Buffer, SourcePtr, SourceLength, 0); BufferPtr->DataSize = SourceLength; return memcpy(IPC_SmAddress(BufferPtr->DataOffset), SourcePtr, SourceLength); }
void *IPC_BufferHeaderRemove(IPC_Buffer Buffer, IPC_U32 HeaderSize) { IPC_Buffer_T *BufferPtr = IPC_BufferToPtr(Buffer); if (BufferPtr == 0) { IPC_TRACE(IPC_Channel_Error, "IPC_BufferHeaderRemove", "Invalid Buffer %d", Buffer, 0, 0, 0); return 0; } if (HeaderSize > BufferPtr->HeaderSize) { IPC_TRACE(IPC_Channel_Error, "IPC_BufferHeaderRemove", "Buffer %08X, HeaderSize %d too big", Buffer, HeaderSize, 0, 0); return 0; } else { IPC_TRACE(IPC_Channel_Data, "IPC_BufferHeaderRemove", "Buffer %08X, HeaderSize %d", Buffer, HeaderSize, 0, 0); BufferPtr->HeaderSize -= HeaderSize; return IPC_SmAddress(BufferPtr->DataOffset - BufferPtr->HeaderSize); } }
void *IPC_BufferHeaderPointer(IPC_Buffer Buffer) { IPC_Buffer_T *BufferPtr = IPC_BufferToPtr(Buffer); if (BufferPtr == 0) { IPC_TRACE(IPC_Channel_Error, "IPC_BufferHeaderPointer", "Invalid Buffer %d", Buffer, 0, 0, 0); return 0; } IPC_TRACE(IPC_Channel_Data, "IPC_BufferHeaderPointer", "Buffer %08X", Buffer, 0, 0, 0); return IPC_SmAddress(BufferPtr->DataOffset - BufferPtr->HeaderSize); }
void *IPC_BufferFillByLinkList(IPC_Buffer Buffer, IPC_LinkList_T *LinkListPtr, IPC_U32 LinkListLength) { IPC_Buffer_T *BufferPtr; IPC_U32 MaxDataSize; IPC_U32 SourceLength; IPC_U32 i; unsigned char *p; unsigned char *q; SourceLength = 0; for (i = 0; i < LinkListLength; i++) SourceLength += LinkListPtr[i].size; if (SourceLength == 0) return NULL; BufferPtr = IPC_BufferToPtr(Buffer); if (BufferPtr == 0) { IPC_TRACE(IPC_Channel_Error, "IPC_BufferFillByLinkList", "Invalid Buffer %d", Buffer, 0, 0, 0); return NULL; } MaxDataSize = IPC_PoolMaxDataSize(BufferPtr->Pool); if (MaxDataSize < SourceLength) { IPC_TRACE(IPC_Channel_Error, "IPC_BufferFillByLinkList", "Buffer %08X, Length %d too big", Buffer, SourceLength, 0, 0); return NULL; } IPC_TRACE(IPC_Channel_Data, "IPC_BufferFillByLinkList", "Buffer %08X, LinkListPtr %08X, Length %d", Buffer, LinkListPtr, SourceLength, 0); BufferPtr->DataSize = SourceLength; p = q = IPC_SmAddress(BufferPtr->DataOffset); for (i = 0; i < LinkListLength; i++) { memcpy(p, LinkListPtr[i].byte_array, LinkListPtr[i].size); p += LinkListPtr[i].size; } return (void *)q; }
void *IPC_BufferDataPointer(IPC_Buffer Buffer) { IPC_Buffer_T *BufferPtr = IPC_BufferToPtr(Buffer); IPC_SmPtr DataOffset = 0; if (BufferPtr == 0) { IPC_TRACE(IPC_Channel_Error, "IPC_BufferDataPointer", "Invalid Buffer %d", Buffer, 0, 0, 0); return 0; } DataOffset = BufferPtr->DataOffset; IPC_TRACE(IPC_Channel_Data, "IPC_BufferDataPointer", "Buffer %08X, Ptr %08X", Buffer, DataOffset, 0, 0); if (DataOffset >= ((IPC_SmControl) SmBase)->Size) { IPC_TRACE(IPC_Channel_Error, "IPC_BufferDataPointer", "Invalid Pointer %08X", DataOffset, 0, 0, 0); return 0; } return IPC_SmAddress(DataOffset); }