Guest User

Untitled

a guest
Jan 23rd, 2018
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.94 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <time.h>
  4. #include <Windows.h>
  5.  
  6.  
  7. struct packet_s
  8. {
  9.     unsigned char data_size;
  10.     unsigned char data[256];
  11. };
  12.  
  13. enum _xfer_state_
  14. {
  15.     SEND_HEADER,
  16.     SEND_DATA,
  17.     SEND_COMPLETE,
  18.     WAIT_FOR_ACK
  19. };
  20.  
  21. enum _recv_state_
  22. {
  23.     RECV_HEADER,
  24.     RECV_DATA,
  25.     RECV_COMPLETE,
  26.     SEND_ACK
  27. };
  28.  
  29. enum _response_
  30. {
  31.     ACK = 0xE2,
  32.     NACK = 0xF4
  33. };
  34.  
  35. unsigned char _dummy[256];
  36. unsigned char global_comm_buffer[8];
  37. unsigned char comm;
  38.  
  39. DWORD WINAPI recv_data(void)
  40. {
  41.     struct packet_s packet;
  42.     enum _recv_state_ recv_state = RECV_HEADER;
  43.     unsigned char local_comm = 0;
  44.     unsigned char data_recv;
  45.     unsigned char* ptr_data;
  46.  
  47.     while (recv_state != RECV_COMPLETE) {
  48.    
  49.         switch (recv_state) {
  50.    
  51.         case RECV_HEADER:
  52.             //insert your code here
  53.             break;
  54.  
  55.         case RECV_DATA:
  56.             //insert your code here
  57.             break;
  58.  
  59.         case SEND_ACK:
  60.             //insert your code here
  61.             break;
  62.         }
  63.     }
  64.     memcpy((void *)_dummy,(void*)packet.data,packet.data_size);
  65.     printf("RECV Complete\r\n");
  66.     return 0;
  67. }
  68.  
  69.  
  70. DWORD WINAPI xfer_data(struct packet_s* ptr_packet)
  71. {
  72.     enum _xfer_state_ xfer_state = SEND_HEADER;
  73.     unsigned char local_comm = comm;
  74.     unsigned char data_sent;
  75.     unsigned char* ptr_data = ptr_packet->data;
  76.  
  77.     while (xfer_state != SEND_COMPLETE) {
  78.        
  79.         switch(xfer_state) {
  80.  
  81.         case SEND_HEADER:                                  
  82.             data_sent = 0;                                                      //total data sent
  83.             global_comm_buffer[0] = ptr_packet->data_size;      //set byte zero of header packet to the total data size
  84.             local_comm = comm ^= 1;                                     //flip the comm bit to let recieving side know data is there
  85.             xfer_state = WAIT_FOR_ACK;                              //wait for the acknowledgement before advancing
  86.             break;
  87.  
  88.         case SEND_DATA:
  89.             memcpy((void *)&global_comm_buffer[0], (void*)ptr_data, 8);         //copy the appropriate amount of data into the comm buffer
  90.             data_sent += 8;                                                                     //track the amount of data sent
  91.             ptr_data += 8;                                                                      //advance the buffer pointer 8 bytes
  92.             local_comm = comm ^= 1;                                                     //flip the comm bit to let recieving side know data is there
  93.             xfer_state = WAIT_FOR_ACK;                                              //wait for the acknowledgement before advancing
  94.             break;
  95.  
  96.         case WAIT_FOR_ACK:
  97.             if (local_comm != comm) {                                       //wait for the acknowledgement before advancing (has the bit been changed?)
  98.                 if (global_comm_buffer[0] == ACK) {                 //was the response and ACK?
  99.                     printf("Recieving ACK\r\n");   
  100.                     if (data_sent >= ptr_packet->data_size) {           //has all the data been sent?
  101.                         xfer_state = SEND_COMPLETE;             //yes - complete and break the loop return to main thread
  102.                     } else {           
  103.                         xfer_state = SEND_DATA;                         //no -- send the next chunk
  104.                     }
  105.                 }
  106.                 else {
  107.                     printf("Error Sending\r\n");
  108.                     xfer_state = SEND_COMPLETE; //break loop and return
  109.                 }
  110.             }
  111.             break;
  112.         }
  113.     }
  114.     printf("XFER Complete\r\n");
  115.     return 0;
  116. }
  117.  
  118.  
  119.  
  120. int main(void)
  121. {
  122.     struct packet_s packet;
  123.     unsigned char* ptr_data = &packet.data[0];
  124.     unsigned int buf_len;
  125.     HANDLE threads[2];
  126.  
  127.     comm = 0;
  128.  
  129.     //designating random buffer sizes
  130.     srand(time(NULL));
  131.     buf_len = (unsigned int)rand() % 256;
  132.     packet.data_size = buf_len;
  133.    
  134.  
  135.     //fill with random data
  136.     while(buf_len--) {
  137.         *ptr_data++ = (unsigned char)rand()%256;
  138.     }
  139.  
  140.     buf_len = packet.data_size;
  141.     ptr_data = &packet.data[0];
  142.  
  143.     printf("Buffer Size: %u\r\n", packet.data_size);
  144.     while(buf_len--) {
  145.         printf("0x%02x ", *ptr_data++);
  146.     }
  147.     printf("\r\n");
  148.  
  149.     //create two threads recv and xfer
  150.     threads[0] = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)xfer_data,&packet,0,NULL);
  151.     threads[1] = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)recv_data,NULL,0,NULL);
  152.  
  153.     WaitForMultipleObjects(1,threads,TRUE,INFINITE);
  154.     printf("Threads Complete\r\n");
  155.  
  156.     //compare the recieved buffer with the sent buffer
  157.     if(memcmp((void*)packet.data,(void *)_dummy,packet.data_size) == 0) {
  158.         printf("Challenge Completed Correctly\r\n");
  159.     } else {
  160.         printf("Incorrect Transfer\r\n");
  161.     }
  162.  
  163.     getchar();
  164.  
  165.     return 0;
  166. }
Add Comment
Please, Sign In to add comment