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

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

レス数が950を超えています。1000を超えると書き込みができなくなります。
0001デフォルトの名無しさんNGNG
ようこそ、Blue Screenへ(・∀・)
0930デフォルトの名無しさん2011/01/29(土) 00:46:18
つまりどういうことです?
09319232011/01/29(土) 01:19:39
>>929
>>930
説明不足ですいません。
このスレの趣旨に基づき、質問を絞ります。

- とあるソフトが発する音を横取りするのが最終目的。win全体の音でも構わない
- フックする場所は、ユーザーモードであればどこまでも構わない。
- 目的のために、ハードウェア導入、もしくはハードウェア依存のドライバ導入など、ハードウェアに関する作業は極力避けたい
- そのソフトをollydbgで覗くと、DSOUNDからDeviceIOCOntrolが頻繁にコールされており、恐らくDirectX系が使われている

現状
- ollydbgにて、DeviceIOControlの引数inBufferをちょくちょく弄っても正常に音が鳴っている「ぽい」し、WriteFileもコールされてないので、詰まった

質問
- 上記の目的は、DeviceIOControlのフックにより達成できるか?出来るのであれば、どういう手法、攻め方をすればいいか
- そもそも、何か大きな勘違いをしていないか

waveOut系で音を鳴らすアプリケーションであれば、恐らくなんとかフック・横取りできる程度のスキルは
あるつもりなんですが、DeviceIOControl とか、低級な制御には余り詳しくなく、また適切なスレも無いために、
このスレでさせて頂いた次第です。

どうぞよろしく願いします。
0932デフォルトの名無しさん2011/01/29(土) 01:22:38
大きな勘違いをしている
0933 ◆0uxK91AxII 2011/01/29(土) 02:42:05
dsoundをhookして、実際のunlock呼出前に読み出せば大抵はOK。
09349232011/01/29(土) 12:45:52
>>924
>>933

Unlock関数のフックで、スタックからwaveが引き抜けそうです。
COMの解析は初めてでしたが、思ったより簡単で助かりました。

ありがとうございました。
0935デフォルトの名無しさん2011/02/04(金) 20:35:45
DDKのサンプルについてるkbdclass改造して、キー入れ替えやりたいんだけどさあ
KeyboardClassServiceCallback内でZwOpenFile使うとブルースクリーンになってしまうだよな。。

kbdclass内じゃファイルアクセス処理は使えないんけ?
(フィルタドライバ内では使えてたんだけど。。)
0936デフォルトの名無しさん2011/02/04(金) 20:37:21
発想が変
09379352011/02/04(金) 21:19:40
>発想が変
わかってる。

お手軽にキー入れ替えをやってみたくてね。
ファイルにキー入れ替え情報を設定して、それを読み込んで反映できないかなって。。

(KeyboardClassServiceCallback内って書いたけど、これじゃキーが押されるたびに
ファイルアクセスしてしまうから、ドライバ起動時にやるべきか。もちろん出来ればの話だけど)


0938デフォルトの名無しさん2011/02/04(金) 22:08:08
>>935
IRQLと、そのそれぞれのレベルで使える関数の制限について勉強してね
0939 ◆0uxK91AxII 2011/02/05(土) 00:24:18
>>937
設定を読み出すなら、ふつーにレジストリ経由が無難。
09409352011/02/05(土) 02:47:20
IRQLの概念無視してた。
確かにZwOpenFileはIRQLがPASSIVE_LEVELのときのみ使用可能って書いてあるね。。。
DriverEntry内ではIRQLがPASSIVE_LEVELだったので、ファイルの情報を
DriverEntryで取得して内部変数で保持する方法で今回は逃げてみるよ。

とりあえず今自分のやりたいことは出来そうだけど、こりゃ本腰いれて勉強しないと
難しいね。
参考書買って勉強してきま

>>938
>>939
感謝!
0941デフォルトの名無しさん2011/03/05(土) 02:30:07.47
まったくの度素人なんですが、ドライバレベルでマウスを動かしたいんですが
moufltrを書き換えて使えばいいんですかね?
単純なフィルタ機能だけじゃなくボタンを押してない時にボタンを押したりするのを
アプリからの制御でやろうかと思いまして
moufltrはたぶんPS/2用のフィルタになるんだと思うんですが
hidとは違うフォルダにあるんで勝手にそう思ってるだけなんだけども
USBにもこれは適用出来るんですか?
09429412011/03/05(土) 13:55:54.31
VMwareにXPをインストールしてmoufiltrをそのままコンパイルして
ドライバ更新でインストールしてアッパーフィルタにmoufiltrが出てるんだけど
DebugViewには何のメッセージも出てきません
どこから手をつけていいかも分からない状態なんで
とりあえず動くものを手にいれたいんですがどうしたらいいんでしょう?
0943 ◆0uxK91AxII 2011/03/05(土) 15:42:20.92
mouclassのIRP_MJ_READで返すとか。
0944デフォルトの名無しさん2011/03/05(土) 17:15:44.38
添付のhtmみれば、PS/2以外では動きそうもないんだが・・・
0945デフォルトの名無しさん2011/03/05(土) 18:39:00.61
何がやりたいのか良くわからんが、フィルタドライバなんて使わなくても
SetCursorPos(...)やPostMessage(...,WM_LBUTTONxxxx,...)で出来そうに思うが・・・
0946デフォルトの名無しさん2011/03/05(土) 19:16:20.21
俺予想ではMMORPGの自動操縦マクロ
0947デフォルトの名無しさん2011/03/05(土) 19:42:58.48
>>943
入力の生成の部分のことですか?
何か動くものがほしくてmouclassもVMWare上のXP SP3に入れてみて
WPFも解除してデバイス表示で上書き出来てるのは確認しましたが
やっぱりDebugViewにはそれらしいメッセージは出てきません

>>944
VM上ではACIPI\PNP0F13だからPS/2だと思うんですが動いてないから違うんですかね

>>945
今はテスト用にVM上のXPにドライバを入れてますが
普段はVM上で別のOSやアプリを動かしててホストからコントロールするわけですが
なぜかVMはプログラムで生成された入力情報は完全に遮断してしまってるんで
VMの中身が操作出来ないんです
それにドライバの作り方にも興味があるんであえてやってみようかと
0948 ◆0uxK91AxII 2011/03/05(土) 20:46:01.07
>>947
checked build
0949デフォルトの名無しさん2011/03/06(日) 19:16:46.56
WINDOWS7 X64でGavotteRamdisk使うために自分でデジタル署名して使おうとしてるが
Inf2catがうまく通らない rramdisk.infをどう修正すればいいやら・・・・
0950デフォルトの名無しさん2011/03/10(木) 21:42:54.63
サンプルの.catとかの拡張子がある一行を書けばいいだけでは?

CatalogFile=toaster.cat

これがあると勝手にやってくれたような記憶があるんだが。
0951デフォルトの名無しさん2011/03/14(月) 20:33:47.88
へえ
0952デフォルトの名無しさん2011/03/25(金) 08:47:27.84
kbfiltrをいじってるんですが
IOCTLのコードを追加してInputデータを与えようとしてて
サンプルは動くところまで確認して
独自のIOCTLコードを発行しても反応がない
たぶんこの行でインプットがあるせいではじかれてるのかと思い削除してみると
UNREFERENCED_PARAMETER(InputBufferLength);
コールバック関数定義の部分
KbFilter_EvtIoDeviceControlFromRawPdo(
IN WDFQUEUE Queue,
IN WDFREQUEST Request,
IN size_t OutputBufferLength,
IN size_t InputBufferLength, *
の一番したの行でc2220エラーが出てコンパイルが通りません
何のことですかね?
C++は熟知してるけど、まるで違う言語を扱ってるくらい動作が違う
0953デフォルトの名無しさん2011/03/25(金) 09:49:47.02
UNREFERENCED_PARAMETERは全然関係なく
パラメーターを受け取るとこまで出来た
なんじゃこりゃ
0954デフォルトの名無しさん2011/03/25(金) 14:26:09.93
> C++は熟知してるけど

嘘だ。
0955デフォルトの名無しさん2011/03/25(金) 16:52:49.26
キーボードドライバは完成しました
次に同じ要領でマウスドライバも作ってますがrawpdoをkbfiltrからコピペしてみて
コンパイルしてインストールしたけどIOCTL用のデバイス名が出てこない
そもそもドライバが動いてなさそうなんですが
問題はEvtDeviceAddで何か失敗してるんだろうけど
マウスドライバは起動時に読み込まれるからDebugViewでメッセージが取れない
起動時のメッセージを見る方法ってどうすればいいんですか?
0956デフォルトの名無しさん2011/03/25(金) 17:58:57.12
VMでやっているならVMware toolsをアンインストールしてみよう。
0957デフォルトの名無しさん2011/03/25(金) 20:43:20.67
アンインストールしたけど何も変わりませんよ
他の部分がバグってるっぽいですが
それも問題になるんですか?
0958デフォルトの名無しさん2011/03/25(金) 20:48:48.91
試しにVMwareToolsを入れた状態で上からmoufiltr未改造をかぶせてみたら
ちゃんとコールバックされてますね
0959デフォルトの名無しさん2011/03/25(金) 21:04:26.32
原因判明、完全にコピペしたつもりが1行抜けてました
いずれにしても起動時のデバッグメッセージが拾えるともっと早く解決したんですけどね
0960 ◆0uxK91AxII 2011/03/25(金) 21:45:19.97
これはひどい。
0961デフォルトの名無しさん2011/03/26(土) 00:07:39.88
デバッガも使わんでデバッグメッセージが拾えんとか言ってんだろ。
話になんねー
0962デフォルトの名無しさん2011/03/26(土) 00:17:43.88
自称「C++は熟知」のコピペグラマだからな
0963デフォルトの名無しさん2011/03/26(土) 04:18:08.15
>>959
他の人が、何がひどいかをあえて説明すると
PCもう一台用意して、WinDbgをインストールし
シリアルか1394でリモートデバッグの設定をすれば
起動時からデバッグメッセージ拾える。

あとC++熟知しているなら、
UNREFERENCED_PARAMETERのマクロが何やってるかぐらいは確認すべき。
0964デフォルトの名無しさん2011/03/26(土) 04:18:51.88
あ、PCもう一台って書いたけどVMWareとか使って仮想PCでもできるよ。
0965デフォルトの名無しさん2011/03/26(土) 06:52:08.35
>>964
情報をありがとうございます。
2台は用意出来ないんですが
それって仮想シリアルポートドライバみたいなのが必要ってことですか?
0966デフォルトの名無しさん2011/03/26(土) 07:13:27.08
>>965
ずいぶん前に数度試しただけだから詳細は覚えてないが
VMWareだと仮想PC上の仮想シリアルがパイプになっているので
WinDbg側からはパイプに接続すればよかった。
と思ったがVMWareじゃなくてVirtualPCだったかもしれん。

仮想PCを起動するとパイプが作られるのでそれをWinDbgで開く
みたいな感じだった
先にWinDbgでひらいておこうとするとパイプがないと怒られたはず。

自分はHW固有のドライバ作ってたので
その環境は作ってはみたものの使い道なくてあまり使わなかった。
0967デフォルトの名無しさん2011/03/26(土) 09:02:16.23
>>966
パイプですか、よく分かりませんがキーワードで調べれば出てきそうですね。
貴重な情報をありがとうございます。
0968デフォルトの名無しさん2011/03/29(火) 13:54:19.16
hidusbfx2をキーボードに置き換えてみたるんだけど
ReportDescritorを返すところまでは呼ばれてて
その後びっくりマークになって正常に起動出来ませんでしたとかになる
他のコールバックは呼ばれてる様子もないしDescriptorの問題なんだろうけど
どっかに動くキーボード用のDescriptorってありますか?
とりあえず検索して出てきたのとHut1.1に載ってるサンプルは試したけど駄目でした
0969デフォルトの名無しさん2011/03/29(火) 14:43:33.51
USBキーボード挿してデスクリプタ見ればいいんじゃね?
0970デフォルトの名無しさん2011/03/29(火) 15:48:07.14
>>969
ホストがWin7 64でVMWareがあるけどPs/2だから
対応してるツールがないんです

それとちょっとだけ進展が
キーボードはブートデバイスだから
ブートデバイスIDを指定してやったら認識はしましたが
なぜか8個もキーボードが出てきてしまいました
0971デフォルトの名無しさん2011/03/29(火) 21:33:22.00
実体は1個みたいなんでとりあえず先に進めて
マウスとキーボードを動かそうとしてるんですが

マウスを動かすのに7byteのデータ
ReportID, Button, X, Y, WheelをIOCTL_HID_READ_REPORTで渡すとマウスが動く
これは確認しました
でキーボードを9byte
ReportID, Modifier, Reversed, Code[6]を同じように発行すると反応なし
何が間違ってるんでしょう?
0972デフォルトの名無しさん2011/03/30(水) 08:57:09.17
すみません。単にバグってただけでした。
おかげさまでキーボードとマウスの仮想USBドライバが完成しました
0973デフォルトの名無しさん2011/03/31(木) 19:10:30.77
急にundefined; assuming extern returning intと出てビルドできなくなりました
解決方法はありますか?
0974デフォルトの名無しさん2011/03/31(木) 19:27:29.86
>>973
関数が定義されていない
急に出た理由までは知らんw
0975デフォルトの名無しさん2011/03/31(木) 20:05:36.97
カーネルモードで使えるGetTickCountに相当する関数って何なんですか?
精度は適当でいいんですが
0976デフォルトの名無しさん2011/03/31(木) 20:14:20.97
KeQueryTickCount
わかりました
0977デフォルトの名無しさん2011/04/02(土) 22:02:10.86
完全に標準関数のみで完結させればドライバに普通のC++で作ったlibを合成出来るかと思ったんですが
cdecl呼び出しにしてもリンクエラーが出てしまいます。
関数の定義はint func(PSTRUCT st)といった単純なものです。
外部のAPIを一切使わないようにして完全に単体で動くようにしてます。
何か呼び出し規約が特別なものなんでしょうか?
0978デフォルトの名無しさん2011/04/02(土) 22:32:56.01
extern "C" を付け忘れてるとかじゃなくて?
0979デフォルトの名無しさん2011/04/02(土) 22:51:45.33
>>978
間違いなくついてます。/MT /MD どっちの出力でも駄目です。
__stdcallも駄目です。
0980デフォルトの名無しさん2011/04/02(土) 23:20:12.91
ドライバの場合、デフォルトの呼び出し規約が__stdcallだけど
0981デフォルトの名無しさん2011/04/02(土) 23:28:51.00
標準関数が使えると思ってるのが間違い
0982デフォルトの名無しさん2011/04/02(土) 23:41:28.46
>>980
ダミーの関数を作ってみたらいけてstdcallで行けるのを確認しました。
問題は解決してないんですが
なぜかその関数だけがLNK2019で唯一の違いが引数だけです。
ダミーの方がunsigned short エラーの方が構造体のポインタ
構造体の宣言は
#pragma pack(1)
typedef struct _ST {
.....
} ST, *PST;
関数の宣言は
unsigned short Func(PST pst);
です。
宣言をいじったりしてるけど原因が分かりません。

>>981
結局バイナリ化したら元が何から来たかなんて関係なくないですか?

0983デフォルトの名無しさん2011/04/02(土) 23:50:18.26
ここまでエラーメッセージなし
0984デフォルトの名無しさん2011/04/03(日) 00:01:35.04
とりあえず引数を消してみて、ライブラリをDDK側でコンパイルするようにしてみたけど変わらず
内部処理で文句を言うのにこのエラーしか出ないとかいうのは許せない
error LNK2019: unresolved external symbol _Func@4 referenced in fution _ParentFunc@16

0985デフォルトの名無しさん2011/04/03(日) 00:20:58.25
全部コード晒してみ
0986デフォルトの名無しさん2011/04/03(日) 00:34:50.80
C++側をコンパイルしてできた.objファイルの中に_Func@4の文字がちゃんとあるかい?
0987デフォルトの名無しさん2011/04/03(日) 01:04:34.54
つきつめたらこれがリンク出来ないみたい
http://www.packetizer.com/security/sha1/
これのsha-c.zipの中身はC言語で計算するだけだからこれで完結してるはずなんだけど
ためしにこのsha1.cを直接sourcesに入れて呼び出したらリンクエラーが出る
0988デフォルトの名無しさん2011/04/03(日) 01:45:52.69
情報小出しでウザすぎる
0989デフォルトの名無しさん2011/04/03(日) 03:46:09.99
変なことやろうとしてるのに小出しとかクソですな
0990 ◆0uxK91AxII 2011/04/03(日) 05:40:10.27
手っ取り早く
・*.cppではなく*.cにする
・build -cZ
0991デフォルトの名無しさん2011/04/03(日) 05:52:48.10
とりあえず原因は分かりました。
DDKのlibの形式はextern "C" + __stdcallです。
両方ともセットしないとうまくリンク出来ません。
0992デフォルトの名無しさん2011/04/03(日) 08:33:07.49
>>991
おまい・・・人の話を聞かないタイプだなw。
0993デフォルトの名無しさん2011/04/03(日) 11:12:55.95
>>991
DDK/libに関係なく、C⇔C++間で関数呼び出しがある場合は、extern "C" が必ず必要なんだが。
なんか最近、WDM/デバドラ以前にCの基本が解ってない人が多すぎる・・・
0994デフォルトの名無しさん2011/04/03(日) 14:15:49.21
情報を小出しにするような奴はろくでもないといういい例だった
0995デフォルトの名無しさん2011/04/03(日) 15:19:00.25
>>993
extern "C"がC言語を表すのはしってたけど、__stdcallをつけるのとつけないので
また違いが出てくるとまでは知りませんでした。
0996デフォルトの名無しさん2011/04/03(日) 19:53:27.11
batファイルなんですがobjfre_wxp_x86とかi386とかを取得出来る変数ってありますか?
0997 ◆0uxK91AxII 2011/04/04(月) 00:48:47.67
>>996
ある。
ふつーにsetで出てくるし。
0998デフォルトの名無しさん2011/04/04(月) 11:44:57.20
>>997
setにそんな使い方があるとは、どうもありがとうございます。
レス数が950を超えています。1000を超えると書き込みができなくなります。