hmx-17の日記

技術ネタとかプライベート

CR4レジスタを観察する簡単なお仕事

LiveKDを使ってCR4レジスタを観察するとてもどうでもいいことをするためのプログラムを作った。
LiveKDとの連携は考えていないので、"hoge 0x0000ffff"みたいに引数にCR4レジスタの値を書いてあげる必要がある。そして適当に作った適当ソースなのでバグっても文句は言わない。

#include <stdio.h>

#define FLAGS_COUNT 19

char FLAG[FLAGS_COUNT][10] = {"VME", "PVI", "TSD", "DE", "PSE", "PAE",
			      "MCE", "PGE", "PCE", "OSFXSR", "OSXNNEXCPT",
			      "RESERVE", "RESERVE", "VMXE", "SMXE", "RESERVE", "RESERVE",
			      "PCIDE", "OSXSAVE"};

int main( int argc, char *argv[] )
{
	unsigned int cr4;
	int i;
	// 0xffff0000みたいなので来て欲しい
	if (argc != 2) return 0;
	cr4 = (unsigned int)strtol(argv[1], NULL, 0);
	printf("CR4: %x\n", cr4);
	// show bit
	for (i = 31; i >= 0; i--) {
		if (i < FLAGS_COUNT) {
			// known-flag
			printf("%s: %d\n", FLAG[i], (cr4>>i) & 1);
		} else {
			printf("%dbit: %d\n", i, (cr4>>i) & 1);
		}
	}
	
	return 0;
}

実行するとこうなる。

C:\>show_cr4 0x6f8
CR4: 6f8
31bit: 0
30bit: 0
29bit: 0
28bit: 0
27bit: 0
26bit: 0
25bit: 0
24bit: 0
23bit: 0
22bit: 0
21bit: 0
20bit: 0
19bit: 0
OSXSAVE: 0
PCIDE: 0
RESERVE: 0
RESERVE: 0
SMXE: 0
VMXE: 0
RESERVE: 0
RESERVE: 0
OSXNNEXCPTRESERVE: 1
OSFXSR: 1
PCE: 0
PGE: 1
MCE: 1
PAE: 1
PSE: 1
DE: 1
TSD: 0
PVI: 0
VME: 0

名前が付いてるところと連続してる所は埋めたけどそのほかは面倒なのでそのままxbitと表示することにした。
何に使うかは後日書く。