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

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
ようこそ、Blue Screenへ(・∀・)
0623デフォルトの名無しさん2008/06/14(土) 01:46:17
>>618
APIつかってエラー出たならGetLastErrorが基本。

>>620
KS系はPinで定義してあるデータを送るものだから
Pinの定義を調べてみては?

>>622
ddkbuild.cmd
0624デフォルトの名無しさん2008/06/14(土) 13:49:08
>>623
老師、感謝
今からGoogle先生を訪問します
0625デフォルトの名無しさん2008/06/14(土) 19:19:24
>>623
ありがとうございます。
PINの定義としては、
DataRange.MajorFormat = STATICGUIDOF(KSDATAFORMAT_TYPE_MUSIC);
DataRange.SubFormat = STATICGUIDOF(KSDATAFORMAT_SUBTYPE_MIDI);
DataRange.Specifier = STATICGUIDOF(KSDATAFORMAT_SPECIFIER_NONE);
Technology = STATICGUIDOF(KSMUSIC_TECHNOLOGY_PORT);
を設定しています。
WDKドキュメントで、KSから送られるMIDIデータのフォーマットを
探しているのですが、見つけられないでいます。
0626デフォルトの名無しさん2008/06/14(土) 20:52:39
むむ
タイムスタンプぢゃないのかしらん
0627デフォルトの名無しさん2008/06/14(土) 23:20:24
>>623
定石をありがとう。感謝します。

CreateFile関数はどうやらプリンタドライバ中では使えない様
なんですが、、ZwCreateFileという関数があるのですが
それならプリンタドライバ中でも使えるのか今確認していますが
何か情報をお持ちの方は情報をお願いします。

最悪、スプーラに書き込みを行えばWinDbgなしでもDebug作業が
できることはわかりました。
0628デフォルトの名無しさん2008/06/15(日) 10:35:18
>>627
ちょっと聞きたいんだが、仕事でプリンタドライバ作ってるの?

お遊びなら、色々試行錯誤して楽しむのもいいけど、お仕事ならきちんと基礎を身に付けてから
でないと、ユーザーに大きな迷惑をかけることになるよ。
周りにドライバを作り慣れた先輩とかいないの?
0629デフォルトの名無しさん2008/06/15(日) 10:54:56
>>627ではないが、ドライバのことを知ってる先輩はいない職場で、
勉強しつつがんばってくれ、みたいな感じで始まった。
仕事はいろいろともらっている2年生。

嫌ではないが、進んでやりたくはないという状況だなー。
だって全然わからんのだよ・・・orz


>>627
ソースがいま手元になくて分からんけど、
CreateFileWって関数かも?
Unicodeじゃないとだめって制限があるらしいので。
0630デフォルトの名無しさん2008/06/15(日) 15:15:31
余計なお世話かも知れんが・・・

>>627の書き込みからカーネルモードのドライバを作っていると想像するが、「ユーザーモードのアプリや
サービスから使用できる関数と、カーネルモードのドライバから使用できる関数は全くの別物」とうことは
デバイスドライバを作る上で一番最初に知るべき基礎の基礎ですよね。
CreateFileWもユーザーモード用のWindowsAPIです。
基礎を知らずに作るととりあえず自分のパソコンでは動いても他の環境では動かない物が出来上がる、
というのはアプリでもドライバでも同じだけど、ドライバの場合はたいていOSもろとも落ちるからねえ。

周りに聞ける人がいないなら、書籍ですかね。
お奨めは、
http://www.ascii.co.jp/books/books/detail/4-7561-3913-2.shtml
これで難しいと感じるなら、その前の入門書として
http://seshop.com/detail.asp?pid=1005
ですかね。(どちらも古い本だから、今はもっといいのがあるかも)
後は、自分の担当するデバイスに一番似通ったDDKサンプルを実際に動かしてみる(必要なら対象機器を
勉強用に会社に買ってもらう)のが良いんでは。

ドライバもだんだんユーザーモードで作れるようになってきてるみたいだけどね・・・
0631デフォルトの名無しさん2008/06/15(日) 15:37:49
いや、プリンタドライバだからユーザーモードだろう
>>611にも書いてるけど
0632デフォルトの名無しさん2008/06/15(日) 16:31:30
ドライバって個別に常識があるから、一般的な話って本当にごく基礎的な話しかできなくて
そういうのは定番の本で足りちゃうんだよね。

で、ドライバに関してはさらに特殊でカーネルモードですらないっていう
これはMSDN、ぐぐる、サンプルソース見るしかない。

ユーザーモードについては一般的なプログラミング知識があればできると思うけど
GetLastErrorを試してないあたりに、その知識も少ないと感じる。

セキュリティ的な面でユーザーモードといえども使えない関数があるかもしれないから
最低でもGetLastErrorで調べてみろってことなんだが。

とにかくがんばれとしか言いようが無いな。
0633デフォルトの名無しさん2008/06/18(水) 19:16:34
WINUSBを使うDLLをX86とx64向けに両刀で書いてるんですが、
86用には普通にビルドできるんですが、64用にビルドすると
外部参照エラーになってしまいます。WinUsb_Initialize()とかの
関数が軒並みアウトです。

普通にリンカーの餌に、SDKのLib/x64ディレクトリにあるsetupapi.lib
を与えてるんですけど。WINSUB.libなんてのも有りそうで無いみたいだし。

だれかわかる人がいたら教えてください。
環境はVC++2008 / Microsoft SDKs v 6.0A / WinDDK 6000です。
0634デフォルトの名無しさん2008/06/18(水) 19:19:55
WINSUB 誤
WINUSB 正
0635デフォルトの名無しさん2008/06/19(木) 09:47:14
>>633
どこを見てるんだ?
普通に DDK の lib 探したら winusb.lib が見つかるわけだが。
winusb.dll 使ううえにダイナミックリンクじゃないんだから lib ファイルがあるに決まってるだろ。
0636デフォルトの名無しさん2008/06/19(木) 15:04:48
>>635
そんなに怒らないで。
>>633の彼はドライバ開発したのとがないんだ。
だから、winusb.libも普通にVC2008やPSDKにあると思っている。
さすがに、setupapi.libを与えたには、ぽかーーーんとした
0637デフォルトの名無しさん2008/06/19(木) 22:12:08
あの、先生方、WDKににmfc42ってlibやincがあるんですけど
これ、ひょっとしてWDKでMFC4.2アプリ開発できるってことですか?

あと、先生方はWDKをVSに統合して、IDE上でドライバプログラム書いているんですか?
0638デフォルトの名無しさん2008/06/19(木) 22:51:17
それはコントロールパネルアプレットとかのドライバ付属の小物を開発するために
付いているのだとMSの中の人がどこかのMLで言ってた
0639デフォルトの名無しさん2008/06/19(木) 22:56:49
俺の場合はVSと統合なんて無駄だな。使い慣れたgvimがあればいい。
0640デフォルトの名無しさん2008/06/19(木) 23:06:08
>>633
それってドライバの話じゃなくてさ
ターゲット環境が変わったら、ライブラリも変えろって話でしょ?
そこらへんはC言語の基礎的な話なので、
どっかでちゃんと理解しといたほうがいいんじゃない?

>>637
できると思うよ。ただ、本来の機能全部入っているかはわからない。
Ioctlなどでドライバを操作したいユーザーモードアプリケーションを作ろうとした場合のためにあると思われる。
カーネルモードのヘッダと一緒にすると不具合が出る部分を出ないようにしたりしてるんじゃないかね
と、嘘かもしれないことを言ってみる。

開発環境は人による。秀丸にこだわってる人も居るだろうし、人それぞれ。
0641デフォルトの名無しさん2008/06/20(金) 00:20:08
>>638-640 先生方すばやいレスありがとうございます。

自分が使っているVC2005expressでMFC使えないから、ひょっとしたら
WDKと連動してやるとMFCアプリのコンパイル(他人のソースを)できるようになるのかなと
思ったんです。小物のcplを作る程度の物しかそろってないですかね。あと、PrefastもVC2005express
で使えたら良いなと思ったり...

自分みたいなへたれですと、インテリセンスないとどうしようもない
何のtypedefなのか、構造体のメンバなんかがさっぱりなんでIDE必須なんですよね
で、WDKインストールしてもVSに統合されないから、他の人は自分で統合してるのかな
と思ったしだいです。ドライバー職人ぐらいになると、インテリセンス鬱陶しいし、
使い慣れたエディタの方がVSでやるより良いとなるんですか!
0642デフォルトの名無しさん2008/06/20(金) 00:43:40
>>641
適当なプロジェクトを作って、ソースファイルを登録して
ヘッダーへのパスを通せば、インテリセンスも使える
エディタとしてならIDE使えるよ。

buildは、それぞれのコマンドプロンプトからだけど。
0643デフォルトの名無しさん2008/06/20(金) 02:04:37
適切なコンパイル・リンクオプション渡してやればIDEでもできるだろ
0644デフォルトの名無しさん2008/06/20(金) 05:53:31
エディタとビルドにしか使わないのにIDEと呼ぶのは抵抗がある。
0645デフォルトの名無しさん2008/06/20(金) 21:28:28
おまんことおっぱいしか使わないのにデリヘルと呼ぶのは抵抗がある。
0646デフォルトの名無しさん2008/06/20(金) 23:57:36
>>620
解決したのかな?たぶんKSMUSICFORMAT::TimeDeltaMsだよ。
0647デフォルトの名無しさん2008/06/22(日) 23:44:13
staticdv使ってる?出てからずいぶん経つけど日本語の記事って無いもんだね
0648デフォルトの名無しさん2008/06/23(月) 22:04:46
GDIINFO構造体で「余白」を制御できると聞いたのですが
どのメンバで制御すればよいのでしょうか?。
それらしきものが見当たらないのですが・・。ちなみにプリンタドライバの
開発になります。
0649デフォルトの名無しさん2008/06/23(月) 22:29:36
プリンタドライバはやってんのか
0650デフォルトの名無しさん2008/06/24(火) 21:11:28
最近某企業が求人広告出しまくってたから
その影響では?

0651デフォルトの名無しさん2008/06/29(日) 18:34:56
自分のくっついているデバイスのデバイス名とかデバイスIDなどを知る方法ってあるのでしょうか?
0652デフォルトの名無しさん2008/06/30(月) 09:45:27
Descriptor解析しろ。
0653デフォルトの名無しさん2008/06/30(月) 12:00:23
>>651
「自分のくっついているデバイス」? 自分をEnumerateしたバスドライバのこと?
「デバイスID」? デバイスインスタンスIDのこと?

質問の意味不明。エスパー登場求む!
0654デフォルトの名無しさん2008/06/30(月) 13:37:39
Windowsなら、デバイスマネージャから見れるんじゃね?
0655デフォルトの名無しさん2008/06/30(月) 18:29:31
ttp://support.microsoft.com/kb/126286/ja/
06566512008/06/30(月) 21:48:59
わかりづらくてすみません。
例えば、Microsoft ACPI-COmpliant Embedded Controllerをデバイスマネージャのプロパティで見ると、
(少なくとも私の環境はですが)「一致するデバイスID」は*pnp0c09となっています。
これをドライバ内部から調べる方法がないかなと探しています。

もちろんコード中に文字列として"*pnp0c09"を持っていれば良い話なのですが、
そうではなくて、APIなどで、自分がフィルタドライバとしてくっついているデバイスの
「一致するデバイスID」やその他、プロパティの詳細タブで見れるような情報を
取得するような方法をご存知ないでしょうか?
0657デフォルトの名無しさん2008/06/30(月) 22:03:20
>>656
IoGetDeviceProperty()や
IoOpenDeviceRegistryKey()からレジストリ読み取りで揃うんじゃね?
0658デフォルトの名無しさん2008/07/05(土) 00:14:18
ユーザーモードのプリンタドライバをデバッグしようとしていますが
WinDbgは使えないのでしょうか?。
そもそもWinDbgはカーネルモードの(プリンタ)ドライバですよね?。
ご意見お願いします。
0659デフォルトの名無しさん2008/07/05(土) 08:55:53
>>650
某企業ってどこ?
そこのプリンタは買わな・・・・(以下自粛)
0660デフォルトの名無しさん2008/07/05(土) 10:03:32
キャノンだよ こないだあんあんからスカウトメールきた無視したけど
0661デフォルトの名無しさん2008/07/05(土) 13:33:54
観音なら...当然超優秀な正社員がたくさんいるだろうから、ここで聞くよりそいつらにでも聞けば良いのにな。
0662デフォルトの名無しさん2008/07/07(月) 09:46:04
なんだかんだいってもソフト部分は外注多いよ。
0663デフォルトの名無しさん2008/07/09(水) 12:20:12
キャノソくらいだとハードも外注だと思ってた
0664デフォルトの名無しさん2008/07/16(水) 12:39:52
WinDriverって使い勝手いいですか?
0665デフォルトの名無しさん2008/07/28(月) 00:39:17
オマンコ臭いスイーツは開発すんなよ
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 も「ロード時に読み込まれるドライバには埋め込み署名が含まれている必要が
あります」とあります。
■ このスレッドは過去ログ倉庫に格納されています