📄 fs_part.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 + -