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と表示することにした。
何に使うかは後日書く。