void* callBack::registerCCall(int index) { void* result = malloc(10); char* chunk = (char*) result; // MOV ECX, index chunk = store_byte(chunk, '\xB9'); chunk = store_long(chunk, index); // JMP _handleCCallStub chunk = store_byte(chunk, '\xE9'); chunk = store_long(chunk, ((long)StubRoutines::handle_C_callback_stub()) - (4 + (long) chunk)); return result; }
/**************************************************************************** * * Name: packet_send * Function: send a packet * variable: pPacket -- packet information point * ****************************************************************************/ UINT32 packet_send(PPACKET pPacket) { //create packet head buffer; unsigned char packet_head[PACKET_HEAD_LEN]; unsigned char szCRC[4]; MakePacketHeadBuffer(pPacket, packet_head); //send packet header if(PACKET_HEAD_LEN != com_send(packet_head, PACKET_HEAD_LEN)) { return ERROR_SENDPACKETHEAD; } UINT32 nLength = pPacket->packet_length; if(0 != pPacket->blank_flag && PACKET_DATA == pPacket->packet_type) nLength = 4; if(nLength != com_send(pPacket->data_buffer, nLength)) { return ERROR_SENDPACKETDATA; } UINT32 nCRC = MG_Table_Driven_CRC(0xFFFFFFFF, pPacket->data_buffer, nLength); store_long(szCRC, nCRC); if(4 != com_send(szCRC, 4)) { return ERROR_SENDPACKETCRC; } return SUCCESS; }
/**************************************************************************** * * Name: MakePacketHeadBuffer * Function: Make Packet head buffer * Remark: local function * variable: * ****************************************************************************/ void MakePacketHeadBuffer(PPACKET pPacket, unsigned char *packet_head) { MEMSET(packet_head, 0, PACKET_HEAD_LEN); // set packet head information; MEMCPY(packet_head + PACKET_HEAD_FLAG_OFFSET, l_packet_head_flag, sizeof(l_packet_head_flag) - 1); MEMCPY(packet_head + PACKET_TYPE_OFFSET, &(pPacket->packet_type), sizeof(pPacket->packet_type)); MEMCPY(packet_head + PACKET_BLANKFLAG_OFFSET, &(pPacket->blank_flag), sizeof(pPacket->blank_flag)); store_long(packet_head + PACKET_INDEX_OFFSET, pPacket->packet_index); MEMCPY(packet_head + PACKET_REPEAT_OFFSET, &(pPacket->packet_repeat), sizeof(pPacket->packet_repeat)); store_long( packet_head + PACKET_LENGTH_OFFSET, pPacket->packet_length); UINT32 nCRC = MG_Table_Driven_CRC(0xFFFFFFFF, packet_head + PACKET_TYPE_OFFSET, PACKET_HEAD_LEN - 8); store_long( packet_head + PACKET_HEAD_CRC_OFFSET, nCRC); }
void* callBack::registerPascalCall(int index, int nofArgs) { void* result = malloc(15); char* chunk = (char*) result; // MOV ECX, index chunk = store_byte(chunk, '\xB9'); chunk = store_long(chunk, index); // MOV EDX, number of bytes for parameters chunk = store_byte(chunk, '\xBA'); chunk = store_long(chunk, nofArgs * sizeof(int)); // JMP _handleCCallStub chunk = store_byte(chunk, '\xE9'); chunk = store_long(chunk, ((long)StubRoutines::handle_pascal_callback_stub()) - (4 + (long) chunk)); return result; }
void ota_save_parameter(UINT8 *p) { unsigned long crc, len; MEMCPY(p+CHUNK_HEADER_SIZE, &m_ota_cfg, sizeof(m_ota_cfg)); MG_Setup_CRC_Table(); len = fetch_long(p + CHUNK_LENGTH); crc = (unsigned long)MG_Table_Driven_CRC(0xFFFFFFFF, p + CHUNK_NAME, len); store_long( (unsigned char*)(p + CHUNK_CRC), crc); }
/**************************************************************************** * * Name: SendStatusPacket * Function: send a status packet * variable: cStatus -- status * nCode -- error code or status code * * ****************************************************************************/ UINT32 SendStatusPacket(unsigned char cStatus, UINT32 nCode) { PACKET packet; MEMSET(&packet, 0 , sizeof(PACKET)); packet.packet_type = PACKET_STATUS; packet.packet_index = g_packet_index; packet.packet_repeat = g_packet_repeat; packet.blank_flag = 0; packet.packet_length = 5; packet.data_buffer[0] = cStatus; store_long(packet.data_buffer + 1, nCode); return packet_send(&packet); }
/**************************************************************************** * * Name: SendRequestPacket * Function: Send a request status Packet * variable: nPacketNum -- packet number request * * * ****************************************************************************/ UINT32 SendRequestPacket(UINT32 nPacketNum) { //data in packet = (4B)PacketNum + data // PACKET packet; MEMSET(&send_packet, 0, sizeof(PACKET)); send_packet.blank_flag = 0; send_packet.packet_type = PACKET_REQUEST; send_packet.packet_length = 4; store_long(send_packet.data_buffer, nPacketNum); send_packet.packet_index = g_packet_index; send_packet.packet_repeat = g_packet_repeat; return packet_send(&send_packet); }
UINT32 SendDataPacket(UINT32 nPacketNum, unsigned char *szBuffer, UINT32 nLen) { //data in packet = (4B)PacketNum + data // PACKET packet; MEMSET(&send_packet, 0, sizeof(PACKET)); send_packet.blank_flag = IsBlankPacket(szBuffer, nLen); send_packet.packet_type = PACKET_DATA; send_packet.packet_length = nLen + 4; store_long(send_packet.data_buffer, nPacketNum); MEMCPY(send_packet.data_buffer + 4, szBuffer, nLen); send_packet.packet_index = g_packet_index; send_packet.packet_repeat = g_packet_repeat; return packet_send(&send_packet); }