定時処理の作成方法

現在、自作PCIボード用のドライバを作成しております。
一定周期でデバドラである関数を実行したいのですが
どのような実現方法があるのでしょうか?
アプリケーションからIOCTRLを一定間隔で発行する方法を考えたのですが、
アプリケーションを起動していない時でも関数を実行したいです。
また、PCIボードから一定間隔で割り込みを入れる方法もありますが、
できればデバドラだけで実現したいです。

一定間隔の周期は数msecか数十msecで、
精度はそれほど必要ありません。
数msecのバラツキは問題になりません。

以上、アドバイス頂けますでしょうか?
曖昧な表現で申し訳ございませんが、よろしくお願いします。

こんにちは、sagaraで

こんにちは、sagaraです。

返信が遅くなりました。
> だとしたら、KeSetTimerEx() を使えば簡単に実現できるかも知れません。

こちらのほうがスマートですね。
この関数を知らなかったので、今回勉強になりました。
有難うございました。

蛇足ですけど。。。 K

蛇足ですけど。。。
KeSetTimerEx() を使った周期タイマの実装例は、WDK で提供されいる isousb.sys などの
サンプル ドライバにもあります。
なので、そちらを参照された方が分かりやすいかも。。。

Pooh様 アドバイスあり

Pooh様
アドバイスありがとうございます。
「Microsoft WDM プログラミング - 第4章 同期」は書籍ですよね。
私も質問前に読んでみたのですが・・・
再度読んで確認してみます。
ありがとうございました。

既に解決されている

既に解決されているかも知れませんが。。。
ccgrape さんがデバイス ドライバで実現させたいのは、周期タイマでは?
だとしたら、KeSetTimerEx() を使えば簡単に実現できるかも知れません。
周期タイマの実装例は、「Microsoft WDM プログラミング - 第4章 同期」の
"4.4.7 カーネル タイマ" のところにあります。

sagara様 アドバイスあ

sagara様
アドバイスありがとうございます。
(お礼が遅くなり申し訳ございません。)
教えて頂いた方法で実験をしてみました。
実現できそうです。
本当にありがとうございました。
また、何かありましたらよろしくお願いします。

はじめまして、sagara

はじめまして、sagaraです。

> 一定周期でデバドラである関数を実行したいのですが
> どのような実現方法があるのでしょうか?
>
上記内容から思いついたのはタイマーを利用した方法です。

KeSetTimer関数を使用すれば、
指定した時間に関数を実行することが出来ます。
また、実行された関数の中でKeSetTimer関数を実行すれば、
一定間隔で関数を呼び出すことが出来ます。

KeSetTimer関数のみでは実現できませんので、
以下に簡単な手順を示します。
①初期処理時(IRP_MN_START_DEVICEが発行された時等)に
 KeInitializeTimer関数を実行します。
②①の後にKeInitializeDpc関数を実行します。
 この関数の第二引数にて実行したい関数を指定します。
③①②で取得した値を持って、KeSetTimer関数を実行します。
④指定された時間に②で指定した関数が実行されます。
 その関数の最後で再度KeSetTimer関数を実行します。

④を行うことで、一定間隔で関数を呼び出すことが可能かと思います。
止めたい場合はKeCancelTimer関数を実行すれば止めることが出来ます。

WDK 6001.18002のサンプルの
(WinDDKフォルダ)\6001.18002\src\general\pcidrv\sys\idle.c
で同じような処理を行っているのでそちらをご参照ください。

意図しているものと違っていたらご指摘ください。