85 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			85 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
#include <stdlib.h>
 | 
						|
#include <stdio.h>
 | 
						|
#include <string.h>
 | 
						|
#include <fcntl.h>
 | 
						|
#include <stdint.h>
 | 
						|
 | 
						|
#define HD_SECTOR_SIZE 512
 | 
						|
#define PARTITION_TABLE_START 0x1BE
 | 
						|
#define PARTITION_TABLE_SIZE 64
 | 
						|
 | 
						|
typedef struct {
 | 
						|
	uint8_t bootSign;
 | 
						|
	uint8_t startHead;
 | 
						|
	uint8_t startSector:6;
 | 
						|
	uint16_t startCylinder:10;
 | 
						|
	uint8_t fsID;
 | 
						|
	uint8_t endHead;
 | 
						|
	uint8_t endSector:6;
 | 
						|
	uint16_t endCylinder:10;
 | 
						|
	uint32_t startLBA;
 | 
						|
	uint32_t sectorCount;
 | 
						|
}__attribute__((packed)) T_PartitionTable;
 | 
						|
 | 
						|
int main(int argc, char* argv[]) {
 | 
						|
	if(argc == 4) {
 | 
						|
		char *diskPath = argv[1];
 | 
						|
		int partNum = atoi(argv[2]);
 | 
						|
		char* field = argv[3];
 | 
						|
		
 | 
						|
		T_PartitionTable pt[4];
 | 
						|
		
 | 
						|
		if(partNum < 0 || partNum > 3) {
 | 
						|
			fprintf(stderr, "Invalid partiton number\n");
 | 
						|
			return -1;
 | 
						|
		}
 | 
						|
 | 
						|
		int fd = open(diskPath, O_RDONLY, 0664);
 | 
						|
		if(fd == -1) {
 | 
						|
			close(fd);
 | 
						|
			fprintf(stderr, "Error when openning the file <%s>\n", diskPath);
 | 
						|
			return -2;
 | 
						|
		}
 | 
						|
 | 
						|
		lseek(fd, PARTITION_TABLE_START, SEEK_SET);
 | 
						|
 | 
						|
		int bytesRead = read(fd, pt, PARTITION_TABLE_SIZE);
 | 
						|
		if(bytesRead == -1) {
 | 
						|
			close(fd);
 | 
						|
			fprintf(stderr, "Error when reading the file <%s>\n", diskPath);
 | 
						|
			return -3;
 | 
						|
		}
 | 
						|
		close(fd);
 | 
						|
 | 
						|
		if(!strcmp(field, "boot_sign"))
 | 
						|
			printf("%u", pt[partNum].bootSign);
 | 
						|
		else if(!strcmp(field, "start_head"))
 | 
						|
			printf("%u", pt[partNum].startHead);
 | 
						|
		else if(!strcmp(field, "start_sector"))
 | 
						|
			printf("%u", pt[partNum].startSector);
 | 
						|
		else if(!strcmp(field, "start_cylinder"))
 | 
						|
			printf("%u", pt[partNum].startCylinder);
 | 
						|
		else if(!strcmp(field, "fs_ID"))
 | 
						|
			printf("%u", pt[partNum].fsID);
 | 
						|
		else if(!strcmp(field, "end_head"))
 | 
						|
			printf("%u", pt[partNum].endHead);
 | 
						|
		else if(!strcmp(field, "end_sector"))
 | 
						|
			printf("%u", pt[partNum].endSector);
 | 
						|
		else if(!strcmp(field, "end_cylinder"))
 | 
						|
			printf("%u", pt[partNum].endCylinder);
 | 
						|
		else if(!strcmp(field, "start_LBA"))
 | 
						|
			printf("%u", pt[partNum].startLBA);
 | 
						|
		else if(!strcmp(field, "sector_count"))
 | 
						|
			printf("%u", pt[partNum].sectorCount);
 | 
						|
		else {
 | 
						|
			perror("Invalid field name\n");
 | 
						|
			return -4;
 | 
						|
		}
 | 
						|
	} else {
 | 
						|
		fprintf(stderr, "[help] : readpt <disk> <partition> <field>\n");
 | 
						|
		fprintf(stderr, "Valid field names : boot_sign,start_head,start_sector,start_cylinder,fs_ID,end_head,end_sector,end_cylinder,start_LBA,sectorCount\n");
 | 
						|
		return -5;
 | 
						|
	}
 | 
						|
	return 0;
 | 
						|
}
 |