トップページ⇒tech
998コメント379KB

【WDM】Windows Driver Model相談室【デバドラ】

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
ようこそ、Blue Screenへ(・∀・)
0666デフォルトの名無しさん2008/08/12(火) 22:58:01
PS2マウス(だけ)に連射機能とかつけようと思い、
フィルタドライバのっけて座標やボタンの状態を取得できるところまできたんですが、
連射させるところで行き詰まってしまいました。

ボタンを押したら Read が発生するんですが、次に離すまでRead がこないので
ボタン状態を変更しようにもできません。
なんとかしてボタンを押したことにしたり離したりしたことにできないでしょうか?

できるものなら何かヒントをお願いします。
0667デフォルトの名無しさん2008/08/12(火) 23:18:07
>>666
フィルタかけるところが違うんじゃないか?
06686662008/08/13(水) 12:29:51
そんな気がしてきました
そこらへん調べてみます
ありがとうございました
0669デフォルトの名無しさん2008/08/14(木) 03:07:29
>>666
もしかしてIRP_MJ_READにデバッグ出力を入れただけだとしたら
下位のドライバがpendingにしてるから次のreadが来ないのでは。
0670デフォルトの名無しさん2008/08/19(火) 20:26:36
>>669
どうもです。恥ずかしながら私がアタッチしてたのはリモートデスクトップ用の
マウスクラス(?)のようで、ACPI のほうにアタッチしたら今度はREADそのものが
こない状況になりました。

DDK サンプルの mouclass やら moufiltr を見ると根本的に間違っていた気がします。
とは言え、moufiltr は USB マウスにアタッチしても Read 処理ではなく
MouFiltr_ServiceCallback() で処理するようになっていますが、GPAF のソースを
見ると(ゲームパッドとは言え)、Read で Hid 処理をしてたりするのでゲームパッドと
マウスの構造は同じ Hid でも違うのかなぁ、なんて思ったり。

結局、PS/2やUSBの選択、どの上位フィルタとして作るのが良いのかわからない状況に
なってしまいました。
今は本買って基礎からお勉強中です。フィルタドライバにまで関して言及してある
書籍って少ないですねぇ。
0671デフォルトの名無しさん2008/08/20(水) 10:33:44
>>670
ボタンに連射を付けるだけなら普通にmoufiltrで十分だとは思うけど。

連射発行タイミングをチェックするスレッドで
必要に応じてServiceCallback風の動作をすることと、
次の要求が来たときに下位ドライバにコマンドを発行せずに
スルー処理を追加する必要があるはず。
0672デフォルトの名無しさん2008/08/20(水) 23:01:18
>>671
どうもです。その ServiceCallback 風の動作をするというのがなかなか敷居が高そうで・・・
海外掲示板とか覗いていたら
「WRITE 時に mouclass の ServiceCallback をコールしたらBSOD になったけどどうすれば良い?」
みたいな内容のスレッドがあって結局未解決のようでした。
とりあえず、そのせんで行ってみて色々試して見ます。
06736722008/08/21(木) 22:26:24
KTimer と KDPC 使って ServiceCallback 呼び出したら難なくいけました。
ありがとうございました。

ところでフィルタドライバは動的にアンロードできないと聞いたんですがXP や VISTAでも無理なんでしょうか?
SCManager 使ってドライバを停止および削除して、SetupDIでフィルタ対象デバイスを再起動させると
フィルタはされなくなるんですが、ドライバそのものはアンロード処理されずにロードされっぱなしになってるようで…
単なるつくりの問題ですか?
0674デフォルトの名無しさん2008/08/22(金) 02:13:24
ん?
普通にデバイスいなくなったら元ドライバとセットでアンロードされると思うんだけど。
それでアンロードされてない、ってことは終了処理にミスがあるんじゃね?
スレッド終了うまくいってないとか。
06756732008/08/22(金) 23:21:10
そうなんですか。。。
もっと調べてみます。どもでした。
0676デフォルトの名無しさん2008/08/23(土) 08:42:14
>>673-674
フィルタドライバがWDMならデバイスを抜くとフィルタドライバも開放されるんだけど
私がHIDでやったときは、WDMだとうまくいかなかったのでNTドライバにしました。
そうするとデバイスを抜いただけではアンロードされないですが、SetupDI系の関数で
アンロードさせることはできます。
0677デフォルトの名無しさん2008/08/23(土) 09:17:20
自分もWDMのフィルタドライバではまってる。
USBデバイスのフィルタドライバを書き、そのデバイスに対し
SetupDiSetClassInstallParamsでDIF_PROPERTYCHANGE/DICS_PROPCHANGE指定して
SetupDiCallClassInstallerを呼び出しいる。

で、無視できない確率でドライバアンロードに失敗する。
自前ドライバの処理でIRP_MN_QUERY_REMOVE_DEVICEに対し
STATUS_SUCCESSを持たせて下位ドライバを呼び出しているのに、
IRP_MN_CANCEL_REMOVE_DEVICEが飛んでくる。

これって、下位ドライバがリムーブを拒否してるんだと思うが
何が原因かわからん。

何か思いつく事があったら教えてください、皆の衆。
0678デフォルトの名無しさん2008/08/23(土) 21:22:52
>>676
ありがとうございます。
アンロードされずに残ったドライバを、DriverWalker などでアンロードさせようとしても失敗しちゃうんですよね。
何か解放してないんでしょうねorz
0679デフォルトの名無しさん2008/08/24(日) 17:21:54
Lowerに要求を投げるだけのなにもしないフィルタドライバ書いて
動きを見てみればいいんでない?
0680デフォルトの名無しさん2008/08/25(月) 23:32:13
WinRing0という,CrystalCPUIDの作者で有名な(?)ひよひよさんのドライバらしいのですが
これでCPUのクロック数を変化させることってできますか?

WinRing0
ttp://openlibsys.org/index-ja.html
0681デフォルトの名無しさん2008/08/25(月) 23:38:07
作者に聞け
0682まつせ2008/08/25(月) 23:49:32
ありがとうございましたm(_ _)m
0683デフォルトの名無しさん2008/08/26(火) 21:59:10
WinDbgの1394接続のカーネルデバッグについて質問です。
Host:Vista or XP、Target:Vistaの構成で1394接続って可能ですかね?
手順通りにやってもうまくいきません。
0684デフォルトの名無しさん2008/08/26(火) 22:20:55
>>683
Host XP Target Vistaで普通にできてる。
だが、使っている1394アダプタによっては動かないことがある。
VIAの古いチップではだめだった。

外人でも似たような人はいるが具体的な話はまだ見たことが無い。
ホスト側はTIのチップつんだやつにしとけ ぐらいしか書いてないが
今時はTIのチップ積んでることなんてあまりないので難しいかも。
手順に問題が無いのであれば
とりあえずホスト側の1394の交換をしてみることをオススメする。

06856932008/08/27(水) 22:37:11
>>684
ケーブルを疑って新しいケーブルに交換したらうまく動きました。
別のマシンでは動いていたんで、まさかとは思ったんですが・・・

Vistaは1394ネットアダプタがないんで通信できてるのかよくわかんないですね。
ともかくありがとうございました。
0686デフォルトの名無しさん2008/08/28(木) 23:17:50
質問させてください。

C言語は多少経験ありますが、ドライバ開発はまったくないので手探り状態で勉強してます。
ディスプレイ関連の操作をしたいのでサンプルソースのvideo\displays\mirror\miniを参考に
下記コードにてビルドをしようとしたのですが、DriverEntryの定義エラーがでました。
そこでntddk.hをインクルードしてみたのですが、今度はminiport.hで再定義エラー(C2011)が出てしまいます。
インクルードする順番など変えてみたのですがエラーが出まくりの状態です。

#include "dderror.h"
#include "devioctl.h"
#include "miniport.h"
#include "ntddvdeo.h"
#include "video.h"

NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING pRegistryPath)
{
NTSTATUS ntStatus = STATUS_SUCCESS;

return ntStatus;
}


付属のサンプル等は問題なくビルドできています。

どうすればビルドできるか教えていただけないでしょうか。
よろしくお願いします。

環境:WDK6001.18001 Windows XP x86 Checked Build
   Windows XP SP2
0687デフォルトの名無しさん2008/08/28(木) 23:22:39
同じ環境だが、普通に何もせず build できたが?
06886862008/08/28(木) 23:27:46
>>687
まじですか・・・
ntddk.hインクルードしない下記のようなエラーが出てしまいます
c:\winddk\test\main.c(31) : error C2061: syntax error : identifier 'DriverEntry'
c:\winddk\test\main.c(31) : error C2059: syntax error : ';'
c:\winddk\test\main.c(31) : error C2146: syntax error : missing ')' before identifier 'pDriverObject'
c:\winddk\test\main.c(31) : error C2061: syntax error : identifier 'pDriverObject'
c:\winddk\test\main.c(31) : error C2059: syntax error : ','
c:\winddk\test\main.c(31) : error C2059: syntax error : ')'

ntddk.hインクルードすると上のエラーはなくなりますが代わりに再定義エラーが100個以上・・・
VS.NET2003インストールしてあるのは関係ないですよね・・・?
0689デフォルトの名無しさん2008/08/28(木) 23:27:51
video\displays\mirror\ で build してエラーでるとか言ってないだろうな
0690デフォルトの名無しさん2008/08/28(木) 23:29:47
って、ごめん、自分で作ったやつか。
SOURCE とか makefile はちゃんとコピーした?
06916862008/08/28(木) 23:30:26
>>689
フォルダ別に作ってMAKEFILEとSOURCESをコピーして
SORCESの"TARGETNAME"と"SOURCES"だけ編集してビルドしてます。
0692デフォルトの名無しさん2008/08/28(木) 23:42:52
とりあえず、

#include <wdm.h>
NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING pRegistryPath) 
{ 
NTSTATUS ntStatus = STATUS_SUCCESS; 

return ntStatus; 
} 

だとどうよ?
06936862008/08/28(木) 23:46:16
>>692
レスどうもです
これだと問題なくビルドできます
video.hをインクルードすると無理ですが・・・
0694デフォルトの名無しさん2008/08/29(金) 00:03:06
サンプルのほう見ると PDRIVER_OBJECT ではなく PVOID で宣言してるね。
video.h とか使う場合は wdm.h とかの include 無理なんかな。
06956862008/08/29(金) 00:08:35
>>694
そうなんですよね
サンプルのようにDriverEntryの戻り値型と引数型を変更すると
ビルドできるんですが、DriverEntryってどこ調べてもNTSTATUSと
PDRIVER_OBJECT、PUNICODE_STRINGで定義されてるので・・・
0696デフォルトの名無しさん2008/08/29(金) 01:47:15
WindowsのMiniportドライバはWDMではない。
これはドライバ開発をする人が誰もがはまる。

WDMドライバを開発=フィルタドライバorクラスドライバ
だが、ある程度共通化できるルーチンが多い場合に備えて
クラスドライバをMSが用意し、そこからリクエストをするのがminiportドライバ
miniportでは専用のライブラリ関数が用意されていて
それら以外の関数は使ってはいけない。

したがってntddk.hをインクルードできないし、してはいけないし
MSは共存させるつもりもない。

それでも無理やりやるのは完全にハックになり
サービスパックやパッチが当たっただけで動かなくなる可能性がある。

0697デフォルトの名無しさん2008/08/29(金) 21:07:59
SCSIミニポートドライバなんてカーネルがロードされる前に呼び出される可能性すらある
0698デフォルトの名無しさん2008/08/29(金) 22:32:28
それはSCSIミニポートだからではなくレジストリの設定で決まる。
ServicesレジストリのStartキーが0ならブートローダーのときに呼ばれる。
起動ディスクを読み込むのに必要なデバイスのStartキーはすべて0になっていないと0x7Bが出る。

OSインストール時にIDEデバイスとか登録されてはいるが
カーネルメモリ節約のために必要の無いデバイスはStartが4になっている。
そのためディスクを付け替えたりすると起動しないことがある。
0699デフォルトの名無しさん2008/08/30(土) 08:39:30
質問があります。

minispy、filespyサンプルの処理内容を理解するのに役立つ書籍や入門サイトがあったら教えていただきたいです

目的は、ファイルの上書きやコピーなど高レベルなファイルI/O監視ドライバを作成することです(フックではなくドライバで行いたいです)

サンプルでは低レベルなIO情報まで監視されてしまうため、これを改造できないかなと考えてます

自分は、ドライバ開発経験はなしです。キーボードのフィルタドライバサンプルは、日本語の書籍で勉強し、軽くは理解しています。

…ソースコードが少ないminispyを理解したいんですが、ミニドライバの資料ってあまりみたことないです
0700デフォルトの名無しさん2008/08/30(土) 13:00:02
>>699
違ったらよいんだが、

Windows XP フィルタドライバプログラミング [入門と実践]

を読んで「軽くは理解しています。」と思っているなら認識改めたほうがいい。
あれで得た知識(見たサンプル)は全く役にたたない。
0701デフォルトの名無しさん2008/08/30(土) 16:18:14
>699
素朴な疑問だが上書きやコピーといった監視だったら、ドライバつかわんでも
FindFirstChangeNotification()という手もある。
これじゃあなんかまずい理由あるの?
0702デフォルトの名無しさん2008/08/30(土) 19:59:59
>>700
フィルタドライバプログラミングではないです。それは参考にしてないです。

API徹底理解っていうムックと。Cマガのバックナンバーです。

「ダミー関数はこんな感じで作って」、「でもPnPのダミー関数は別」ってことくらいしか理解してないです。

filespyを見ても、「なんでこのファンクションを監視するんだ?」って疑問しかわかないんです。かと言って、USBドライバを最終目標にしてる書籍はfilespyの世界とは畑違いな気がして


>>701
あのAPIの詳細は知らないんですが、ファイルを操作したユーザー名やアプリケーション名が取得できるならやってみたいです。

ただ、ローカルだけでなく、リムーバブルやサーバーやネットワークPCも監視が条件なので
0703デフォルトの名無しさん2008/08/30(土) 21:43:59
ファイルシステムの監視ならminifilterでフィルタドライバ書けばいいよ
ローカルならPIDが入ってくるからそこからユーザートークンに変換すればいい

でもネットワークドライブはまた別の話になるよ
リモートのPIDなんか分かってもしょうがないしね
そもそもSMBのリダイレクタのPIDしか入ってこないだろうし
0704デフォルトの名無しさん2008/08/31(日) 00:32:13
というか、ファイルを開くとか、そこから読むとか、書くとかは判るけど、

それが上書きなのかコピーなのかというような意図?は、カーネルレベルでは
失われているような気がするんだけど。
0705デフォルトの名無しさん2008/08/31(日) 01:03:30
ソースと関数リファレンス見ても分からんって事はOSの知識が足りないんじゃねーのか?
まずはWindows Internals(和訳名インサイドWindows?)読んでみたらどうだ。
0706デフォルトの名無しさん2008/08/31(日) 07:19:19
>>704
フィルタドライバで分かるのは削除と同じボリューム内の移動だけだね
というかやりたいこと具体的に言わんと
07077022008/08/31(日) 10:10:41
>>703
minifilterで作っていきたいと思います。ネットワークからリモートログインしてきたユーザーの監視はしません。自分がリモートで操作したファイルは監視します。

>>705
ドライバ系のAPI知識はゼロに近くて、ファイルシステムのフの字も知らないです。インサイドウィンドウズの購入してみます。…でも金がないので会社から借ります

>>706
やりたいのは、フックベースで実現できていたファイル監視をドライバに移植することです。

>>704
コピーや上書きは、フックベースでも追いきれないとこがあったんで「ReadFileで処理したアドレスがWriteFileで処理されたらコピー扱い」みたいなマージをしており、ドライバでもマージしようかなと考えてます

長い旅路になりそうです。ありがとうございました
0708デフォルトの名無しさん2008/09/02(火) 01:37:50
WDMのドライバをリモートからデバッグしようと思い、
シリアルクロスケーブルを購入したのですが、
どちらのPCにもシリアルポートがないようなのです。
調べてみたところ、USB シリアル変換機というのを利用すれば、
それを経由してシリアル通信ができそうなのですが、
この変換機はPC1台につき1個、つまり2個必要であると考えて問題
ないでしょうか。
また、クロスケーブルではなく、ストレートのシリアルケーブルでは、
デバッグはできないものなのでしょうか。
0709デフォルトの名無しさん2008/09/02(火) 06:40:14
HOST側はUSB-Serial変換でいいけど、TARGET側では無理。
0710デフォルトの名無しさん2008/09/02(火) 14:19:43
そうでしたか。
つまり、シリアルポートがない場合は、
リモートからのデバッグはできないと。
デバッグといっても、DbgPrintの結果を確認したいだけなので、
ローカルでDebugViewを使う方法でもよいのですが、
リモートの方法も気になるところです。
0711デフォルトの名無しさん2008/09/02(火) 14:59:28
>>708
>また、クロスケーブルではなく、ストレートのシリアルケーブルでは、
>デバッグはできないものなのでしょうか。

時代が変わって、232cなんて使わなくなってきたのは分かるが・・・
0712デフォルトの名無しさん2008/09/02(火) 20:03:23
XPはFireWireとかでも使えなかったっけ?
0713デフォルトの名無しさん2008/09/02(火) 22:29:21
Windows用USBデバイスのインストーラ及びアンインストーラをVCで
作ってます。
汎用性を持たせるためにinf及びdelファイルを書き換えるだけで
インストーラ、アンインストーラは再コンパイル不要とした作りに
したいと思っています。
そこで、特定のINFファイルから"USB\VID_xxxx&PID_xxxx"を
抜き出して行うような方式としたいとおもうのですがなにか
方法(Win32 API)は無いでしょうか。

0714デフォルトの名無しさん2008/09/03(水) 00:10:22
インストールアンインストールだけだったらDPINST使えばいいとおもうがどうか。
INFが適切なら実行するだけでインストールしてくれる
あと、DPINSTをAPI化したDIFとかいうやつもある。
07157132008/09/03(水) 21:16:14
>>714
たしかにINFのみでインストールだけなら可能なのですが、
コマンド等でカスタマイズも考えているので...


で、自ら調べた結果、GetPrivateProfileStringが
INIだけでなくINFにも使えそうなので、これを組み
合わせて作ろうと思うのですが他に何かいいアイディアは
ありますか?
0716デフォルトの名無しさん2008/09/03(水) 22:35:58
いまいち何がしたいのかよくわからんが dpinst を自作したいなら DriverPackageInstall 使う
07177132008/09/10(水) 13:20:32
GetPrivateProfileString及びGetPrivateProfileStringで
何とかできそうです。
ありがとうございました。
0718デフォルトの名無しさん2008/09/15(月) 22:45:22
DDK サンプルの kbfiltr を x86 VISTA 上で PS/2 キーボードのフィルタドライバとして
インストールしたのですが、なんだかロードされてない感じがします。
(KdPrintなどのデバッグメッセージが表示されない)

起動時に読み込まれるドライバには署名が必須という条件にひっかかかっているのかと思い

Bcdedit.exe /set nointegritychecks ON

を実行してみましたが何も変わりませんでした。
VISTA にインストールするにはどうしたらよいのでしょうか?
ちなみに XP だと問題なく動作しました。
0719デフォルトの名無しさん2008/09/15(月) 23:36:24
>>718
フィルタされてるのでは。
KdPrintExかDbgPrintEx使ってみたらどう?
0720デフォルトの名無しさん2008/09/16(火) 00:28:46
テスト用の署名はしたん?
0721デフォルトの名無しさん2008/09/16(火) 01:03:02
x86はまだ署名はいらんと思うが
07227182008/09/16(火) 10:32:18
>>719
使用してみましたが、結果変わらずでした。フィルタされてないようです。

>>720
してないです。署名はどのような設定だろうと必要なんでしょうか?
テスト用の署名では公開できないと思うので、公開しようと思ったら
リリース用の署名をとらないと駄目ってことでしょうか?

>>721
http://www.microsoft.com/japan/whdc/winlogo/drvsign/drvsign.mspx

では x86 も「ロード時に読み込まれるドライバには埋め込み署名が含まれている必要が
あります」とあります。
0723デフォルトの名無しさん2008/09/16(火) 10:52:05
>>722
公開前提ならテスト署名で動作確認後にリリース署名確保でいいと思う。
デバイス固有でいいならkbfilter使うよりクラスでHIDミニドライバ作ることも検討した方が楽だろうけど。


http://www.microsoft.com/japan/whdc/winlogo/drvsign/kmcs_walkthrough.mspx

の右からダウンロードできる、

http://download.microsoft.com/download/c/f/6/cf670671-64aa-4eb2-abbf-bb33dc4ac834/KMCS_Walkthrough_jpn.doc

これを見るとそのオプションは製品版VISTAでは存在しないことになってる。
テスト署名であれば

bcdedit.exe /set TESTSIGNING ON

でロードできるようだが。
07247182008/09/16(火) 22:13:50
>>723
存在しないことになってたんですねorz

テスト署名してみたところ、無事ロードされるようになりました。
でも HD DVD とか Bluray とか再生できなくなるのかな・・・?

みなさん、ありがとうございました。
0725デフォルトの名無しさん2008/09/17(水) 09:26:14
x64じゃダメだろーけど、x86なら自分で署名して、それを信頼する発行元とかに突っ込めばなんとかならんもんかね
0726デフォルトの名無しさん2008/10/04(土) 02:38:08
現在、各ドライブ(C:, D:, ...)のフィルタドライバを作成しています。
そこで、事始めに IoAttachDeviceToDeviceStack で Attach だけして
全 IPR をそのまま下位デバイスへ渡すドライバを作ってみました。

ディスパッチルーチンは、Toaster の filter.c を参考にして、
以下のように記述して、全 IRP_MAJOR_FUNCTION に適用しています。

NTSTATUS dispatch_pass(IN PDEVICE_OBJECT device, IN PIRP irp) {
PDEVICE_EXTENSION ext = NULL;
NTSTATUS status = STATUS_SUCCESS;

PAGED_CODE();

ext = reinterpret_cast<PDEVICE_EXTENSION>(device->DeviceExtension);
status = IoAcquireRemoveLock(&ext->lock, irp);
if (status != STATUS_SUCCESS) { ... }

IoSkipCurrentIrpStackLocation(irp);
status = IoCallDriver(ext->target, irp);
IoReleaseRemoveLock(&ext->lock, irp);
return status;
}

これでテストしたところ IRP_MJ_READ や IRP_MJ_WRITE を受信したときに、
頻繁にブルースクリーンが発生します。ファイルサイズが小さな場合は成功するときもあるのですが・・・

スレッド間での排他処理を記述しなければならないのかなとも思いましたが、単にリクエストを下位デバイスに渡すだけでも
そういった処理は記述する必要なのでしょうか?
0727デフォルトの名無しさん2008/10/05(日) 10:00:09
>>726
その問題のソースをどこかにアップして、ブルースクリーンの内容を全部書けば
すぐ解決するのになんで答えを省くかな
0728デフォルトの名無しさん2008/10/07(火) 08:13:49
フィルタドライバのサンプルminispyで日本語ファイル名が取得でっきん(´・ω・`)

サンプルでは、ドライバ側のFltGetFileInfomationでファイル名取得しとんがやけどその時点てとれるんかな。今日デバッガ準備して確認するけど。暇な人、教えてください(´・ω・`)
0729デフォルトの名無しさん2008/10/09(木) 20:56:20
ウニコードからアンシーに変換してデバッグプリントしたらちゃんと日本語名格納されてました。ごめんなさい(´・ω・`)
0730デフォルトの名無しさん2008/10/12(日) 19:20:53
>>726
ブルースクリーンの内容を書かないと何もいえない。
まずはBSODへの対処の仕方を
MSDNでよく読んで実践してみることをお勧めする。

ただ、フィルタードライバーのR/Wでそういうことが起きているということなら
バッファの取り扱いが適切で無いと推測する。
ファイルシステムの場合、R/Wへのアクセスが3種類ぐらい来るので
それらを適切に扱わないとすぐ問題がでたはず。

>>729
%sではなく%wsとするとちょっといいことがあるかも。
0731デフォルトの名無しさん2008/10/14(火) 08:04:50
>>730
ありがとうございます.指摘の通りバッファの扱いが不適切なのかもしれません.
まず,BSODのメッセージとWinDbgの結果を添付します.
*** STOP: 0x0000008E (0xC0000005, 0x80576D6F, 0xECE8CC14, 0x00000000)

EXCEPTION_CODE: (NTSTATUS) 0xc0000005 - "0x%08lx"
FAULTING_IP:
nt!NtWriteFile+321
80576d6f ff530c call dword ptr [ebx+0Ch]
TRAP_FRAME: ece8cc14 -- (.trap 0xffffffffece8cc14)
ErrCode = 00000000
...
nt!NtWriteFile+0x321:
80576d6f ff530c call dword ptr [ebx+0Ch] ds:0023:0000000c=????????
Resetting default scope

DEFAULT_BUCKET_ID: DRIVER_FAULT
BUGCHECK_STR: 0x8E
PROCESS_NAME: explorer.exe
LAST_CONTROL_TRANSFER: from 8051f8ad to 8053580e

STACK_TEXT:
ece8c7dc 8051f8ad 0000008e c0000005 80576d6f nt!KeBugCheckEx+0x1b
ece8cba4 804e1235 ece8cbc0 00000000 ece8cc14 nt!KiDispatchException+0x3b1
ece8cc0c 804e11e6 ece8cd38 80576d6f badb0d00 nt!CommonDispatchException+0x4d
ece8cc3c 80566ba5 00000000 00000023 00000023 nt!KiExceptionExit+0x18a
ece8cd38 804e07ec 00000924 00000000 00000000 nt!ExMapHandleToPointerEx+0x21
ece8cd38 7c94e4f4 00000924 00000000 00000000 nt!KiFastCallEntry+0xf8
046ae084 7c94df6c 7c810e86 00000924 00000000 ntdll!KiFastSystemCallRet
046ae088 7c810e86 00000924 00000000 00000000 ntdll!ZwWriteFile+0xc
046ae0e8 7c8283dc 00000924 04590000 0000b29c kernel32!WriteFile+0xf7
0732デフォルトの名無しさん2008/10/14(火) 08:16:13
続き.以下のようなコードで,フィルタドライバをattachしました.

PDEVICD_OBJECT self;
status = IoCreateDevice(...);

PFILE_OBJECT obj = NULL;
PDEVICE_OBJECT target = NULL;
UNICODE_STRING name;
RtlInitUnicodeString(L"\\Device\\HarddiskVolume1");
NTSTATUS status = IoGetDeviceObjectPointer(name.data(), GENERIC_READ, &obj, &target);

DbgPrint("flag %0x%08x\r\n", target->Flags);

target = IoAttachDeviceToDeviceStack(self, target);
self->Flags |= target->Flags & (DO_BUFFERED_IO | DO_DIRECT_IO);
self->DeviceType = target->DeviceType;
self->Characteristics = target->Characteristics;
if (self->AlignmentRequirement < target->AlignmentRequirement) {
  self->AlignmentRequirement = target->AlignmentRequirement;
}

このとき,Flags の値を確認すると 0x00000000 でした(ちなみに,
self->Flags の値も 0x00000000 でした).
すなわち,DO_BUFFERED_IO でも DO_DIRECT_IO でもない状態となります.
Microsoft WDM プログラミングを読むと,この状態のときは
Irp->UserBuffer にユーザモード仮想アドレスが設定されるらしいのですが,
IRP_MJ_READ が呼ばれたときのディスパッチルーチンで確認すると
Irp->UserBuffer は NULL でした.
Irp->MdlAddress には何らかの値が格納されているようなのですが,
フィルタドライバ内で,ここから Irp->UserBuffer に値を設定するということでしょうか?
0733 ◆0uxK91AxII 2008/10/14(火) 08:57:07
とりあえず、FastIoDispatchを埋めてみるとか。
07347272008/10/14(火) 13:30:12
>>731
733さんが正解。

NtWriteFile内のIoGetRelatedDeviceObject()でトップレベル
(あなたのドライバ)のDriverObjectを手に入れて
DriverObject->DriverObject->FastIoDispath->FastIoWrite()でクラッシュしてる。
ebxがFastIoDispathでこれがNULLだから[ebx+0C]にあたる
FastIoWriteをコールするときにds:0023:0000000Cを参照。
0735デフォルトの名無しさん2008/10/16(木) 08:39:40
>>733,734
本当にありがとうございます.
FastIO 部分をサンプルの filesys\filter\sfilter を参考に修正したところ,
ブルースクリーンが表示されることなく,うまく動作するようになりました.

もう1点だけ質問があります(何度も申し訳ありません).

上記のフィルタドライバは,あるディレクトリを別のディレクトリにリダイレクトする
(C:\xxx -> C:\yyy など)ものを作成しており,リダイレクト部分は以下の URL
を参考に作成しました. http://support.microsoft.com/kb/319447/
この方法を使うと,explorer 上で操作しているときはうまく機能する
(C:\xxx へ移動すると C:\yyy の中のファイルが表示される)のですが,
そこに存在するファイルを別のアプリケーションで開こうとすると,
アプリケーションによってはうまくいきませんでした.

具体的には,.pdf(Acrobat), .jpg(イメージビューア),.wmv(メディアプレイヤー),
.zip(フリーの解凍ソフト(Lhaplus)) はうまく機能しました.

一方で,.txt(メモ帳)とオフィス系(.doc, .xls, .ppt)は,リダイレクト前の
パス(C:\xxx\xxxyyy.doc など)と“ファイルが見つかりません”
のメッセージが表示されうまく行きませんでした.

後者のファイルもうまく開くようにするための良い方法はありますでしょうか?

質問ばかりで申し訳ありません・・・
何か良い方法などがありましたらお願いします
0736デフォルトの名無しさん2008/10/16(木) 10:38:44
x86 の XP/VISTA で makecert でテスト用の証明書を作り、

 signtool sign /v /s my /n testca test.sys

でドライバファイルに埋め込み署名したところ、ファイルのプロパティの
デジタル署名タブでは「問題ありません」になるのに、CreateService()
で登録してデバイスマネージャのドライバの詳細で確認すると
「デジタル署名されていません。」になってしまいます。

これはテスト証明書だからでしょうか?それとも何か手順が漏れているのでしょうか?
0737デフォルトの名無しさん2008/10/16(木) 11:17:10
>>736
テスト証明書だからですね。

テスト証明書を「(あなたが)信頼する発行元」として登録したので、”ファイル”のプロパティーでは「問題ありません」になります。
が、テスト署名の手順ではその証明書(のルートの証明書)へのマイクロソフトのCross-Certificateができないため、
その署名はカーネルモジュールへの署名としては「”マイクロソフトからは”信頼されない証明書による署名」になります。
0738 ◆0uxK91AxII 2008/10/16(木) 11:50:44
>>735
redirect先に、ファイルを作る。
0739デフォルトの名無しさん2008/10/16(木) 23:16:23
>>737
ありがとうございます。
ということは正式な証明書をとれば大丈夫そうですね。
しかし、日本で頼むと6万とか9万超とかなんであんなに高いんだろう。
0740デフォルトの名無しさん2008/10/19(日) 18:37:59
ご相談です。
WinXP環境でドライバ設計中に、PAGE_FAULT_IN_NONPAGED_AREA(0x00000050)
という文字を吐くブルースクリーンが頻度は小さいですが出ます。
通常、ドライバの問題であれば、設計中のドライバの名前が表示される
ブルースクリーンが表示されると思うのですが、原因を検討中です。
どういった原因が考えられるか同じような問題に出くわした方がいらしたら
ご教授願います。
ちなみにドライバが画像処理ボード用です。
0741 ◆0uxK91AxII 2008/10/19(日) 20:54:36
>>740
失せろ。
0742デフォルトの名無しさん2008/10/19(日) 23:42:27
事情も知らずに失せろは如何なものか
日本に来て勉強しながら頑張ってるのかもしれないぢゃないか
0743デフォルトの名無しさん2008/10/19(日) 23:55:58
たとえそうであっても、来るなと言うよ。
0744デフォルトの名無しさん2008/10/20(月) 01:33:53
とりあえず自国民に聞けでFAじゃなかろうか
0745デフォルトの名無しさん2008/10/23(木) 23:45:13
指定のドライブを読み取り専用にしてしまうフィルタドライバを作りたいんですが

そういうのってminispyサンプルを改造すれば実装できるでしょうか?


試しにドライバ側のソースを下記のようにいじってみたんですが読み取り専用にはできませんでした

PreOperationコールバック関数内で

PFLT_CALLBACK_DATA->Iopb->MajorFunctionがIRP_MJ_CREATEのときに

FLT_CALLBACK_DATA->Iopb->MajorFunction->Paramamters.Create.SecurityContext->DesirendAccessにGENERIC_WRITEを代入


アタッチしたドライブのIRPを読み取り専用に書き換えるっていうイメージだったんですが、正常に読み書きできましたorz
0746 ◆0uxK91AxII 2008/10/24(金) 09:32:26
読取のcallbackが着たら、テキトーに弾く。
でも、開くときに弾く方が、OSの挙動として正しいと思う。
0747デフォルトの名無しさん2008/10/27(月) 20:18:44
今カーネルモードのデバイスドライバから
CPUのプロセッサ数(コア数?)を取得する方法を探してるんだけど誰かおせーてー

というかデバイスドライバはサンプルとか入門ページとか数なくてホントワケワカメ。
なんで、それ探すために
「WDMデバイスドライバプログラミング完全ガイド下巻」の購入を検討しているんだけど
関数リファレンスとかどこぞで公開されてないんでしょーか?
0748デフォルトの名無しさん2008/10/27(月) 20:36:43
OpenLibSys参考にハードにアクセスして
詳細情報を自前で取りに行ったら?
0749デフォルトの名無しさん2008/10/27(月) 21:48:06
>>747
とりあえず、
>「WDMデバイスドライバプログラミング完全ガイド下巻」の購入
は止めとけ。
ほとんどがNTドライバの話(WDMでもこの知識は必要だが)で、WDMについては下巻の後半のみ
0750 ◆0uxK91AxII 2008/10/27(月) 22:43:37
>>747
KeNumberProcessors
0751デフォルトの名無しさん2008/10/28(火) 05:46:35
>>748-750
うおー
ありがとー


リファレンス英語版のMSDNにはあるんだね
特にデバイス制御が目的じゃなくて
APIフックの為にカーネルモードで走らせれる環境が必要で
デバドラ作ってるんだけどガイド本はどうしようかな
しかしほんとに毎日BlueScreen何回見てることやら・・・
0752デフォルトの名無しさん2008/10/31(金) 12:34:47
DeviceIoControl()のlpInBufferって参照渡しにできる?
0753デフォルトの名無しさん2008/10/31(金) 14:55:53
>>752
参照渡しってDirect-IO(MDL渡し)のことか?
0754デフォルトの名無しさん2008/10/31(金) 15:37:35
>>753
MDLはよくわからんが、多分そんな感じ
ドライバがIrp->AssociatedIrp.SystemBufferで取得したparamに値を代入した場合
アプリ側でその値は取得できるのかな?っみたいな。。
0755デフォルトの名無しさん2008/10/31(金) 16:30:36
lpInBufferの方は、どっちに指定しても読み取り専用のバッファIO扱いだったはず

ttp://www.sciencepark.co.jp/community/report/report27.html
0756 ◆0uxK91AxII 2008/10/31(金) 20:30:39
>>754
METHOD_BUFFEREDにして、lpOutBufferで読むとか。
0757デフォルトの名無しさん2008/10/31(金) 23:15:55
>>752が何をやりたいのかワカラン
ドライバ→アプリのデータを、アプリが用意したバッファにドライバがコピーするのでなく、
ドライバの持ってるバッファのアドレスをアプリに渡したいのか??(それは無理)
MDLを知らないってことは基礎知識が全く無いってことだよな、やめとけ

>>756
なぜにlpOutBuffer?
METHOD_BUFFEREDではドライバ側ではIN/OUT同一のバッファだけど、ドライバでバッファにセット
したデータは、lpInBuffer側にしかコピーされないよ
0758デフォルトの名無しさん2008/10/31(金) 23:51:39
データ設定してDeviceIoControlするのが面倒だからポインタで渡して
ドライバとアプリで同時に読み書きしたいとかそんなところ?
排他制御やら面倒そうだが名前つきのFileMappingで出来るんじゃないかな。

それはともかくWDK SP1が出たね。
0759デフォルトの名無しさん2008/11/04(火) 13:34:27
複数ボタン同時押しで、別のボタン押下イベントが発生する、ゲームパッド用フィルタドライバを作ろうと思っているのですが、
ドライバ側で、パッドに実装されているボタン以外のイベント(17~32あたり)を発生させることは可能でしょうか?
0760 ◆0uxK91AxII 2008/11/04(火) 14:13:24
>>759
やりたい事は、可能だと思う。
事前に、適当なreportDescriptorを返すとかで。
0761 ◆8eAmylDLLs 2008/11/04(火) 15:09:22
>>759
元からそのパッドに存在しないボタンに振り替えするのは
760が書いてるようにReportDescriptorをでっちあげる必要がある。
もちろんボタン数が増えてデータサイズが増えたら
Reportもそれに併せて手を入れないといけない。

やる気になればマウスだろうがキーボードだろうがHIDの機能なら全部振り替えできなくもない。
つーか箱○改造版ではキーボード振り替えやってる。

独自ドライバ使ってるデバイスの場合、フィルタでやっても
動作しない可能性があるので、独自にドライバ起こす方が無難。
0762デフォルトの名無しさん2008/11/04(火) 15:14:22
CHの3点セット の造りみたいだな

USBでぶっさした機器は直接 HID機器ではない扱いで
HIDドライバが 4アナログ 32点 提供 それのマッピングは任意にできるぜ
07637592008/11/05(水) 10:56:55
>>760-762 ありがと
とりあえずreportDescriptorでググってみたが、ezusbやpicのマイコン関連しか出てこない。。
もしかしてこれってWDMより外のはなし?
0764デフォルトの名無しさん2008/11/05(水) 11:04:12
>>763
HIDの話しだからWDMの外と言われればそーかもな
0765 ◆8eAmylDLLs 2008/11/05(水) 11:58:51
>>763
USB.org行ってHIDのドキュメント漁ってくるのが確実。
あとは公開されてるゲームパッドドライバのソースを見る。

HID部分についてはWDM以外のLinuxとかでも同じなので
そっち系のソースを見る方が分かりやすいかもね。
「USAGE_PAGE」でググるとソースが見つかりやすい。


>>762
質問者は既存のゲームパッドの動作改造目的なんだから
「マッピング部分を差し替える=ReportDescriptorを差し替える」部分をやらなきゃいけないわけだ。
その方法論について聞かれているわけで、視点がちょっと違うんでない?
07667592008/11/06(木) 12:24:36
>>764-765 ありがと
ググってみたが、 ttp://www.tamanegi.org/prog/vtchid/くらいしか見つけられんかった;
とりあえず参考にしてみようと思うが、ソースが複雑過ぎる><
■ このスレッドは過去ログ倉庫に格納されています