Changes by: flatcap
Update of /cvsroot/linux-ntfs/dynamic-disk/linux/fs/partitions
In directory usw-pr-cvs1:/tmp/cvs-serv4849/linux/fs/partitions
Modified Files:
ldm.c ldm.h
Log Message:
figured out all of the vblk flags. now I'm certain of what to expect.
also, now check the vblk's length.
Index: ldm.c
===================================================================
RCS file: /cvsroot/linux-ntfs/dynamic-disk/linux/fs/partitions/ldm.c,v
retrieving revision 1.63
retrieving revision 1.64
diff -U2 -r1.63 -r1.64
--- ldm.c 27 Feb 2002 17:40:20 -0000 1.63
+++ ldm.c 9 Mar 2002 01:58:42 -0000 1.64
@@ -2,7 +2,7 @@
* ldm - Support for Windows' Logical Disk Manager (Dynamic Disks)
*
- * Copyright (C) 2001 Richard Russon <ld...@fl...>
+ * Copyright (C) 2001,2002 Richard Russon <ld...@fl...>
* Copyright (C) 2001 Anton Altaparmakov <an...@us...>
- * Copyright (C) 2001 Jakob Kemi <jak...@te...>
+ * Copyright (C) 2001,2002 Jakob Kemi <jak...@te...>
*
* Documentation is available at http://linux-ntfs.sf.net/ldm
@@ -172,4 +172,5 @@
*/
+
/**
* ldm_parse_privhead - Read the LDM Database PRIVHEAD structure
@@ -396,5 +397,5 @@
if (*(u16*) (data + 0x01FE) != cpu_to_le16 (MSDOS_LABEL_MAGIC)) {
- ldm_debug ("No MS-DOS partition-table found.\n");
+ ldm_debug ("No MS-DOS partition table found.\n");
goto out;
}
@@ -410,5 +411,5 @@
ldm_debug ("Parsed partition table successfully.\n");
else
- ldm_debug ("Found an MS-DOS partition-table, not a dynamic disk.\n");
+ ldm_debug ("Found an MS-DOS partition table, not a dynamic disk.\n");
out:
put_dev_sector(sect);
@@ -830,4 +831,5 @@
}
+
/**
* ldm_parse_comp - Read a raw VBLK Component object into a vblk structure
@@ -843,27 +845,40 @@
static BOOL ldm_parse_comp (const u8 *buffer, int buflen, struct vblk *vb)
{
- int rel_objid, rel_name, rel_vstate, rel_parent;
+ int r_objid, r_name, r_vstate, r_child, r_parent, r_stripe, r_cols, len;
struct vblk_comp *comp;
DEBUG_ON (!buffer || !vb);
- rel_objid = ldm_relative (buffer, buflen, 0x18, 0);
- rel_name = ldm_relative (buffer, buflen, 0x18, rel_objid);
- rel_vstate = ldm_relative (buffer, buflen, 0x18, rel_name);
- rel_parent = ldm_relative (buffer, buflen, 0x18, rel_vstate);
- if (rel_parent < 0)
+ r_objid = ldm_relative (buffer, buflen, 0x18, 0);
+ r_name = ldm_relative (buffer, buflen, 0x18, r_objid);
+ r_vstate = ldm_relative (buffer, buflen, 0x18, r_name);
+ r_child = ldm_relative (buffer, buflen, 0x1D, r_vstate);
+ r_parent = ldm_relative (buffer, buflen, 0x2D, r_child);
+
+ if (buffer[0x12] & VBLK_FLAG_COMP_STRIPE) {
+ r_stripe = ldm_relative (buffer, buflen, 0x2E, r_parent);
+ r_cols = ldm_relative (buffer, buflen, 0x2E, r_stripe);
+ len = r_cols;
+ } else {
+ r_stripe = 0;
+ r_cols = 0;
+ len = r_parent;
+ }
+ if (len < 0)
return FALSE;
- /* Volume State, Parent Id */
- if (ldm_out_of_range (buffer, buflen, 0x18 + rel_name) ||
- ldm_out_of_range (buffer, buflen, 0x2F + rel_vstate))
+ len += VBLK_SIZE_COMP;
+ if (len != BE32 (buffer + 0x14)) {
+ printk ("len (COMP): calc = 0x%02x, read = 0x%02x\n", len, BE32 (buffer + 0x14));
return FALSE;
+ }
comp = &vb->vblk.comp;
- comp->type = buffer[0x18 + rel_vstate];
- comp->parts = buffer[0x1E + rel_vstate];
- comp->parent_id = ldm_get_vnum (buffer + 0x2F + rel_vstate);
- ldm_get_vstr (buffer + 0x18 + rel_name, comp->state,
+ comp->type = buffer[0x18 + r_vstate];
+ comp->parts = ldm_get_vnum (buffer + 0x1D + r_vstate);
+ comp->parent_id = ldm_get_vnum (buffer + 0x2F + r_vstate);
+ ldm_get_vstr (buffer + 0x18 + r_name, comp->state,
sizeof (comp->state));
+
return TRUE;
}
@@ -882,21 +897,33 @@
static int ldm_parse_dgrp (const u8 *buffer, int buflen, struct vblk *vb)
{
- int rel_objid, rel_name, rel_diskid;
+ int r_objid, r_name, r_diskid, r_id1, r_id2, len;
struct vblk_dgrp *dgrp;
DEBUG_ON (!buffer || !vb);
- rel_objid = ldm_relative (buffer, buflen, 0x18, 0);
- rel_name = ldm_relative (buffer, buflen, 0x18, rel_objid);
- rel_diskid = ldm_relative (buffer, buflen, 0x18, rel_name);
- if (rel_diskid < 0)
+ r_objid = ldm_relative (buffer, buflen, 0x18, 0);
+ r_name = ldm_relative (buffer, buflen, 0x18, r_objid);
+ r_diskid = ldm_relative (buffer, buflen, 0x18, r_name);
+
+ if (buffer[0x12] & VBLK_FLAG_DGR1_IDS) {
+ r_id1 = ldm_relative (buffer, buflen, 0x24, r_diskid);
+ r_id2 = ldm_relative (buffer, buflen, 0x24, r_id1);
+ len = r_id2;
+ } else {
+ r_id1 = 0;
+ r_id2 = 0;
+ len = r_diskid;
+ }
+ if (len < 0)
return FALSE;
- /* Disk Id */
- if (ldm_out_of_range (buffer, buflen, 0x18 + rel_objid))
+ len += VBLK_SIZE_DGR1;
+ if (len != BE32 (buffer + 0x14)) {
+ printk ("len (DGR1): calc = 0x%02x, read = 0x%02x\n", len, BE32 (buffer + 0x14));
return FALSE;
+ }
dgrp = &vb->vblk.dgrp;
- ldm_get_vstr (buffer + 0x18 + rel_name, dgrp->disk_id,
+ ldm_get_vstr (buffer + 0x18 + r_name, dgrp->disk_id,
sizeof (dgrp->disk_id));
return TRUE;
@@ -917,23 +944,33 @@
{
char buf[64];
- int rel_objid, rel_name, rel_diskid;
+ int r_objid, r_name, r_id1, r_id2, len;
struct vblk_dgrp *dgrp;
DEBUG_ON (!buffer || !vb);
- rel_objid = ldm_relative (buffer, buflen, 0x18, 0);
- rel_name = ldm_relative (buffer, buflen, 0x18, rel_objid);
- rel_diskid = ldm_relative (buffer, buflen, 0x44, rel_name);
- if (rel_diskid < 0)
+ r_objid = ldm_relative (buffer, buflen, 0x18, 0);
+ r_name = ldm_relative (buffer, buflen, 0x18, r_objid);
+
+ if (buffer[0x12] & VBLK_FLAG_DGR2_IDS) {
+ r_id1 = ldm_relative (buffer, buflen, 0x44, r_name);
+ r_id2 = ldm_relative (buffer, buflen, 0x44, r_id1);
+ len = r_id2;
+ } else {
+ r_id1 = 0;
+ r_id2 = 0;
+ len = r_name;
+ }
+ if (len < 0)
return FALSE;
- /* Name, Disk Id 1 */
- if (ldm_out_of_range (buffer, buflen, 0x18 + rel_objid) ||
- ldm_out_of_range (buffer, buflen, 0x44 + rel_name))
+ len += VBLK_SIZE_DGR2;
+ if (len != BE32 (buffer + 0x14)) {
+ printk ("len (DGR2): calc = 0x%02x, read = 0x%02x\n", len, BE32 (buffer + 0x14));
return FALSE;
+ }
dgrp = &vb->vblk.dgrp;
- ldm_get_vstr (buffer + 0x18 + rel_objid, buf, sizeof (buf));
+ ldm_get_vstr (buffer + 0x18 + r_objid, buf, sizeof (buf));
return TRUE;
}
@@ -952,24 +989,27 @@
static BOOL ldm_parse_disk (const u8 *buffer, int buflen, struct vblk *vb)
{
- int rel_objid, rel_name, rel_diskid;
+ int r_objid, r_name, r_diskid, r_altname, len;
struct vblk_disk *disk;
DEBUG_ON (!buffer || !vb);
- rel_objid = ldm_relative (buffer, buflen, 0x18, 0);
- rel_name = ldm_relative (buffer, buflen, 0x18, rel_objid);
- rel_diskid = ldm_relative (buffer, buflen, 0x18, rel_name);
- if (rel_diskid < 0)
+ r_objid = ldm_relative (buffer, buflen, 0x18, 0);
+ r_name = ldm_relative (buffer, buflen, 0x18, r_objid);
+ r_diskid = ldm_relative (buffer, buflen, 0x18, r_name);
+ r_altname = ldm_relative (buffer, buflen, 0x18, r_diskid);
+ len = r_altname;
+ if (len < 0)
return FALSE;
- /* Disk Id, Alt Name */
- if (ldm_out_of_range (buffer, buflen, 0x18 + rel_name) ||
- ldm_out_of_range (buffer, buflen, 0x18 + rel_diskid))
+ len += VBLK_SIZE_DSK1;
+ if (len != BE32 (buffer + 0x14)) {
+ printk ("len (DSK1): calc = 0x%02x, read = 0x%02x\n", len, BE32 (buffer + 0x14));
return FALSE;
+ }
disk = &vb->vblk.disk;
- ldm_get_vstr (buffer + 0x18 + rel_diskid, disk->alt_name,
+ ldm_get_vstr (buffer + 0x18 + r_diskid, disk->alt_name,
sizeof (disk->alt_name));
- if (!ldm_parse_guid (buffer + 0x19 + rel_name, disk->disk_id)) {
+ if (!ldm_parse_guid (buffer + 0x19 + r_name, disk->disk_id)) {
ldm_error ("VBLK DISK contains an invalid GUID.\n");
return FALSE;
@@ -992,16 +1032,23 @@
static BOOL ldm_parse_disk2 (const u8 *buffer, int buflen, struct vblk *vb)
{
- int rel_objid, rel_name;
+ int r_objid, r_name, len;
struct vblk_disk *disk;
DEBUG_ON (!buffer || !vb);
- rel_objid = ldm_relative (buffer, buflen, 0x18, 0);
- rel_name = ldm_relative (buffer, buflen, 0x18, rel_objid);
- if (rel_objid < 0)
+ r_objid = ldm_relative (buffer, buflen, 0x18, 0);
+ r_name = ldm_relative (buffer, buflen, 0x18, r_objid);
+ len = r_name;
+ if (len < 0)
return FALSE;
+ len += VBLK_SIZE_DSK2;
+ if (len != BE32 (buffer + 0x14)) {
+ printk ("len (DSK2): calc = 0x%02x, read = 0x%02x\n", len, BE32 (buffer + 0x14));
+ return FALSE;
+ }
+
disk = &vb->vblk.disk;
- memcpy (disk->disk_id, buffer + 0x18 + rel_name, GUID_SIZE);
+ memcpy (disk->disk_id, buffer + 0x18 + r_name, GUID_SIZE);
return TRUE;
}
@@ -1020,32 +1067,39 @@
static BOOL ldm_parse_part (const u8 *buffer, int buflen, struct vblk *vb)
{
- int rel_objid, rel_name, rel_size, rel_parent, rel_diskid;
+ int r_objid, r_name, r_size, r_parent, r_diskid, r_index, len;
struct vblk_part *part;
DEBUG_ON (!buffer || !vb);
- rel_objid = ldm_relative (buffer, buflen, 0x18, 0);
- rel_name = ldm_relative (buffer, buflen, 0x18, rel_objid);
- rel_size = ldm_relative (buffer, buflen, 0x34, rel_name);
- rel_parent = ldm_relative (buffer, buflen, 0x34, rel_size);
- rel_diskid = ldm_relative (buffer, buflen, 0x34, rel_parent);
- if (rel_parent < 0)
+ r_objid = ldm_relative (buffer, buflen, 0x18, 0);
+ r_name = ldm_relative (buffer, buflen, 0x18, r_objid);
+ r_size = ldm_relative (buffer, buflen, 0x34, r_name);
+ r_parent = ldm_relative (buffer, buflen, 0x34, r_size);
+ r_diskid = ldm_relative (buffer, buflen, 0x34, r_parent);
+
+ if (buffer[0x12] & VBLK_FLAG_PART_INDEX) {
+ r_index = ldm_relative (buffer, buflen, 0x34, r_diskid);
+ len = r_index;
+ } else {
+ r_index = 0;
+ len = r_diskid;
+ }
+ if (len < 0)
return FALSE;
- /* Size, Parent Id, Disk Id */
- if (ldm_out_of_range (buffer, buflen, 0x34 + rel_name) ||
- ldm_out_of_range (buffer, buflen, 0x34 + rel_size) ||
- ldm_out_of_range (buffer, buflen, 0x34 + rel_parent)||
- ldm_out_of_range (buffer, buflen, 0x34 + rel_diskid))
+ len += VBLK_SIZE_PART;
+ if (len != BE32 (buffer + 0x14)) {
+ printk ("len (COMP): calc = 0x%02x, read = 0x%02x\n", len, BE32 (buffer + 0x14));
return FALSE;
+ }
part = &vb->vblk.part;
- part->start = BE64 (buffer + 0x24 + rel_name);
- part->volume_offset = BE64 (buffer + 0x2C + rel_name);
- part->size = ldm_get_vnum (buffer + 0x34 + rel_name);
- part->parent_id = ldm_get_vnum (buffer + 0x34 + rel_size);
- part->disk_id = ldm_get_vnum (buffer + 0x34 + rel_parent);
+ part->start = BE64 (buffer + 0x24 + r_name);
+ part->volume_offset = BE64 (buffer + 0x2C + r_name);
+ part->size = ldm_get_vnum (buffer + 0x34 + r_name);
+ part->parent_id = ldm_get_vnum (buffer + 0x34 + r_size);
+ part->disk_id = ldm_get_vnum (buffer + 0x34 + r_parent);
if (vb->flags & VBLK_FLAG_SUCCESSIVE)
- part->partnum = buffer[0x35 + rel_diskid];
+ part->partnum = buffer[0x35 + r_diskid];
else
part->partnum = 0;
@@ -1067,37 +1121,57 @@
static BOOL ldm_parse_volu (const u8 *buffer, int buflen, struct vblk *vb)
{
- int rel_objid, rel_name, rel_vtype, rel_size, rel_drive;
+ int r_objid, r_name, r_vtype, r_child, r_size, r_id1, r_id2, r_size2, r_drive, len;
struct vblk_volu *volu;
DEBUG_ON (!buffer || !vb);
- rel_objid = ldm_relative (buffer, buflen, 0x18, 0);
- rel_name = ldm_relative (buffer, buflen, 0x18, rel_objid);
- rel_vtype = ldm_relative (buffer, buflen, 0x18, rel_name);
- rel_size = ldm_relative (buffer, buflen, 0x40, rel_vtype);
- rel_drive = ldm_relative (buffer, buflen, 0x55, rel_size);
- if (rel_drive < 0)
+ r_objid = ldm_relative (buffer, buflen, 0x18, 0);
+ r_name = ldm_relative (buffer, buflen, 0x18, r_objid);
+ r_vtype = ldm_relative (buffer, buflen, 0x18, r_name);
+ r_child = ldm_relative (buffer, buflen, 0x2E, r_vtype);
+ r_size = ldm_relative (buffer, buflen, 0x3E, r_child);
+
+ if (buffer[0x12] & VBLK_FLAG_VOLU_ID1)
+ r_id1 = ldm_relative (buffer, buflen, 0x53, r_size);
+ else
+ r_id1 = r_size;
+
+ if (buffer[0x12] & VBLK_FLAG_VOLU_ID2)
+ r_id2 = ldm_relative (buffer, buflen, 0x53, r_id1);
+ else
+ r_id2 = r_id1;
+
+ if (buffer[0x12] & VBLK_FLAG_VOLU_SIZE)
+ r_size2 = ldm_relative (buffer, buflen, 0x53, r_id2);
+ else
+ r_size2 = r_id2;
+
+ if (buffer[0x12] & VBLK_FLAG_VOLU_DRIVE)
+ r_drive = ldm_relative (buffer, buflen, 0x53, r_size2);
+ else
+ r_drive = r_size2;
+
+ len = r_drive;
+ if (len < 0)
return FALSE;
- /* Volume Type, Drive Hint, Size */
- if (ldm_out_of_range (buffer, buflen, 0x18 + rel_name) ||
- ldm_out_of_range (buffer, buflen, 0x55 + rel_size) ||
- ldm_out_of_range (buffer, buflen, 0x40 + rel_vtype))
+ len += VBLK_SIZE_VOLU;
+ if (len != BE32 (buffer + 0x14)) {
+ printk ("len (VOLU): calc = 0x%02x, read = 0x%02x (0x%02x)\n", len, BE32 (buffer + 0x14), buffer[0x12]);
return FALSE;
+ }
volu = &vb->vblk.volu;
- volu->partition_type = buffer[0x44 + rel_size];
- volu->size = ldm_get_vnum (buffer + 0x40 + rel_vtype);
- memcpy (volu->volume_state, buffer + 0x19 + rel_vtype,
+ volu->partition_type = buffer[0x42 + r_size];
+ volu->size = ldm_get_vnum (buffer + 0x3E + r_child);
+ memcpy (volu->volume_state, buffer + 0x19 + r_vtype,
sizeof (volu->volume_state));
- memcpy (volu->guid, buffer + 0x45 + rel_size, sizeof (volu->guid));
- ldm_get_vstr (buffer + 0x18 + rel_name, volu->volume_type,
+ memcpy (volu->guid, buffer + 0x43 + r_size, sizeof (volu->guid));
+ ldm_get_vstr (buffer + 0x18 + r_name, volu->volume_type,
sizeof (volu->volume_type));
- ldm_get_vstr (buffer + 0x55 + rel_size, volu->drive_hint,
- sizeof (volu->drive_hint));
- /* FIXME There's an extra Id in here occasionally */
- if ((volu->drive_hint[0] < 'A') || (volu->drive_hint[0] > 'Z'))
- ldm_get_vstr (buffer + 0x55 + rel_drive, volu->drive_hint,
+ if (buffer[0x12] & VBLK_FLAG_VOLU_DRIVE) {
+ ldm_get_vstr (buffer + 0x53 + r_size, volu->drive_hint,
sizeof (volu->drive_hint));
+ }
return TRUE;
}
Index: ldm.h
===================================================================
RCS file: /cvsroot/linux-ntfs/dynamic-disk/linux/fs/partitions/ldm.h,v
retrieving revision 1.36
retrieving revision 1.37
diff -U2 -r1.36 -r1.37
--- ldm.h 27 Feb 2002 15:56:10 -0000 1.36
+++ ldm.h 9 Mar 2002 01:58:42 -0000 1.37
@@ -5,7 +5,7 @@
* ldm - Part of the Linux-NTFS project.
*
- * Copyright (C) 2001 Richard Russon <ld...@fl...>
+ * Copyright (C) 2001,2002 Richard Russon <ld...@fl...>
* Copyright (C) 2001 Anton Altaparmakov <an...@us...>
- * Copyright (C) 2001 Jakob Kemi <jak...@te...>
+ * Copyright (C) 2001,2002 Jakob Kemi <jak...@te...>
*
* Documentation is available at http://linux-ntfs.sf.net/ldm
@@ -59,4 +59,23 @@
#define VBLK_FLAG_COMPOUND 0x10 /* 00010000 Compound comp. */
#define VBLK_FLAG_SUCCESSIVE 0x08 /* 00001000 n-th in set, n>1 */
+
+/* vblk flags indicating extra information will be present */
+#define VBLK_FLAG_COMP_STRIPE 0x10
+#define VBLK_FLAG_PART_INDEX 0x08
+#define VBLK_FLAG_DGR1_IDS 0x08
+#define VBLK_FLAG_DGR2_IDS 0x08
+#define VBLK_FLAG_VOLU_ID1 0x08
+#define VBLK_FLAG_VOLU_ID2 0x20
+#define VBLK_FLAG_VOLU_SIZE 0x80
+#define VBLK_FLAG_VOLU_DRIVE 0x02
+
+/* size of a vblk's static parts */
+#define VBLK_SIZE_COMP 22
+#define VBLK_SIZE_PART 28
+#define VBLK_SIZE_DSK1 12
+#define VBLK_SIZE_DSK2 45
+#define VBLK_SIZE_DGR1 12
+#define VBLK_SIZE_DGR2 44
+#define VBLK_SIZE_VOLU 59
/* component types */
|