| Inside the Disk Key | |||
| Copyright © 1997 Mark Russinovich | |||
| Last Updated November 5, 1997  | 
    |||
| Introduction | The HKLM\System\Disk key is the heart
        of Windows NT 4.0's volume management. Under this key,
        which is created by the NT Disk Administrator program,
        you'll find a binary-data value called Information.
        Its this value that contains the configuration of
        recognized partitions, their drive-letter assignment
        information, and the definition of any fault-tolerant or
        multi-volume logical drives that exist on a machine. The Disk
        key has been around since the first releases of NT, but
        Microsoft has never documented its format. In this
        article I'm going to describe the layout of the Disk
        key and present a program, Diskkey, that will
        (what else?) read, decode, and print the information
        stored in the Disk\Information value. If you've
        ever been curious about how fault-tolerant drives are
        constructed in NT, or you wish to write your own version
        of the Resource Kit's FT-Edit program for managing
        NT volumes, then you'll find the information here
        interesting and/or useful.  | 
    ||
| What's Under the Disk Key? | The HKLM\System\Disk
        key is created the first time you run Disk
        Administrator. Disk Administrator makes a
        value called Information, where it initially
        stores information about each hard-disk in the system,
        including the layout of partitions on the drive. As you
        use Disk Administrator to assign drive letters,
        create and delete partitions, or configure fault-tolerant
        drives, the Information value is updated to
        reflect changes.  You may also find another other value under the Disk key if you've specified that you want a particular drive letter to be mapped to your CD-ROM. The value's name will usually be \device\CdRom0 and it is a string value representing the assigned drive letter (e.g. "G:"). Of course, if you have more than one CD-ROM on your system you might have more values with similar names for them. Besides Disk Administrator, the other components in an NT system that read the Disk key include the fault-tolerant disk driver (ftdisk.sys), and Win32. During its initialization FT-Disk determines what fault-tolerant and multi-volume drives exist on the machine by decoding the Information value. These drive types include mirrored drives, stripe sets, stripe sets with parity, and volume sets. Win32 reads the Information value, and possibly the \device\CdRomXX values, when assigning drive letters to represent partitions.  | 
    ||
| Decoding the Information Value | The Information value is variable
        length, since there is not a fixed number of disks or
        fault-tolerant drives that can exist in NT. The data
        stored in the value is hierarchical in nature, and a
        particular data structure is used to describe components
        at each level in the hierarchy. The diagram below shows
        how the data is organized with an example system that has
        two hard drives. The first hard drive has two partitions
        on it, one of which is half of a mirrored drive. The
        second hard drive consists of only one partition that is
        the other half of the mirror-set.![]() At the top of the diagram is the disk header, which is represented with the DISK_CONFIG_HEADER data structure. Besides a version number, the important fields in this data structure locate the header for the disk description and the fault-tolerant description headers. The disk description header, DISK_REGISTRY (not shown), precedes information about the disks in the system. In turn, each disk header, of type DISK_DESCRIPTION, precedes the data that describes the partitions on the disk. The partitions are described in DISK_PARTITION data structures. A similar approach is taken on the fault-tolerant side of the tree, where a FT_REGISTRY data structure (not shown) precedes the description of each fault-tolerant set on the system (mirrored drive, stripe-set, etc.). Each fault-tolerant set starts off with a header of type FT_DESCRIPTION, and is followed by FT_MEMBER_DESCRIPTION that describe each component of the particular fault-tolerant set. For the example configuration shown in the figure above, the Information value would be laid out as shown below. ![]() Note how each level in the hierarchy locates the components within it. In addition, fault tolerant members, such as the members of the mirror set in the example, locate the disk partition they correspond to both by referencing the logical partitions disk and partition number, and by specifying an offset into the Information value where the partition's description is located. Each level in the structure may have zero or more pieces. A disk can have no partitions or 5 partitions (for instance),and a fault-tolerant set can consist of one or more members (partitions). The number of partitions or fault-tolerant members is stored in the disk or fault-tolerant description data structures. Likewise, the number of disks in the system is stored in the disk registry structure and the number of fault-tolerant sets is stored in the fault-tolerant registry structure. At the top of the tree, the disk configuration data structure locates the disk registry and fault-tolerant registry data structures with their offsets into the Information value. Thus, to traverse the fault-tolerant information for example, the fault-tolerant registry is first located using its offset in the configuration header. Then the number of fault-tolerant sets is noted and the members are iterated by using the size of the data structures as indexes into the Information value.  | 
    ||
| Interesting Fields | Some of the interesting information stored within the data structures include drive letter assignments. Each partition has a field that indicates whether the user has specified that a particular drive letter should be assigned, or if the system should assign a letter. In the fault-tolerant member data structures, as well as the fault-tolerant set data structures, are stored the state of the fault-tolerant component. You'll typically see that the members and sets are healthy, but its possible to find that a part of a mirror has been orphaned, or that a stripe set member is regenerating, if there were errors encountered on the drive. Finally, you'll see the values of the disk signatures that Disk Administrator indicates it writes to the drives it has seen. | ||
| The Diskkey Program | The
        Diskkey program is included here to both
        demonstrate how to read the Disk key and to
        provide header files that can be used in your own volume
        management programs. Diskkey does nothing more
        than dump the information it finds in the Disk
        key.  Some of the data structures defined in diskkey.h are taken from their definitions in the NTDDK file ntddft.h, while others have been derived through experimentation and correlation with the ntddft.h structures.  | 
    ||
| What's Coming in NT 5.0 | Disk
        management is undergoing some major changes in NT 5.0,
        with the incorporation of Veritas' volume-management
        technology. The HKM\Disk\Information value is
        still present, but fault-tolerant information is no
        longer stored there. It appears that the Information
        value has been kept in NT 5.0 merely to provide some
        level of backward compatibility, and is understood by NT
        5 in order to support migration from NT 4.0.  Fault-tolerant information in NT 5.0 is stored directly on disk, which makes the loss of fault-tolerant drives less likely in NT 5.0. In addition, the fault-tolerant disk driver is in charge of all partitions, not just those that are part of fault-tolerant sets. This means that even if you don't have a fault-tolerant drive (or even a volume-set), ftdisk.sys in NT 5.0 is always running as a filter driver that sees every request directed at every disk drive. Apparently because NT 5.0 requires additional space on a drive to store FT-information, you must have what Microsoft is calling a "dynamic" drive to be able to create volume sets or fault-tolerant sets. It seems that "dynamic" really means NT 5-only (no pre-existing partitions).  | 
    ||