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). |
||
Download Diskkey Plus Source (26KB) |