【WDM】Windows Driver Model相談室【デバドラ】
156 :
デフォルトの名無しさん :
04/06/17 00:05 物理アドレスと仮想アドレスが合うようにマッピングしてメモリを確保する 関数、もしくは方法はありませんか?
物理アド==仮想アド ってこと??? 仮想からマップさせて物理アド取得するんじゃダメなの?
>>157 そうです。
一旦ページング機能を切りたいのです。
ページング機能を切るコードは物理アド=仮想アドなメモリ上に置く必要があると
思うのですが。
>156 IoGetDmaAdapter()で得たハンドルを使ってAllocateCommonBuffer()するってのはどぉ?
>156 1)ユーザーモードでアドレスを指定してVirtualAlloc()を呼び仮想空間を確保。 2)そのアドレス値をカーネルモードに渡し、MmAllocateContiguousMemory()で物理空間を確保。 確保できなかったら1)に戻る。 3)CR3レジスタから確保した仮想アドレスのテーブルを探す。そのテーブルを書き直し 確保した物理アドレスにマップする。物理→仮想アドレス変換はMmGetVirtualForPhysical()を使う。 試していないけど
163 :
デフォルトの名無しさん :04/06/18 13:34
>>162 MmAllocateContiguousMemory()ってまずくね?
とにかくマップするだけの関数だったような。
PFNいじるしかない
皆さん、レスどうもです。
基本的に
>>162 をベースに作りました。
ただ、物理メモリの空きを探すのにMmAllocateContiguousMemory()を使うのは
まずいようなので、PFNデータベースを参照しました。
(WinNT系のPFNの資料がほとんど見当たらなかったので、怪しいかも)
167 :
デフォルトの名無しさん :04/06/22 21:46
WinXP SP2のシンボルファイル、まだー?
169 :
デフォルトの名無しさん :04/06/24 02:13
>>167 Windbgのシンボルサーバにはアップされているみたい。
XPのSP2 RC2でもコマンドが使えるようになった。
170 :
デフォルトの名無しさん :04/07/04 19:24
USBのBulk転送をタイムアウト中断させるにはどうしたらいいの?
171 :
デフォルトの名無しさん :04/07/04 22:23
>>170 ドライバは、bulkusbのままでいいんでない?
FILE_FLAG_OVERLAPPEDで開いて、非同期通信して
タイムアウトしたら、CancelIo発行
175 :
デフォルトの名無しさん :04/07/23 15:36
皆様よろしくお願い致します。 DDKの勉強はじめたんですが、DDK付属のサンプルが コンパイルできなくて困っています。 DDK_XPの \WINDDK\2600\src\network\ndis ディレクトリ内の サンプルがすべてコンパイルでエラーを排出します。 エラーの内容 driver\passthrou.h(318) : error C2146: syntax error : missing ')' before identifier 'DevicePnPEvent' など多数のエラーが出ます。 環境:Win2k、DDK_XP(ネットに落ちてたもの) setenv.batで環境変数は登録しています。 他のサンプルはしっかりコンパイルできるんですが、ndisディレクトリ以下が コンパイルできません。 ndis.h か ndis.lib ファイルが壊れているのか?とも考えました。 初歩的質問ですがご存知の方ご教授ねがいます。
>>175 Build Enviromentsのメニュー下にあるコマンドプロント使ってる?
BUILDで全部通ったけど
>>176 レスありがとう御座います。
Win2k FreeBuildでビルドしています。
javaSDKとか影響していたりするのでしょうか…
原因不明です。
特定のディレクトリのサンプルだけです。
DDKをアンインストールして再インストール後もこの症状が消えません。
sourceファイルもDirsも変更していないのですが…
>>177 >Win2k FreeBuild
でやってみると、確かにエラーが出るね。
XPだと問題茄子
本当ですか! XPで開発環境整えればいいんですね。 ありがとう御座いました。 こんなことでずっと悩んでないで、早く聞けばよかったです。 難解な課題山積みですがすこしがんばってみます。
>>179 違う、違う、Build EnviromentsのXP FreeBuildのコマンドプロンプトだよ。
誤解を招くような書き方をしてすまぬ
エラーからするとint/ddk/wxpにはあるけど inc/ddk/w2kにはないヘッダーがあるからっぽいね プログラマなら定義がないとかそんなのはエラーみてなんとかしんさい。
>>181 そうですね、これくらいは自己解決レベルですね。
どうも思い込むと発想の転換が下手でして…
コマンドプロンプトがXPなんですか…
183 :
デフォルトの名無しさん :04/07/25 12:13
WDMデバイスドライバー完全ガイド(上)(下)を 某書店(埼玉県)で見つけて慌てて両方買った俺はヴァカですか? 探すと以外に見つからないんだよね、アレ。
185 :
デフォルトの名無しさん :04/07/28 09:16
ドライバのソースコードだけは、なぜか綺麗なのは俺だけ?
186 :
デフォルトの名無しさん :04/07/30 09:32
NT/2000 ネイティブAPIリファレンス買ってしまった・・・・ ちょっと後悔。
187 :
デフォルトの名無しさん :04/08/09 13:03
デバドラってドキュメント化されてない関数多すぎ。 もっと解説本を出版汁!!
188 :
デフォルトの名無しさん :04/08/10 23:06
あるPCIボード用のドライバを作成していて、わからない点があるのでどなたか教えてください。 (OSはWinXP SP1、DDKはXP SP1 DDKです) IoConnectInterrupt関数で割り込み関数を登録したのですが、登録した割り込み関数に 入ってくる割り込みは、必ずそのPCIボードの割り込みなのでしょうか? デバイスマネージャでIRQを確認すると、そのPCIボードには16番が割り当てられており、 USBホストコントローラとマザーボードのグラフィックコントローラのIRQと共有しています。 割り込み関数に入ってくる割り込みが必ずそのPCIボードの割り込みであれば それで問題はないのですが、仮に共有しているデバイスの割り込みも入ってしまう場合 入ってきた割り込みがどのデバイスが引き起こしたものなのかを判断する方法がわかりません。 どのような方法でそれを判断するのでしょうか?
189 :
デフォルトの名無しさん :04/08/13 11:08
>>188 ISRの中で自分のデバイスに訊いてみれば?
>188 PCIボード自体から割り込みの他に「割り込み要因」をフラグかなんかでもらわないとダメでしょ。 要因が無ければ他のデバイスとか。
192 :
デフォルトの名無しさん :04/08/29 17:12
セットアップクラスを作りますか? コインストーラを作りますか?
それとも、ア・タ・シ?
194 :
デフォルトの名無しさん :04/09/16 12:32:13
すれ違いかもしれないけど、ここの人が分かりそうなので質問します。 エラーセクタのリトライを止めたいのですけど、 どこを設定したらよいですか。 DeviceIOControlくらいは使えます。ドライバか、IDEやSCSIパススルー なんかでやるんだと思いますけどどこを見ればいいのか見つけられません。
>>194 何がやりたいのかわからないけど、
それはドライバでやりたいの?
196 :
デフォルトの名無しさん :04/10/08 22:32:12
>>195 いや、分からないのです。出来ればVC、VBアプリからやりたいです。
>>196 エラーセクタのリトライってソフトでやってるのかね。
198 :
デフォルトの名無しさん :04/11/08 14:35:43
自作機器からWinへデータを送りたいのでZMODEMしたいのですが、 ZMODEMの時代が終わったっぽいので、USBに切り替えたいんでつ。 でもWDM難しそうだし、何よりUSBホストのドライバ作ったら他OS(PC Linuxとか)でも同じ動作するドライバを作る必要がありそうな... じゃあ、ドライバ作らずに、アプリとUSBに標準で付いてるドライバを組み合わせる形を思いつきましたが、そんなことは可能でしょうか? USB-ZMODEMドライバなんて有るわけ無いよな...
単にそこらにあるUSBシリアルの上にZMODEM流すだけで いいんじゃねーかつーきがするが。
200 :
デフォルトの名無しさん :04/11/08 14:43:11
>>199 やりたいことはまさにそれなんですが、機器側の端子をUSBだけにしたいんでつ。
USBシリアルじゃ、ニセモノっぽくて...
>>200 少しは調べろ。USB<>シリアル変換アダプタじゃないぞ
202 :
デフォルトの名無しさん :04/11/08 16:01:17
>>201 「USB<>シリアル変換アダプタじゃない」ドライバか何かが存在する、と?
はつみみです。
203 :
198 :04/11/08 16:17:34
わりきって、普通にWDMでファイル転送プログラムを作った方が楽かな。
204 :
デフォルトの名無しさん :04/11/08 16:21:03
WDMってサウンドかと思った
>>201 もしかして、
USB⇔シリアル変換モジュール
でつか?
確かに見た目USBだから良サゲ。
みんな志が低いね
207 :
デフォルトの名無しさん :04/11/09 08:42:51
WDM/USBを作るのは簡単でつか? さらに、Linux版も同時開発できまつか?
208 :
デフォルトの名無しさん :04/11/09 08:50:40
でつ厨には無理でつ。
>>207 BULK転送でデータを送受信するくらいのものなら、
DDKのbulkusbをほとんどそのまま使える
linuxの方は、ここだとスレ違いだが、WDM書くより簡単に思えた
210 :
デフォルトの名無しさん :04/11/09 09:07:18
>linuxの方は、ここだとスレ違い そんなことないYO! WDMとLinuxと同時開発方法とか教えてYO!
212 :
198 :04/11/09 09:36:46
ちょっとスレ違いなんですが、普段ドライバ作られてる方の意見を聞きたくて。。。 別スレで、Win32の中の人がCLI/WinFXになるから、CLIがネイティブになると盛んに言われてます。 (ドライバなんかもマネージドになっちゃうんだろうか?) 今までのドライバの動作が遅くなって、ドライバもCLIで作れ!なんてことは発生しえるのでしょうか? ドライバはOSの命とまでは言わなくても、それなしでは機器を制御出来ないわけですが、 VBを丸々捨てたM$ですから、今までのドライバを丸々捨てられることはあながち無いとも言い切れないような。 と考えると、データ転送ならUSBドライバ作るよりLANポートと標準ドライバの方が良いのかな??? でも、機器側のIPとかネットに入るの大変なんだよな。 と、独り言ですた。
シリアル <-> Ether 変換器使えば?
214 :
198 :04/11/09 10:09:17
>>213 やっぱIP設定があるのでUSBにします。
シリアル <-> USB 変換器
はどうなのか教えて下さい。
215 :
198 :04/11/09 10:12:20
USBの標準ドライバにZMODEMがあれば何ら困らないんですが、 m$もLinuxもそういうことはしてくれませんか。
>>198 おまえさー、
>ZMODEMの時代が終わったっぽいので、USBに切り替えたいんでつ。
って自分で言っておいて何でUSB側をZMODEMにせなあかんねん。
>>216 確かに自己矛盾してますた。
開発なんて矛盾があるところの調整みたいなもんだし、、、
出来上がりはバリバリのUSBが良いけど、中の人がZMODEMであれば開発楽だなー、と。
USBとRS-232Cとプロトコルがごっちゃになってそうだ
ZMODEMってどんなモデム?
220 :
デフォルトの名無しさん :04/11/09 14:38:25
Driver Verifier使ってる?
221 :
デフォルトの名無しさん :04/11/13 21:29:03
本体のUSB1.1コネクタに直結すると問題ないのだが、 ハブを経由するとデータが落ちてしまうことがある。 これってハブが悪いって断言していいのだろうか? 装置側が悪いってこともあるの?
>221 他の機器が動くなら、御社に難あり。
223 :
デフォルトの名無しさん :04/11/15 11:28:16
意外にWDM/USBって難?
>>223 難しいのを意外だと思う奴がいることが意外。
225 :
デフォルトの名無しさん :04/11/17 15:55:34
USBマスストレージドライバについて、DDKのサンプルソースの中で 実際にSCSIコマンドを作成して、コマンド転送している部分が載ってる ソースはありますか? bulkusbなんて、バルクオンリーでSCSIコマンド転送してそうな感じが したんですけど、IoCallDriverかなにかで全部丸投げしていて、肝心 のCBWを作成してる所や実際に転送してる所が判りませんでした。 CBW == SRB CBWCB == CDB という認識は間違って無いですよね?
227 :
225 :04/11/17 16:27:20
>>226 ありがとうございます。
紹介してもらった書籍はあるので、これからは書籍ベースで解析してみます。
とは言うものの、Win32アプリからI/Oに送ったWriteFile()等のメッセージがIRPに
詰められて送られて来るとは思うのですが、そこからSCSIコマンドに直すところが
どうにも不明なところで、実際にやってるソースは無いかなと思ったのです。
ファイルがどのAPから呼び出されいるか知りたいので, ファイルシステムフィルタドライバを作ろうと思ってます. そこで,マイクロソフトのIFSキットでいるのでしょうか? フリーのIFSキットあると聞いたんですけど,よくわかりません. OSRのFSDKはダウンロード先が書いてないような・・・・ どなたか知っていたらお願いします.
ごめんext2ifsね
>>228 フィルタドライバならDDKだけでいけるよ。
Filemonのソースを見れ。
KeFlushSingleTb()の引数と戻り値の内容を知りたいのですが ご存知の方、教えてください。
>>229 フィルタドライバ実践の書籍は手元にあるので,読んでいるところです.
>>230 有難うございます
ソースをダウンロードして読んでみようと思います
これはIFSキットとは別でファイルシステムドライバそのものなのかな?
>>232 ご指摘有難うございます
サンプルを読んでみます
235 :
デフォルトの名無しさん :04/11/19 13:13:22
USBモニターを使い、USBにWriteされる情報を監視していたのですが、 ファイル一つ送るだけなのに、全部で30個のコマンド(コマンド転送、 データ転送、ステータス転送が一括りとして10個のコマンド)を送って いて少し驚いています。 そこで質問なのですが、実際に書き込みたいデータ (Write10のコマンド転送、実データ転送、ステータス転送) を送っている所は、1個所しかなく、他の部分で行われ ている処理も、SCSIコマンドを読み解くとWrite10のコマンド転送、 データ転送(何を転送?)、ステータス転送しています。 USBに書き込みたいファイルの中身を転送している場所以外のWrite10 コマンドは、何をしている所なのでしょうか? どなたか、宜しくお願い致します
236 :
235 :04/11/19 13:20:59
すいません、情報不足でした。 その上記の知りたい部分のByte配列で読みとれる部分には、 MSDOS5.0 NO NAME FAT16 等の記述がありました。 USBの情報を取得しているなら、この部分のコマンド転送部の CBWCBにはReadが来ると思うのですが、これもWriteなのです。
どっちかというとWindowsのファイルシステムの問題だと思われ。 よくわからんが、ファイルを書き込むならFAT領域なども当然更新 書き込みされる。で、それ以外の場所に何故か書き込むとかそういう話?
239 :
235 :04/11/21 13:25:39
>237さん はい、Mass Storageの話で、紹介頂いた仕様書も 一応目を通しています。 >238さん >よくわからんが、ファイルを書き込むならFAT領域なども当然更新 >書き込みされる。で、それ以外の場所に何故か書き込むとかそういう話? それ以外の場所に、と言うよりは、書き込みたい内容の分(ファイルの実データ) だけWriteすれば良いものだと思っていました。 それがUSBモニタで、ファイルをUSBメモリに書き込んだ全パケットを監視すると、 書き込みたいファイルの転送の前に、前処理の様にwriteが走っており、さらに 書き込みたいファイル転送の後には、後処理の様にwriteが走っています。 前処理部分で読みとれるのは>236で書いたとおりで、後処理では良く読みとると (>236を書いてから気が付いたのですが)ファイル名らしき物がデータ転送部に ありました。 その、此処で便宜上に言った前処理と後処理(それも含めてファイル転送なので しょうが)について、そこで何が行われているのか教えて頂きたいのです。 たぶん前処理は、>238さんの仰るFAT領域などの更新処理なのかと思っています。 長文の上、説明下手で申し訳ありません。
ファイルシステムの更新もPC側でする必要があるはず
241 :
デフォルトの名無しさん :04/11/22 09:53:27
return STATUS_UNSUCCESSFUL;
>>235 そもそも「ファイルシステム」とは何か、ということを調べるといいと思う。
ちゃんと。
244 :
デフォルトの名無しさん :04/11/25 08:58:02
「USBハード&ソフト開発のすべて 」に付属しているUSBのサンプルのドライバは有益でつか? それか、m$が配布してるバルクUSBサンプルの方が良いで塚?
うちは最新DDKのBulkUsbを使った。
246 :
デフォルトの名無しさん :04/11/25 13:21:49
詳細キボンニュ
>>245 ちょっと処理足すだけでOKなんでつか?
>246 転送単位が256B単位になっててHi-speedで使えんかったから増やしてみた。 あとは、もうちょっと速くするための工夫を挿れてみたとか。。。
248 :
デフォルトの名無しさん :04/11/26 16:59:01
サンクス>247 本読んでみたら、Bulkてのが基本的なパケット通信みたいね。 とりあえず、BulkUsbのソース印刷してみまつ。
249 :
デフォルトの名無しさん :04/11/26 17:06:45
DDKをインストールしたのに、BULKUSB(というフォルダやファイル)がありません。 どうしたことでしょう。
>>249 インストールのチェックで抜かしたんじゃない?
サンクス
>>250 インストールし直して入りますた。
252 :
デフォルトの名無しさん :04/11/30 19:33:11
微妙にスレ違い&FAQかもしれませんがここで質問します。 WindowsNT/XPで、LPT1をCreateFileしてDeviceIoControlしたいのですが、 なにをやってもロジアナに反応しません。入り口でつまづいてます。 標準ドライバとかBIOSとか、その辺の設定に問題があるのでしょうか?
ドライバ作るのに勉強になるサイトってある?(日本語のページ) サンプル位しかないのかなぁ
>>254 情報交換系ですか
勉強するためのサイトがよかったですが、掲示板でも見ていれば勉強になりますね
ありがとうございます
保守システム起動
WindowsXPでプリンタドライバを作ろうと思ったのですが、サンプルからつまずいてます 印刷結果を画像出力したいのですが、どのサンプルを見ればよいのか教えてください XP_DDKの内容でお願いします。
259 :
デフォルトの名無しさん :05/01/12 09:41:50
そういやそうだな。 それは注文するしかないってことか。 探せばありそうだが。
261 :
デフォルトの名無しさん :05/01/28 11:46:16
USB通信のサンプルは無いでつか?
Win32のKe386SetIoAccessMap()、Ke386QueryIoAccessMap()、 Ke386IoSetAccessProcess() と同じような関数ってx86-64にありますか?
>>264 ドライバ上でI/O使えばいいじゃんかよ
すみませんが教えてください XP checkedをインストールして /debug /debugport=COM1 /baudrate=115200としたのですが いざ再起動させてみると COM1は相変わらずデバイスマネージャに存在し 当然ホスト側からも接続出来ませんでした /debugport=COM1を付けたのにもかかわらず COM1が普通に鎮座している事についての理由が判りません ささいな事で構いませんので何か教えて頂けるとありがたいです
とりあえず判ったこと
1. 現在ターゲット用に使っているPC以外は /debugport指定によりCOMが占有される
2. ターゲット用PCにはCOMポートが一つしか存在しない
3. 他PCにはCOMが二つついている
>>20 氏とはデバイスマネージャにCOMが鎮座しているかどうかの差があるけど
おそらくCOMが1ポートかどうかで COMをデバッグ用に使えるかどうかが決まる?
この推測が正しいかどうかは知りませんが情報が無いよりましかと思い postします
>265 ターゲットは一般的なマザーボード使ったデスクトップPCだよね?とりあえず試しに通信速度sageてみたら?
>>267 845Gチップセットをつかった microATXな一般的マザーです
ただしCOMが1ポートしかありませんが・・・・
通信速度は 19200〜115200まですべて試しました
HyperTerminalで相互通信確認も行いましたです
/debugport指定したのに COMが占有されないのが今回の問題かなと
>268 デバマネでCOM1のI/Oポートアドレスって確認できる?他のPCと一緒かな? /debugmodeのターゲットPCは直接I/Oポートいじってると思うんだけど。。。タブン
270 :
20 :05/02/15 00:02:00
件のノートPCのリソース情報はI/Oポートアドレスは忘れましたが、普通のデスクトップPCと同じI/Oポート、IRQでした。 COMが1ポートだとダメなのかな?ノートPCもCOMが1ポートしか無いです。
>>269 一般的なCOMポートアドレスとIRQですた
BIOSで4つ選択できるので全部試しましたが結果同じ
272 :
デフォルトの名無しさん :05/03/03 16:38:32
Ntfsのドライバのアッパーにフィルタリングして、 Ntfsに渡されているメジャーファンクションとIOを見張る フィルタドライバを作りたいのですが、 (動きとしてみれば、Filemonみたいに、DeleteやCreateなどをフックしたい) 正直な話、インストールの方法(infファイルの書式)がわかりません。 GUIDやClassの部分が肝になってる気がするのですが…。 当然インストールができないため、ドライバ自体も作ってはみたものの、 動いてるかどうかの確認ができない状況にあります。 filemonの作者様がソースを後悔していれば、即時解決なきがするのですが、 filemonはなぜかソースが後悔されていません…。 ドつぼにはまってます。 誰か情報をお持ちのかた、どんな情報でもかまわないので、 馬鹿な私に知恵を与えてください。 よろしくお願いします。
>>272 > filemonの作者様がソースを後悔していれば、即時解決なきがするのですが、
> filemonはなぜかソースが後悔されていません…。
ああいうのはソース公開して欲しいよねぇ。
ということでお前。解決したらソース公開しるw
>>273 もちろん、解決しだい、過程と結果は報告させていただくつもりです!
ですから、解決の糸口を与えてください・・・(;´Д`)
FileMonて昔ソース公開してたよ。しばらく前はWaybackすればソースも取得できたけど、今は無理かな?
とりあえずテストするだけならレジストリ直接いじれば動かせるでしょ
>>276 InfのClassやGUIDがわかんねーって書いてるってことは、
レジストリの直接いじる部分もわかんねーってことじゃないの?
俺はあまり詳しくないから、断言できないが・・・。
SCMじゃダメなのか
Filemonは、infファイル使ってないよ。 自力でドライブのオブジェクトを取得して、アタッチしてる。
>>279 ありがとうございます!
FilemonはアプリからCreateDeviceしてるんですね・・・。
なんとかBoot時に読み込むようにできないかなぁ・・・。
っていうかそれ以前に、Filemonのソース、XPじゃ動かない・・・_| ̄|○
>>281 NT系はService関連のAPIを使う。
9xは知らん。
boot時に起動するようにしたいけど infワカランっていうんであれば 直接レジストリいじってservice登録すればいいと思うけどどうかな? HKEY_LOCAL_MACHINE\SYSTEM\ControlSet002\Services このへんにSERVICE_AUTO_START属性つけて加えておけばいいかと
あ ControlSetの後の数字は環境によって変わるはずなのでそのへんは便宜
CurrentControlSetじゃなくて?
いやだから環境で変わると
だからこそ CurrentControlSet なんだろ
>>287 やっぱり通常は CurrentControlSetを見てるんだよねぇ
うちの手元の環境がおかしいのかどうか判らないけど
そこを触っても変化してくれなくて ControlSet00xとかの方じゃないと
設定が反映されなかったから直接それを触ってた。
すいません、ちょっとお聞きしたいのですが、 ドライバのソースの中に、プリコンパイラを仕込み、 #IF DEBUG #DEFINE DbgPrint(X) DbgPrint x #ENDIF のように、DEBUGを指定したときだけデバッグ情報を出力したいのですが、 DDKの標準のBuildではどこにプリコンパイラの定義を記入すれば よろしいのでしょうか? 馬鹿な質問かもしれませんが、よろしくお願いします。
checkのときは、デバッグ情報hが出る freeのときは出ないように元からなっているような気がするんだが
標準で出力されるデバッグ情報と、 任意に入れたデバッグプリントじゃ出力するものが違うんじゃない?
なんにしろ、俺はプリコンパイラのスイッチ自体知らん。 が、俺も知りたい! 詳細(ヽ゚д)キボンヌ
マスストレージクラスやHIDデバイスクラスなどのドライバのように、 ダイアログを出さずに、 USBデバイスドライバをインストールするにはどうしたらいいんでしょう? 1回インストールすれば、別のポートに挿しても自動的に認識してくれればいいんだけど・・・
infファイル内にオプションがある 詳細は忘れたけどDDKのドキュメントに書いてある
>>294 レスありがとうございます。
もっぺん、ドキュメントとにらめっこしてみます
>>294-295 「ダイアログを出さずに、 USBデバイスドライバをインストール」という問題と、
「1回インストールすれば、別のポートに挿しても自動的に認識してくれればいい」
という問題は全然別の問題だと思う。
前者については、ドライバとinfファイルをシステムフォルダの\driversと\infに
放り込んだ後、レジストリのどっかにキーを追加するアプリを作ればよかったと思う。
サイプレスのEZ-USBの開発ツールなんかはこれだ。
後者は、基本的にはUSBデバイス側の問題(というかWin2kとxpの仕様)だったはず。
http://support.microsoft.com/default.aspx?scid=kb;ja;818542 ただ、Win2Kに関しては確かにinfファイルを小細工して解決する方法が
あったと思う。
どっちも同じことだよ。 違いは、最初の一回をWinのデバイスドライバウィザードに任せるか、自アプリで先にやってしまうかの違い。
>>297 こんな短い内容を読んで理解できないのかな?
ドライバがどんな方法でインストールされようが、USBデバイスが
Winの仕様を満たしてなければ、(といってもストリングディスクリプタの
シリアルナンバーを持っていればいいだけなんだけど)やはり挿すポートを変えたり
ハブをかましたりする度にドライバを要求される。
論より証拠自分でやって確認してみて、それから物を言えといいたい。
>>296 有用な情報ありがとうございます。
試しにシリアルナンバーを付けたところ、希望する挙動を得られました。
どうしてもPC側で解決できなかったら、これで行きたいと思います。
DDKドキュメントには、
infのCotrolFlagsセクションにInteractiveInstallを追加すればいいようなことが書いてありましたが
電子署名を必要とするらしく、残念ながら試せませんでした
299の名前欄間違えました。ごめんなさい
>>289 です。
デバッグスイッチですが自己解決したので、
一応自分が調べた内容を書かせていただきます。
どうもSOURCESファイルに一文記入すればいいだけみたいです。
NTDEBUG=ntsd
これでDBGがONになるっぽいです。
逆にOFFにするには
NTDEBUG=ntsdnodebug
みたいです。
それから、プリコンパイラを指定するには C_DEFINES=/DBG みたいなのをSOURCESに追加すればいいみたいです。 でもこれだと/DBGのみの指定になっちゃうんで、 C_DEFINES=$(C_DEFINES)/DBG みたいにすると追加になるみたいです。
そうそう、デフォの設定では最適化設定がサイズ優先になってる。
304 :
デフォルトの名無しさん :2005/03/28(月) 18:58:55
USBのGUIDってぶっちゃけ何に使われるんでつか?
305 :
デフォルトの名無しさん :2005/03/29(火) 17:54:45
USBのHOSTの汎用アプリが欲しい、 なんて無茶な話でつか? Targetの動作テストに使います。 エンドポイント0にコマンド送るのと、Bulk転送出来れば良いかなぁ。 でも、PictBridgeとかUSBクラスがテスト出来るようであればもっとうれしい。
新しいターゲットマシンに、Intel 純正 M/B D915PGN を用意したんだけど、 なんか WinDbg との接続が異常に遅くなった。 ホストおよびターゲットは、Win2k SP4 および WinXP SP2 を、マトリックスで すべて試した。 早いときでも 1 分くらい、酷いときは、5分くらい経ってからやっと繋がる。 始めは、ありえないと思いつつも、シリアルの同期がとれないのかと思い、 baudrate を 19200 程度まで下げてみたり、ホストマシンを変えて試して みたが変わらず。 シンボルサーバが重くなってて、それに引っ張られてるのかと思い、 シンボルサーバの記述を削除してみたが、それでも変わらず。 少し変化があるか?と思えるのが、/fastdetect=com2 を追加したとき。 だが、この M/B はシリアルが 1 つしかないので、なんか釈然としない。 BIOS で COM の IRQ、I/O を変えると、少し変化があるような気もするが、 多分気のせいだろう。 結局だましだまし繋がるまで待ってデバッグしてるが、効率悪いことこの上ない。 私以外にも、接続で 1 分以上かかってる人います?
WDM
308 :
デフォルトの名無しさん :2005/07/09(土) 05:41:19
ドライバを書こうと思ってるんですが、DDKがでかすぎてとても落とせません(アナログ電話)。 なるべく軽いサンプルソースや、フォーマットを落とせる場所、あるいはそういうものが書いてあるWebページを紹介して下さい。MASMを使ってます。
普通に郵送してもらえばいいだけ
310 :
308 :2005/07/16(土) 07:43:34
なるべく安くしたいんですが・・・
送料だけ。ダイヤルアップで落とすより確実に安いぞ
312 :
308 :2005/07/23(土) 06:04:01
どうもすみません、「落とせない」というのは電話代がかかる、という意味も含んでいます。 大体100〜200円くらいで済ませたいのですが・・・
>>312 サンプルソースがあればDDKが無くてもドライバが書けると思ってるの?
>>308 そもそもDDKはいまダウンロード公開はしてないが、どこから拾う気?
CDの送料も払えないような貧乏人にはドライバ書くなんて無理無理。
勉強本だけでいくらかかるやら。
調べ方さえ分かってればDDKのドキュメントとサンプル、それと他でソース公開されてるやつだけでもドライバ書けるけどな。
> 調べ方さえ分かってれば 308にそれが期待できると思うか?
無理だね
DDKをダウンロード出来ると言うことは、当然、CDも送られて来てると思うんだが。
そんな金払ってるわけないだろ
テレホ時間にダウンローダつかって レジュームしながらおとせばえーやない。 1週間もかからんだろ
322 :
312 :2005/08/27(土) 06:37:36
みなさんどうもありがとうございます。 とりあえず、Win98も動かしているのでVXDでも作ってみたいと思うのですが・・・ VXDを作るにはVMM.INCさえあればとりあえずプログラミングできるらしいのですが・・・ もしよければ、VMM.INCのサイズ、および、VMM.INCがさらにインクルードしているファイルの名前とサイズを教えてください。友達にメールで送ってもらえるかもしれないので・・・
保守…する必要あるのか?
64bitやWindows Vista対応を考えると泣きそうになる俺ガイル なので、とりあえず保守
326 :
デフォルトの名無しさん :2005/09/21(水) 11:46:07
ドライバ作成3日目です。 ドライバからマウスイベントを発生させるにはどうすれば良いんでしょうか? SendInput とか mouse_event とか使えるのでしょうか?
そもそも、なんのドライバを作ってるのやら・・・ ユーザモードで書いてるなら、使えるんじゃね?
328 :
326 :2005/09/21(水) 12:07:34
USB機器用のデバイスドライバです。 そのデバイスからデータを取得し(これはできました)、そのデータに応じて マウスカーソルを動かしたいのですが、データは取れてもそのデータを どうすればマウスを動かす事ができるのか、さっぱりわかりません。 時間はありますので方向性だけでも教えていただけないでしょうか?
カーネルモードとユーザモードに分ければええんでね?
330 :
326 :2005/09/21(水) 13:50:16
すみません、恥を忍んでお聞きします。 「ユーザーモード」ドライバを作るって事ですか? ユーザーモードで動くドライバを作って、カーネルモードで動く ドライバと連携させるって事でしょうか?。というか、ユーザー モードで動くドライバってどうやって作るんでしょうか・・・。 根本的な事が全くわかってないので勉強中なのですが、 ゴールまでの過程というか方向性が見えていないので 非常に効率が悪いです・・・。
USBマウスドライバを書きたいってことかな・・・? デバイス側を変えられるなら、 デバイスをHIDマウスに準拠させて、ドライバを不要にすると良い と、少し方向違いのレスを付けてみる
ヒント:Mouclass
333 :
326 :2005/09/21(水) 17:30:28
>>331 本当はそうするのが一番良いんですが・・・。
>>332 DDKサンプルにあるやつですね。
Mouclassを絡めて調査&勉強してみます。
ありがとうございました。
デバイス側を変えられないのなら、ドライバ側をHIDミニドライバにするという方法もある HidRegisterMinidriver
335 :
326 :2005/09/22(木) 11:48:40
>>334 ドライバでHIDクラスを装うわけですね。
うーむ、奥が深い・・・。
336 :
デフォルトの名無しさん :2005/11/09(水) 18:05:25
うーむ困った解りません、教えてください。 「ハードウェアの追加」から手動で infを経由して自前ドライバのインストールは可能なんですが、 これをセットアッププログラムから楽チンにインストールさせるミッションを課せられており試行 錯誤中です。 Infを見ると、自前の "Class" 、"ClassGuid" が定義されていて正常にインストールされている環境 を見るとドライバはその配下に入りインストールされています。 "\Root\xxxxxx\0000" CreateServiceでドライバをインストールすると登録はできました。 しかし変なデバイスインスタンスIDにマップされています。しかも動きません。 もちろん、原因はこちらが正しいデバイスインスタンスの登録と指定をしていないからだと思うので すが、これをWin32APIから行う方法はあるのでしょうか? 無理やりレジストリにデバイスインスタンスを書き込んでリブートしちゃおうかとも思いましたが、 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum ってSYSTEMアカウントからしか書けないように なっているんですね。 よろしくお願いします。
× infファイル ⇒ ○ infフォルダ
dpinstとか使えば。
341 :
336 :2005/11/10(木) 11:30:13
>>337 情報どうもです。本チェックしてみます。
setup API を使うと INF経由でインストールできそうな気配がありますね。
>>339 情報どうもです。早速ダウンロードしてみましたが単に CreateService
しているだけでした。残念。
>>340 情報どうもです。Driver Install Frameworks Tools 2.0 ですね。
チェックしていますが、まだ未調査です。
SYSTEMアカウントじゃないと触れないレジストリがあるので、ダミーのサービス
を登録しドライバ関連のレジストリ(デバイスインスタンス)をいじった後に
ダミーサービスを削除し、リブートといった臭い方法で逃げるかなぁ・・・
ExAllocatePoolWithTag()でNonPagedPoolを指定してメモリを 確保したいのですが、うちだと16MB以上は確保できません。(Win32、x64ともに同じです) コレは仕様ですか? HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control \Session Manager\Memory Management のレジストリキーをいじれば何とかなりそうな気がしたのですが うまくいきませんでした。
344 :
デフォルトの名無しさん :2005/11/16(水) 18:53:04
>>343 こちらは128M程度確保できました。
利用可能メモリとの兼ね合い なんでしょうかね。
たんまり取るにはどうすればいいのでしょうね。
NonPagedPool あたりの引数??
345 :
デフォルトの名無しさん :2005/11/16(水) 18:53:29
>>343 こちらは128M程度確保できました。
利用可能メモリとの兼ね合い なんでしょうかね。
たんまり取るにはどうすればいいのでしょうね。
NonPagedPool あたりの引数??
346 :
344 :2005/11/16(水) 18:54:34
2回書いちゃった。リロードミスです。すみません。<m(__)m>
どこかで読んでうろ覚えなのだけど NonPagedPool 総容量はシステム毎に限りがあったと思う。 ひとつのサービスが確保しすぎると他にしわ寄せが行くと思われ。
NonPagedPool limitation でぐぐってみたら 参考になりそうな検索結果が出たけど 深く調べる気力がないので神の降臨を待とう。
神じゃないけど。
NonPagedPoolの初期量と最大量は起動時に(多分物理メモリ総量から)算出されて、
最大量の範囲内で必要に応じて増減するぽい。
物理メモリ1Gで最大200MBくらいって例があるから、
>>343 の実装メモリが少ないんじゃ?
それより前に、NonPagedPoolが本当にそんなに必要なのかを検討し直した方がいい
351 :
デフォルトの名無しさん :2005/12/02(金) 03:20:47
Win2k3DDKSP1って落ちてないかな? x64対応なのってこれだけなんだよね・・・。 けど、俺クレカ持って無いから送ってもらうやつ出来ないし・・・orz 何故かこれだけネット上探しても落ちてない。 散々商業ソフトとかヤバ目のは落ちまくってるくせに、こういう時に限ってないんだよね。 MSも何で落とせるようにしないんでしょ・・・。
送料分をカードで支払ったけど、着払いも出来るの?
クレジットカードくらい作ればいいのに
355 :
351 :2005/12/02(金) 13:24:27
14歳なんですけど、クレカって作れるんでしょうか?
学校いってる?
357 :
351 :2005/12/02(金) 14:09:46
今日は創立記念日です。 部活はあるので、そろそろ行かないといけません。
>>351 XPのアクチに見られるようにXP以降のM$はシブチンだね
それ以前はDDKもフリーでDLできた
なので転がってるのはそれらばかりだね
(´-`).。oO(そういやアクチってサポート期間過ぎたら期間限定でしか使えないOSになるのか?)
>>358 その通り。
実はMSのアクチの狙いは割れ対策なんかじゃなくて
OSを買い換えてもらう為のものだったりするんじゃないかと思うんだが・・・。
この前、OSの利用調査でいつまでたってもWin98使いが消えなかったのでMSが頭を抱えてた。
そういうのも確実に戦略としてある気がする。
>>359 米国の消費者はサポート期間過ぎたら期間限定になるというのは猛反発しそうだな
結局、アクチ管理の鯖管理維持費で苦しくなるだけなのにな…
ほとんどの素人にとっては乗り換えるメリットが分からないから
>>358 サポート期限が切れたらアクティベーションが不要になるパッチを出すという話を聞いたことがあるが。
乗り換えるメリットが判っても今のOSで十分と判断しちゃうでしょ 動画処理とかじゃ不十分な性能だけど日本独自のコピワンデジタル放送じゃ 意味無いし…
DDK2003はtorrentに流れてるよ。結構新しいやつ 開発キットを無償提供しないのは今時意味分かんないなぁ
>>364 どこのサイトにあります?
自分が知ってる所は、XPまででした・・・orz
torrentはP2Pだろ
あれ? 自分のbit torrentの事ですよね? 落としたいファイルのtorrentファイルをどこかのサイトから落とさないといけないような・・・
自分の と言うのは消し忘れです。
isohunt.com
THXです。 マジタスカタ
XPのDDKは、購入しないといけないですか?それとも無料配布されてますか?
$199.00です。
373 :
デフォルトの名無しさん :2005/12/07(水) 21:30:08
374 :
デフォルトの名無しさん :2005/12/07(水) 21:33:43
コールされた命令のログを表示するだけのサウンドカードデバイスのドライバを書きたいのですが サウンドカードのドライバを実装する際のエントリポイントなどの情報が書かれてる資料はありませんか? WDMドライバの本の上巻下巻にも書いてなく、DDK2003のソースにも無いので困ってます。 当然MSDNにもないし・・・。
今品川でWindows64bitDriversWorkshop受けている訳だが、
XP_DDK.iso落ちてるとこ無いですか? またはどこかに上げてもらうこと出来ませんか? 一応ログ見て、shelekは項目はあれど落とせない(TOPに戻る) ssarangは、403でページが見られない。 "DDK_XP.ISO"でぐぐって、****.szipc.comって所にあることはあったけど重い。 Irvineで1〜2kしか落とせず、42時間なんて待てないッス。 よろしくお願いします。
うpに時間かかる メアド晒したら送っちゃる
379 :
376 :2005/12/16(金) 20:57:58
>377 メアドでも、うpに時間掛かるんじゃ・・・ >378 ありがとう。今落としてます。
380 :
デフォルトの名無しさん :2006/01/21(土) 23:21:43
USBのバルク転送を行うドライバを作成しています。 IoCallDriver を呼ぶ前に IoSetCompletionRoutine でデータの受信 処理をタイムアウト可能にしています。タイムアウト処理は正常に 行われるのですが、例えばタ受信完了間際にタイムアウトになった 場合、それまで受信していた(?)データが欠落するといった事は ありえるのでしょうか? 感覚的な疑問なので根本的に間違っているかもしれませんが ご存知の方、ご教授願います。
WDF 関連の話題もここでいいですか? DDK って一応無料で手にはいるんですね。
384 :
デフォルトの名無しさん :2006/02/20(月) 10:47:02
USBミニポートドライバ作ってるんですが、 Win2Kに同じデバイスを2つ挿すと片方は 正常に認識されるもののもう片方が常に ドライバのインストールを促され、再起動を 要求されてしまいます。 WinXPでは問題ないのですが・・・。 考えられる原因は何でしょうか?
385 :
デフォルトの名無しさん :2006/02/22(水) 00:24:10
どうもはじめまして。 ほとほと困り果てています。どなたかお力添えをお願いしたいのですが。 windows updateをしようとすると以下のメッセージが出て ウインドウが強制終了されてしまいます。updateができない状態です。 IEXPLORE のページ違反です。 モジュール : RPCRT4.DLL、アドレス : 017f:70140894 Registers: EAX=02df06db CS=017f EIP=70140894 EFLGS=00010216 EBX=02dec5a0 SS=0187 ESP=02dec3c0 EBP=02dec5b0 ECX=770eee58 DS=0187 ESI=00000484 FS=117f EDX=bff768d5 ES=0187 EDI=770eef6e GS=0000 Bytes at CS:EIP: ff 30 ff 75 d4 8d 85 1c fe ff ff 50 e8 cb 0b 00 Stack dump: 02dec8bc 00000000 00000000 02dec508 0061002e 00000000 00000000 000d002f 00000000 0062000a 0064006f 00000001 00000000 00000000 0061006e 00000000 どうか宜しくお願い致します。
387 :
デフォルトの名無しさん :2006/02/24(金) 02:09:23
SCSIのプロセッサーにコマンド出したいんですがどうしたらいいでしょうか? SCSI_PASS_THROUGHでCDBにWRITE(0x3B)のコマンドを入れてDeviceIoControlしたんですが、 DeviceIoControlは1で正常終了しても、SCSI StatusがCHECK CONDITIONになって、WRITEできていません。 SENSE見ると、INVALID REQUESTのINVALID FIELD in CDBってなります。 CreateFile(\\.\scsi0:でREADとWRITEを指定するだけじゃ駄目ですか?)
>SENSE見ると、INVALID REQUESTのINVALID FIELD in CDBってなります。 これが理由じゃないのか? つーかこれってドライバの質問?
ドライバ自体の作成は完了し、インストーラーを作成しているのですが、 ハードウェアの検出ウィザードを使用しないインストールってどうすれば いいのでしょうか? DPInst を使用しましたが、inf の選択が無くなるだけで、ウィザード自体は ユーザーが操作を行わなければいけません。ドライバをインストールし USBデバイスを繋いだらすぐ使えるようにしたいのです。 参考になるサイトなどありましたら教えてください。
漏れも知りたいw 結局、わかんなくてデバイスのファームをHID準拠に作り直しちゃった・・・
なんかあべし童貞の臭いがぷんぷんする擦れだな
>>391 はいはい、昨日筆おろしに行ったんですね、うまくいった?
オマエら筆おろしは素人?それとも風俗? 俺は風俗。それ以来ずっと風俗。
394 :
デフォルトの名無しさん :2006/06/01(木) 00:07:28
Mass Storage ClassのUSBのポータブルHDDに対して SCSIコマンドの送受信を行いたいんですがドライバを差し替えないで、 usbstore.sysのままで行えないでしょうか?
玉袋の裏かゆくなりませんか?
397 :
394 :2006/06/01(木) 23:58:17
>>396 情報ありがとうございます。
こんな便利なものがあるのですね。
とりあえず、やりたいことができるか調べてみたいと思います。
398 :
デフォルトの名無しさん :2006/06/04(日) 14:37:21
アプリケーションからReadFileを同期処理として呼び出したときに、 Device側が送るべきデータを持っていなければ、 ずっとReadFileを抜けずに待ち状態になってしまいます。 ReadFile自体はアプリケーションとは別スレッドで行っているとした場合、 任意のタイミング(キャンセルボタン押下)でReadFileを止めさせる場合には、 どのような方法が良いでしょうか?
アプリを非同期で書いた方が良いと思うけど・・・ やるとしたら、 データ待ちうけ部分をKeWaitForMultipleObjecとかで待って 中断イベントも待つようにして、DeviceIoControlでイベント発行・・・かな
400 :
デフォルトの名無しさん :2006/06/05(月) 00:34:25
仮想LANドライバ書きたいのですが 今までLinuxやUnixでの開発しか経験ないので 資料集めから始めたいのですがどの資料はみなさん どんなの読んでいますか?
winpcap のそーす?
403 :
デフォルトの名無しさん :2006/07/18(火) 20:16:22
UsbBuildVendorRequest(URB_FUNCTION_CLASS_INTERFACE)で デバイスが返答しない場合にタイムアウトさせるにはどうすれば良かですか?
WDMであるデバイス用のドライバが書ければ、Linux用の ドライバを書く力もつくと考えていいのでしょうか?
全然違うよ
ハードに直接アクセスする部分が書けるなら それなりになんでも出来るでしょう あとはルールを知ってるか知らないかだけ
>>403 WorkQueueで待ってイベントがタイムアウトしたらキャンセルとか。
>>404 そんな考えはダメ。
>>403 UsbBuildVendorRequestは単なるマクロで、urbに必要な情報を代入するだけ
urbを下のドライバに渡すときに使ってる関数のリファレンスを読めば載ってるかと
409 :
403 :2006/07/19(水) 20:38:20
410 :
デフォルトの名無しさん :2006/07/27(木) 14:39:39
あげ
411 :
デフォルトの名無しさん :2006/07/27(木) 14:40:28
ある特殊なデバイスを作りました。 HIDマウスなんだけど、特殊なベンダーリクエストが来ると LEDが光ります。(フィードバック) これは普通にPCに挿すと、普通のHIDマウスとしか認識しないんだけど 専用デバイスドライバをインストールすると、(HIDドライバーをすげ替える) LEDによるフィードバックが味わえるようになるという。 とりあえずwindows2000/xpで動作確認した所、okだったんだけど、 ドライバーのインストールで気になる事が。 windows2000では普通にインストールできるのに、 windowsXPにインストールすると、その時挿していたusbポート以外では、 HIDマウスとして認識してしまうという不具合が出ました。 (手動で一つ一つ、ドライバーの更新という作業が必要) どうしてこんな事が起きるのか・・・・orz
412 :
デフォルトの名無しさん :2006/07/27(木) 14:46:27
インストーラーは、installshield 11.5 のウイザードのみ使用。 ドライバー INFファイル インストーラー、 どれが悪いのか・・・。 親切心で、デバイスにリポートディスクリプターなんか載せたのが 悪かったのかな。 単純に、hidマウスデライバのプライオリティが下げられれば 良いだけな気がするんだが、方法がわからん。
416 :
デフォルトの名無しさん :2006/09/04(月) 22:50:02
他のスレからこちらに来ました. 「どのプロセス」が「どのファイル」を作成,変更したかを リアルタイム取得する方法を探しているのですが, デバイスドライバーを自作する必要があると聞いてこちらに来ました. Filemonのように高度なものでなく,ReadDirectoryChangesWで取得できる 情報が「どのプロセス」によってもたらされたものかを知りたいのですが, サンプルコードや参考書などがあればご教授お願いします.
filemonのソース。 ntinternalではもう公開してないが、ぐぐれば見つかる。
418 :
416 :2006/09/07(木) 12:57:02
>>417 ありがとうございます.
>>280 にあったv4.34のソースをおとして
\FILESRC\exe内のプロジェクトをビルドしようとしたのですが,
以下のようなエラーが出てコンパイルが通りません;;
○VC++ 2005 Express Edition
Filemon.dspを開いて,プロジェクトの変換
→コンパイルすると
filemon.c(185) : error C2220: 警告をエラーとして扱いました。'object' ファイルは生成されません。
と出るため,/WX を指定せずにコンパイル
→ビルドすると
1>CVTRES : fatal error CVT1100: 重複するリソースです。type:MANIFEST, name:1, language:0x0409
1>LINK : fatal error LNK1123: COFF への変換中に障害が発生しました: ファイルが無効であるか、または壊れています。
と出て失敗する.
○VC++ 6
filemon.c(1988) : error C2220: 警告をエラーとして扱いました。オブジェクト ファイルは生成されません。
filemon.c(1988) : warning C4013: 関数 'SetWindowLongPtr' は定義されていません。int 型の値を返す外部関数と見なします。
filemon.c(1989) : error C2065: 'GWLP_WNDPROC' : 定義されていない識別子です。
filemon.c(1990) : error C2065: 'LONG_PTR' : 定義されていない識別子です。
filemon.c(1990) : error C2146: 構文エラー : ')' が、識別子 'ListViewSubclass' の前に必要です。
filemon.c(1990) : error C2059: 構文エラー : ')'
デバイスドライバどころか,C++もサンプルコードをいじる程度しかできない初心者なのですが,
どなたか教えていただけませんか
>>418 ・・・悪いことは言わん、アキラメロ
XPのコマンドプロンプトでopenfiles使った方が幸せになれるぞw
>>418 方法を知りたいなら、buildを通す必要は無いし、
Filemonのような事をしたいなら、FILEM.SYSを使えば良いだけだから、
やはり、FILEM.SYSのbuildは不要。
十年早いと言うか、諦めた方が良いね。
x やはり、FILEM.SYSのbuildは不要。 o やはり、FILEMON.EXEのbuildは不要。
こんばんは、ボクfilemonです
423 :
416 :2006/09/07(木) 22:40:10
>>418-421 ありがとうございます.
とりあえず,ビルドだけはできたのですが皆様のおっしゃるとおり
理解するのはほぼ不可能なのであきらめます.
net files
意欲があっても能力が足りない典型例 能力があっても意欲が無いのとどっちが会社的には良いのだろうか? 藁 漏れは両方無いけど 核爆
能力があって意欲が無いのも 意欲があって能力が無いのも どっちも社会的に有害 まあ漏れもなんだが ,'⌒,ー、 _ ,,.. X 〈∨⌒ /\__,,.. -‐ '' " _,,. ‐''´ 〈\ _,,r'" 〉 // // . ‐''" ,ゝ `く/ / 〉 / ∧_,. r ''" - - - -_,,.. ‐''" _,.〉 / / . {'⌒) ∠二二> - - - - - - - _,.. ‐''" _,,,.. -{(⌒)、 r'`ー''‐‐^‐'ヾ{} + '-‐ '' " _,,. ‐''"`ー‐ヘj^‐' ;; ‐ -‐ _- ちょっくら逝ってくる - ‐_+ ;'" ,;'' ,'' ,;゙ ‐- ー_- ‐ ______,''___,;;"_;;__,,___________ ///////////////////////
自分で書いたドライバをインストールすると、 日付: 利用できません バージョン: 0.0.0.1 のように、バージョンは表示されますが日付が表示されません。 INFにDriverVer=mm/dd/yyyy,versionは書いてありますが、 もしかしてデジタル署名しないと日付は表示されないんでしょうか?
>>427 デジタル署名は関係ない
そのINF使って、再インストールしてみたら?
429 :
デフォルトの名無しさん :2006/10/06(金) 21:17:37
もうちょっとそちらの状況を晒してほしい
431 :
デフォルトの名無しさん :2006/10/17(火) 01:58:39
はじめまして。WinXPのWDMを開発しています。 WRTIE_PORT_UCHAR等の正しい使い方をご教授願います。 WDMの下記コードで、プリンタポートに0x55を出力しようとしましたが、 プリンタポートに0x55の電圧パタンが出てきません。 -------------------------------------------------------- . . . switch(irpStack->Parameters.DeviceIoControl.IoControlCode) { case IOCTL_HELLO: // パラレルポートに0x55を出力 WRITE_PORT_UCHAR((PUCHAR)0x378,(UCHAR)0x55); KdPrint(("0x55 output to parallel port\n")); Irp->IoStatus.Information = 0; status = STATUS_SUCCESS; break; . . . --------------------------------------------------------- 物理<->仮想アドレス変換が必要なのは、メモリ空間だけであって、 I/Oポート空間は不要だと認識しているのですが、正しいでしょうか。 よろしくお願いします。
ポートが0x378じゃないというオチ
433 :
427 :2006/10/18(水) 01:13:27
>>430 >>429 に対して、ですか?
こんな感じです。
[Version]
Signature = $CHICAGO$
Class = USB
ClassGUID = {36FC9E60-C465-11CF-8056-444553540000}
Provider = %MFGNAME%
DriverVer = 10/18/2006,0.0.0.1
Catalogfile = TestDriver.cat
これをWindows 2000にインストールすると、最初はOK。二回目以降は、
「既知の...」から「ディスク使用」を選ばないと更新できない。
DriverVerを更新しても、「デバイスに最適なドライバを検索する」を指定した
場合は、「現在のドライバよりさらに適切な...」で、現在のものが使われてしまうの
だけど、署名されてないから日付が認識されず、新しいと判定されないからだ、
と予想してます。困ってはいないんですが、こういうもんなのかなと。
XPだと警告は出るものの、日付が認識されて、更新もできます。
434 :
デフォルトの名無しさん :2006/10/21(土) 09:46:36
XP SP2 DDKを使っています。 atapi.sysを使うためのカーネルレベル関数を教えていただけないでしょうか。 PCIIDEのソース例はありますが、atapi.sysよりもハード側のレイヤの バスドライバであって、参考になりません。 PCに付属のIDEポートを直接駆動してATAPIコマンドを入力したいのです。 よろしくおねがいします。
atapi.sysを使ってport直叩きなんてできんぞ。 pass throughじゃ駄目なのか?
Vista-x64以降は署名の無いドライバは使えない事に対して、 (既にWHQL取ってるような大メーカーさんは別にして)皆さんどのように 対応します?
普通に署名を付加します。
テスト署名して、 Bcdedit.exe -set TESTSIGNING ON でOK。
Bcdedit.exe -set TESTSIGNING ON すると、(セーフモードみたいに)画面の四隅に「テストモード」って出るんだな。 インストーラでこっそりTESTSIGNING ONしようと思ったけどだめだは・・・・
デジタルコンテンツの暗号化とかのために、 カーネルでは信頼するものしか動かせなくする という話だが。
ドキュメントにビルドする環境くらい書いてあるだろ それと違う環境でビルドするなら、ソース直すくらいはしなきゃならんこともあるだろ
仮想空間アドレスがどの物理メモリに割り当てられているか知る術がありますか。
>>445 カーネルだけが知っているということですか?
>>446 そう。内部用のAPIじゃないとわからん。
WDMでも使えたかどうかは知らないけどNT用のDDIにあったような
厨房スレだな。 MmGetPhysicalAddress
450 :
444 :2007/02/19(月) 06:56:51
WinIo.dllでRTCを弄りたいのですが 皆さんどうやっています?
453 :
デフォルトの名無しさん :2007/03/19(月) 02:58:29
WinDbgを使ったKernel Debugにおいて、
ターゲットマシンが全く応答してくれず、2日無駄にしました。
このスレの
>>21 ,
>>25 ,
>>27 を読んでいれば、もっと早く気づけたのに・・・。
ちなみに、ターゲットマシンは、ThinkPadで
ドッキングステーションに載ってるCOMポートにつないでやろうとしました。
wdmってddkよりめんどい?
え゛?
wdf
もう、春だからなぁ・・・
あと、少しで終わるよなー
ドライバのインストールでお教えください。 専用ハード/専用デバイスドライバを必要とするアプリがあり、これまでは、 アプリのインストーラでinfファイル/sysファイルを%WINDOWS%\infおよび %WINDOWS%\system32\driversにあらかじめコピーしておくことで、ユーザー がドライバインストール時に在り処を指定しなくても済むようにしていまし た。(WHQL未取得なので警告は出ますが・・・) Vista-x64及びLonghorn対応のためドライバ署名のためのcatファイルが必要に なりますが、この場合も上記同様、ユーザーがドライバの在り処を指定しなく てもインストールできるようにすることは可能でしょうか? catファイルを%WINDOWS%\system32\CatRootにコピーする等、試行錯誤してみ ましたがだめでした。 アドバイスいただけたら幸いです。
DIFxフレームワーク使ってセットアップかければいいじゃん。
461 :
459 :2007/05/30(水) 06:52:04
>>460 ありがとうございます。 こんなものがあるのを知りませんでした。
大変助かりました。
memcard.sys ねぇ・・・orz
Filemonのソースを解析したいんですが、ソースの内容がわからないです(´・ω・`) まず何を勉強したほうがいいのでしょうか? ドライバプログラミングの入門書から勉強しようかなと思ってるんですが(´・ω・`) ハードの知識はちょびっとあります。Windowsの知識はあんまりないです(´・ω・`)
>>464 ありがとうございます。わかりやすいです(´・ω・`)
Filemonの読みはファイルモン? ホリエモンみたいは暑苦しい姿を彷彿とさせる名前だな
フィレモンって呼んでもいいぞ
ハ〜〜〜〜〜〜 やっとKMCS対応終わった〜〜〜〜〜 こんなに手間取ると思わなんだ・・・・・ 以上、チラシの裏でした
469 :
デフォルトの名無しさん :2007/08/02(木) 09:32:19
>>468 そのチラ裏が妙〜〜に気になった。
ターゲットOSは、Vista 64bit版でつか?
MS社の方針変更の可能性濃厚なんで
おおまかな手続きの流れをよければ語って
もらえマイカ。
いずれ全てのドライバが署名必要となるのか・・・orz。
470 :
468 :2007/08/02(木) 14:20:49
471 :
469 :2007/08/02(木) 17:45:32
>>470 >方針変更とは? KMCS義務をやっぱりやめるなんて情報があるの?
やめるという情報はないでつ。むしろ、32bitとかも求められるとなると、
いずれSP3辺りでXPなんかもそうなるのかなと・・・。XPのサポートが
延びてるしまだまだ使われるはずなので。
手順docのリンクとんくすでつ。
認証ツールいくつかあるみたいだけれど、おすすめとかありますか?
後、対応化にあたって苦労した話なんか聞かせてもらえるとこれから
認証手続きする人に役立つと思いまつ。
あ、SDK+WDK(withDDK)辺りはインスト済み前提で話してもらっていいでつ。
472 :
デフォルトの名無しさん :2007/08/02(木) 21:23:37
>いずれSP3辺りでXPなんかもそうなるのかなと・・・。XPのサポートが んな事したら発狂する顧客が随分出そうな気配。
473 :
468 :2007/08/02(木) 22:24:17
>>471 >いずれSP3辺りでXPなんかもそうなるのかなと・・
私も
>>472 と同じくこれは無いと思います。
>認証ツールいくつかあるみたいだけれど、おすすめとかありますか?
認証ツールとは?
>後、対応化にあたって苦労した話なんか聞かせてもらえるとこれから
>認証手続きする人に役立つと思いまつ。
自分で(Verisign等から)電子証明書を購入し、自分の作ったドライバに自分で
電子署名するなら、特に難しい点は無いと思います。
(KMCS_Walkthrough.docの手順をそのとおり辿るだけ)
私の場合、お客からの請負で作成した(アプリに含む)ドライバにお客の会社の
電子証明書でお客に電子署名してもらわなければならない故に以下で手間取り
ました。
(1) 電子署名とは何か、なぜ必要なのかを理解してもらう。
(2) 電子証明書を購入してもらう。
(3) 電子署名をしてもらう。
(1)は説明不要でしょう。
(2)は私がでは無く客先の担当者が苦労したのですが、でかい会社のため、法務・
総務・購買などに(1)が必要だったようで、電子証明書を購入だけで2ヶ月か
かりました。
474 :
468 :2007/08/02(木) 22:25:03
一番の難関は(3)です。電子証明書(の秘密鍵)の管理は「DOSプロンプトって何?」 ていうような事務屋さんが仕切っているわけですから、WDKのインストールを含め、 KMCS_Walkthrough.docの手順をやってもらうなど、まず不可能。 で、仕方が無いので、公開鍵・秘密鍵ファイルのありかとパスワードを入力する ための専用ダイアログアプリとそこから一連の手順を自動実行するバッチ(+α) を作成し、WDKの中で必要なツール等と合わせてお客に渡し、署名してもらい ました。 KMCS_Walkthrough.docを見てもらえばわかりますが、Cross-Certificateの関 連で、テスト用電子証明書で署名する手順と本物の電子証明書で署名する手順 が異なるため、上記バッチの確認が(本物の電子証明書がない)自分のところで できず、苦労しました。 参考: catファイルの作成にMakeCat/Signability/Inf2Catの3つの選択肢がありますが、 * MakeCatは面倒 * Signablityはファイルをコピーしただけでは使えない(COMの登録が必要) なので、Inf2Catがお勧めです。 以上、ご参考まで
475 :
469 :2007/08/03(金) 00:44:14
>>473-
>>474 実際の流れに沿った詳細な解説ありがとうございます。
おそらく、実際に対応してみないと見えてこないことが多々あると思われ、
>>468 さんの情報は今後実施する多くの方に貴重な内容だったと思われまつ。
結果として、お客様自身に電子証明書手続きしてもらうことが
一番大変だったということでつね。PCの事をよくわからない事務屋さんに
ドライバの署名してもらう為のバッチ処理、作るのかなり難易度高そうでつ・・・。
IRP_MJ_READにセットしたディスパッチルーチンの中で、 ユーザが読むべきデータがまだ無い場合はブロッキングしたいのですが、 どのような機能を使えば良いのでしょうか? 初歩的っぽい質問で申し訳ないのですが、探しても中々でてこないので・・・ どなたかご教授いただければ幸いです。
ブロックしたらだめ。完了ルーチンなり割り込みなりを設定して 「まだ読み出すべきデータがない」と言ってすぐに戻る。
読むべきデータがないならSTATUS_PENDINGでいったん返しておいて、 データができたときに割り込みがあるなら、それをトリガにしてIRPを完了かなぁ。 割り込みなくてポーリングでしかわからないなら、ワーカースレッドを起動して スレッド内でデータができたらIRP完了するのかな。
>>476 >>477 が書いているようにディスパッチルーチンの中で時間のかかる処理の完了を待ってはならない。
>>478 のようにディスパッチルーチンではSTATUS_PENDINGを返しておき、割り込みなりポーリング
なりで処理の完了を確認した時点で、IoCompleteRequest()で呼び出し側に完了を伝える。
ドライバ側で上記の実装をしておけば、アプリ側は
同期IO:ReadFile()は処理の完了まで抜けてこない
非同期IO(Overlapped-I/O):ReadFile()は処理の完了を待たない
のどちらでも実装できる。
>>476 の質問の書き込みから見て、これらの説明だけではチンプンカンプンでしょう。
何か本を買って一通りの勉強をすることを強く勧める。
例:
http://www.ascii.co.jp/books/books/detail/4-7561-3913-2.shtml 入門書としては少し難しいが、実装上のノウハウがひととおり書かれている。
480 :
476 :2007/08/14(火) 13:59:27
>>477 >>478 >>479 ご回答ありがとうございます!
一応Linux上でのドライバ開発の経験はあるもので、
Linuxだとディスパッチルーチンに相当する部分でスリープしてしまって良く、
それと同じようなことをしようとあがいてました。
もっとWindowsでの事情をちゃんと考慮すべきでした・・・
おぼろげながらどうやればいいかわかってきた気がするので、
またがんばってみようと思います。
ありがとうございました
ファイルシステムのドライバを作ってるページありませんか?
484 :
デフォルトの名無しさん :2007/08/25(土) 19:04:45
はじめまして.デバイスドライバに関しては全くの素人なのですが, FILEM.SYSを利用して,ファイルがどのプロセスから読み書きされているか 調べるツールを作成しようと考えています. このスレで上げられているFilemonのソース見て, DeviceIoControlでアプリ側からフィルタドライバ側へアクセスしているだろう ということは分かったのですが,フィルタドライバ側からのデータは どのようにして受信するのでしょうか? 初歩的な質問で申し訳ございませんがよろしくお願いします.
定期的に共有メモリを覗く
487 :
481 :2007/09/05(水) 14:41:25
はまってて質問したこと忘れてました・・・
>>482 DDKサンプル、OSRは大体見てます。
NTファイルシステム詳細は会社にはあるのですが
個人でも買いたいと思ってます。(が売ってません・・・)
>>483 とりあえずDLはしておきました。
>>486 ファイルシステムの場合、OSからのリクエストが
Undocumentedな上に、SPが当たったりすると、動作が変わるのが嫌らしいです。
キャッシュマネージャを利用しようとすると、IRP_MJ_READ/IRP_MJ_WRITEに対して
2回コールされます。
最初はキャッシュフラグOnでOS側から。このときにキャッシュマネージャーのファンクションをコールします(CcCopyRead)
するとキャッシュマネージャ、VMMを経て、またIRP_MJ_READが呼ばれますが、このときはフラグがありません。
で、キャッシュなしということで、ディスクから読み込んで〜
という風になりますが、マルチスレッドを考慮して適切に排他/共有ロックをかけないといけないですし
さらに、先読み、遅延書き込み、によって通常の読み書きより優先度の高い処理が別スレッドで発生したり
Explorerや、AntiVirus、ユーザーが意識していないタイミングで、リクエストがばんばん発生するので
地道に解析しながらやるしかなさそうです。
UndocumentedつーかIFSKITはDDKとは別に購入しなければならなかったんじゃないかな? まず動かすんだったらキャッシュマネージャを無視して処理してもいいんじゃ?
489 :
481 :2007/09/05(水) 18:43:08
>>488 IFSKitはすでにあります。
しかし、添付のドキュメントはほぼフィルタドライバについてだったりして
期待するようなことはあまり書いてないです。
新しくでたVistaのDDKだと、FileSystemのソースもDDKに入るようになったので
IFSKIT自体無くなるのか?
いろいろ見た結果FAT32のサンプルとNTファイルシステム詳細みながら
やるのがよさそうなのでそれでがんばります。
ファイルシステム詳細は絶版だから紹介しなかったんだけど IFSはDDKと統合されてWDKっていう扱いになったんじゃなかったか? MSはころころ名前変えてくれるよな
>>488 WDKに統合されて誰でもタダで入手できるようになった
492 :
デフォルトの名無しさん :2007/09/15(土) 14:07:06
Vista発売前に、 「Vistaではドライバ未対応のため使えないデバイスが出てくる」 と言われてた気がするんだけど、 具体的にドライバの何が問題? 32bit-Vistaなら、XPのWDMドライバもそのまま使える?
Vistaで構造が大きく変わったドライバモデルがある。その筆頭がビデオ関連。 一応これまでのドライバモデルも動くらしいが、当然Aeroは動かないっぽい。 Vista は持ってないので、実際に試したことがないので詳しくはわからないです。 ファイルシステムとかプリンタあたりはどうなんだろう。 ここは専門外なのでわかりません。 あとは、電源関連あたりの処理が変わっているらしいので、サスペンドレジューム休止状態などで 不具合が出てしまうデバイスがあるかもしれません。 上記の注意点の条件に当てはまらなければ、原理的にはXPのドライバでも動くはずです。 なにか忘れてることがあるかもしれませんが、そんな感じです。
496 :
デフォルトの名無しさん :2007/09/28(金) 02:18:34
HELP DDKのサンプルで製品版と互換にする方法教えてもらえませんか。 おそらくGUIDをそろえるんだと思います。 NECのスキャナのドライバでブルースクリーンになるので調べたら、 内部名がbulkusbでDDKのサンプルらしく、KB調べたらバグありらしいので ドライバの供給はもう終わっているので、自分で修正しようとしています。 bulidしてリネームしてDiriversにコピーしたけどだめでした。 ソースだと、 // {6068EB61-98E7-4c98-9E20-1F068295909A} DEFINE_GUID(GUID_CLASS_I82930_BULK, 0x873fdf, 0x61a8, 0x11d1, 0xaa, 0x5e, 0x0, 0xc0, 0x4f, 0xb1, 0x72, 0x8b); ここのところがわかりません。0x6060eb,0x61...のようになるはずなんじゃないかと。
bulkusbと書いてあるからと言って、 中身がDDKのbulkusbそのまんまとは限らないと思う・・・ 仮に、中身がほぼ同一だとしたら、 GUIDは、オマイの使ってるデバイスにあわせる必要がある
498 :
デフォルトの名無しさん :2007/09/28(金) 12:04:46
>>497 ありがとう。
デバイスとは、製品版のSYSファイルから取り出せますか?
INFにはimageのクラスGUIDと、USDClassというのしかなかったです。
上位と下位みたいだからこれ以外みたいですが。
TWAIN用のDLLとかワンプッシュボタン用のEXEから知ることもできるでしょうか。
現状で動作させると、組み込みはできますが、データソースはデバイスが見つからないというエラーです。
>>498 まー、その辺のファイルのどっかに書いてあるでそ
逆アセすりゃ、分かるんでない?
500 :
デフォルトの名無しさん :2007/09/28(金) 23:56:10
簡単にさくっとは無理ですか。 SYSの逆汗したことないです dumpbinでも分かりませんでした GUIDだけ合わせてもだめ?
そのGUIDをファイルの中から探せって話しだぞ どこのGUIDを合わせなきゃいけないか理解してる? 分かってないなら、 bulkusbと一緒に付いてるサンプルの実行ファイルのソース読め あと、逆汗ムリつーなら、CreateFileにフックかけて引数調べるとかでも良いかと
502 :
デフォルトの名無しさん :2007/09/30(日) 03:08:00
>>501 理解していません。。
infには2箇所ありました。だけど、SYSには依存していないっぽいのでinfは無関係みたい。
製品版のSYSからとってソースに書くという事実は分かります。
場所は、496の場所かと。
mofにもなんからしいのがある気がします。
APIをフックするのも分かりません。やったことないです。
とりあえずソース見て、そしてフックも勉強します。
EXEなりのCreateFileのところの引数を調べるってことですよね、多分。
W32dsmで見てみます。
USBのバルク転送を実装するのにBULKUSBをベースに作ったってだけで どんなデータのやり取りをしているかは自分で調べないとだめでしょ んで、GUIDは単にデバイスインターフェイス登録しているだけだから 無くてもかまわない。 元のドライバのSYSと入れ替えれば、OSがロードしてくれるはず ここまでが下準備で OSやアプリケーションからどんなリクエストが来るか デバイスにどんなリクエストを出しているか はフィルタドライバ作るなりして調べないといけない。 まあ、スキャナをコントロールするのにEXEやプロパティページ拡張のDLLみたいなのは 入ってると思うから、そういうの経由でどのボタン押すとどういうリクエスト来るか ぐらいは調べられると、楽かもね まったく動かないのであれば、正直お手上げだと思うけど 多少なりとも動くのなら、落ちる部分だけフィルタドライバでオーバーライドするのが 早い気もするんだけど。
504 :
デフォルトの名無しさん :2007/10/01(月) 14:44:54
みんなありがとう。 バージョンリソースがそのままなのでてっきり同じかと思っていました。 いろいろやらないとだめなんですね。今のレベルだとちょっとお手上げです。 bulidしてSYSをコピーするとか、infをちょっと書き換え程度しかできません。 DLLの中身とかを見ていて、別な会社名を見つけたので、そこのWebに行って ドライバ取ってきたら、とりあえずそのドライバで1回は動きました。 これでバグが出なければ解決だと思います。だめならまた考えます。 ドライバはNECより新しくてUIはもっと良くなっていました。
505 :
:デフォルトの名無しさん :2007/10/13(土) 02:47:54
PCI基板を新規におこしてそれ用のドライバを作ってます。 とりあえずWinXP環境からバスをチェックして、 ベンダ情報があっているデバイス番号とか機能番号は確認しました。 そこでPCIとPCとの共有メモリの情報を見たいのですが、 どうすればいいのでしょうか?
507 :
:デフォルトの名無しさん :2007/10/15(月) 00:06:36
ドライバで基板の物理メモリを仮想メモリにマップして、 その先頭アドレス取得、Winアプリからそのアドレスのデータを読むことはできました。 (意味不明なデータですが、初期化されてないからと思ってます) ただ、デバイスマネージャのメモリ一欄にその基板用に取得した アドレスが表示されてません。 ドライバ上で仮想アドレスの先頭を取得するだけではダメなんでしょうか? アドレス取得後、デバイスマネージャに教える関数とかあるんですか? WDMがよくわからなくて、XP環境でNTのドライバの本見ながら作ってます、、
普通、そういう領域はPCI config spaceのBARを使ってOSにアレンジしてもらう。 それがPCI device。そうじゃないとP2P bridgeとかで問題がでるはず。
509 :
. :2007/10/15(月) 20:13:34
そもそも「このデバイスは正常に動作しています。」かどうかも 書かれていないわけだが・・・
>>507 WDMかWDFを勉強しなよw PnPに対応しないと、やりたい事はできないよ。
508みたいなこともあるわけだし 通常のPCIデバイスとしてBIOS/OSが認識して初めてWDMの話が出てくるわけだから デバドラ開発以前の問題に思えるんだが。 そもそもそのWinアプリって何?って話なんだが。 基盤ってあたりで、XilinxとかでPCIデバイス開発したいような気もするんだけど それなら本読めば書いてあるし、ここで聞いてる理由もわからんな
512 :
509 :2007/10/19(金) 12:38:20
作ったデバイス専用のドライバではなくて レガシードライバで強引に物理リソースに アクセスしていると思うんだが・・・ リソース割り当て&コンフィギュレーションは されているが、専用ドライバがインストール されていないからデバイスマネージャ上で リソース確認できないんじゃないか? Winアプリとは前述レガシードライバ経由で メモリ、I/O、コンフィギュレーションスペースに アクセスするアプリとみた。 ってここでエスパーしてもしょうがないな。
いっぱいコメントついてるのに、経過報告はおろか、礼すら無いようだから、 もう本人は見てないんじゃない?
514 :
:デフォルトの名無しさん :2007/10/19(金) 22:27:36
507です。 みなさん参考になるコメントたくさんありがとうございます。 経過報告ですが、なんとか試験的に動作できるものは作れてました。 結局、WDM的な作り方ではなく、NT用のデバイスドライバを元にして作りました。 WDMでは裏でしていることが多いようで、自分には不向きなようでした。 NT的な方法でなんでもソースに書いてとりあえず動いてます。 はじめてドライバを触るし、ゼロから作るため、いろいろ思考錯誤しましたが、 これから、それをWDM的に変更していくつもりです。 あと質問ですが、DMAをするには基板側にそういった仕様、機能がないとできないのでしょうか? ドライバでソースを書くだけでなんとかなるものなのでしょうか?
>>514 ソースだけで何とかしているだけでDMAでないと思うが…
汎用的に使用可能なDMAって組み込まれてたっけ?
PCIはDMA転送のモードがあるからボードの受け側が対応しているならできるとおもうけど
DMA : Direct Memory Access
メモリ<>メモリもしくはデバイス<>メモリ のデータ転送で
CPUを通さずにデータを転送させる機能
>>514 趣味で作ってるならいいんだが、そうじゃないなら最初からWDMで書いたほうが良いよ。
PnPとパワーマネージメントはWDMじゃないと、きちんと対応することは難しい。
PnPなんて抜き差ししないから関係ないとか思ってると、後で困る事が多いよ。
PCIに関する知識が決定的に不足している。 極端な表現をすればデバイスも偶然動いているだけ。 PCIデバイスのDMAとはデバイスがバスマスタになってトランザクションを 発行しなければならないのでデバイスが対応していなければならない。
518 :
:デフォルトの名無しさん :2007/11/02(金) 01:30:04
>>515-517 返事遅れました。すみません。
趣味というか、興味本位ではじめたドライバの勉強でしたが、
PCI基板を2つPCにさして動かすことはできました。
多少は勉強になったようですが、所詮学生の勉強レベルですね。
就職前にデバイスドライバの勉強でもしようと思いましたが、
修論に専念します。
先生がドライバを簡単に作れるツールがあれば、買ってくれるようなことを
言われたので探してるとこでした。
いろいろありがとうございました。
> 身体のアクセシビリティ ハァハァ でも機械翻訳もずいぶんと遠い道のりを経てここまできたんだな。
|∵)ノ カーネルモードの初心者ですけれども先生質問です。 Virtual Audio Cableのようなソフトウェアオンリーの仮想オーディオドライバを作ろうと思うですけれども ユーザモードのアプリからカーネルモードのPortCls KSフィルタの中のミニポートのインスタンスを見つけ出して 直接通信するにはどんな方法を使ったらよいですか?
>>521 普通のWDMドライバであれば
CreateDeviceInterfaceだったかSymbolicだったかを呼び出し
それをユーザーモードドライバでCreateFileしてやって
DeviceIoControlを呼び出すと、IRP_MJ_DEVICE_CONTROL経由で
データが飛んでくるのでそれでやり取りできる。
が、オーディオやキャプチャデバイスの場合はミニポートドライバなので
特殊なインターフェイスしか無い
(WDMドライバ本などの基礎的な部分は役に立つが、完全ではない)
DirectShowデバイスの場合はDirectShow経由で行い、
汎用セッティングについては、GUIDでやるのが作法になっているので(KSPROPERTYあたり)
そのデバイスについての固有な命令については、自分でGUIDを定義して
やり取りするのが普通だと思う。
詳細は忘れてしまったので、AC97のProppageサンプル見てみたが
SetupDiでデバイスインターフェイスを探して、そのハンドル経由でIOCTL_KS_PROPERTYで
設定を流し込んでるみたい。
そのデバイスインターフェイスは誰が作ってるかということなんだが
通常だったら自分で作らないと存在しないが、身にポートドライバなので
MSが用意してくれているかもしれない、が名前がどうなってるかまではわからないので
ツールとか使って調べてください。
デバイス固有の作法については、本が無いので、DDKのサンプルとドキュメント見て
やるしかないと思うが、他にいい文献など知ってたら教えて欲しいぐらいです。
|;∵) うをををッ為になりますッ!てゆうかレス早ッ 取り敢えずは早速IOCTL_KS_PROPERTYを試してみるです。有り難うございます。
524 :
521 :2007/11/07(水) 16:59:44
質問です。
なんとか、VS2005でコンパイル -> VMWare上のXPでデバッグ という流れを
作りたくて、いろいろいじっています。ドライバに関してはほとんど初心者です。
vsprintf という関数を使うと、"外部参照が未解決"となるので、VSの設定で、
"すべての規定のライブラリの無視"を "はい" に変更していたのを "いいえ" に
戻して、コンパイル、インストールしてみたのですが、インストールに失敗します。
インストールは、以下のサイトの、"DIP.zip"てのを使っていてエラーは "Error: 3" と
だけしか出ません。
ttp://ruffnex.oc.to/kenji/windriver/ vsprintf をコメントアウトすると、正常に動くので、原因はこいつで間違いないと思うの
ですが、なぜインストール出来なくなるのかがわかりません。
よろしければ、こうなる理由を教えてください。よろしくお願いします。
>>525 >よろしければ、こうなる理由を教えてください。よろしくお願いします。
よろしくないから、教えない。
ヒドス (^^; 一つだけ。ユーザモードとカーネルモードでは基本的に使えるライブラリもAPIセットも違います。
>>527 根本的に勘違いしていました。ありがとうございました。
>525 まずは自分で貼ったURLのサイトを100回読むことだ。
531 :
チラシ :2007/12/27(木) 13:46:15
usbd.sys 6.0.6000.16553って動き怪しくないか? _URB_CONTROL_VENDOR_OR_CLASS_REQUESTを IOCTL_INTERNAL_USB_SUBMIT_URBでIoCallDriverすると 成功と失敗を交互に繰り返すんだが・・・ 失敗時、バスにはパケット流れないのにURBヘッダの ステータスはUSBD_STATUS_DEV_NOT_RESPONDING・・・orz
532 :
デフォルトの名無しさん :2007/12/30(日) 01:39:29
ISRの処理の中から、IoRequestDpcでDPC呼んでるんですけど、 それから500msくらい後から、DPCの処理がされています。 漠然とした質問ですが、原因をご教授ねがえないでしょうか?
>>532 他のデバイスの割り込み処理が入ってるんじゃね?
もしくは自分のデバイスがさらに割り込んでるとか。
535 :
デフォルトの名無しさん :2008/01/06(日) 22:46:36
PCI用のドライバ開発でデータ転送で困ってます。 1 Winアプリ側でReadFile 2 いろいろ処理され、PCI基板のメモリにデータセット(基板側で処理されます) 3 基板が割り込み発生 4 DPCの中で、RtlCopyMemoryでPCI基板のメモリからReadFileのバッファにコピー データは、200KB〜300KBですが、 4のRtlCopyMemoryに100msくらいかかります。 何かの設定で、バスの速度を早くするとかあるのでしょうか? それとも、DMA処理とか使って、データのコピー方法を検討する必要があるのでしょうか? ちなみにその場合、基板内にDMAコントローラがなくても可能なものでしょうか? 詳しいかたお願いします。
>>535 507か?
I/Oで3MB/sだから、ありえる数値じゃないの。
性能が欲しいならバスマスタでしょ。
もちろんデバイスが対応していないと無理だけど。
537 :
デフォルトの名無しさん :2008/01/06(日) 23:32:37
早速の回答ありがとうございます。 (ちなみに507です。就職決まったので悪あがき再開してます。) I/Oで3MB/sというのは、PCIの仕様なのでしょうか。 参考になるURLとかご存知ですか? バスマスタDMA可能にするには、どういった機能が基板に必要なのでしょうか。 システムDMAというのがあるらしいですが、これはPC既存のもの?? でも遅いようですね。
>>537 そこそこ行儀が良いと仮定してもread cycleで4byte毎にバストランザクション発生させてんだろ。
1回のトランザクションに何サイクル必要か仕様見て実際に計算すれば予想できるじゃないか。
できるところまで突っ走るのも良いけど、ちゃんと基礎も勉強しないと役に立たない知識になるぞ。
デバイスのローカル側が遅いだけじゃないの? 非バスマスタならFIFO乗っけるなりして 性能あげるしかないと思うけど・・・
”気軽に「こんなソフトありませんか?」 ”スレから移動してきました。 Windows 2000/XP/Vista(32bit)でドライバをロード/アンロードできるCUIのツールがあれば教えてください >hogehoge.exe c:\fugagufa\foo.sys スレ違いなのは承知していますが、プログラマ以外では使わないツールだろうと考えていますので、 こちらで質問させていただきました。よろしくお願いします
CodeProjectで見たような気がするが ツールとしては見たこと無い というか、自分も欲しいw
>>542-543 ありがとう。
devconはデバイスの管理のようですね。
私の場合は542さんが示していただいているように純粋なアンロード・ロード機能があるもので、
もうすこし汎用的なツールがどこかしらにあるだろうと期待して質問してみました
ちょっとなさそうであれば、チープな実装で片手間に書きます(絶対あると思ってたので。。。
>>540 CUIってところが問題なのか。
自分でちゃっちゃと書くか、driverloaderあたりをwshで叩くかかな?
546 :
540 :2008/01/13(日) 17:31:06
>546 乙andありがとう
logicoolのWebカメラ l2台をUSBで接続したいのですが、 VFW-WDMラッパーの問題で片方ずつしか使用できません。 VFW経由では2台同時使用は出来ないのでしょうか? 例えば、USBポート拡張PCカードを使うなど、何らかの方法でVFW経由の使用が可能でしょうか?
>>548 自分でドライバを書く気が無いならスレ違い
もし書く気があるなら、そのラッパーの問題とやらをkwsk
デバイスと関係のないカーネル空間一般の質問になります。 ユーザモードだとVirtualAllocで確保した空間に実行コードを書き込み、 VirtualProtectで実行可能属性を与えることで実行することができます。 これをカーネル空間で行いたいと考え、 ExAllocatePoolで確保した空間に同じようにコードを書き込みますが、特に保護属性を変更せずに実行できるように見えます。 (プログラム自体はバグっているので自信が無いのですが)これは私のCPUだから、ということではなく、 カーネル空間には保護属性はないと考えて間違ってませんでしょうか?
> カーネル空間には保護属性はないと考えて間違ってませんでしょうか? 間違っているよ。poolは実行可能領域になるだけでスタック領域は実行不可能になっている。 !pteで簡単に見れるんだからちゃんと調べようよ。
ありがとう。!pte知りませんでしたorz とても勉強になります。 やっぱりgoogleとtry&errorなデバッグだけじゃ十分な知識が揃いにくいですね
553 :
548 :2008/01/26(土) 09:57:41
PCカードではないが、PCIボードでUSBポートを増設して自己解決。 レスくれた人どうも。
554 :
ぱーぷりん :2008/02/01(金) 10:01:51
WDFDRIVERやWDFDEVICE等の定義ヘッダーは何処のなんと言うファイル名か、 ご存知の方教えてください。DDK内を検索しても見つかりませんでした。
wdf\kmdf\10\wdftypes.h
デバイスドライバは作った事が無くて、 今wav等のHDD上のオーディオファイルをオーディオ入力に渡すというアプリを作るために 仮想オーディオ入力ドライバを作りたいんだけど、 ドライバの情報がWEB上探してもあまり見つからなくて難航してます。 参考になりそうなサイトとか知ってたら教えて下さい。 ちなみに、これを実現するにはオーディオファイルを開くアプリと、 アプリからの入力を受け付ける仮想オーディオ入力ドライバがあれば良くて、 同時にマイク等からのオーディオ入力も行うにはフィルタドライバにすれば良いと思ってるんだけど合ってます?
557 :
556 :2008/02/02(土) 16:55:37
あれ勘違い?フィルタドライバ(=中間ドライバ?)だとアプリからの要求を直接受けられないから 上位ドライバとして作って、他の上位ドライバへ転送するような処理をさせればいいのかな?
558 :
556 :2008/02/02(土) 18:27:02
ループバックデバイス使えば良さそう 過疎杉
既にフリーのものがあるのにご苦労なことです
あるなら教えて下さい
561 :
556 :2008/02/02(土) 19:05:40
2chにただ
>>559 とだけ書かれるとあるなら探さないといけないし
実は嘘で無いかもしれないから困る
信じずに探さなければいいじゃない
何がしたいかが問題だな このスレで質問する人の大半が 目的とやりたいことがあってない
スレ違いかも知れませんが、もし分かる方がいらっしゃいましたら教えてください。 BIOSの設定を、Windowsから変更することできませんか? WDM(デバイスドライバ)経由でできたりしないのでしょうか? BIOSの時計は、Windowsから同期(変更)しているみたいだから、 できそうな気がするのですが・・・
BIOSはメーカーによってまったく違う物だけど、そこはどうする気だ?
結論から言うと無理
デバイス依存で直接IOポート叩く覚悟ならば全くできないことはないんぢゃないかと思いますけれども
できますよ
>>564 設定方法次第。
I/O経由なら可能だろうけど、
保存場所がメモリアドレスに出てきていたら、不可能な場合もある。
今でもBIOSの設定情報がCMOS RAMに存在すると仮定した話。 CMOSのI/O portのlockはHALが持っているから勝手にアクセスすると トラブルの原因になる。 DDKではobsoleteと書かれているがHalGetBusDataの引数に BUS_DATA_TYPEでCmosがあるからそれを使えばアクセス可能だと 思われる。
デバイスドライバ関係の良い書籍とかサイトがあったら教えて下さい。 目標は各種ループバックデバイスが作れるレベルです。
>>571 お前に言いたい事は、
目的によって実装が全然異なるのに「各種」なんてあるわけない。
その程度の事がわかるぐらいになってからドライバを書け。
そもそもDRM対策で個人ドライバ開発者が厳しい状況に置かれている
事を理解しろ。
>>571 DDK落としてtoasterで心行くまで遊べばいいと思う。
実際より書籍が好きなら忘れてくれ。
574 :
デフォルトの名無しさん :2008/02/17(日) 21:47:25
質問です。 複数の異なるアドレスからデータを非同期に読みたいのです。 例えば4つのスレッドからドライバにアクセス(ReadFie、IO_CTRL_・・・等)する場合に、 複写元にデータが入ったタイミングで割り込みきて、 DPCで複写先(スレッド毎に異なる場所)にコピーするとき、 ISR、DPCでどのスレッドからのReadFileがきたのかを 判断する基準てあるのでしょうか? ISRには独自データを追加する場所もないようです。 ISR、DPCを複数用意する手段があるのでしょうか?
>>574 リクエスト元のスレッドなんて意識するような作りをしちゃいかんだろ。
何の為のIRPだ。
>>574 readに対する応答処理として、それは誤っている。
故に、死ね。
>574 複数のアドレスとring3のスレッドが一対一対応しているなら アドレスの数だけ新しいデバイスオブジェクトを作っちまったら どうだ? どうしてもダメなら ・プロセスID、スレッドID等の情報をドライバに登録する DeviceControlをつくり、読み書きの前にスレッド情報を 登録しておく。 ・ReadFileはやめて DeviceIoContro( ハンドル, スレッド識別読み取りコード, 上記情報バッファのアドレス, 上記情報バイト数, 読み取りデータ格納バッファアドレス, 読み取るバイト数, ... ); ・WriteFileはやめて DeviceIoContro( ハンドル, スレッド識別書き込みコード, 上記情報に書き込みデータを付加したバッファのアドレス, 上記情報 + 書き込むバイト数, NULL, 0UL, ... ); 実装としては果てしなくダサいな・・・
578 :
デフォルトの名無しさん :2008/02/18(月) 17:23:47
574は本質的な間違いを犯している。よって終了。
>>574 まずドライバに持たせたバッファにコピーするだろw
581 :
デフォルトの名無しさん :2008/02/22(金) 01:51:29
WindowsXP環境でUSBAudioドライバを作成しています。 解決できない問題があり質問させていただきます。 ドライバはKS(KernelStream)のMiniDriverとしてつくっており、 Filter1つに、Pinが WaveとMidi用のCapture/RenderPinの計4本の構成です。 あと、各ピン用のBridge Pinを用意しています。 PinのCreateまでは成功しているのですが、 その後、Pinステートの変更、PCMストリームデータのRead/Writeをしようとすると KSから MiniDriverの ・PinSetDeviceState ルーチン ・PinProcess ルーチン がコールされなく、原因を探しています。 原因の手掛かりになりそうなことでもいいので わかる方がいましたら教えていただけないでしょうか? ( KSPropertyでサポートしないといけないものがある、 KSディスクリプタの設定内容に怪しい箇所がある、 など) ドライバの動作確認には、WDKの付属ツール KSStudioを使っています。 WDKは Ver6001です。 ちなみに、 PinCreate ルーチン PinClose ルーチン PinSetDataFormat ルーチン IntersectHandler ルーチン はKSから問題なくコールされています。 各ルーチンは、KSPINディスクリプタに登録しています。 宜しくお願いします。
>>581 自己レスです。Pinのルーチンが呼ばれない件、解決しました。
Pinの接続設定とPinディスクリプタの設定値に不備があったのが原因でした。
失礼しました。
583 :
デフォルトの名無しさん :2008/03/03(月) 16:23:26
USBデバイスのファンクションドライバの上層に挿入する、ごく普通のフィルタドライバ を作ろうとしていますが、インストールで詰まっています。 参考書:滝口著「フィルタドライバプログラミング」では、最も一般的な方法として DDKのサンプルにある「addfilter.exe」をビルドして使えといっており、たしかに配賦 のためインストーラーが必要になりコマンドラインベースの方法が良いので納得です。 しかし説明に乏しく引数の指定方法がよくわかりません。 usage: addfilter [/listdevices] [/device device_name] [/add filter] [/remove filter] [/lower] とありますが、 [/device device_name] というときdevice_nameはどんな指定のしかたをするのでしょうか? XXXX.sysといったことなのか、それとも何かレジストリキーのようなものなのか。 [/add filter]も同様で何を指定するのか判然としません。 どなたかご存知のかた、教えていただけませんか? 宜しくお願いします。
>>583 正直あの本の方法は特殊だと思う。
一般的に特定のデバイスで動作させるには、
そのドライバにインストールできるようなInfファイルを書けば良くて
サンプルはDDKについてるから、それとヘルプ参照しながらで
簡単に作れたと思う。
>583 ざっとソースを眺めたところ、 device_nameは/listdevicesの出力結果、 filterはHKLM\SYSTEM\CurrentControlSet\Servicesにぶら下がってるキー名 に見えた。
ドライバ作ってみたいんだけど環境は何が必要? Visual Studio 2005 なら正式版あるけどテンプレにドライバなかった
DDK Visual Studioに統合もできたはず
DDKWizard
591 :
デフォルトの名無しさん :2008/03/20(木) 16:36:37
UMDFは一般のDLLで開発できるということで手を出してみたのですが、 wudfddi.hをインクルードすると 構文エラー : 識別子 '_in' というエラーが出てしまいます。 確か、VS2002や2003で最近のSDKやWDKをコンパイルとすると この手のエラーが出たような記憶があるのですが、 何とか突破する方法はないでしょうか。 WDKとダウンロードインクルードパスの追加は完了しています。
>>591 止む無くVC2008をインストールして解決することにしました。
>>591 それは最近のVC++の/analyzeオプション用の注釈だと思う。
単純に/D__inとかで空に置換してコンパイルできない?
ちがうと思う。 VCに最初から入っているPlatformSDKに相当するものとの相性があって 最新のもの同士なら大抵うまくいくが、片方のバージョンが違うと インクルードがうまくいかないことが多い。 WDKは最近出たものだから余計そうじゃないかと。 逆にPlatformSDK入れてパス通せばうまくいくんじゃないかと。 すでに動いているだろうから余計なことする必要は無いけどね。
595 :
デフォルトの名無しさん :2008/05/26(月) 21:52:05
ドライバから、レジストリって読みに行けますか? windows.hがインクルード出来なくて、RegOpenKeyEx()が使えないです。 なにかヒントください。 VC6+XPSP1DDKです。
RtlQueryRegistryValuesかな? Windows起動中にロードするドライバだとレジストリの場所によっては読めないところもあるので、 注意してくださいね。
Zw系の関数にある Windows.hはユーザーモードアプリケーション用であって ドライバのカーネルモードはntddk.hとかになる。 サンプルをインストールしてよく見てみるべし。
あ、Rtlか スマソ
RAMディスクみたいな仮想ディスクのドライバを作成した場合、 ハードウェアが存在しないのでバスドライバがハードウェアの追加を「検出」することも ないと思うのですが、実際にはAddDeviceがちゃんと呼び出されるみたいです。 なぜ呼び出されるのでしょうか? MSのサンプルRAMディスクのソースを見ても 特別なことをしているようには見えません。
>>596-598 RtlQueryRegistryValuesで読めました。
引数悩んだけど、なんとかなりました。
thx
>599 .inf(inx)
まず、カーネルモードドライバといっても実際にはサービスのようなものがある デバイスマネージャで非表示デバイスの表示をやると出てくるやつがそれだ。 そこに登録されているものは、すべてのデバイスの列挙が終わってから DriverEntryが呼ばれる。 DriverEntryでの処理が適切であれば、AddDeviceがすぐに呼ばれるはず AddDevice内で正式に処理を行う。 で、普通のドライバかカーネルモードサービス(という表現を他のところで見たが これの正式な言い方は知らない)をどこで区別してるかというと HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services が本体のエントリポイント。 だから手順を知っていればInfすらいらないはず まあ、Inf使ったほうが確実だとは思うけどね。
>>601-602 トンクス。(599じゃないけど
自分で追ってみたんだけど、Servicesセクションの、AddServicesディレクティブで指定したセクション内で、
StartType = 3 ; SERVICE_DEMAND_START, bulkusbの場合…PnPで検出する場合はこちら
と指定するか、
StartType = 0 ; SERVICE_BOOT_START, ramdiskの場合…OS起動時に必要なデバイスはこちら
の違いだと、思ってるんですが、、あってます?
あとお聴きしたいんですが、
ramdisk(StartType=0?)の場合、AddDeviceに渡されるPDOって何なんでしょうか?
他のデバイスの場合は、バスドライバが作成した何かだと思うんですが…
604 :
603 :2008/06/03(火) 00:13:00
StartTypeはなんか違いますね。 modelsセクションのhw-id, ramdiskサンプルでいうと以下のRamdiskのところ(普通のバスならベンダIDやプロダクトIDが入る)に、 テキトーなIDを書いておけば、デバイスの有無に関わらず、AddDeviceが呼ばれるようになるのかな? [Manufacturer] %MSFT% = DiskDevice,NTx86 ; For Win2K [DiskDevice] %DiskDevDesc% = DiskInstall, Ramdisk ; For XP and later [DiskDevice.NTx86] %DiskDevDesc% = DiskInstall, Ramdisk このhw-idは、PnPデバイスならデバイスが接続されたときのinfファイルの探索に用いられるのか。
605 :
603 :2008/06/03(火) 01:14:27
「ハードウェアの追加と削除」でRamdisk (WDF版)をインストールしたところ、 Walter本(15章)でいうHardware (instance) keyが、 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\Root\UNKNOWN\0000 として 登録された。 (USBだと HKLM\SYSTEM\CurrentControlSet\Enum\USB 以下にHardware keyが来る。デバイス1つごとに。) 察するに、Ramdiskのような非PnPデバイスは、OSの起動時なりにこのEnum\Root以下のキーがすべて対応するドライバにPDOとしてAddDeviceされるんかな? ご意見かポインタきぼんぬ。
606 :
603 :2008/06/03(火) 01:34:37
walter本の2章に書いてあるわ…<root bus。 ちゃんと読まなきゃダメだな。スレ汚しスマソ
607 :
デフォルトの名無しさん :2008/06/05(木) 17:31:44
WinDBGの使い方について教えてください。
プリンタドライバ開発を始めようというところで、ソースコードデバッグがしたいのですが、
ブレークポイントの設定ができずに悩んでます。
1.サンプルをServer 2003 Checked x86 でビルドし、インストール・実行はできた。
2.そこでできた.pdbと.dllとソース類をまとめて解析用マシンにコピーし、Symbol Path、SrcPath, Image Pathに追加。
3.src*c:\test*
http://msdl.microsoft.com/download/symbolsとやって 、何やらダウンロードはできている模様。
4.解析用マシンからBreakし、F9などでブレークポイントを入れても、その行の色が変わらない。
5.Edit - BreakPointダイアログを見てみると、ブレークポイントが追加されているみたいだが、
「0 eu 0001 (0001) .....」となっており、「unresolved」らしい。
C.印刷実行中にメッセージボックスを出し、そこで解析用マシンからBreak。
D.Step実行をすると、アセンブラが表示されて1行ずつ実行されているような雰囲気。
どうもシンボルが読み込めていない気がするのですが、どうすれば良いでしょうか?
>>607 4の時点でだめだね
使ってるモジュールがリリース版になってるなどして
ロードしてるモジュールとシンボルが一致して無い。
ロードしてからコンパイルしなおしてるとか
ちゃんとファイルがコピーされているから
日付、サイズをちゃんと確認すべし。
src*
>>608 レスありがとうございます!
1.実行用マシンの Server 2003 Checked x86 でリビルドし、プリンタインストール。
2.すぐに解析用マシンにソースとpdbファイルなどをコピー。
3.実行用マシン再起動
としてみましたが、結果変わりませんでした。
何か基本的な手順を抜かしていたりしませんか?
あと基本的な質問なのですが、
実行用マシンで印刷が実行されると、それに必要なモジュールが解析用マシンにロードされるのでしょうか?
そしてモジュールがロードされた後に、pdbなどのシンボルを探してロードするのですか?
>>609 すみません、タイプミスでした。
実際は srv にしていたので、そこは大丈夫かと思います。
ああ、ごめん、プリンタドライバってユーザーモードで動いてるっぽいね (DLLって言われた時点で気がつくべきだった) カーネルデバッグできるのはカーネルモードだけだった気がする だから、VisualStudioか、WinDbgで、起動してるプロセスにアタッチするように するしか無いんじゃないかな
じゃあ根本的に違うことやってたんですね・・・orz プロセスにアタッチって1台のマシンでやるわけですか?
デバッガから印刷しなければ1台で問題なし
デバイスドライバインストール時に、EXEを実行したいんだけど、 INFファイルから起動かけるのって無理かな? 逆に、EXEからINF実行って仕組みが一般的?
>>612 デバッグするマシンにWinDbgいれれば1台でできるし
開発マシンから見たければ、リモート設定すればできる。
ただ、どっちにしろ、パスだのログインだのアクセス権だの
結構めんどくさい&ひっかかるので注意。
>>614 ExeからInfならSetupDi系関数なら簡単じゃなかったかな
ドライバインストール時に呼ばれる個別設定はCoInstallerDLLだったような・・・
616 :
デフォルトの名無しさん :2008/06/09(月) 00:42:13
>>613 デバッガから印刷しなければ1台で問題なし
そもそもWinDbg自体から「プリント」はできないはずでは?
WinDbgを入れて、スプーラにアタッチして
それから、メモ帳などを開いて、印刷実行
これでマシンは1台でOKですよね?
ブレークポイントがうまくつけられない orz
617 :
610 :2008/06/09(月) 13:33:11
レスしてくれた方ありがとうございました! プロセスにアタッチして、とうとうデバッグができました・・・(;*´∀`*) 「ファイルに出力」ってのを選ぶとプリントプロセッサが動かないらしく、 何もつながってないポートを選んで印刷したらブレークポイント設定できました。 VisualStudioでもデバッグできたので、ビルドもできれば楽になりそう・・・
618 :
デフォルトの名無しさん :2008/06/12(木) 20:52:15
プリンタドライバのCOREソースコード中に CreateFile(filename〜)を指定して、ファイルを作り出そうとしているんですが うまくいきません 無論fpt=fopen("log.txt","w") などしても 無駄です。 OUTPUTとしては「印刷物(中間ファイル)」と「コード中に外部ファイルに 書き込んだファイル」 を考えているのですが、、、、ドライブのソースコード中に何を 書いたら外部ファイルをつくりだすこともできるんでしょうか? 要するにコンソールでいえば、fopenして外部ファイルに書き込んで チェックする作業をドライバでもやりたいのです。
>>618 コンパイルエラーとかはないの?
デバッグでステップ実行してみたら?
俺は印刷データをビットマップファイルに保存するのに成功してるから、
普通のログファイル作成も問題ないはず。
620 :
sage :2008/06/12(木) 23:27:10
MIDIストリームについて教えてください。 AVStreamのMiniDriverとしてUSBAudioドライバを作っているのですが、 MIDIのストリーム転送機能で、KS(KernelStream)から送られてくる MIDIデータに不明なデータがあります。 KSから送られてくるMIDIデータは、 不明データ(4バイト)+MIDIメッセージ長(4バイト)+MIDIメッセージ(可変長) の形式で繰り返し送られてきます。 不明データと書いた最初の4バイトが何を指すものか 知っている方がいたら教えてください。 USBAudioドライバからデバイスには、USBMIDIフォーマットで 転送するため、MIDIメッセージ以外のデータを送る事はないのですが、 制御かなにかで必要となるデータなのでしょうか? 宜しくお願いします。
>>620 sageさん、思いっきりAGEてるんですけど><
老師! WDKをVSに統合したいんですけどどうすればいいんですか? アプリみたいにVS上でIDEを使って開発したいんです。 WDK: Server 2008 VS: VS2008Pro
>>618 APIつかってエラー出たならGetLastErrorが基本。
>>620 KS系はPinで定義してあるデータを送るものだから
Pinの定義を調べてみては?
>>622 ddkbuild.cmd
>>623 老師、感謝
今からGoogle先生を訪問します
>>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データのフォーマットを
探しているのですが、見つけられないでいます。
むむ タイムスタンプぢゃないのかしらん
627 :
デフォルトの名無しさん :2008/06/14(土) 23:20:24
>>623 定石をありがとう。感謝します。
CreateFile関数はどうやらプリンタドライバ中では使えない様
なんですが、、ZwCreateFileという関数があるのですが
それならプリンタドライバ中でも使えるのか今確認していますが
何か情報をお持ちの方は情報をお願いします。
最悪、スプーラに書き込みを行えばWinDbgなしでもDebug作業が
できることはわかりました。
>>627 ちょっと聞きたいんだが、仕事でプリンタドライバ作ってるの?
お遊びなら、色々試行錯誤して楽しむのもいいけど、お仕事ならきちんと基礎を身に付けてから
でないと、ユーザーに大きな迷惑をかけることになるよ。
周りにドライバを作り慣れた先輩とかいないの?
>>627 ではないが、ドライバのことを知ってる先輩はいない職場で、
勉強しつつがんばってくれ、みたいな感じで始まった。
仕事はいろいろともらっている2年生。
嫌ではないが、進んでやりたくはないという状況だなー。
だって全然わからんのだよ・・・orz
>>627 ソースがいま手元になくて分からんけど、
CreateFileWって関数かも?
Unicodeじゃないとだめって制限があるらしいので。
余計なお世話かも知れんが・・・
>>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サンプルを実際に動かしてみる(必要なら対象機器を
勉強用に会社に買ってもらう)のが良いんでは。
ドライバもだんだんユーザーモードで作れるようになってきてるみたいだけどね・・・
いや、プリンタドライバだからユーザーモードだろう
>>611 にも書いてるけど
ドライバって個別に常識があるから、一般的な話って本当にごく基礎的な話しかできなくて そういうのは定番の本で足りちゃうんだよね。 で、ドライバに関してはさらに特殊でカーネルモードですらないっていう これはMSDN、ぐぐる、サンプルソース見るしかない。 ユーザーモードについては一般的なプログラミング知識があればできると思うけど GetLastErrorを試してないあたりに、その知識も少ないと感じる。 セキュリティ的な面でユーザーモードといえども使えない関数があるかもしれないから 最低でもGetLastErrorで調べてみろってことなんだが。 とにかくがんばれとしか言いようが無いな。
WINUSBを使うDLLをX86とx64向けに両刀で書いてるんですが、 86用には普通にビルドできるんですが、64用にビルドすると 外部参照エラーになってしまいます。WinUsb_Initialize()とかの 関数が軒並みアウトです。 普通にリンカーの餌に、SDKのLib/x64ディレクトリにあるsetupapi.lib を与えてるんですけど。WINSUB.libなんてのも有りそうで無いみたいだし。 だれかわかる人がいたら教えてください。 環境はVC++2008 / Microsoft SDKs v 6.0A / WinDDK 6000です。
WINSUB 誤 WINUSB 正
>>633 どこを見てるんだ?
普通に DDK の lib 探したら winusb.lib が見つかるわけだが。
winusb.dll 使ううえにダイナミックリンクじゃないんだから lib ファイルがあるに決まってるだろ。
>>635 そんなに怒らないで。
>>633 の彼はドライバ開発したのとがないんだ。
だから、winusb.libも普通にVC2008やPSDKにあると思っている。
さすがに、setupapi.libを与えたには、ぽかーーーんとした
637 :
デフォルトの名無しさん :2008/06/19(木) 22:12:08
あの、先生方、WDKににmfc42ってlibやincがあるんですけど これ、ひょっとしてWDKでMFC4.2アプリ開発できるってことですか? あと、先生方はWDKをVSに統合して、IDE上でドライバプログラム書いているんですか?
それはコントロールパネルアプレットとかのドライバ付属の小物を開発するために 付いているのだとMSの中の人がどこかのMLで言ってた
俺の場合はVSと統合なんて無駄だな。使い慣れたgvimがあればいい。
>>633 それってドライバの話じゃなくてさ
ターゲット環境が変わったら、ライブラリも変えろって話でしょ?
そこらへんはC言語の基礎的な話なので、
どっかでちゃんと理解しといたほうがいいんじゃない?
>>637 できると思うよ。ただ、本来の機能全部入っているかはわからない。
Ioctlなどでドライバを操作したいユーザーモードアプリケーションを作ろうとした場合のためにあると思われる。
カーネルモードのヘッダと一緒にすると不具合が出る部分を出ないようにしたりしてるんじゃないかね
と、嘘かもしれないことを言ってみる。
開発環境は人による。秀丸にこだわってる人も居るだろうし、人それぞれ。
>>638-640 先生方すばやいレスありがとうございます。
自分が使っているVC2005expressでMFC使えないから、ひょっとしたら
WDKと連動してやるとMFCアプリのコンパイル(他人のソースを)できるようになるのかなと
思ったんです。小物のcplを作る程度の物しかそろってないですかね。あと、PrefastもVC2005express
で使えたら良いなと思ったり...
自分みたいなへたれですと、インテリセンスないとどうしようもない
何のtypedefなのか、構造体のメンバなんかがさっぱりなんでIDE必須なんですよね
で、WDKインストールしてもVSに統合されないから、他の人は自分で統合してるのかな
と思ったしだいです。ドライバー職人ぐらいになると、インテリセンス鬱陶しいし、
使い慣れたエディタの方がVSでやるより良いとなるんですか!
>>641 適当なプロジェクトを作って、ソースファイルを登録して
ヘッダーへのパスを通せば、インテリセンスも使える
エディタとしてならIDE使えるよ。
buildは、それぞれのコマンドプロンプトからだけど。
適切なコンパイル・リンクオプション渡してやればIDEでもできるだろ
エディタとビルドにしか使わないのにIDEと呼ぶのは抵抗がある。
645 :
デフォルトの名無しさん :2008/06/20(金) 21:28:28
おまんことおっぱいしか使わないのにデリヘルと呼ぶのは抵抗がある。
>>620 解決したのかな?たぶんKSMUSICFORMAT::TimeDeltaMsだよ。
staticdv使ってる?出てからずいぶん経つけど日本語の記事って無いもんだね
648 :
デフォルトの名無しさん :2008/06/23(月) 22:04:46
GDIINFO構造体で「余白」を制御できると聞いたのですが どのメンバで制御すればよいのでしょうか?。 それらしきものが見当たらないのですが・・。ちなみにプリンタドライバの 開発になります。
プリンタドライバはやってんのか
最近某企業が求人広告出しまくってたから その影響では?
自分のくっついているデバイスのデバイス名とかデバイスIDなどを知る方法ってあるのでしょうか?
Descriptor解析しろ。
>>651 「自分のくっついているデバイス」? 自分をEnumerateしたバスドライバのこと?
「デバイスID」? デバイスインスタンスIDのこと?
質問の意味不明。エスパー登場求む!
Windowsなら、デバイスマネージャから見れるんじゃね?
656 :
651 :2008/06/30(月) 21:48:59
わかりづらくてすみません。 例えば、Microsoft ACPI-COmpliant Embedded Controllerをデバイスマネージャのプロパティで見ると、 (少なくとも私の環境はですが)「一致するデバイスID」は*pnp0c09となっています。 これをドライバ内部から調べる方法がないかなと探しています。 もちろんコード中に文字列として"*pnp0c09"を持っていれば良い話なのですが、 そうではなくて、APIなどで、自分がフィルタドライバとしてくっついているデバイスの 「一致するデバイスID」やその他、プロパティの詳細タブで見れるような情報を 取得するような方法をご存知ないでしょうか?
>>656 IoGetDeviceProperty()や
IoOpenDeviceRegistryKey()からレジストリ読み取りで揃うんじゃね?
658 :
デフォルトの名無しさん :2008/07/05(土) 00:14:18
ユーザーモードのプリンタドライバをデバッグしようとしていますが WinDbgは使えないのでしょうか?。 そもそもWinDbgはカーネルモードの(プリンタ)ドライバですよね?。 ご意見お願いします。
>>650 某企業ってどこ?
そこのプリンタは買わな・・・・(以下自粛)
660 :
デフォルトの名無しさん :2008/07/05(土) 10:03:32
キャノンだよ こないだあんあんからスカウトメールきた無視したけど
観音なら...当然超優秀な正社員がたくさんいるだろうから、ここで聞くよりそいつらにでも聞けば良いのにな。
なんだかんだいってもソフト部分は外注多いよ。
キャノソくらいだとハードも外注だと思ってた
WinDriverって使い勝手いいですか?
665 :
デフォルトの名無しさん :2008/07/28(月) 00:39:17
オマンコ臭いスイーツは開発すんなよ
PS2マウス(だけ)に連射機能とかつけようと思い、 フィルタドライバのっけて座標やボタンの状態を取得できるところまできたんですが、 連射させるところで行き詰まってしまいました。 ボタンを押したら Read が発生するんですが、次に離すまでRead がこないので ボタン状態を変更しようにもできません。 なんとかしてボタンを押したことにしたり離したりしたことにできないでしょうか? できるものなら何かヒントをお願いします。
>>666 フィルタかけるところが違うんじゃないか?
668 :
666 :2008/08/13(水) 12:29:51
そんな気がしてきました そこらへん調べてみます ありがとうございました
>>666 もしかしてIRP_MJ_READにデバッグ出力を入れただけだとしたら
下位のドライバがpendingにしてるから次のreadが来ないのでは。
>>669 どうもです。恥ずかしながら私がアタッチしてたのはリモートデスクトップ用の
マウスクラス(?)のようで、ACPI のほうにアタッチしたら今度はREADそのものが
こない状況になりました。
DDK サンプルの mouclass やら moufiltr を見ると根本的に間違っていた気がします。
とは言え、moufiltr は USB マウスにアタッチしても Read 処理ではなく
MouFiltr_ServiceCallback() で処理するようになっていますが、GPAF のソースを
見ると(ゲームパッドとは言え)、Read で Hid 処理をしてたりするのでゲームパッドと
マウスの構造は同じ Hid でも違うのかなぁ、なんて思ったり。
結局、PS/2やUSBの選択、どの上位フィルタとして作るのが良いのかわからない状況に
なってしまいました。
今は本買って基礎からお勉強中です。フィルタドライバにまで関して言及してある
書籍って少ないですねぇ。
>>670 ボタンに連射を付けるだけなら普通にmoufiltrで十分だとは思うけど。
連射発行タイミングをチェックするスレッドで
必要に応じてServiceCallback風の動作をすることと、
次の要求が来たときに下位ドライバにコマンドを発行せずに
スルー処理を追加する必要があるはず。
>>671 どうもです。その ServiceCallback 風の動作をするというのがなかなか敷居が高そうで・・・
海外掲示板とか覗いていたら
「WRITE 時に mouclass の ServiceCallback をコールしたらBSOD になったけどどうすれば良い?」
みたいな内容のスレッドがあって結局未解決のようでした。
とりあえず、そのせんで行ってみて色々試して見ます。
673 :
672 :2008/08/21(木) 22:26:24
KTimer と KDPC 使って ServiceCallback 呼び出したら難なくいけました。 ありがとうございました。 ところでフィルタドライバは動的にアンロードできないと聞いたんですがXP や VISTAでも無理なんでしょうか? SCManager 使ってドライバを停止および削除して、SetupDIでフィルタ対象デバイスを再起動させると フィルタはされなくなるんですが、ドライバそのものはアンロード処理されずにロードされっぱなしになってるようで… 単なるつくりの問題ですか?
ん? 普通にデバイスいなくなったら元ドライバとセットでアンロードされると思うんだけど。 それでアンロードされてない、ってことは終了処理にミスがあるんじゃね? スレッド終了うまくいってないとか。
675 :
673 :2008/08/22(金) 23:21:10
そうなんですか。。。 もっと調べてみます。どもでした。
>>673-674 フィルタドライバがWDMならデバイスを抜くとフィルタドライバも開放されるんだけど
私がHIDでやったときは、WDMだとうまくいかなかったのでNTドライバにしました。
そうするとデバイスを抜いただけではアンロードされないですが、SetupDI系の関数で
アンロードさせることはできます。
自分もWDMのフィルタドライバではまってる。 USBデバイスのフィルタドライバを書き、そのデバイスに対し SetupDiSetClassInstallParamsでDIF_PROPERTYCHANGE/DICS_PROPCHANGE指定して SetupDiCallClassInstallerを呼び出しいる。 で、無視できない確率でドライバアンロードに失敗する。 自前ドライバの処理でIRP_MN_QUERY_REMOVE_DEVICEに対し STATUS_SUCCESSを持たせて下位ドライバを呼び出しているのに、 IRP_MN_CANCEL_REMOVE_DEVICEが飛んでくる。 これって、下位ドライバがリムーブを拒否してるんだと思うが 何が原因かわからん。 何か思いつく事があったら教えてください、皆の衆。
>>676 ありがとうございます。
アンロードされずに残ったドライバを、DriverWalker などでアンロードさせようとしても失敗しちゃうんですよね。
何か解放してないんでしょうねorz
Lowerに要求を投げるだけのなにもしないフィルタドライバ書いて 動きを見てみればいいんでない?
681 :
デフォルトの名無しさん :2008/08/25(月) 23:38:07
作者に聞け
682 :
まつせ :2008/08/25(月) 23:49:32
ありがとうございましたm(_ _)m
WinDbgの1394接続のカーネルデバッグについて質問です。 Host:Vista or XP、Target:Vistaの構成で1394接続って可能ですかね? 手順通りにやってもうまくいきません。
>>683 Host XP Target Vistaで普通にできてる。
だが、使っている1394アダプタによっては動かないことがある。
VIAの古いチップではだめだった。
外人でも似たような人はいるが具体的な話はまだ見たことが無い。
ホスト側はTIのチップつんだやつにしとけ ぐらいしか書いてないが
今時はTIのチップ積んでることなんてあまりないので難しいかも。
手順に問題が無いのであれば
とりあえずホスト側の1394の交換をしてみることをオススメする。
685 :
693 :2008/08/27(水) 22:37:11
>>684 ケーブルを疑って新しいケーブルに交換したらうまく動きました。
別のマシンでは動いていたんで、まさかとは思ったんですが・・・
Vistaは1394ネットアダプタがないんで通信できてるのかよくわかんないですね。
ともかくありがとうございました。
質問させてください。 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
同じ環境だが、普通に何もせず build できたが?
688 :
686 :2008/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インストールしてあるのは関係ないですよね・・・?
video\displays\mirror\ で build してエラーでるとか言ってないだろうな
って、ごめん、自分で作ったやつか。 SOURCE とか makefile はちゃんとコピーした?
691 :
686 :2008/08/28(木) 23:30:26
>>689 フォルダ別に作ってMAKEFILEとSOURCESをコピーして
SORCESの"TARGETNAME"と"SOURCES"だけ編集してビルドしてます。
とりあえず、 #include <wdm.h> NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING pRegistryPath) { NTSTATUS ntStatus = STATUS_SUCCESS; return ntStatus; } だとどうよ?
693 :
686 :2008/08/28(木) 23:46:16
>>692 レスどうもです
これだと問題なくビルドできます
video.hをインクルードすると無理ですが・・・
サンプルのほう見ると PDRIVER_OBJECT ではなく PVOID で宣言してるね。 video.h とか使う場合は wdm.h とかの include 無理なんかな。
695 :
686 :2008/08/29(金) 00:08:35
>>694 そうなんですよね
サンプルのようにDriverEntryの戻り値型と引数型を変更すると
ビルドできるんですが、DriverEntryってどこ調べてもNTSTATUSと
PDRIVER_OBJECT、PUNICODE_STRINGで定義されてるので・・・
WindowsのMiniportドライバはWDMではない。 これはドライバ開発をする人が誰もがはまる。 WDMドライバを開発=フィルタドライバorクラスドライバ だが、ある程度共通化できるルーチンが多い場合に備えて クラスドライバをMSが用意し、そこからリクエストをするのがminiportドライバ miniportでは専用のライブラリ関数が用意されていて それら以外の関数は使ってはいけない。 したがってntddk.hをインクルードできないし、してはいけないし MSは共存させるつもりもない。 それでも無理やりやるのは完全にハックになり サービスパックやパッチが当たっただけで動かなくなる可能性がある。
SCSIミニポートドライバなんてカーネルがロードされる前に呼び出される可能性すらある
それはSCSIミニポートだからではなくレジストリの設定で決まる。 ServicesレジストリのStartキーが0ならブートローダーのときに呼ばれる。 起動ディスクを読み込むのに必要なデバイスのStartキーはすべて0になっていないと0x7Bが出る。 OSインストール時にIDEデバイスとか登録されてはいるが カーネルメモリ節約のために必要の無いデバイスはStartが4になっている。 そのためディスクを付け替えたりすると起動しないことがある。
質問があります。 minispy、filespyサンプルの処理内容を理解するのに役立つ書籍や入門サイトがあったら教えていただきたいです 目的は、ファイルの上書きやコピーなど高レベルなファイルI/O監視ドライバを作成することです(フックではなくドライバで行いたいです) サンプルでは低レベルなIO情報まで監視されてしまうため、これを改造できないかなと考えてます 自分は、ドライバ開発経験はなしです。キーボードのフィルタドライバサンプルは、日本語の書籍で勉強し、軽くは理解しています。 …ソースコードが少ないminispyを理解したいんですが、ミニドライバの資料ってあまりみたことないです
>>699 違ったらよいんだが、
Windows XP フィルタドライバプログラミング [入門と実践]
を読んで「軽くは理解しています。」と思っているなら認識改めたほうがいい。
あれで得た知識(見たサンプル)は全く役にたたない。
>699 素朴な疑問だが上書きやコピーといった監視だったら、ドライバつかわんでも FindFirstChangeNotification()という手もある。 これじゃあなんかまずい理由あるの?
>>700 フィルタドライバプログラミングではないです。それは参考にしてないです。
API徹底理解っていうムックと。Cマガのバックナンバーです。
「ダミー関数はこんな感じで作って」、「でもPnPのダミー関数は別」ってことくらいしか理解してないです。
filespyを見ても、「なんでこのファンクションを監視するんだ?」って疑問しかわかないんです。かと言って、USBドライバを最終目標にしてる書籍はfilespyの世界とは畑違いな気がして
>>701 あのAPIの詳細は知らないんですが、ファイルを操作したユーザー名やアプリケーション名が取得できるならやってみたいです。
ただ、ローカルだけでなく、リムーバブルやサーバーやネットワークPCも監視が条件なので
ファイルシステムの監視ならminifilterでフィルタドライバ書けばいいよ ローカルならPIDが入ってくるからそこからユーザートークンに変換すればいい でもネットワークドライブはまた別の話になるよ リモートのPIDなんか分かってもしょうがないしね そもそもSMBのリダイレクタのPIDしか入ってこないだろうし
というか、ファイルを開くとか、そこから読むとか、書くとかは判るけど、 それが上書きなのかコピーなのかというような意図?は、カーネルレベルでは 失われているような気がするんだけど。
ソースと関数リファレンス見ても分からんって事はOSの知識が足りないんじゃねーのか? まずはWindows Internals(和訳名インサイドWindows?)読んでみたらどうだ。
>>704 フィルタドライバで分かるのは削除と同じボリューム内の移動だけだね
というかやりたいこと具体的に言わんと
707 :
702 :2008/08/31(日) 10:10:41
>>703 minifilterで作っていきたいと思います。ネットワークからリモートログインしてきたユーザーの監視はしません。自分がリモートで操作したファイルは監視します。
>>705 ドライバ系のAPI知識はゼロに近くて、ファイルシステムのフの字も知らないです。インサイドウィンドウズの購入してみます。…でも金がないので会社から借ります
>>706 やりたいのは、フックベースで実現できていたファイル監視をドライバに移植することです。
>>704 コピーや上書きは、フックベースでも追いきれないとこがあったんで「ReadFileで処理したアドレスがWriteFileで処理されたらコピー扱い」みたいなマージをしており、ドライバでもマージしようかなと考えてます
長い旅路になりそうです。ありがとうございました
WDMのドライバをリモートからデバッグしようと思い、 シリアルクロスケーブルを購入したのですが、 どちらのPCにもシリアルポートがないようなのです。 調べてみたところ、USB シリアル変換機というのを利用すれば、 それを経由してシリアル通信ができそうなのですが、 この変換機はPC1台につき1個、つまり2個必要であると考えて問題 ないでしょうか。 また、クロスケーブルではなく、ストレートのシリアルケーブルでは、 デバッグはできないものなのでしょうか。
HOST側はUSB-Serial変換でいいけど、TARGET側では無理。
そうでしたか。 つまり、シリアルポートがない場合は、 リモートからのデバッグはできないと。 デバッグといっても、DbgPrintの結果を確認したいだけなので、 ローカルでDebugViewを使う方法でもよいのですが、 リモートの方法も気になるところです。
>>708 >また、クロスケーブルではなく、ストレートのシリアルケーブルでは、
>デバッグはできないものなのでしょうか。
時代が変わって、232cなんて使わなくなってきたのは分かるが・・・
XPはFireWireとかでも使えなかったっけ?
713 :
デフォルトの名無しさん :2008/09/02(火) 22:29:21
Windows用USBデバイスのインストーラ及びアンインストーラをVCで 作ってます。 汎用性を持たせるためにinf及びdelファイルを書き換えるだけで インストーラ、アンインストーラは再コンパイル不要とした作りに したいと思っています。 そこで、特定のINFファイルから"USB\VID_xxxx&PID_xxxx"を 抜き出して行うような方式としたいとおもうのですがなにか 方法(Win32 API)は無いでしょうか。
インストールアンインストールだけだったらDPINST使えばいいとおもうがどうか。 INFが適切なら実行するだけでインストールしてくれる あと、DPINSTをAPI化したDIFとかいうやつもある。
715 :
713 :2008/09/03(水) 21:16:14
>>714 たしかにINFのみでインストールだけなら可能なのですが、
コマンド等でカスタマイズも考えているので...
で、自ら調べた結果、GetPrivateProfileStringが
INIだけでなくINFにも使えそうなので、これを組み
合わせて作ろうと思うのですが他に何かいいアイディアは
ありますか?
いまいち何がしたいのかよくわからんが dpinst を自作したいなら DriverPackageInstall 使う
717 :
713 :2008/09/10(水) 13:20:32
GetPrivateProfileString及びGetPrivateProfileStringで 何とかできそうです。 ありがとうございました。
DDK サンプルの kbfiltr を x86 VISTA 上で PS/2 キーボードのフィルタドライバとして インストールしたのですが、なんだかロードされてない感じがします。 (KdPrintなどのデバッグメッセージが表示されない) 起動時に読み込まれるドライバには署名が必須という条件にひっかかかっているのかと思い Bcdedit.exe /set nointegritychecks ON を実行してみましたが何も変わりませんでした。 VISTA にインストールするにはどうしたらよいのでしょうか? ちなみに XP だと問題なく動作しました。
>>718 フィルタされてるのでは。
KdPrintExかDbgPrintEx使ってみたらどう?
テスト用の署名はしたん?
x86はまだ署名はいらんと思うが
722 :
718 :2008/09/16(火) 10:32:18
724 :
718 :2008/09/16(火) 22:13:50
>>723 存在しないことになってたんですねorz
テスト署名してみたところ、無事ロードされるようになりました。
でも HD DVD とか Bluray とか再生できなくなるのかな・・・?
みなさん、ありがとうございました。
x64じゃダメだろーけど、x86なら自分で署名して、それを信頼する発行元とかに突っ込めばなんとかならんもんかね
726 :
デフォルトの名無しさん :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 を受信したときに、 頻繁にブルースクリーンが発生します。ファイルサイズが小さな場合は成功するときもあるのですが・・・ スレッド間での排他処理を記述しなければならないのかなとも思いましたが、単にリクエストを下位デバイスに渡すだけでも そういった処理は記述する必要なのでしょうか?
>>726 その問題のソースをどこかにアップして、ブルースクリーンの内容を全部書けば
すぐ解決するのになんで答えを省くかな
フィルタドライバのサンプルminispyで日本語ファイル名が取得でっきん(´・ω・`) サンプルでは、ドライバ側のFltGetFileInfomationでファイル名取得しとんがやけどその時点てとれるんかな。今日デバッガ準備して確認するけど。暇な人、教えてください(´・ω・`)
ウニコードからアンシーに変換してデバッグプリントしたらちゃんと日本語名格納されてました。ごめんなさい(´・ω・`)
>>726 ブルースクリーンの内容を書かないと何もいえない。
まずはBSODへの対処の仕方を
MSDNでよく読んで実践してみることをお勧めする。
ただ、フィルタードライバーのR/Wでそういうことが起きているということなら
バッファの取り扱いが適切で無いと推測する。
ファイルシステムの場合、R/Wへのアクセスが3種類ぐらい来るので
それらを適切に扱わないとすぐ問題がでたはず。
>>729 %sではなく%wsとするとちょっといいことがあるかも。
>>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
続き.以下のようなコードで,フィルタドライバを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 に値を設定するということでしょうか?
とりあえず、FastIoDispatchを埋めてみるとか。
734 :
727 :2008/10/14(火) 13:30:12
>>731 733さんが正解。
NtWriteFile内のIoGetRelatedDeviceObject()でトップレベル
(あなたのドライバ)のDriverObjectを手に入れて
DriverObject->DriverObject->FastIoDispath->FastIoWrite()でクラッシュしてる。
ebxがFastIoDispathでこれがNULLだから[ebx+0C]にあたる
FastIoWriteをコールするときにds:0023:0000000Cを参照。
>>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 など)と“ファイルが見つかりません”
のメッセージが表示されうまく行きませんでした.
後者のファイルもうまく開くようにするための良い方法はありますでしょうか?
質問ばかりで申し訳ありません・・・
何か良い方法などがありましたらお願いします
x86 の XP/VISTA で makecert でテスト用の証明書を作り、 signtool sign /v /s my /n testca test.sys でドライバファイルに埋め込み署名したところ、ファイルのプロパティの デジタル署名タブでは「問題ありません」になるのに、CreateService() で登録してデバイスマネージャのドライバの詳細で確認すると 「デジタル署名されていません。」になってしまいます。 これはテスト証明書だからでしょうか?それとも何か手順が漏れているのでしょうか?
>>736 テスト証明書だからですね。
テスト証明書を「(あなたが)信頼する発行元」として登録したので、”ファイル”のプロパティーでは「問題ありません」になります。
が、テスト署名の手順ではその証明書(のルートの証明書)へのマイクロソフトのCross-Certificateができないため、
その署名はカーネルモジュールへの署名としては「”マイクロソフトからは”信頼されない証明書による署名」になります。
>>735 redirect先に、ファイルを作る。
>>737 ありがとうございます。
ということは正式な証明書をとれば大丈夫そうですね。
しかし、日本で頼むと6万とか9万超とかなんであんなに高いんだろう。
740 :
デフォルトの名無しさん :2008/10/19(日) 18:37:59
ご相談です。 WinXP環境でドライバ設計中に、PAGE_FAULT_IN_NONPAGED_AREA(0x00000050) という文字を吐くブルースクリーンが頻度は小さいですが出ます。 通常、ドライバの問題であれば、設計中のドライバの名前が表示される ブルースクリーンが表示されると思うのですが、原因を検討中です。 どういった原因が考えられるか同じような問題に出くわした方がいらしたら ご教授願います。 ちなみにドライバが画像処理ボード用です。
事情も知らずに失せろは如何なものか 日本に来て勉強しながら頑張ってるのかもしれないぢゃないか
たとえそうであっても、来るなと言うよ。
とりあえず自国民に聞けでFAじゃなかろうか
指定のドライブを読み取り専用にしてしまうフィルタドライバを作りたいんですが そういうのってminispyサンプルを改造すれば実装できるでしょうか? 試しにドライバ側のソースを下記のようにいじってみたんですが読み取り専用にはできませんでした PreOperationコールバック関数内で PFLT_CALLBACK_DATA->Iopb->MajorFunctionがIRP_MJ_CREATEのときに FLT_CALLBACK_DATA->Iopb->MajorFunction->Paramamters.Create.SecurityContext->DesirendAccessにGENERIC_WRITEを代入 アタッチしたドライブのIRPを読み取り専用に書き換えるっていうイメージだったんですが、正常に読み書きできましたorz
読取のcallbackが着たら、テキトーに弾く。 でも、開くときに弾く方が、OSの挙動として正しいと思う。
今カーネルモードのデバイスドライバから CPUのプロセッサ数(コア数?)を取得する方法を探してるんだけど誰かおせーてー というかデバイスドライバはサンプルとか入門ページとか数なくてホントワケワカメ。 なんで、それ探すために 「WDMデバイスドライバプログラミング完全ガイド下巻」の購入を検討しているんだけど 関数リファレンスとかどこぞで公開されてないんでしょーか?
OpenLibSys参考にハードにアクセスして 詳細情報を自前で取りに行ったら?
>>747 とりあえず、
>「WDMデバイスドライバプログラミング完全ガイド下巻」の購入
は止めとけ。
ほとんどがNTドライバの話(WDMでもこの知識は必要だが)で、WDMについては下巻の後半のみ
>>748-750 うおー
ありがとー
リファレンス英語版のMSDNにはあるんだね
特にデバイス制御が目的じゃなくて
APIフックの為にカーネルモードで走らせれる環境が必要で
デバドラ作ってるんだけどガイド本はどうしようかな
しかしほんとに毎日BlueScreen何回見てることやら・・・
DeviceIoControl()のlpInBufferって参照渡しにできる?
>>752 参照渡しってDirect-IO(MDL渡し)のことか?
>>753 MDLはよくわからんが、多分そんな感じ
ドライバがIrp->AssociatedIrp.SystemBufferで取得したparamに値を代入した場合
アプリ側でその値は取得できるのかな?っみたいな。。
>>754 METHOD_BUFFEREDにして、lpOutBufferで読むとか。
>>752 が何をやりたいのかワカラン
ドライバ→アプリのデータを、アプリが用意したバッファにドライバがコピーするのでなく、
ドライバの持ってるバッファのアドレスをアプリに渡したいのか??(それは無理)
MDLを知らないってことは基礎知識が全く無いってことだよな、やめとけ
>>756 なぜにlpOutBuffer?
METHOD_BUFFEREDではドライバ側ではIN/OUT同一のバッファだけど、ドライバでバッファにセット
したデータは、lpInBuffer側にしかコピーされないよ
データ設定してDeviceIoControlするのが面倒だからポインタで渡して ドライバとアプリで同時に読み書きしたいとかそんなところ? 排他制御やら面倒そうだが名前つきのFileMappingで出来るんじゃないかな。 それはともかくWDK SP1が出たね。
複数ボタン同時押しで、別のボタン押下イベントが発生する、ゲームパッド用フィルタドライバを作ろうと思っているのですが、 ドライバ側で、パッドに実装されているボタン以外のイベント(17~32あたり)を発生させることは可能でしょうか?
>>759 やりたい事は、可能だと思う。
事前に、適当なreportDescriptorを返すとかで。
>>759 元からそのパッドに存在しないボタンに振り替えするのは
760が書いてるようにReportDescriptorをでっちあげる必要がある。
もちろんボタン数が増えてデータサイズが増えたら
Reportもそれに併せて手を入れないといけない。
やる気になればマウスだろうがキーボードだろうがHIDの機能なら全部振り替えできなくもない。
つーか箱○改造版ではキーボード振り替えやってる。
独自ドライバ使ってるデバイスの場合、フィルタでやっても
動作しない可能性があるので、独自にドライバ起こす方が無難。
CHの3点セット の造りみたいだな USBでぶっさした機器は直接 HID機器ではない扱いで HIDドライバが 4アナログ 32点 提供 それのマッピングは任意にできるぜ
763 :
759 :2008/11/05(水) 10:56:55
>>760-762 ありがと
とりあえずreportDescriptorでググってみたが、ezusbやpicのマイコン関連しか出てこない。。
もしかしてこれってWDMより外のはなし?
>>763 HIDの話しだからWDMの外と言われればそーかもな
>>763 USB.org行ってHIDのドキュメント漁ってくるのが確実。
あとは公開されてるゲームパッドドライバのソースを見る。
HID部分についてはWDM以外のLinuxとかでも同じなので
そっち系のソースを見る方が分かりやすいかもね。
「USAGE_PAGE」でググるとソースが見つかりやすい。
>>762 質問者は既存のゲームパッドの動作改造目的なんだから
「マッピング部分を差し替える=ReportDescriptorを差し替える」部分をやらなきゃいけないわけだ。
その方法論について聞かれているわけで、視点がちょっと違うんでない?
766 :
759 :2008/11/06(木) 12:24:36
ボタンの番号分かってんなら難しくないんでないの? ゲームパッドのレポートなんてあっても16バイト程度だろうし、 数回分のデータを見れば(アナログでも)データの配置も分かりそう。
>>766 あとはX360Cでググ。
フィルタならLowerでIOCTL_HID_READ_REPORTと
IOCTL_HID_GET_REPORT_DESCRIPTOR差し替えれば
動くような気はするけど。
>>767 上でも書かれているがレポートだけではなく、レポートディスクリプタを変更しないと
ボタンを増やすことはできないよ。
データの配置だけではなく、データの配置の定義を変えないといけない。
769 :
767 :2008/11/07(金) 18:10:58
>>768 そうか新たにボタンを定義するんでしたな。
レポートディスクリプタって何度PDF読んでも完全に理解出来んかったな…。
あれだけ複雑すぐる。
結局既存のモノをパクって終わらせた思い出。
770 :
759 :2008/11/12(水) 17:02:44
>>767-768 ありがと
つまりデフォルトのreportDescriptorのUsage Maximumを32に書き換えたものを、
IOCTL_HID_GET_REPORT_DESCRIPTORとIOCTL_HID_READ_REPORTで読み込ませればよいということでしょうか。
でもデフォルトのreportDescriptorってどこから取得すればよいのだろう。。。
>>770 そーいや標準HIDドライバへの登録で使う前に書き換えないといけないから
IOCTL_INTERNAL_USB_SUBMIT_URB
あたりで抑えておかないとダメか。
768で書いたのは無し、lowerでこっちだけ見て戻りデータも捕まえなきゃ無理か。
フィルタでやるよりソースのある既存ドライバいじって
独自ドライバ仕立てるほうが楽に見えるんだよなぁ。
772 :
デフォルトの名無しさん :2008/11/25(火) 03:03:43
デバイスドライバの開発の話ではないけれど・・・ あるドライバ(サウンドドライバ)があって、Windows起動時に それが読み込まれると、Windowsが落ちます。 だからセーフモードで無効しました。そしたら当たり前ですが、 普通に起動しても正常に起動できます。 正常に起動してからデバイスマネージャからドライバを 有効にしても落ちません。しかも正常に動いているようです。 (もしこの時点で何か思い当たること、試してみるべきことがあったら教えてください) そこで、Windows起動時はドライバを無効にしておき、起動してから有効にする方法を とりたいと思っていますが、有効にしてから再起動すると次回起動時は(有効なので) Windowsが落ちます。 そこで、Windows起動時にautoexec.batのような感じでドライバを強制的に無効にしてから 起動する方法は無いでしょうか? OSは2000ですがXPの方法でもかまいません。
馬鹿は消えろ
>>772 ドライバの起動順を適当に変更してみる。
順位を手動にしておけば再起動してもドライバはロードされない。
devcon.exe。
>>774 ありがとうございます。
devcon.exeは入れていたのですが、順位変更なんてできたんですね。
IDのことでしょうか? まあやってみます。
WindowsDDK内で,整数の型はどのようなものがあるのでしょうか? UNIX環境で言うstdint.h見たいな者を探しています
あるWindows用PCIデバイス&ドライバを解析して Linuxドライバとして移植しようかと思っているんですけど、 デバイスドライバに関してはまったくの無知なんですよね。 そこで簡単なPCIボードをあつかうWindows用デバイスドライバを 作ってみようかと思うんですけど、何か良いサンプル無いですかね? PCIボードが簡単に手に入って、ドライバのソースも公開されていて、あまり複雑でないもの。
( ´-`).。oO(PT1がターゲットかな…)
フィルタードライバー作ってるのですが DO_POWER_PAGEABLEプラグってどういった意味があるのでしょう とりあえず立てて電源周りの処理もサンプルみながら実装できましたが わからないと気持ち悪くて
>>780 thx
それを踏まえてヘルプとか読みあさったらなんとなく理解できました
VistaSP1でipfltdrv.sysが動作しないんですが、 これを無理やり動作させる方法ってないですか? (WinObjではちゃんと表示されているのですが、動作していない様子です、、、) ndis使うしかないのでしょうか?
buildコマンドで別途インクルードパスを指定したいのですが どうすればよいのでしょう?
784 :
でるたん :2008/12/17(水) 15:57:41
USBドライバを作成しています。 バッファが少なく、 転送の間隔があいてしまうと、 バッファがあふれデータが喪失してしまうデバイスがターゲットです。 ReadFileを同期的に呼び出すと前のReadFileの完了の処理をしてから 次のReadFileを呼び出すまでの間にデータが喪失してしまいました。 ReadFileを非同期的に複数回呼び出し 完了したものを処理して再びReadFileを呼び出すようにしたところ、 ReadFileの呼び出しの間にデータが喪失する現象は解決しました。 ところが、数時間動作させるとReadFileが 要求したサイズを受信したわけでもなく、 ショートパケットを受信したわけでもないのに早まって完了してしまうことがあります。 ReadFileを1回しか呼ばない場合はこの現象は今のところ確認できていないのですが、 前述のようにデータが喪失してしまいます。 作成したドライバでは特にキュー等は作成しておらず(作成方法もわからないのですが)、 単に下位のドライバに要求を投げています。 ReadFileを複数回呼び出すのはいけないことなのでしょうか? よろしくお願いいたします。
>>783 sourcesファイルにINCLUDEセクションってなかったか?
>>784 非同期ってオーバーラップ使ったんだよね?
あれはリクエストが終わったらリクエストが来るまでの
待ち時間に別の処理するためだけにあると思ったほうがいいのではないか。
複数回リクエストと書いてあるが、オーバーラップのリクエストを待たずに別のリクエストを出したときに
デバイスドライバの中で適切に処理できているのか確認してみた?
ReadFileってアプリか何かでやってるんだよね?
単にファイルに書けばいいだけだったら、データ受信した瞬間
構造体作ってキューに溜め込んで別のスレッドでファイルに書き出すような処理を
ドライバに入れちゃったほうが早いかもしれない。
786 :
でるたん :2008/12/19(金) 19:24:07
>>785 返信ありがとうございます。
> 複数回リクエストと書いてあるが、オーバーラップのリクエストを待たずに別のリクエストを出したときに
> デバイスドライバの中で適切に処理できているのか確認してみた?
そのままUSBバスのドライバに渡されているので
その先でどうなっているのかはわからないです。
何か調べる方法はあるのでしょうか?
大抵は期待したとおりに動いているのですが、
たまたまうまくいっただけなのでしょうか?
デバイスはカメラで映像データが垂れ流しで送られてきています。
ファイルには保存しておらず、単にメモリへ取得できればよいのですが。
垂れ流しなら、多少消えたところで、問題は無いね。
USBドライバ作成って書いてあったから カーネルモードだと思ってたんだが違うのかな。 私の返事はカーネルモードドライバ+アプリだと 思って書いたので違うかなー。 単純に速度を一度調べたほうがいいと思うよ。 取りこぼしが出たときにタイミングが異常にずれることがあるかとか。
790 :
デフォルトの名無しさん :2008/12/29(月) 19:30:17
WDMデバイスドライバプログラミング完全ガイド上下買ってしまった、、 理由は、買えなくなる前にかっておこうかと、、 宝くじ買ったほうが良かったかな。
>>790 個人的にはオレンジのウォルターオニーさんのほうがオススメ。
基本的な概念はそれで、あとはWDKのドキュメント、サンプルとにらめっこ。
Vista以降、署名の問題で個人のドライバ作成が事実上アウトに されたのが痛いな。
32bitは警告が出るだけでいいんだけどね。 64bitは署名必須になっちゃったし 次のOSでは32bitも必須になるだろうし もうドライバ趣味で作ったりとかできないね。 ので、Linux勉強している自分がいる。
>>794 これからはデバイスドライバの類はユーザーモードで動くようになっていくんでしょう。
趣味で作るだけなら署名無効にすればいいのだしね。
ブートやその他カーネルモードドライバを公開しにくいのは残念だけど
それらのドライバがWindowsの不安定さの一員でもあったのだからしょうがないよ
アホか? 署名無効にできないから問題なんだよ。 毎回F8なんてやってらんね。 それに署名付きが高品質とは限らんし。
799 :
デフォルトの名無しさん :2009/01/07(水) 22:48:27
時間のかかる計算ってドライバの中でやるのと 外で計算してからdeviceiocontrolとかでドライバに結果渡すのとで速さに違いある?
>>799 >時間のかかる計算ってドライバの中でやるのと
するな。
IRQL = PASSIVE_LEVELなら問題なし。
>>797 落ちる落ちないみたいな品質面もあるけどセキュリティ面もでかい。
また、ウェブサイトが乗っ取られるようなことがあって擦り返られても平気になる。
>>802 でかくねーよ。
ドライバロードさせられる権限あればドライバ使わんでもOS乗っ取れる。
>>804 単にPC乗っ取ったり、破壊するだけならそうだね。
C++でドライバってどうよ? どうよ?
別に
808 :
デフォルトの名無しさん :2009/01/30(金) 14:16:03
ゲーム用にキーボード入力をアプリケーション側で操作するソフト作りたいんだけど, とりあえずWindowsXP用のデバイスドライバをプログラミングする良い入門書とかある?
アプリでやらない理由を教えてくれ。
ネトゲのBOTかマクロを作ろうとしてユーザモードからだと弾かれるからだろ
うんそうです.
>>808 USBチップ積んだ回路にPICとか使ってキーボードやゲームパッドを直接制御した方が簡単だよ
マイコンとか更に知識なくて大変そうだ とりあえずVMにXP突っ込んで試してみるお
>>808 入り口から聞く様じゃ作れないな
俺もその用途でドライバ作ったが、結局なんかあったら聞こうと思って開いてたこのスレで
改めて聞くことなんか何も無かった
本も要らない
ググれば全ての必要な情報が揃う
箱○ドライバのソースと、仮想HIDドライバのソース組み合わせれば可能だしな。
ネットワークのパケットキャプチャのように、 USBのデバイスとのやりとりのデータをキャプチャするソフトはありますでしょうか。
SniffUsb
6001.18002に変えたら2 Warningsとか出るようになったお…… ignoreされてんのかwrnに出ないし、動作するけど気持ち悪いんだお(´;ω;`)
820 :
デフォルトの名無しさん :2009/02/12(木) 09:35:18
DISPATCH_LEVELで使える関数リストくれくれ
>>820 WDMデバイスドライバ プログラミング完全ガイド (アスキー)
お力お貸しください。 現在PCIデバイスドライバをWDMで作成しているのですが、IoAttachDeviceToDeviceStack 関数で必ずブルースクリーンになってしまいます。 ためしにWDMに付属していたサンプルのPCIデバイスドライバ(PCIDRV.sys)を インストールしてみたのですが、同じようにIoAttachDeviceToDeviceStack でブルースクリーンです。 IoCreateDeviceが成功していることは確認しています。 こういった場合、何が原因なのでしょうか?(ハードウェア?)
フィルタドライバでATAPIの流れているコマンドを盗めないか検討している。出来るのか?
できないよ
>>823 USBならusbstorの上で取れる。
IDEはシラネ。
busDriverのfilterでも書けばいけるとか、何処かで見た気がするする、
828 :
デフォルトの名無しさん :2009/03/18(水) 19:35:39
質問です。 カーネル空間とユーザー空間とでMutexで同期を取りたいのですが どちらかで作成した Mutex をもう片方に告知する方法ってありませんか?
>カーネル空間とユーザー空間とでMutexで同期を取りたい おい、やめろ馬鹿 このスレは早くも終了ですね とりあえず、キレイな方法は無い。
今のWDKのセットアップから 親切に説明してくれてる書籍ってあるんでしょうか
この辺 「Windows Vista カーネルソフトウェア開発技法」 「Windows Vistaデバイスドライバプログラミング」
ありがとうございます とりあえずフリーのWDKのインストールまではできたのですが wdm.hとntddk.hがコンパイラバージョンが合わないとかで サンプルがビルドできないorz とりあえず本待ちだ
とりあえず原因はわかった もってるVCがバージョン6だからだ とりあえず7以降のがほしいってことで
どやって、ビルドしようとしてんだ・・・?
いきなりVCでWDK動かそうとするなよ。
基本CUIだぞ。
>>834 パス通したり設定さえやってればVCで動くプロジェクトも作れる。
WDKサンプルのままmakefileとか使った方が手っ取り早いが。
いちおうVS6はあって 2000用のは作ったことがあるのですよ なのでだいじょうぶかなぁと
VC9EE+WDK+DDKWizardでIDE依存症のあなたも幸せ
最近知った言葉:UMDF、KMDF、WDF Limuxのカーネル関係勉強してからWindowsをさわろうと思う。
839 :
デフォルトの名無しさん :2009/04/02(木) 22:56:47
ビルド環境ってOSごとにあるけど違いとかある? どれでビルドしても2000でもXPでもvistaでも使えるようだけど、 各osのビルド環境で別々に作ったドライバを使ったほうがいいの?
ねーよw
>>839 どのOSにも存在する機能を使ってるぶんには同じ。
XPとかVistaにしかない関数を使うんなら、OS毎にビルドするなり
ダイナミックロードするなりすればよろし。
ターゲットじゃねえぞ
教えてください。 IDEの設定についてです。 WinDDK\6001.18002\inc配下に api atl21 atl30 crt ddk mfc42 wdf というフォルダがそれぞれありますが、 Visual Studio 2008の ツール→オプション→プロジェクトおよびソリューション→VC++ディレクトリ にてインクルードディレクトリを設定しようと考えているのですが、 設定する対象フォルダは「ddk」のみで大丈夫でしょうか? ※インテリセンス機能を使いたいので。。。 宜しくお願いします。
844 :
デフォルトの名無しさん :2009/04/30(木) 22:21:56
シャットダウン再起動休止状態スタンバイスリープなどを ドライバ内で検出する方法があれば教えてください
>>843 ソースによると思うけれども
手元では、inc\api と inc\ddk をインクルードファイルの設定に入れてる。
>>844 MajorFunction[IRP_MJ_POWER] の中で
IRP_MN_SET_POWERやIRP_MN_QUERY_POWER で引っ掛けて
Parameters.Power.ShutdownType や powerState.SystemState を
見れば、ある程度、判るよ。
というか、普通実装してあるはずだけど。
846 :
843 :2009/05/09(土) 16:04:32
>>845 ありがとうございます
実はあの後色々錯誤してapiとddkのみ
インクルードファイルに設定することにしました。
再確認できてよかったです。
ドライバ初心者です。 あるデバイスに対して、I/Oの入出力と 割り込みのハンドリングを行うだけの 簡単なドライバを作りたいのですが、 簡単なサンプルソースはどこかに無いでしょうか? (ソースファイル1つ、ヘッダファイル1つくらいのもの) DDKのサンプルは少々複雑で・・・。 よろしくお願いします。
848 :
デフォルトの名無しさん :2009/05/16(土) 05:26:19
下記8つの同じようなエラーがとれず困っています。何かヒントでも良いので頂けないでしょうか? 1>c:\winddk\3790.1830\inc\wxp\usbioctl.h(449) : error C2220: warning treated as error - no object file generated 1>c:\winddk\3790.1830\inc\wxp\usbioctl.h(449) : error C4200: nonstandard extensi on used : zero-sized array in struct/union 1>c:\winddk\3790.1830\inc\wxp\usbioctl.h(472) : error C4200: nonstandard extensi on used : zero-sized array in struct/union 1>c:\winddk\3790.1830\inc\wxp\usbioctl.h(528) : error C4200: nonstandard extensi on used : zero-sized array in struct/union 100>c:\winddk\3790.1830\inc\wxp\usbioctl.h(449) : error C2220: warning treated a s error - no object file generated 100>c:\winddk\3790.1830\inc\wxp\usbioctl.h(449) : error C4200: nonstandard exten sion used : zero-sized array in struct/union 100>c:\winddk\3790.1830\inc\wxp\usbioctl.h(472) : error C4200: nonstandard exten sion used : zero-sized array in struct/union 100>c:\winddk\3790.1830\inc\wxp\usbioctl.h(528) : error C4200: nonstandard exten sion used : zero-sized array in struct/union 宜しくお願いします。
850 :
デフォルトの名無しさん :2009/05/16(土) 14:58:58
>>849 build通りました!ありがとうございました!
最近のDDK(WDK)ってgeninf.exeは付属していないのでしょうか? infファイルは自分で書くしかないのでしょうか?
VS2010ベータ出るな MSDN会員だけ先行して公開されてる
ドライバでWindowsロゴテスト受けてないと、リリース署名つけても デバイスマネージャ→ドライバの詳細上のデジタル署名者欄で 署名なしとされてしまう模様。 リリース署名したがVista x64でのこれがどうも気になる。 やっぱロゴテスト合格しないとここは署名なしのままなのかな。
そりゃカタログファイルが無いからな。
IRPをキャプチャするフィルタを好きなところ、あるいは、全部の UPPERなりLOWERなりにSetupDIで突っ込むんだろうね。 アプリが大変だね。CDB・CBW・タスクファイル・・・
857 :
デフォルトの名無しさん :2009/10/22(木) 15:24:45
ネイティブAPIのZwCreateProcess()にフックをかけるドライバを作成しています。 フック時に起動させるモジュールの対象パスを取得、コマンド引数を取得したいと思っています。 モジュールの対象パスは取得することは成功したのですが、コマンド引数の文字列の取得を行うことができません。 NTSTATUS NtCreateProcess( OUT PHANDLE ProcessHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, IN HANDLE ParentProcess, IN BOOLEAN InheritObjectTable, IN HANDLE SectionHandle OPTIONAL, IN HANDLE DebugPort OPTIONAL, IN HANDLE ExceptionPort OPTIONAL ); これら引数からアプリ起動時のコマンド引数の文字列を取得する方法をご存知の方をご存知の方がいましたら、 教えていただけないでしょうか。よろしくお願いいたします。
まぁーPCやってることが2chやってることと同義だって考えてる人にとっちゃ PCやってるなんておhるかもしれんのう。
誤爆ですw
おhる
ndisフィルタでパケットフィルタ作りたいんだが サンプル見てもコンパイルの仕方すら分からない状況ですが まあそれは調べたらあったのでいいとして アプリケーションとどうやって通信するのかとか、ドライバ自体をどうやってシステムに登録するのかとか ほとんど何も分からないし調べても出てこないんですが サンプルコードでもあれば教えてください
WDK7のサンプルソースみれば一発だろ。 まずはWDDFの書籍買って一から勉強しろ。
いや一発じゃないだろう、お前は超能力者か何かか? geekなサイトにもぐりこんでだいたいやり方は分かった
864 :
862 :2009/12/10(木) 22:49:39
>>863 いや、アフォでなければ分かる。
WDKあるならドキュメント読めば全部きっちり載ってる。
英語が面倒で見てすらいないんだろ。
大体、
> サンプルコードでもあれば教えてください
って、network\ndis\filterにndisのlowerfilterがあるわけだが。
ろくに探しもしてないことが明白。
865 :
デフォルトの名無しさん :2009/12/13(日) 23:04:15
痛々しい863age
866 :
デフォルトの名無しさん :2009/12/23(水) 16:54:59
WinDriverってカーネルコード書かないでドライバ作れるけど いったいどういう仕組みなんだろ? ユーザーランドのコードを対応するものに変換してくれるとか?
DDKで、DuplicateHandleの代わりになるものってある?
ZwDuplicateObject かな?
ObReferenceObject みたいなモノってある?
>>869 ありがとうございます。
助かりました。
自作ドライバにインタフェース作成してユーザからCreateFileすると、 GetLastErrorでアクセス拒否が返されるんですが、何が悪いですか。 ドライバ側: (1) AddDeviceで IoRegisterDeviceInterface(PDO, &GUID, NULL, &IfName); (2) IoSetDeviceInterfaceState(&IfName, TRUE); ユーザプログラム側: (1) SetupDiGetClassDevs (2) SetupDiEnumDeviceInterfaces (3) SetupDiGetDeviceInterfaceDetail(サイズ取得用) (4) SetupDiGetDeviceInterfaceDetail(ifName取得用) (5) CreateFile(ifDetail->DevicePath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); ここで-1が返され、失敗。 GetLastError で FormatMessage すると「アクセスが拒否されました」 何が原因と考えられるんでしょうか。 ドライバ側では正常に返ってるし、ユーザ側も(5)以外は正常、 GUIDもドライバとユーザで一致してます。 infが悪い・・・?
環境忘れてた。 開発、動作とも WinXP で CheckBuild(6001.18002) で動作させてます。
IRP_MJ_CREATEのhandlerで、STATUS_SUCCESSを返していないとか。
875 :
872 :2010/02/22(月) 10:59:39
返答どうもです。IRP_MJ_CREATE のルーチンでは、 return CompleteIrp(Irp,STATUS_SUCCESS,0); で記述してますが、その前のDebugPrintExが表示されないので そもそもIRP_MJ_CREATE前の I/Oマネージャによるアクセス権限チェックで 弾かれてるような印象です。
FILE_SHARE_READ | FILE_SHARE_WRITE を0にしてみたら?
877 :
872 :2010/02/23(火) 08:29:56
>>876 CreateFile( ifDetail->DevicePath,
GENERIC_READ,
0,
NULL, OPEN_EXISTING, 0, NULL);
にしてみましたが、ダメでした。
WinDDKサンプルの Toaster Bus だとうまく I/O できるので、
その辺の差異を見ないといけない・・・にしてもよくわからない。
878 :
872 :2010/02/23(火) 08:34:14
SECURE_OPEN は必須ですか? Toaster Bus だと inf で Registry にアクセス権の設定をして、 IoCreateDevice で FILE_DEVICE_SECURE_OPEN を指定してますが・・・
制限ユーザでCreateFileしてる・・・ワケないよな
>>878 単純にCreateFileするユーザーのアクセス権限で
Administrators指定して開けばいける気がする。
881 :
872 :2010/02/24(水) 11:13:23
実行ユーザは Administrators のグループに追加されてます・・・ あと CUI なプログラムなので、 (1) DOS窓開始ユーザを Administrator で実行して実行してみたり、 (2) Explorerから実行ファイル右クリックで別ユーザ→Administrator指定して実行してみたり でも変わらずです。 Class が UNKNOWN なドライバだけどUpper や Lower がいるはずもないし・・・ うちのマシン環境が腐ってる・・・?OS入れ直ししてみた方がいいんでしょうか。
882 :
872 :2010/02/24(水) 16:20:44
色んな所のサンプルをあさって比較しながら色々試してみたところ、 CreateFile の 第1引数のパスの末尾に"\\" を追加するとうまくいきました ・・・が、そういう仕様ですか? MSDN みてますが、第1引数 lpFileName の指定で特筆無いし・・・ 本当に正しいのか良く分からないです。
それはないなー てかなんで\\を追加とかいう不可思議な発想に至ったのか
884 :
872 :2010/02/24(水) 21:41:20
>>883 Windows Vista デバイスドライバプログラミングの書籍にあるサンプルプログラムに
Detail で DevicePath を取得したあと \\hoge を追加したパスで
CreateFile してて、それだとうまくいきました。
んで、色々パスを試したら \\ を追加すれば
動くって所に(たまたま)行き着いた、ってトコです。
メモリ壊してるだけだろwww
886 :
872 :2010/02/25(木) 11:28:06
>>885 どういう仕組みでメモリ破壊になってるんでしょう。
お前のソースをここに貼ったら教えてやらんでもない
888 :
872 :2010/02/25(木) 14:28:58
違うPCでやると、
>>882 関係なしにうまくいくので、
結局今のPCの環境がおかしい・・・何が違うんだorz
OS入れなおしてみるか・・・。お騒がせ(?)しました。
889 :
872 :2010/02/25(木) 14:42:18
同じ登録のドライバが先にいるんじゃね?
891 :
872 :2010/02/25(木) 14:54:20
以下、openの関数です HANDLE CreateDevice(GUID *pGuid, CHAR* filename) { HDEVINFO deviceInformationHandle; SP_INTERFACE_DEVICE_DATA interfaceDeviceData; PSP_INTERFACE_DEVICE_DETAIL_DATA interfaceDeviceDetail; DWORD sizeOfSymbolicName; HANDLE deviceHandle=NULL; UCHAR devicePath[DEVICE_PATH_LENGTH]; interfaceDeviceDetail = NULL; memset(&devicePath,0,DEVICE_PATH_LENGTH); // GUIDからHDEVINFOを取得 deviceInformationHandle = SetupDiGetClassDevs(pGuid, NULL, NULL, DIGCF_PRESENT | DIGCF_INTERFACEDEVICE); if(deviceInformationHandle==INVALID_HANDLE_VALUE) return NULL; // HDEVINFOからSP_INTERFACE_DEVICE_DATAを取得 interfaceDeviceData.cbSize = sizeof(interfaceDeviceData); SetupDiEnumDeviceInterfaces( deviceInformationHandle, NULL, pGuid, 0, &interfaceDeviceData); // SP_INTERFACE_DEVICE_DATAからSP_INTERFACE_DEVICE_DETAIL_DATA取得 // その1:とりあえず長さを取得 SetupDiGetDeviceInterfaceDetail( deviceInformationHandle,&interfaceDeviceData, NULL, 0, &sizeOfSymbolicName, NULL);
892 :
872 :2010/02/25(木) 14:55:21
つづき // SP_INTERFACE_DEVICE_DATAからSP_INTERFACE_DEVICE_DETAIL_DATA取得 // その2:データそのものを取得 interfaceDeviceDetail = (PSP_INTERFACE_DEVICE_DETAIL_DATA)malloc(sizeOfSymbolicName); interfaceDeviceDetail->cbSize = sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA); SetupDiGetDeviceInterfaceDetail( deviceInformationHandle, &interfaceDeviceData, interfaceDeviceDetail, sizeOfSymbolicName, NULL, NULL); // interfaceDeviceDetail->DevicePathがドライバアクセスへの // 名前として使える。ここでは更に引数のファイル名を追加する。 strcpy((CHAR *)devicePath, interfaceDeviceDetail->DevicePath); printf("CreateDevice [%s] \n",(PCHAR)interfaceDeviceDetail->DevicePath); strcat ((CHAR *)devicePath,"\\"); strcat ((CHAR *)devicePath,filename); // デバイスドライバへのアクセス許可を求める deviceHandle = CreateFile( (CHAR *)devicePath, GENERIC_WRITE | GENERIC_READ, FILE_SHARE_WRITE | FILE_SHARE_READ, NULL,OPEN_EXISTING,0,NULL); // 確保したリソースを破棄する if (interfaceDeviceDetail) free(interfaceDeviceDetail); SetupDiDestroyDeviceInfoList(deviceInformationHandle); return deviceHandle; }
893 :
872 :2010/02/25(木) 15:00:56
>>890 1-8\open_close_final\VistaSample1 が対応するドライバで、
inf の クラスとGUIDを Unknown に変更して使ってみてます。
ってそういう意味じゃない?
パス名の最後の文字が「表」とか「申」とか「能」で終わってる
strcpyとかstrcatとか使ってる時点で読む気をなくす('A`)
最初から改造したやついれた? アンインストールをちゃんとやらないでドライバだけいれたから レジストリがおかしくなってるか、ドライバが実は古いままとか そういうのはないかな。別のPCでも大丈夫なあたり。 できれば仮想環境とかですぐに元に戻せる環境を使って 最初から今のドライバでうまくいくか試したほうが速いと思う。 今の自分のドライバのGUIDに変なエントリがないか調べてみるのもあり。 あと、正直勉強不足だった。 \\つけた後にオプションとかやるんだな。 ただ列挙したデバイスインターフェイスのGUID+4桁の数字 ちなみに俺はおっさんなので、SetupDi使うのがめんどくさくて CreateDeviceの固定された名前でどうにかしてしまうことが多い。
>>896 消しすぎた。
デバイスインターフェイスのGUID+4桁の数字
でアクセスできるのが普通だと思うから
サンプルがそれでちゃんと動くかどうか確認してみたほうがよい
と書くつもりだった。
割とどうでも良い事だけど。 >SetupDiEnumDeviceInterfaces( >deviceInformationHandle, >NULL, pGuid, 0, &interfaceDeviceData); 0決め打ちはマズイと書いてみる。
900 :
デフォルトの名無しさん :2010/04/20(火) 23:53:44
WinUSB使ってデバドラ作ってるんだけども、ベンダーリクエストがどうにも通らない…… WinUsb_ControlTransfer()使うんだ、と言うところまでは理解した……つもりなのだが、 いざ実行してみるとFALSEが返ってGetLastError()はERROR_GEN_FAILUREになる。 ReadPipeとWritePipeはうまく行ってるので、WINUSB_INTERFACE_HANDLEがとれてないという ことは無いと思うのだけど、ドコのナニに問題があるのか全然分からない。 同じところで詰まった人、ヒントで良いんでおしえてくだちいorz
901 :
デフォルトの名無しさん :2010/08/07(土) 04:07:36
どなたかご教授ください。 ComPortのドライバを作っていまして、 ドライバの割り込み待ち中に、通信先のWin32アプリがフリーズする点で躓いています。 Win32アプリ(フリーのシリアル通信ソフト)からIOCTL_SERIAL_WAIT_ON_MASKという I/O Controlコードをドライバが受け取ったとき、 ドライバはシリアル受信等の割り込みがあるまで、そこで待ち続ける必要があるようなのですが、 待っている間、Win32のアプリの方がフリーズしてしまいます。 割り込み待ちの処理には KeWaitForSingleObject を NotificationEvent, Executive, KernelMode、タイムアウトなしで使用しています。 一般に出回っているComPortのドライバに 自作のWin32アプリからIOCTL_SERIAL_WAIT_ON_MASKを送信してみたところ、 その送信時点でWin32アプリの処理が止まり、 (DeviceIoControl関数から抜けなくなり) ドライバがシリアルデータを受信したときにアプリは処理を開始していました。 これから、ComPortのドライバはIOCTL_SERIAL_WAIT_ON_MASKを受信した段階で シリアルデータの受信割り込みがあるまで待ち続けることが分かるのですが、 僕の待ち方(KeWaitForSingleObject)が悪いためか、 自作のドライバではフリーのシリアル通信ソフトはフリーズしてしまうようです。 どなたか、正しい割り込み待ちの仕方をご教授いただけないでしょうか? WDMの勉強はごく最近始めたもので、 知識不足な点が多いとは思いますが、宜しくお願いいたします。
ソースうp
>>901 >ドライバはシリアル受信等の割り込みがあるまで、そこで待ち続ける必要があるようなのですが、
常識的に考えて、ソレはアリエナイ。
queueにでも突っ込んでおいて、STATUS_PENDINGを返して、
指定の状態変化が起きたらcompleteする感じで良いハズ。
ソースは次のようになっています。 やはりKeWaitForSingleObjectの使い方が間違っているのでしょうか。 待ちに入った場合でもWin32アプリの方がフリーズしない方法をご存じでしたら ぜひ教えてほしいです。 NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING pRegistryPath) { //デバイス作成 NTSTATUS NtStatus1; PDEVICE_OBJECT pDeviceObject_Port1 = NULL; UNICODE_STRING usDriverName_Port1, usDosDeviceName_Port1; RtlInitUnicodeString(&usDriverName_Port1, L"\\Device\\vserial1"); RtlInitUnicodeString(&usDosDeviceName_Port1, L"\\DosDevices\\COM5"); NtStatus1 = IoCreateDevice(pDriverObject, 0, &usDriverName_Port1, FILE_DEVICE_UNKNOWN, FILE_DEVICE_SECURE_OPEN, FALSE, &pDeviceObject_Port1); //メジャーファンクション登録 for(int i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; i++) pDriverObject->MajorFunction[i] = COM_UnSupportedFunction; pDriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = COM_IoControl; IoCreateSymbolicLink(&usDosDeviceName_Port1, &usDriverName_Port1); return STATUS_SUCCESS; } ---2/2へ続きます----
---1/2の続き---- NTSTATUS COM_IoControl(PDEVICE_OBJECT DeviceObject, PIRP Irp) { NTSTATUS NtStatus = STATUS_NOT_SUPPORTED; KEVENT event; PIO_STACK_LOCATION pIoStackIrp = IoGetCurrentIrpStackLocation(Irp); // バッファポインタ取得 PCHAR pInputBuffer = (PCHAR)Irp->AssociatedIrp.SystemBuffer; PCHAR pOutputBuffer = (PCHAR)Irp->AssociatedIrp.SystemBuffer; // バッファサイズ取得 int InSize = pIoStackIrp->Parameters.DeviceIoControl.InputBufferLength; int OutSize = pIoStackIrp->Parameters.DeviceIoControl.OutputBufferLength; int dwDataRead = InSize, dwDataWritten = 0, debugstr_i = 0; switch (pIoStackIrp->Parameters.DeviceIoControl.IoControlCode) { case IOCTL_SERIAL_WAIT_ON_MASK: { //待ちに入る KeInitializeEvent(&event, NotificationEvent, FALSE); NtStatus = KeWaitForSingleObject(&event, UserRequest, UserMode, FALSE, NULL); KeClearEvent(&event); } Irp->IoStatus.Information = dwDataWritten; Irp->IoStatus.Status = NtStatus; IoCompleteRequest(Irp, IO_NO_INCREMENT); return NtStatus; } 簡略化しましたがこれが全貌です。 以上、お時間のある方いらっしゃいましたらお相手していただけると嬉しいです。
906 :
901 :2010/08/08(日) 01:04:22
>>903 レスありがとうございます。
KeWaitForSingleObjectでタイムアウトを設定し、
STATUS_PENDINGを返すようにしました。
しかし、自作のWin32アプリからドライバへ、DeviceIoControl関数により
IOCTL_SERIAL_WAIT_ON_MASKを送信してみたところ、
すぐにDeviceIoControl関数から抜けて次の処理を行ってしまい、
一般に出回っているComPortのドライバと同じふるまい(DeviceIoControl関数から抜けなくなる)
をさせることができませんでした。
つーか問題にしてるのは何? 他のシリアルドライバとの違いなのか、 シリアルドライバとして正しい振る舞いがわからないのか。 手っ取り早いのはMS標準シリアルドライバでどう動くのか確認して、同じように実装すること。 挙動を見る限り、その比較対象のドライバはPENDING抜けしてないでしょ。 フリーズする/しないはアプリ側の作りの違いだと思うから、そこは気にしなくてもよさそうじゃね?
確かに何を問題にしてるかよくわからんな KeWaitForで固まるのが困るときはタイムアウト設定したり スレッド別に用意したりすると思うが、別にドライバに限った話じゃないし 話を聞いた感じだと、 アプリ側でスレッドつくるべきなんじゃないかと思うけどね。
返信ありがとうございます。 ドライバと通信を行うWin32アプリは、一般に出回っているシリアル通信ソフトを考えています。 また、参考にしていたシリアルドライバはMS標準のものです。 整理しますと、自作のシリアルドライバとMS標準のものでは次の違いが発生しています。 自作のシリアルドライバとシリアル通信ソフト(Win32アプリ)での挙動: Win32アプリからドライバへ、DeviceIoControl関数でシリアルデータ受信割り込み待ち命令を送信すると アプリ側の処理がそこから先に進まないうえ、 Win32アプリ(のGUI)がフリーズする MS標準のシリアルドライバとシリアル通信ソフト(Win32アプリ)での挙動: Win32アプリからドライバへ、DeviceIoControl関数でシリアルデータ受信割り込み待ち命令を送信すると アプリ側の処理がそこから先に進まなくなるにも関わらず、 Win32アプリ(のGUI)はフリーズしない これらから、MS標準のシリアルドライバと同じ挙動をさせるには Win32アプリをDeviceIoControl関数から抜けなくさせ、 なおかつアプリのGUIが固まらないようにしなければならないと解釈しています。 どなたかお時間のある方いらっしゃいましたら ヒントを頂けると嬉しいです。
同じアプリを使っている前提で話すけど
アプリがフリーズしているように見えるかどうかはWindowsから送られてくる
メッセージ処理をしているかどうかで決まる。
だからDeviceIoControlで止まっていたらアプリは必ずフリーズする。
だから
>>908 のように、「固まって困る場合=メッセージ処理したい場合」として
スレッドやタイムアウトをするべきであると書いた。
よって、MS標準のドライバの場合はOKで、
自作のはフリーズするというのは理にかなっていない。
もう一度アプリ側の調査をよくよくやってみることをおすすめする。
WAIT_ON_MASK以外の応答が違っているとか。 受信通知条件が違っているとその辺の処理の扱いが変わってくるからな。
USBカメラの解像度設定とかを横取りして、常にある値を指定するような 方法ってありますか。 解像度の変更が出来ないソフトがあって困ってます。
フィルタドライバ書けばできるだろうけど 特定ソフトだけの問題ならアプリ側のアクセスをどうにかするほうが楽そう
914 :
デフォルトの名無しさん :2010/10/21(木) 20:54:35
WDK付属のMSVADみたいな仮想デバイスドライバのインストーラを書いてるんだが 非PnPなのでDPInstは諦めてdevconのソースを流用しているんだが、 これだとデバイスを削除した後にドライバ・パッケージがシステム内に残ったままになる (devconのremoveコマンドとdp_deleteコマンドの中身を組み合わせてる) 誰か、ドライバ・パッケージまで削除できる良い方法を知らない? DIFxAPIと組み合わせれば何とかなるのかな?
誰も返事しないから嘘を承知で。 ・\RootのなんとかにするとDPInstでもインストールできなかったっけ? と思ってToasterみてたらよくわからんGUIDだった。 とにかく、Inf/Inxをちゃんと書けばDPInstが使えると思う ・どうしても無理ならDIFxなんとかを改造すれば使える DPInstのコアAPIなのでこっちならパッケージのインストール、アンインストールができるはず。 多分DIFxPkgsあたりだろうけど、できるかどうかはわからん。
916 :
sage :2010/10/27(水) 18:12:47
>>914 自己レス
DIFxLIB(DIFxAPI)と組み合わせるたら、Windows XPでそこそこいい感じになった
インストール:
・デバイスを手動で登録する(非PnPなので)
devconのcmdInstall()のソースを移植、但しcmdUpdate()の呼び出しは削除
※既にデバイスが存在する場合は、この処理はスルーすること
・で、DriverPackageInstall()でドライバをインストール
アンインストール:
・デバイスを削除する。devconのcmdRemove()とRemoveCallback()あたりを参照
あとEnumerateDevices()あたりも
・で、DriverPackageUninstall()でドライバを削除。
Windows XPだとDriverPackageUninstall()がそこそこいい感じにファイルを削除してくれる
C:\Windows\System32\drivers以下にコピーされたファイルも削除してくれる
(Windows 7以降では削除されないけど、DriverPackageUninstall()の仕様なので)
ただ新しいドライバに更新した後にアンインストールすると、
ドライバ・ストアから最新のドライバ・パッケージは削除されるけど、
古い世代のドライバ・パッケージは全バージョン残ったままになってしまう
DIFxAPIの仕様なんだろうか?
>>916 それはDPInstもそうなってるので、仕様だと思う。
DPInstでインストールするとドライバの日付やバージョンで管理するらしく
複数残ったままになる。ただ、アプリケーションの追加と削除に項目として残るので
普通に全部アンインストールすれば問題ない。
918 :
デフォルトの名無しさん :2010/12/12(日) 19:39:33
お願いっ! windows7上で、magicmouseを動かしたいんで、 ドライバを、書いてくれっ! 現状だと、スワイプが使えないんだ!
そういうスレじゃねーから
>>918 >windows7上で、magicmouseを動かしたいんで、
ドライバ署名の問題もあるから自分で書けばいいじゃんw。
スレ違いだったらごめんなさう、質問させてください。 とあるアプリケーションの音を、劣化なしに録音したいのですが、 録音デバイスはマイクとライン入力程度で、まともな手段で録音出来ません。 とりあえず、ollydbgで見てみたら、waveOutWriteは呼ばれず、DSoundから 直接DeviceIOControlが呼ばれており、DirectX系から、ハードウェアが 直接制御されているようです。あと、WriteFileはコールされていませんでした。 ここで、DeviceIOControl 関数の引数inBuffをじゃっかん弄っても、音に変化が なさそう(?)でした。この関数でバッファ転送してると思ってたので、行き詰まって しまいました。 なんか勘違いとかしてるんでしょうか? もしくは、上記の目的のために、別の手段はありませんでしょうか?
そういう場合、普通はDirectSoundをフックする
>>923 大抵は、サウンドチップの製造元のドライバ入れれば、
ステレオミキサーから録音できるようになる。
劣化防止が目的ならばASIOなどで鳴らして光OUTを光INで受けるしか信用ならない
927 :
923 :2011/01/29(土) 00:00:14
>>924 COMで実装されてるぽい(たぶん)ので、上手いことフック出来ません。
そもそもCOMもDirectSound詳しくないのですが、COMあたりから
攻めた方が賢いでしょうか?
>>925 そうなんですか!ちょい調べてみます。
納入先にそれを要求するのは厳しいかもしれませんが、検討してみます。
928 :
923 :2011/01/29(土) 00:02:31
>>926 確かにそうなんですが、ハード的な制約や導入は出来るだけ押さえたいです。
条件の後出しなんて最低だと思いませんか
つまりどういうことです?
931 :
923 :2011/01/29(土) 01:19:39
>>929 >>930 説明不足ですいません。
このスレの趣旨に基づき、質問を絞ります。
- とあるソフトが発する音を横取りするのが最終目的。win全体の音でも構わない
- フックする場所は、ユーザーモードであればどこまでも構わない。
- 目的のために、ハードウェア導入、もしくはハードウェア依存のドライバ導入など、ハードウェアに関する作業は極力避けたい
- そのソフトをollydbgで覗くと、DSOUNDからDeviceIOCOntrolが頻繁にコールされており、恐らくDirectX系が使われている
現状
- ollydbgにて、DeviceIOControlの引数inBufferをちょくちょく弄っても正常に音が鳴っている「ぽい」し、WriteFileもコールされてないので、詰まった
質問
- 上記の目的は、DeviceIOControlのフックにより達成できるか?出来るのであれば、どういう手法、攻め方をすればいいか
- そもそも、何か大きな勘違いをしていないか
waveOut系で音を鳴らすアプリケーションであれば、恐らくなんとかフック・横取りできる程度のスキルは
あるつもりなんですが、DeviceIOControl とか、低級な制御には余り詳しくなく、また適切なスレも無いために、
このスレでさせて頂いた次第です。
どうぞよろしく願いします。
大きな勘違いをしている
dsoundをhookして、実際のunlock呼出前に読み出せば大抵はOK。
934 :
923 :2011/01/29(土) 12:45:52
>>924 >>933 Unlock関数のフックで、スタックからwaveが引き抜けそうです。
COMの解析は初めてでしたが、思ったより簡単で助かりました。
ありがとうございました。
DDKのサンプルについてるkbdclass改造して、キー入れ替えやりたいんだけどさあ KeyboardClassServiceCallback内でZwOpenFile使うとブルースクリーンになってしまうだよな。。 kbdclass内じゃファイルアクセス処理は使えないんけ? (フィルタドライバ内では使えてたんだけど。。)
発想が変
937 :
935 :2011/02/04(金) 21:19:40
>発想が変 わかってる。 お手軽にキー入れ替えをやってみたくてね。 ファイルにキー入れ替え情報を設定して、それを読み込んで反映できないかなって。。 (KeyboardClassServiceCallback内って書いたけど、これじゃキーが押されるたびに ファイルアクセスしてしまうから、ドライバ起動時にやるべきか。もちろん出来ればの話だけど)
>>935 IRQLと、そのそれぞれのレベルで使える関数の制限について勉強してね
>>937 設定を読み出すなら、ふつーにレジストリ経由が無難。
940 :
935 :2011/02/05(土) 02:47:20
IRQLの概念無視してた。
確かにZwOpenFileはIRQLがPASSIVE_LEVELのときのみ使用可能って書いてあるね。。。
DriverEntry内ではIRQLがPASSIVE_LEVELだったので、ファイルの情報を
DriverEntryで取得して内部変数で保持する方法で今回は逃げてみるよ。
とりあえず今自分のやりたいことは出来そうだけど、こりゃ本腰いれて勉強しないと
難しいね。
参考書買って勉強してきま
>>938 >>939 感謝!
まったくの度素人なんですが、ドライバレベルでマウスを動かしたいんですが moufltrを書き換えて使えばいいんですかね? 単純なフィルタ機能だけじゃなくボタンを押してない時にボタンを押したりするのを アプリからの制御でやろうかと思いまして moufltrはたぶんPS/2用のフィルタになるんだと思うんですが hidとは違うフォルダにあるんで勝手にそう思ってるだけなんだけども USBにもこれは適用出来るんですか?
942 :
941 :2011/03/05(土) 13:55:54.31
VMwareにXPをインストールしてmoufiltrをそのままコンパイルして ドライバ更新でインストールしてアッパーフィルタにmoufiltrが出てるんだけど DebugViewには何のメッセージも出てきません どこから手をつけていいかも分からない状態なんで とりあえず動くものを手にいれたいんですがどうしたらいいんでしょう?
mouclassのIRP_MJ_READで返すとか。
添付のhtmみれば、PS/2以外では動きそうもないんだが・・・
何がやりたいのか良くわからんが、フィルタドライバなんて使わなくても SetCursorPos(...)やPostMessage(...,WM_LBUTTONxxxx,...)で出来そうに思うが・・・
俺予想ではMMORPGの自動操縦マクロ
>>943 入力の生成の部分のことですか?
何か動くものがほしくてmouclassもVMWare上のXP SP3に入れてみて
WPFも解除してデバイス表示で上書き出来てるのは確認しましたが
やっぱりDebugViewにはそれらしいメッセージは出てきません
>>944 VM上ではACIPI\PNP0F13だからPS/2だと思うんですが動いてないから違うんですかね
>>945 今はテスト用にVM上のXPにドライバを入れてますが
普段はVM上で別のOSやアプリを動かしててホストからコントロールするわけですが
なぜかVMはプログラムで生成された入力情報は完全に遮断してしまってるんで
VMの中身が操作出来ないんです
それにドライバの作り方にも興味があるんであえてやってみようかと
WINDOWS7 X64でGavotteRamdisk使うために自分でデジタル署名して使おうとしてるが Inf2catがうまく通らない rramdisk.infをどう修正すればいいやら・・・・
サンプルの.catとかの拡張子がある一行を書けばいいだけでは? CatalogFile=toaster.cat これがあると勝手にやってくれたような記憶があるんだが。
951 :
デフォルトの名無しさん :2011/03/14(月) 20:33:47.88
へえ
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++は熟知してるけど、まるで違う言語を扱ってるくらい動作が違う
UNREFERENCED_PARAMETERは全然関係なく パラメーターを受け取るとこまで出来た なんじゃこりゃ
> C++は熟知してるけど 嘘だ。
キーボードドライバは完成しました 次に同じ要領でマウスドライバも作ってますがrawpdoをkbfiltrからコピペしてみて コンパイルしてインストールしたけどIOCTL用のデバイス名が出てこない そもそもドライバが動いてなさそうなんですが 問題はEvtDeviceAddで何か失敗してるんだろうけど マウスドライバは起動時に読み込まれるからDebugViewでメッセージが取れない 起動時のメッセージを見る方法ってどうすればいいんですか?
VMでやっているならVMware toolsをアンインストールしてみよう。
アンインストールしたけど何も変わりませんよ 他の部分がバグってるっぽいですが それも問題になるんですか?
試しにVMwareToolsを入れた状態で上からmoufiltr未改造をかぶせてみたら ちゃんとコールバックされてますね
原因判明、完全にコピペしたつもりが1行抜けてました いずれにしても起動時のデバッグメッセージが拾えるともっと早く解決したんですけどね
これはひどい。
デバッガも使わんでデバッグメッセージが拾えんとか言ってんだろ。 話になんねー
自称「C++は熟知」のコピペグラマだからな
>>959 他の人が、何がひどいかをあえて説明すると
PCもう一台用意して、WinDbgをインストールし
シリアルか1394でリモートデバッグの設定をすれば
起動時からデバッグメッセージ拾える。
あとC++熟知しているなら、
UNREFERENCED_PARAMETERのマクロが何やってるかぐらいは確認すべき。
あ、PCもう一台って書いたけどVMWareとか使って仮想PCでもできるよ。
>>964 情報をありがとうございます。
2台は用意出来ないんですが
それって仮想シリアルポートドライバみたいなのが必要ってことですか?
>>965 ずいぶん前に数度試しただけだから詳細は覚えてないが
VMWareだと仮想PC上の仮想シリアルがパイプになっているので
WinDbg側からはパイプに接続すればよかった。
と思ったがVMWareじゃなくてVirtualPCだったかもしれん。
仮想PCを起動するとパイプが作られるのでそれをWinDbgで開く
みたいな感じだった
先にWinDbgでひらいておこうとするとパイプがないと怒られたはず。
自分はHW固有のドライバ作ってたので
その環境は作ってはみたものの使い道なくてあまり使わなかった。
>>966 パイプですか、よく分かりませんがキーワードで調べれば出てきそうですね。
貴重な情報をありがとうございます。
hidusbfx2をキーボードに置き換えてみたるんだけど ReportDescritorを返すところまでは呼ばれてて その後びっくりマークになって正常に起動出来ませんでしたとかになる 他のコールバックは呼ばれてる様子もないしDescriptorの問題なんだろうけど どっかに動くキーボード用のDescriptorってありますか? とりあえず検索して出てきたのとHut1.1に載ってるサンプルは試したけど駄目でした
USBキーボード挿してデスクリプタ見ればいいんじゃね?
>>969 ホストがWin7 64でVMWareがあるけどPs/2だから
対応してるツールがないんです
それとちょっとだけ進展が
キーボードはブートデバイスだから
ブートデバイスIDを指定してやったら認識はしましたが
なぜか8個もキーボードが出てきてしまいました
実体は1個みたいなんでとりあえず先に進めて マウスとキーボードを動かそうとしてるんですが マウスを動かすのに7byteのデータ ReportID, Button, X, Y, WheelをIOCTL_HID_READ_REPORTで渡すとマウスが動く これは確認しました でキーボードを9byte ReportID, Modifier, Reversed, Code[6]を同じように発行すると反応なし 何が間違ってるんでしょう?
すみません。単にバグってただけでした。 おかげさまでキーボードとマウスの仮想USBドライバが完成しました
急にundefined; assuming extern returning intと出てビルドできなくなりました 解決方法はありますか?
>>973 関数が定義されていない
急に出た理由までは知らんw
カーネルモードで使えるGetTickCountに相当する関数って何なんですか? 精度は適当でいいんですが
KeQueryTickCount わかりました
完全に標準関数のみで完結させればドライバに普通のC++で作ったlibを合成出来るかと思ったんですが cdecl呼び出しにしてもリンクエラーが出てしまいます。 関数の定義はint func(PSTRUCT st)といった単純なものです。 外部のAPIを一切使わないようにして完全に単体で動くようにしてます。 何か呼び出し規約が特別なものなんでしょうか?
extern "C" を付け忘れてるとかじゃなくて?
>>978 間違いなくついてます。/MT /MD どっちの出力でも駄目です。
__stdcallも駄目です。
ドライバの場合、デフォルトの呼び出し規約が__stdcallだけど
標準関数が使えると思ってるのが間違い
>>980 ダミーの関数を作ってみたらいけてstdcallで行けるのを確認しました。
問題は解決してないんですが
なぜかその関数だけがLNK2019で唯一の違いが引数だけです。
ダミーの方がunsigned short エラーの方が構造体のポインタ
構造体の宣言は
#pragma pack(1)
typedef struct _ST {
.....
} ST, *PST;
関数の宣言は
unsigned short Func(PST pst);
です。
宣言をいじったりしてるけど原因が分かりません。
>>981 結局バイナリ化したら元が何から来たかなんて関係なくないですか?
ここまでエラーメッセージなし
とりあえず引数を消してみて、ライブラリをDDK側でコンパイルするようにしてみたけど変わらず 内部処理で文句を言うのにこのエラーしか出ないとかいうのは許せない error LNK2019: unresolved external symbol _Func@4 referenced in fution _ParentFunc@16
全部コード晒してみ
C++側をコンパイルしてできた.objファイルの中に_Func@4の文字がちゃんとあるかい?
情報小出しでウザすぎる
変なことやろうとしてるのに小出しとかクソですな
手っ取り早く ・*.cppではなく*.cにする ・build -cZ
とりあえず原因は分かりました。 DDKのlibの形式はextern "C" + __stdcallです。 両方ともセットしないとうまくリンク出来ません。
>>991 おまい・・・人の話を聞かないタイプだなw。
>>991 DDK/libに関係なく、C⇔C++間で関数呼び出しがある場合は、extern "C" が必ず必要なんだが。
なんか最近、WDM/デバドラ以前にCの基本が解ってない人が多すぎる・・・
情報を小出しにするような奴はろくでもないといういい例だった
>>993 extern "C"がC言語を表すのはしってたけど、__stdcallをつけるのとつけないので
また違いが出てくるとまでは知りませんでした。
batファイルなんですがobjfre_wxp_x86とかi386とかを取得出来る変数ってありますか?
>>997 setにそんな使い方があるとは、どうもありがとうございます。