⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fs_part.c

📁 pocket pc hx4700 bootloader
💻 C
字号:
/* part of Embedded OS Loader source code * *   Copyright 2005 Vivien Chappelier <vivien.chappelier@free.fr> *   Copyright 2006-2007 Pawel Kolodziejski - adopted to linux native bootloader * * This software is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU * Library General Public License for more details. * */#include "types.h"#include "fs_types.h"static void chs_decode(chs_t *chs, unsigned char *addr) {	chs->h = addr[0];	chs->s = addr[1] & 0x3f;	chs->c = ((addr[1] & 0xc0) << 2) | addr[2];}static void read_pentry(unsigned char *buffer, pentry_t *pentry) {	pentry->boot = buffer[0];	chs_decode(&pentry->begin, &buffer[1]);	pentry->type = buffer[4];	chs_decode(&pentry->end, &buffer[5]);	pentry->sector_start   = buffer[ 8];	pentry->sector_start  |= buffer[ 9] <<  8;	pentry->sector_start  |= buffer[10] << 16;	pentry->sector_start  |= buffer[11] << 24;	pentry->sector_length  = buffer[12];	pentry->sector_length |= buffer[13] <<  8;	pentry->sector_length |= buffer[14] << 16;	pentry->sector_length |= buffer[15] << 24;}static int read_ptable(unsigned char bootsector[], pentry_t *parent, pentry_t *ptable) {	/* check for the signature at offset 510 */	if (bootsector[510] != 0x55 || bootsector[511] != 0xaa) {		return 0;	}	/* partition descriptors are at offset 446, 462, 478 and 494 */	if (!parent) {		/* MBR */		read_pentry(&bootsector[446], &ptable[0]);		read_pentry(&bootsector[462], &ptable[1]);		read_pentry(&bootsector[478], &ptable[2]);		read_pentry(&bootsector[494], &ptable[3]);		return 4;	} else {		/* EMBR */		read_pentry(&bootsector[446], &ptable[0]);		read_pentry(&bootsector[462], &ptable[1]);		ptable[0].sector_start += parent->sector_start;		ptable[1].sector_start += parent->sector_start;		return 2;	}}grub_file_t grub_file_open(grub_disk_t disk, const char *file_name);grub_ssize_t grub_file_read(grub_file_t file, char *buf, grub_size_t len);grub_off_t grub_file_seek(grub_file_t file, grub_off_t offset);void grub_file_close(grub_file_t file);int sd_read_sector(char *buffer, unsigned long sector);int cf_read_sector(char *buffer, unsigned long sector);int read_file(char *filename, char *buffer, int fs_type, int card_type, int nb_sectors) {	int i;	int found = 0;	struct grub_disk disk;	grub_file_t file = 0;	grub_err_t status = GRUB_ERR_NONE;	memset(&disk, 0, sizeof(disk));	disk.pcount = 0;	disk.card_type = card_type;	disk.fs_type = fs_type;	if (card_type == 0)		disk.read = sd_read_sector;	else if (card_type == 1)		disk.read = cf_read_sector;	else {		return 0;	}	memset((char *)0xA3100300, 0, 32);	memset((char *)0xA3100400, 0, 64000);	disk.read(buffer, 0);	disk.pcount += read_ptable(buffer, NULL, disk.ptable);	disk.cur_ptable = -1;	for (i = 0; i < disk.pcount; i++) {		switch (disk.ptable[i].type) {		case 0x00: /* empty */			break;		case 0x01: /* FAT12 */                        if (fs_type == 1) {				found = 1;				disk.cur_ptable = i;			}			break;		case 0x05: /* extended */			/* read the first sector of the extended partition */			if (disk.pcount <= 16) {				disk.read((char *)buffer, disk.ptable[i].sector_start * 512);				disk.pcount += read_ptable(buffer, &disk.ptable[i], &disk.ptable[disk.pcount]);			} else {				//printf("too many extended partitions\n");			}			break;		case 0x0b: /* FAT32 */		case 0x0c: /* FAT32 (LBA) */                        if (fs_type == 1) {				found = 1;				disk.cur_ptable = i;			}			break;		case 0x04: /* FAT16 <32M */		case 0x06: /* FAT16 */		case 0x0e: /* FAT16 (LBA) */                        if (fs_type == 1) {				found = 1;				disk.cur_ptable = i;			}			break;		case 0x83: /* Linux */                        if (fs_type == 0) {				found = 1;				disk.cur_ptable = i;			}			break;		default:			//printf("partition %x: type %x unknown\n", i, disk.ptable[i].type);			grub_debug("partition unknown type.");			break;		}		if (found)			break;	}	if (!found) {		grub_error(GRUB_ERR_BAD_PART_TABLE, "No valid partition.\n");		return 0;	}	memset(buffer, 0, 512);	//disk.total_sectors = nb_sectors; // TODO	disk.total_sectors = 8388608; // 4 GB size card	file = grub_file_open(&disk, filename);	if (file == 0) {		grub_error(GRUB_ERR_FILE_NOT_FOUND, "Can't open file !");		return 0;	}	int left = file->size;	int size = 0;	int pos = 0;	while (left) {		if (left > 512)			size = 512;		else			size = left;		if (grub_file_read(file, buffer + pos, size) != size) {			grub_error(GRUB_ERR_READ_ERROR, "Can't read file !");			return 0;		}		updateBar1((pos * 100) / (int)file->size);		pos += size;		left -= size;		if (left <= 0)			break;	}	size = file->size;	grub_file_close(file);	return size;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -