2

既存の Windows カーネル デバイス ドライバーを変更していて、そこでタイムスタンプを取得する必要があります。time.h ライブラリを使用して clock() 関数を呼び出してそれを取得するつもりでしたが、Windows Visual Studio ではリンクが失敗しています。そのため、ドライバーのライブラリ内で作業する必要があるという手段としてこれを採用しました。

次の関数、KeInitializeTimer、および KeSetTimerEx を見つけましたが、これらは、タイマーを設定してウェイクアップする予定がある場合に使用されます。私が本当に必要としているのは、タイムスタンプを与えるものです。

何か案は?

4

1 に答える 1

7

他の人が私の調査結果から恩恵を受けるための回答で質問を更新しています。

タイムスタンプを取得するには、KeQueryTickCount() を使用できます。このルーチンは、システムの起動以降に発生したインターバル割り込みの数を示します。ただし、キャプチャした最後のタイムスタンプから X 時間経過したことを確認する必要がある場合は、システムにクエリを実行して、各インターバル クロック割り込みにかかる時間を決定する必要もあります。

ULONG KeQueryTimeIncrement() は、100 ナノ秒単位の数を示します。

例:

PLARGE_INTEGER timeStamp;

KeQueryTickCount(&timeStamp);

PLARGE_INTEGER は次のように定義されていることに注意してください。

#if defined(MIDL_PASS)
typedef struct _LARGE_INTEGER {
#else // MIDL_PASS
typedef union _LARGE_INTEGER {
    struct {
        ULONG LowPart;
        LONG HighPart;
    } DUMMYSTRUCTNAME;
    struct {
        ULONG LowPart;
        LONG HighPart;
    } u;
#endif //MIDL_PASS
    LONGLONG QuadPart;
} LARGE_INTEGER;

たとえば、最後にタイムスタンプを取得してから 30 秒が経過したかどうかを確認するには、次のようにします。

ULONG tickIncrement, ticks;
LARGE_INTEGER waitTillTimeStamp;
tickIncrement = KeQueryTimeIncrement();

// 1 秒は 1,000,000,000 ナノ秒ですが、KeQueryTimeIncrement は // 100 ns 単位なので、それを割ると定数は 10,000,000 になります

ticks = ((30 * 10,000,000) / tickIncrement);
KeQueryTickCount(&waitTillTimeStamp);
waitTillTimeStamp.QuadPart += ticks;

<.....Some code and time passage....>
KeQueryTickCount(&currTimeStamp);


if (waitTillTimeStamp.QuadPart < currTimeStamp.QuadPart) {
    <...Do whatever...>
}

これを理解するのに役立つもう 1 つの例は、取得したタイムスタンプをミリ秒などの時間値に変換する場合です。

LARGE_INTEGER mSec, currTimeStamp;
ULONG timeIncrement;

timeIncrement = KeQueryTimeIncrement();


KeQueryTickCount(&currTimeStamp);

// 1 millisecond is 1,000,000 nano seconds, but remember divide by 100 to account for 
// KeQueryTickCount granularity.
mSec.QuadPart = (currTimeStamp.QuadPart * timeIncrement) / 10000;

この例はデモンストレーションを目的としており、mSec はミリ秒単位の現在の時刻ではないことに注意してください。上記で使用された API に基づくと、これはシステムが開始されてから経過したミリ秒数にすぎません。

GetTickCount() を使用することもできますが、これは DWORD を返すため、システムが起動してから最大 49.7 日間のミリ秒数しか取得できません。

于 2012-10-22T17:29:57.713 に答える