上に述べたように、インストレーションIDにリンクされるハードウェア構成は、2個のダブルワード、H1およびH2によって表現される。
ビットフィールド
このために、この2つのダブルワードは12個のビットフィールドに区分される。コンピュータのハードウェアとビットフィールドとの関係を、次の表で示す。
ダブルワード | オフセット | ビット長 | ビットフィールドの値を決めるもの |
---|---|---|---|
H1 | 0 | 10 | システムボリュームの、ボリュームシリアル番号文字列 |
H1 | 10 | 10 | ネットワークアダプタのMACアドレス文字列 |
H1 | 20 | 7 | CD-ROMドライブのハードウェア識別文字列 |
H1 | 27 | 5 | グラフィックアダプタのハードウェア識別文字列 |
H2 | 0 | 3 | 未使用、001に固定 |
H2 | 3 | 6 | CPUのシリアル番号文字列 |
H2 | 9 | 7 | HDDのハードウェア識別文字列 |
H2 | 16 | 5 | SCSIホストアダプタのハードウェア識別文字列 |
H2 | 21 | 4 | IDEコントローラのハードウェア識別文字列 |
H2 | 25 | 3 | プロセッサモデルの文字列 |
H2 | 28 | 3 | RAMサイズ |
H2 | 31 | 1 | 1=ドッキング可能 |
0=ドッキング不可能 |
H2のBit 31は、これらのビットフィールドが、ドッキングステーションをサポートするノート型コンピュータのものかどうかを示す。もしドッキングが可能であれば、アクティベーション機構は、将来のハードウェア変更に関して、より寛容なものとなる。つまり、ノートPCをドッキングステーションに差し込むことによって、そのハードウェア構成が変わる可能性が高いだろう、という意味だ(たとえばドッキングステーションに組み込まれているSCSIホストアダプタが使えるようになるかもしれない)。
H2のBit 2から0までは未使用であり、常に001がセットされる。
残りの10個のビットフィールドに対応するハードウェアコンポネントが存在する場合、そのコンポネントに対応するビットフィールドには、そのコンポネントを記述する0以外の値が入る。0の値は、そのハードウェアコンポネントが存在しないことを示す。
すべてのハードウェアコンポネントは、レジストリから得られるハードウェア識別文字列によって、識別される。これらの文字列をハッシュすることにより、対応するビットフィールドの値が得られる。
ハッシュ
ハッシュ結果は、ハードウェア識別文字列を、MD5メッセージダイジェストアルゴリズムに入力し、その結果として得られるメッセージダイジェストの、あらかじめ決められた位置から、ビットフィールドに必要な数のビットを抽出することによって得られる。ビットフィールドごとに、それぞれ別の位置が決められている。さらに、ハッシュ結果が0となるのを防ぐために、次の計算が行なわれる。
Hash = (Hash % BitFieldMax) + 1
ここで、BitFieldMaxは、そのビットフィールドに格納できる最大の値であり(たとえば10ビットのビットフィールドならば1023)、'x % y'は、xをyで割る除算の剰余を示す。この結果は、1からBitFieldM axまでの範囲の値である。こうして得られた値が、それぞれのビットフィールドに格納される。
RAM ビットフィールド
オペレーティングシステムが利用可能なRAMの量に関するビットフィールドは、別の方法で計算される。次の表で示すように、おおよそのRAM容量が7種類の値で指定される。
値 | 利用可能なRAMの量 |
0 | (使用されないビットフィールド) |
1 | 32MB未満 |
2 | 32MBから63MBまで |
3 | 64MBから127MBまで |
4 | 128MBから255MBまで |
5 | 256MBから511MBまで |
6 | 512MBから1023MBまで |
7 | 1024MB以上 |
ここで重要なことは、RAM容量がGlobalMemoryStatus()関数の呼び出しによって決められるという点であり、この関数が報告する値は、インストールされているRAMの物理的な容量よりも数百キロバイト少ない。したがって、128 MBのRAMは、「64 MBから127 MBまで」に分類されるのが典型的である。
実例
一つ実例を見ることにしよう。我々のテストシステムの一つは、ハードウェア情報が次の8バイトで構成される。
0xC5 0x95 0x12 0xAC 0x01 0x6E 0x2C 0x32
これらのバイトをH1とH2に変換すると、次の値が得られる。
H1 = 0xAC1295C5、H2 = 0x322C6E01
このH1とH2を分割すると、次の表に示す各ビットフィールドの値が得られる。この表には、それぞれの値の元になった情報も記入してある。
ダブルワードとオフセット | 値 | 元になった情報 |
---|---|---|
H10 | 0x1C5 | '1234-ABCD' |
H110 | 0x0A5 | '00C0DF089E44' |
H120 | 0x37 | 'SCSI\CDROMPLEXTOR_CD-ROM_PX-32TS__1.01' |
H127 | 0x15 | 'PCI\VEN_102B&DEV_0519&SUBSYS_00000000&REV_01' |
H20 | 0x1 | (未使用、常に0x1) |
H23 | 0x00 | (CPUシリアル番号なし) |
H29 | 0x37 | 'SCSI\DISKIBM_____DCAS-34330______S65A' |
H216 | 0x0C | 'PCI\VEN_9004&DEV_7178&SUBSYS_00000000&REV_03' |
H221 | 0x1 | 'PCI\VEN_8086&DEV_7111&SUBSYS_00000000&REV_01' |
H225 | 0x1 | 'GenuineIntelFamily6Model3' |
H228 | 0x3 | (システムのRAMは128MB) |
H231 | 0x0 | (システムはドッキングできない) |