Logo Search packages:      
Sourcecode: parted version File versions

bootsector.h

/*
    libparted
    Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc.

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    This program 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 General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
*/

#ifndef PED_FAT_BOOTSECTOR_H
#define PED_FAT_BOOTSECTOR_H

typedef struct _FatBootSector FatBootSector;
typedef struct _FatInfoSector FatInfoSector;

#include "fat.h"

#define FAT32_INFO_MAGIC1     0x41615252
#define FAT32_INFO_MAGIC2     0x61417272
#define FAT32_INFO_MAGIC3     0xaa55

/* stolen from mkdosfs, by Dave Hudson */

#define FAT_BOOT_MESSAGE      \
"This partition does not have an operating system loader installed on it.\n\r"\
"Press a key to reboot..."

#define FAT_BOOT_JUMP   "\xeb\x58\x90"          /* jmp      +5a */

#define FAT_BOOT_CODE   "\x0e"                  /* push cs */           \
                  "\x1f"                  /* pop ds */            \
                  "\xbe\x74\x7e"          /* mov si, offset message */ \
                              /* write_msg_loop: */         \
                  "\xac"                  /* lodsb */       \
                  "\x22\xc0"        /* and al, al */  \
                  "\x74\x06"        /* jz done (+8) */      \
                  "\xb4\x0e"        /* mov ah, 0x0e */      \
                  "\xcd\x10"        /* int 0x10 */          \
                  "\xeb\xf5"        /* jmp write_msg_loop */ \
                              /* done: */             \
                  "\xb4\x00"        /* mov ah, 0x00 */      \
                  "\xcd\x16"        /* int 0x16 */          \
                  "\xb4\x00"        /* mov ah, 0x00 */      \
                  "\xcd\x19"        /* int 0x19 */          \
                  "\xeb\xfe"        /* jmp +0 - in case int 0x19 */ \
                                    /* doesn't work */      \
                              /* message: */                \
                  FAT_BOOT_MESSAGE

#define FAT_BOOT_CODE_LENGTH 128

struct _FatBootSector {
      uint8_t           boot_jump[3];     /* 00: Boot strap short or near jump */
      uint8_t           system_id[8];     /* 03: system name */
      uint16_t    sector_size;      /* 0b: bytes per logical sector */
      uint8_t           cluster_size;     /* 0d: sectors/cluster */
      uint16_t    reserved;   /* 0e: reserved sectors */
      uint8_t           fats;       /* 10: number of FATs */
      uint16_t    dir_entries;      /* 11: number of root directory entries */
      uint16_t    sectors;    /* 13: if 0, total_sect supersedes */
      uint8_t           media;            /* 15: media code */
      uint16_t    fat_length; /* 16: sectors/FAT for FAT12/16 */
      uint16_t    secs_track; /* 18: sectors per track */
      uint16_t    heads;            /* 1a: number of heads */
      uint32_t    hidden;           /* 1c: hidden sectors (partition start) */
      uint32_t    sector_count;     /* 20: no. of sectors (if sectors == 0) */

union {
/* FAT16 fields */
struct {
      uint8_t           drive_num;  /* 24: */
      uint8_t           empty_1;    /* 25: */
      uint8_t           ext_signature;    /* 26: always 0x29 */
      uint32_t    serial_number;    /* 27: */
      uint8_t           volume_name [11];       /* 2b: */
      uint8_t           fat_name [8];     /* 36: */

      uint8_t           boot_code[448];   /* 3f: Boot code (or message) */
} __attribute__ ((packed)) fat16;

/* FAT32 fields */
struct {
      uint32_t    fat_length; /* 24: size of FAT in sectors */
      uint16_t    flags;            /* 28: bit8: fat mirroring, low4: active fat */
      uint16_t    version;        /* 2a: minor * 256 + major */
      uint32_t    root_dir_cluster; /* 2c: */
      uint16_t    info_sector;    /* 30: */
      uint16_t    backup_sector;    /* 32: */

      uint8_t           empty_1 [12];     /* 34: */

      uint16_t    drive_num;  /* 40: */
      uint8_t           ext_signature;    /* 42: always 0x29 */
      uint32_t    serial_number;    /* 43: */
      uint8_t           volume_name [11]; /* 47: */
      uint8_t           fat_name [8];     /* 52: */

      uint8_t           boot_code[420];   /* 5a: Boot code (or message) */
} __attribute ((packed)) fat32;
} __attribute ((packed)) u;

      uint16_t    boot_sign;  /* 1fe: always 0xAA55 */
} __attribute__ ((packed));

struct _FatInfoSector {
      uint32_t    signature_1;      /* should be 0x41615252 */
      uint8_t           unused [480];
      uint32_t    signature_2;      /* should be 0x61417272 */
      uint32_t    free_clusters;
      uint32_t    next_cluster;     /* most recently allocated cluster */
      uint8_t           unused2 [0xe];
      uint16_t    signature_3;      /* should be 0xaa55 */
} __attribute__ ((packed));

int fat_boot_sector_read (FatBootSector* bs, const PedGeometry* geom);
FatType fat_boot_sector_probe_type (const FatBootSector* bs,
                            const PedGeometry* geom);
int fat_boot_sector_analyse (FatBootSector* bs, PedFileSystem* fs);
int fat_boot_sector_set_boot_code (FatBootSector* bs);
int fat_boot_sector_generate (FatBootSector* bs, const PedFileSystem* fs);
int fat_boot_sector_write (const FatBootSector* bs, PedFileSystem* fs);

int fat_info_sector_read (FatInfoSector* is, const PedFileSystem* fs);
int fat_info_sector_generate (FatInfoSector* is, const PedFileSystem* fs);
int fat_info_sector_write (const FatInfoSector* is, PedFileSystem* fs);

#endif /* PED_FAT_BOOTSECTOR_H */


Generated by  Doxygen 1.6.0   Back to index