diskpartitiontable.c
/** @file diskpartitiontable.c * * * \brief Read disk partition table * */ #include <stdio.h> // printf #include <stdlib.h> // exit #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <errno.h> #include <unistd.h> int main(int argc, char ** argv ) { int fd; unsigned char mbs[512]; // master boot sector unsigned char * pp; // partition pointer int head, sect, cyl; unsigned int sector; int n; if (argc <= 1) { fprintf(stderr, "Usage: %s <device>\n", argv[0] ); exit(1); } fd = open( argv[1], O_RDONLY ); if ( fd < 0 ) { fprintf(stderr, "Error: unable to open device %s\n", argv[1] ); perror(""); exit(1); } n = read( fd, mbs, 512); close(fd); if ( n < 512 ) { fprintf(stderr, "Error: short read %d\n", n ); exit(1); } pp = mbs + 0x1BE; for (n=0; n<4; n++) { printf("PARTITION %d\n", n ); printf("Boot flag %2x\n", pp[0] ); printf("System flag %2x\n", pp[4] ); // C/H/S as 10+8+6 #if 0 head = pp[1]; sect = pp[2]; sect = (sect<<2) | (pp[3]>>6); cyl = pp[3] & 0x3f; /* cyl = pp[1] >> 2; head = ((pp[1] & 0x03)<<6) | (pp[2]>>2); sect = pp[2] & 0x03; sect = (sect << 8) | pp[3]; head = pp[1]; sect = pp[3]>>6; sect = (sect<<8) | pp[2]; cyl = pp[3] & 0x3f; */ printf("Start Cylinder %d Head %d Sector %d \n", cyl, head, sect ); head = pp[5]; sect = pp[6]; sect = (sect<<2) | (pp[7]>>6); cyl = pp[7] & 0x3f; cyl = pp[5]; printf("End Cylinder %d Head %d Sector %d \n", cyl, head, sect ); #endif sector = pp[8] + (1<<8)*pp[9] + (1<<16)*pp[10] + (1<<24)*pp[11]; printf("Sector number %u\n", sector); sector = pp[12] + (1<<8)*pp[13] + (1<<16)*pp[14] + (1<<24)*pp[15]; printf("Number of sectors %u\n", sector); pp += 0x10; } }Quick Links: Have a Linux Issue? Do you have a Linux Question? Linux Home: Linux System Administration Hints and Tips (c) www.gotothings.com All material on this site is Copyright.
|