DDKのバージョンとVistaでの動作の問題
いままで、Windows用デバイスドライバの開発にはDDK(Driver Development Kit。今ではWDKという)のbuild 2600という古いバージョンを使っていました。
build 2600ではWindows 2003やVista用のドライバは作れないので、build 6001や、build 3790という比較的新しいバージョンを導入してみました。
しかし、build 3790でビルドしたデバイスドライバをVistaで動作させるのは全く問題ないのですが、ドライバを停止するときにブルースクリーンになってしまいました。
ドライバが停止するときに、IoDeleteDeviceという関数を呼ばなければならないのですが、どうやらこの関数の実行に伴ってREFERECE_BY_POINTER (Bugcheck Code 18)というエラーが発生するようです。しかし、MSDNのページを見ても、いったい何のエラーなのかよくわかりません。
古いbuild 2600でWindows XP用にビルドしたドライバをVistaで動かすのは問題ないのですが、3790以降のWDKでビルドしたものをVistaで動かすと、必ずこのエラーになります。
デバイスドライバの作成方法の作法が何か変わったのかもしれません。
■Vistaでの動作
・Build 2600でビルド
Windows XP用・・・OK
・Build 3790でビルド
Windows XP用・・・NG
Windows Server 2003用・・・NG
・Build 6001でビルド
Windows XP用・・・NG
Windows Server 2003用・・・NG
Windows Vista用・・・NG
■XPでの動作
・Build 2600でビルド
Windows XP用・・・OK
・Build 3790でビルド
Windows XP用・・・OK
Windows Server 2003用・・・OK
・Build 6001でビルド
Windows XP用・・・OK
Windows Server 2003用・・・OK
Windows Vista用・・・OK
とりあえず、古いDDKのbuild 2600はまだ手放せません。
| 固定リンク
コメント
自己解決しました。
玉ねぎ本「WDMデバイスドライバ―Windows98/2000のための新しいドライバモデル 翔泳社」(http://www.amazon.co.jp/dp/4881358618/)
に同梱されているPHD社のDebugPrintは、
DebugPrint.cの259行目にある
ObDereferenceObject(&ThreadObjectPointer);
ObDereferenceObject(ThreadObjectPointer);
にしなければならない。
ObReferenceObjectByHandleでオブジェクトを作るときにはポインタのポインタを与えて、戻り値たるポインタを設定してもらうけど、ObDereferenceObjectが指定するのはただのポインタである。だから、&が余計。
Checkedでビルドで作ったドライバはこの問題が潜む可能性はあるけど、Freeビルドで作ったドライバはDebugPrintが組み込まれないので問題は生じないはず。
投稿: なひたふ | 2013.04.02 11:24