sábado, 22 de febrero de 2014

TCP Checksum


unsigned short  tcp_checksum (int count, unsigned short * addr,unsigned long ip_src,unsigned int ip_dst)
{
    unsigned long sum = 0;
    unsigned long sum2 = 0;
    int k=0;
    int count2;

count2=count;
    count=count>>8;
   // printf("\nCount =%i \n",count);
    while (count > 1) {
     //   printf("\n%04x ",htons(*addr   ));
sum += htons(*addr++);    
        count -= 2;
    }

    // Add left-over byte, if any
    if (count > 0)
        sum += * (unsigned char *) htons(addr);

//printf("Pseudoheader\n");
sum += htons(ip_dst) & 0x00ffff;//printf("\n%04x ",htons(ip_dst) );
         sum += htons(ip_dst>>16) ; //printf("\n%04x ",htons(ip_dst>>16) );
sum += htons(ip_src) & 0x00ffff; //printf("\n%04x ",htons(ip_src) );
         sum += htons(ip_src>>16) ; //printf("\n%04x ",htons(ip_src>>16) );
         sum += 0x6; //printf("\n%04x ",0x6 );
         sum += htons(pacsize+count2);
//printf("\n%04x ",htons(pacsize+count2));

    while (sum >> 16)
        sum = (sum & 0xffff) + (sum >> 16);

    return (unsigned short )(htons(~sum));
}

unsigned short  checksum (int count, unsigned short * addr) {
    unsigned long sum = 0;

    count=count>>8;
   // printf("Count =%x \n",count);
    while (count > 1) {
     //   printf("%x ",(*addr<<8 &0xff00  ));
sum += *addr++;    
        count -= 2;
    }

    // Add left-over byte, if any
    if (count > 0)
        sum += * (unsigned char *) addr;

    if (sum >> 16)
        sum = (sum & 0xffff) + (sum >> 16);

/*while (sum >> 16)
        sum = (sum & 0xffff) + (sum >> 16);*/

    return (unsigned short )(~sum);
}

viernes, 7 de febrero de 2014

Read and Write IDE ATA functions in C

The following functions in C  allows you to read and write a single sector in a hard disk:

int IDE1=0x1F0;
unsigned int drive=0x00;

int Read_Disk(unsigned long addr, unsigned char *targetbuffer)
{
unsigned int i;
int idx;

unsigned int tmpword;
unsigned char buffer[512];
outb(0x00,IDE1+0x01);//null data
outb(0x1,IDE1+0x02);//sector count
outb((unsigned char) addr,IDE1+0x03 );
outb((unsigned char)(addr >> 8),IDE1+0x04 );
outb((unsigned char)(addr >> 16),IDE1+0x05 );
outb(0xE0 | (drive << 4) | ((addr >> 24) & 0x0F),IDE1+0x06 );
outb( 0x20,IDE1+0x07);
while (!(inb(IDE1+0x07) &0x08)) {
//printf("waiting for HD 0x%x\n",addr);
inb(IDE1+0x07);
}
for (idx = 0; idx < 512; idx++)

{
tmpword = inw(IDE1+0x0);
buffer[idx] = (unsigned char)tmpword;
buffer[idx  + 1] = (unsigned char)(tmpword >> 8);
   //printf("%hhx %hhx ",(unsigned char)buffer[idx],(unsigned char)buffer[idx+1]);
  idx++;
}

memcpy(targetbuffer,&buffer,512);

return idx;
}

int Write_Disk(unsigned long addr, unsigned char *targetbuffer)
{

unsigned int i,drive;

int idx;
int m=0;
drive=0;
unsigned int tmpword;
unsigned char buffer[512];
memcpy(&buffer,targetbuffer,512);
outb(0x00,IDE1+0x1);//null data
outb(0x1,IDE1+0x2);//sector count
outb((unsigned char) addr,IDE1+0x3 );
outb((unsigned char)(addr >> 8),IDE1+0x4);
outb((unsigned char)(addr >> 16),IDE1+0x5 );
outb( 0xE0 | (drive << 4) | ((addr >> 24) & 0x0F),IDE1+0x6);
outb( 0x31,IDE1+0x7);//write command
while ((inb(IDE1+0x7) != 0x58)) {
//printf("Write waiting for HD\n");
}
for (idx = 0; idx < 2*512; idx++)

{
tmpword = buffer[ idx ] | (buffer[ idx  + 1] << 8);
outw(tmpword,IDE1+0x0);
idx++;
}

return idx;
}