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_IncrementBufferDataPointer(IPC_Buffer Buffer, IPC_U32 offset) { IPC_Buffer_T *BufferPtr = IPC_BufferToPtr(Buffer); IPC_SmPtr DataOffset = 0; if (BufferPtr == 0) { IPC_TRACE(IPC_Channel_Error, "IPC_MoveBufferDataPointer ", "Invalid Buffer %d", Buffer, 0, 0, 0); return; } DataOffset = BufferPtr->DataOffset + offset; IPC_TRACE(IPC_Channel_Data, "IPC_MoveBufferDataPointer ", "Buffer %08X, Ptr %08X", Buffer, DataOffset, 0, 0); if (DataOffset >= (BufferPtr->DataBufferStart) + IPC_PoolMaxDataSize(BufferPtr->Pool)) { IPC_TRACE(IPC_Channel_Error, "IPC_MoveBufferDataPointer ", "Invalid Pointer %08X", BufferPtr->DataOffset, 0, 0, 0); return; } BufferPtr->DataOffset = DataOffset; BufferPtr->DataSize -= offset; BufferPtr->HeaderSize += offset; }
IPC_U32 IPC_BufferSetDataSize(IPC_Buffer Buffer, IPC_U32 Length) { IPC_Buffer_T *BufferPtr = IPC_BufferToPtr(Buffer); IPC_U32 MaxDataSize; if (BufferPtr == 0) { IPC_TRACE(IPC_Channel_Error, "IPC_BufferSetDataSize", "Invalid Buffer %d", Buffer, 0, 0, 0); return 0; } MaxDataSize = IPC_PoolMaxDataSize(BufferPtr->Pool); if (Length > MaxDataSize) { IPC_TRACE(IPC_Channel_Error, "IPC_BufferSetDataSize", "Buffer %08X, Length %d too big", Buffer, Length, 0, 0); return 0; } else { IPC_TRACE(IPC_Channel_Data, "IPC_BufferSetDataSize", "Buffer %08X, Length %d", Buffer, Length, 0, 0); BufferPtr->DataSize = Length; return Length; } }
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; }