人とか機械とか

デジタルガジェットやコンピュータについてのブログです。

カーネルモードでシステムの稼働時間(Uptime)を得る(WDK)

ルーチン

LARGE_INTEGER 
  KeQueryPerformanceCounter(
    OUT PLARGE_INTEGER  PerformanceFrequency OPTIONAL
    );

    PerformanceFrequency ... 1秒あたりのカウント数
    return value ... カウンタの値


サンプルコード

LARGE_INTEGER Count;
LARGE_INTEGER Freq;

Count = KeQueryPerformanceCounter (&Freq);

{
	LONGLONG TotalSecs = Count.QuadPart / Freq.QuadPart;  // total seconds
	LONGLONG Days  =  (TotalSecs / (3600 * 24));              // days
	LONGLONG Hours = ((TotalSecs % (3600 * 24)) / 3600);      // Hours
	LONGLONG Mins  = ((TotalSecs % (3600 * 24)) % 3600) / 60; // Minutes
	LONGLONG Secs  = ((TotalSecs % (3600 * 24)) % 3600) % 60; // seconds

	KdPrint ("System Up Time:%I64u days %I64u Hours %I64u Minutes %.2I64u Seconds\n");
}

これカウンタが1周してしまったらマズイですね。
イベントログとか、別の手段で得たほうがいいと思います。