[syslinux:master] chain: Use struct mbr where applicable

syslinux-bot for Shao Miller shao.miller at yrdsb.edu.on.ca
Fri Jun 25 14:12:21 PDT 2010


Commit-ID:  a13adfbee93d052fe13a76cdfa15a4abea1dd1e1
Gitweb:     http://syslinux.zytor.com/commit/a13adfbee93d052fe13a76cdfa15a4abea1dd1e1
Author:     Shao Miller <shao.miller at yrdsb.edu.on.ca>
AuthorDate: Tue, 22 Jun 2010 23:44:29 -0400
Committer:  Shao Miller <shao.miller at yrdsb.edu.on.ca>
CommitDate: Wed, 23 Jun 2010 00:21:58 -0400

chain: Use struct mbr where applicable

Instead of magic offsets.

Signed-off-by: Shao Miller <shao.miller at yrdsb.edu.on.ca>


---
 com32/modules/chain.c |   91 ++++++++++++++++++++++++++++---------------------
 1 files changed, 52 insertions(+), 39 deletions(-)

diff --git a/com32/modules/chain.c b/com32/modules/chain.c
index f0ddc38..d7c6a1c 100644
--- a/com32/modules/chain.c
+++ b/com32/modules/chain.c
@@ -343,27 +343,6 @@ static int write_verify_sector(unsigned int lba, const void *buf)
     return rv ? -1 : 0;
 }
 
-/* Search for a specific drive, based on the MBR signature; bytes
-   440-443. */
-static int find_disk(uint32_t mbr_sig)
-{
-    int drive;
-    bool is_me;
-    char *buf;
-
-    for (drive = 0x80; drive <= 0xff; drive++) {
-	if (get_disk_params(drive))
-	    continue;		/* Drive doesn't exist */
-	if (!(buf = read_sectors(0, 1)))
-	    continue;		/* Cannot read sector */
-	is_me = (*(uint32_t *) ((char *)buf + 440) == mbr_sig);
-	free(buf);
-	if (is_me)
-	    return drive;
-    }
-    return -1;
-}
-
 /*
  * CHS (cylinder, head, sector) value extraction macros.
  * Taken from WinVBlock.  Does not expand to an lvalue
@@ -385,6 +364,37 @@ struct part_entry {
     uint32_t length;
 } __attribute__ ((packed));
 
+/* A DOS MBR */
+struct mbr {
+    char code[440];
+    uint32_t disk_sig;
+    char pad[2];
+    struct part_entry table[4];
+    uint16_t sig;
+} __attribute__ ((packed));
+static const uint16_t mbr_sig_magic = 0xAA55;
+
+/* Search for a specific drive, based on the MBR signature; bytes
+   440-443. */
+static int find_disk(uint32_t mbr_sig)
+{
+    int drive;
+    bool is_me;
+    struct mbr *mbr;
+
+    for (drive = 0x80; drive <= 0xff; drive++) {
+	if (get_disk_params(drive))
+	    continue;		/* Drive doesn't exist */
+	if (!(mbr = read_sectors(0, 1)))
+	    continue;		/* Cannot read sector */
+	is_me = (mbr->disk_sig == mbr_sig);
+	free(mbr);
+	if (is_me)
+	    return drive;
+    }
+    return -1;
+}
+
 /* Search for a logical partition.  Logical partitions are actually implemented
    as recursive partition tables; theoretically they're supposed to form a
    linked list, but other structures have been seen.
@@ -396,18 +406,18 @@ struct part_entry {
 
 int nextpart;			/* Number of the next logical partition */
 
-static struct part_entry *find_logical_partition(int whichpart, char *table,
+static struct part_entry *find_logical_partition(int whichpart, struct mbr *br,
 						 struct part_entry *self,
 						 struct part_entry *root)
 {
     static struct part_entry ltab_entry;
-    struct part_entry *ptab = (struct part_entry *)(table + 0x1be);
+    struct part_entry *ptab = br->table;
     struct part_entry *found;
-    char *sector;
+    struct mbr *ebr;
 
     int i;
 
-    if (*(uint16_t *) (table + 0x1fe) != 0xaa55)
+    if (br->sig != mbr_sig_magic)
 	return NULL;		/* Signature missing */
 
     /* We are assumed to already having enumerated all the data partitions
@@ -465,12 +475,12 @@ static struct part_entry *find_logical_partition(int whichpart, char *table,
 		continue;
 
 	/* Process this partition */
-	if (!(sector = read_sectors(ptab[i].start_lba, 1)))
+	if (!(ebr = read_sectors(ptab[i].start_lba, 1)))
 	    continue;		/* Read error, must be invalid */
 
-	found = find_logical_partition(whichpart, sector, &ptab[i],
+	found = find_logical_partition(whichpart, ebr, &ptab[i],
 				       root ? root : &ptab[i]);
-	free(sector);
+	free(ebr);
 	if (found)
 	    return found;
     }
@@ -609,7 +619,7 @@ enomem:
     return;
 }
 
-static int hide_unhide(char *mbr, int part)
+static int hide_unhide(struct mbr *mbr, int part)
 {
     int i;
     struct part_entry *pt;
@@ -622,7 +632,7 @@ static int hide_unhide(char *mbr, int part)
     bool write_back = false;
 
     for (i = 1; i <= 4; i++) {
-	pt = (struct part_entry *)&mbr[0x1be + 16 * (i - 1)];
+	pt = mbr->table + i - 1;
 	t = pt->ostype;
 	if ((t <= 0x1f) && ((mask >> (t & ~0x10)) & 1)) {
 	    /* It's a hideable partition type */
@@ -706,7 +716,8 @@ static void usage(void)
 
 int main(int argc, char *argv[])
 {
-    char *mbr, *p;
+    struct mbr *mbr;
+    char *p;
     struct part_entry *partinfo;
     struct syslinux_rm_regs regs;
     char *drivename, *partition;
@@ -873,7 +884,7 @@ int main(int argc, char *argv[])
     } else if (whichpart <= 4) {
 	/* Boot a primary partition */
 
-	partinfo = &((struct part_entry *)(mbr + 0x1be))[whichpart - 1];
+	partinfo = mbr->table + whichpart - 1;
 	if (partinfo->ostype == 0) {
 	    error("Invalid primary partition\n");
 	    goto bail;
@@ -989,14 +1000,16 @@ int main(int argc, char *argv[])
 	data[ndata].size = SECTOR;
 	data[ndata].base = load_base;
 
-	if (!opt.loadfile &&
-	    *(uint16_t *) ((char *)data[ndata].data +
-			   data[ndata].size - 2) != 0xaa55) {
-	    error
-		("Boot sector signature not found (unbootable disk/partition?)\n");
-	    goto bail;
+	if (!opt.loadfile) {
+	    const struct mbr *br =
+		(const struct mbr *)((char *)data[ndata].data +
+				     data[ndata].size - sizeof(struct mbr));
+	    if (br->sig != mbr_sig_magic) {
+		error
+		    ("Boot sector signature not found (unbootable disk/partition?)\n");
+		goto bail;
+	    }
 	}
-
 	/*
 	 * To boot the Recovery Console of Windows NT/2K/XP we need to write
 	 * the string "cmdcons\0" to memory location 0000:7C03.



More information about the Syslinux-commits mailing list