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

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
ようこそ、Blue Screenへ(・∀・)
0002デフォルトの名無しさんNGNG
さようなら〜(ノ∀`)
0003デフォルトの名無しさんNGNG
WinDbgの使い方がワカラン。分かりやすく解説してるサイトオシエテ
0004デフォルトの名無しさんNGNG
ぬるぽ
0005デフォルトの名無しさんNGNG
tab
0006デフォルトの名無しさんNGNG
>>3
教えてもいいけど俺に何の利益があるの?
0007デフォルトの名無しさんNGNG
制御系PGって性格悪い香具師多いよね
0008デフォルトの名無しさんNGNG
MaximumTransferSizeを大きくすると下位のドライバでPCリセットがかかっちゃうんだけど,
一般的にはいくつにしてるの?
0009デフォルトの名無しさんNGNG
>>8
USBのドライバの話?
00108NGNG
>9
そうです。bulkusbベース
00119NGNG
>>10
64kBにしたことはあるけど、問題なさそうだった。
それ以上にはしたことはないです。
00128NGNG
1MBにして使ってたら一人だけ�dじゃうって人が居たんで、追い込んだ結果動作した256KBにしてみますた。
転送速度に影響したんで思いっきり増やしたんですが大き杉ですかねぇ???
00139NGNG
>>12
ニュースグループ検索でこんなのを見つけました。
http://groups.google.co.jp/groups?hl=ja&lr=&ie=UTF-8&oe=UTF-8&c2coff=1&selm=32391b3b.0304140557.22779591%40posting.google.com

うちでは4kBより増やしてはだめという噂が一時期出回っていました(笑)

昔計ったときは、64kBでも秒間1.1MBぐらいは出てました。
転送するデータ自体が最大で秒間1MBだったので、そこで止めてしまったけど。
00148NGNG
>13
ありが�dございまつ。感激(゜ーÅ)ホロリ
0015デフォルトの名無しさんNGNG
WDMとは関係ないかも知れないけど、仮想プリンタドライバ作りたいんだけども
プリンタドライバのサンプルで良いのがないかな?
2KDDKにはほとんど情報ないし、NT4DDKは既に公開されてないし
0016デフォルトの名無しさん NGNG
>>3

昨日、本屋でみつけたこの本にWinDBGの使い方があった。

http://www.gihyo.co.jp/books/syoseki.php/4-7741-1841-9
0017デフォルトの名無しさんNGNG
>>13

Windows98とかのころは、たまに64KBでもダメな場合があったから
カナーリ古いハードまで考慮するなら、4KBが一番安全だったよ。

なので、レジストリで切り分けたりしてたけど。
1MBでも最近はできるんだ。。


0018デフォルトの名無しさんNGNG
>16
買うって外注さんがいるんで見てみて良かったら、うちでも買ってもらいまつ。
001918NGNG
外注さんのを見せてもらうだけで間に合いそうでつ。
0020デフォルトの名無しさんNGNG
デバッグ用にシリアルケーブル作ったsage。
0021デフォルトの名無しさんNGNG
繋がらない。。。_| ̄|○ /fastdetect /debug /debugport=COM1 /baudrate=19200
0022デフォルトの名無しさんNGNG
ちょっとしたアクセスしたいだけでも、WDMが挟まるため、
巨大なソースというかインターフェース定義しなきゃならないんだよね。
なんでこんなことになったんだろう。
WindowsからWDMを廃棄できないものか。
0023デフォルトの名無しさんNGNG
何にアクセスしたいの? I/Oならそれほど問題ないでしょ
002422NGNG
SRAMカード。>>23
ドライブイメージじゃなくて、カードをメモリイメージで参照したい。
002520NGNG
ノートPCがターゲットだとダメぽ。デスクトップで接続確認。。。_| ̄|○
0026デフォルトの名無しさんNGNG
>>25

その、ノートPCのシリアルがCOM2ってことはないよね?
002720NGNG
>26
んなこたーないでつ。
・通常期同時にCOM1で通信確認。
・/debug起動時にデバイスマネージャからCOM1が消滅。でもWinDbgには繋がらない。
こんな感じですた。
0028デフォルトの名無しさんNGNG
MDLを下層ドライバに渡して処理するドライバは書いたことあるんだけど、
MDLを受け取って自分でメモリにRead/Writeするサンプルって無いですかねぇ?
0029デフォルトの名無しさんNGNG
ExQueueWorkItem()で起動したスレッドでポーリングしてるんでつがWindows全体が劇重になりまつ。
KeWaitForSingleObject(...timeout)とかではCPUは開放されないんでつかねぇ???

(´-`).。oO(もっとバックグラウンドでやんわり動いて欲しいんでつが。。。)
0030デフォルトの名無しさんNGNG
>29

スレッドの最初で KeSetPriorityThread 呼び出してプライオリティ
落としてもダメってことですか?
0031デフォルトの名無しさんNGNG
>>29
確認だけど
1) ExQueueWorkItemのWORK_ITEM_ROUTINE内でPsCreateSystemThreadを読んで
スレッドを起動し、そこでポーリングをしている。
2) ExQueueWorkItemのWORK_ITEM_ROUTINE内でポーリングしている。
どっち?
003229NGNG
(´-`).。oO(KeDelayExecutionThread()でWindowsは安定したような。でもTOTAL待ち時間が妙に短いのは???)

>30
あんま変わんなかったような。。。

>31
2でつ。PsCreateSystemThread()が必要でつか?
003331NGNG
>>32
WORK_ITEM_ROUTINEはとっとと処理を終わらせるように書かなければ
ならなかったはずです。ポーリングやKeWaitForSingleObjectなど
時間がかかる処理はまずいかと思います。
PsCreateSystemThreadでスレッドを作る、
もしくはタイマDPCを使うとかになるかと思います。
003429NGNG
>33
なるほど。スレッド作ってみまつ。

(´-`).。oO(スレッド内でCompleteIrp()するのはアリでつか?)
003529NGNG
>30>31>33
(´-`).。oO( 軽くなりましたですー。ありが�dございますた。 )
003631NGNG
>>35
予め忠告しておきますと
スレッドが終了したかをどうかを確認するというのが、
えらく面倒くさかったはずなので、気をつけてください。
0037デフォルトの名無しさんNGNG
キモい書き方すんな
003829NGNG
>36
(´-`).。oO( 気を付けますです。。。今日見直してみまつ。 )
0039デフォルトの名無しさんNGNG
   /⌒ヽ   
  / ´_ゝ`)すいません、まだいろいろ作ってるので保守させてもらいますよ
  |    /
  | /| |
  // | |
 U  .U
0040デフォルトの名無しさんNGNG
IoBuildPartialMdl()したメモリにアクセスするには↓のやつらじゃダメぽ?リセットかかっちゃう
//MmProbeAndLockPages(mdl,KernelMode,IoWriteAccess);
//va=MmMapLockedPages(mdl,KernelMode);
//pa=MmGetSystemAddressForMdlSafe(mdl,HighPagePriority);
//va=MmGetMdlVirtualAddress(mdl);
004140NGNG
va=MmGetMdlVirtualAddress(mdl); するだけなら動くけどアクセスは不可でつ。(トーゼンか
0042デフォルトの名無しさんNGNG
pa=MmGetSystemAddressForMdlSafe(mdl,HighPagePriority); // で逝けますた。アドレス計算間違ってた。。。_| ̄|○
0043デフォルトの名無しさんNGNG
教えて偉い人。

根本的質問なんだけどもさ
あるPCI PnPデバイスがすでにバスドライバによって物理アドレスマッピングされて動いてるとして
それ用のファンクションドライバを作りたいんだけど,どーすればいいの?w

というのも,カーネルドライバとか作って dll経由アクセスをしようとすると
実行ファイルと同じディレクトリにあれば検索してそれを使ってくれるけど
NT系だと Admin権限ないと駄目じゃないですか。
#サービスコントロールマネージャが Adminじゃないと駄目?

なので,OS起動時にバスドライバとセットで登録しておきたいんだけど
どーすればいいんでしょうか。

書籍としては
WDMデバイスドライバプログラミング完全ガイド上下
Microsoft WDMプログラミング

の2冊を揃えましたがイマイチ判らず
0044デフォルトの名無しさんNGNG
MmProbeAndLockPages()に失敗するのは分かったんでつが、
失敗させずにマップさせるにはどうすればいいんでしょうか?
0045デフォルトの名無しさんNGNG
IRQLを間違えているとか
0046デフォルトの名無しさんNGNG
IRQLってなんですか?
004745NGNG
>>46
Interrupt ReQuest Levelの略。
主に以下のものがある。(優先度の高い順)
DIRQL 優先度の高い割り込み(ハードウェア割り込み?)
DISPATCH_LEVEL(≒APC_LEVEL) 優先度の低い割り込み(ソフトウェア割り込み?)
PASSIVE_LEVEL スレッド

ルーチン毎にどのIRQLで呼ぶことができるのか決まっていて
それはDDKのドキュメントに書かれてある。
あとKeGetCurrentIrql()で、どのIRQLか取得することができる。
004844NGNG
動いてるのはPASSIVEスレッドでつ。
自分でcreateしたMDLを使って、・・・・

スマソ ソース手元に無いんで明日書く鴨。
004944NGNG
とりあえず別の方法で動きますた。
MmProbeAndLockPages()が失敗するのは未だ謎。
0050デフォルトの名無しさんNGNG
↓これ使ったことある奴いる?
ttp://wdtl.sourceforge.net/
0051デフォルトの名無しさんNGNG
Win2000DDKのBulkUsbで、非同期でReadFileすると、時々次のような問題が
発生して困っています。

○ 前回ReadFileで読み取ったデータの最後の64バイトが、今回読み取ったデータの
  先頭の64バイトとダブっている。

○ 読みとったデータの65バイト目から64バイトが、先頭の64バイトとダブっている。

これってBulkUsbの「仕様」でしょうか? ちなみに次の修正はおこなってあります。
http://support.microsoft.com/default.aspx?scid=kb;ja;414526
005251NGNG
神降臨を期待してもう少し詳しく書いてみます。

まず、>>51で書いた「64バイトダブる」っていうのは私の勘違いでした。
どうもUSBデバイスから送信されたはずのデータが256バイトの倍数で
失われることが時々ある、というのが正しい事実のようです。
それも、ReadFileと次のReadFileの間でデータが失われる、というのでは必ずしもなく
一回のReadFileで読んだデータの中に、256*Nバイトの長さで失われた部分が
発生することがあるようです。

で、どうして256の整数倍でデータが失われるのかを考えたのですが、
256バイトというのはUSBデバイスの送信リングバッファの容量なので
(デバイスのファームは私が書いたものです)恐らくReadFileが完了するのに
異常に時間がかかることが時々あり、そのためにその間にリングバッファが
1(N)周してしまっているのではないかと思うのです。

なにかこの問題に対する対処法をご存知ないでしょうか?
ちなみにデータの転送レートは、だいたい10KByte/sec程度です。
0053デフォルトの名無しさんNGNG
>51-52
xpDDKのやしとかはどうなの?
0054デフォルトの名無しさんNGNG
神ではないんだけど…

>ReadFileが完了するのに異常に時間がかかることが時々あり

どうもここがひっかかりますね。
通常異常に時間がかかるって場合はUSBバス上ではNAKになっていると
考えられますが、そうなのでしょうか。

その場合は、ACKを適切に出せていない可能性がありますけど…。
(ファーム側でACKを出しているつもりが実は出していないて、
データを上書きしてからACK設定を行っているなど)

当方も決して慣れてはいないので、間違ってたらごめんなさいです。
005551NGNG
>>53
XPDDKは手に入れてないので解らないです。
本当は試してみたいのですが。。

>>54
レスありがとうございます。

>通常異常に時間がかかるって場合はUSBバス上ではNAKになっていると
>考えられますが、そうなのでしょうか。
デバイスのファームでは、送信するデータがないとき送信要求が来たときは
NAKを返すようにしています。(というか、USBコントローラの石が勝手に
NAKを返します)

これがマズいのでしょうか?USBデバイスでは1msecに約10バイトのデータを
256バイトのリングバッファに書いているので、もしそうだとすると、デバイスから
NAKが返ると最低でも26msec以上ReadFileの処理が固まっている(?)ことに
なりますが、そんなことってあるんでしょうか。(実際には、酷いときには256*3 =
768バイトのデータが抜けることがあります。)

NAKがまずいとするとSTALLを返すか、0パケットを
返すかのどちらかにしないといけないのでしょうか。


>その場合は、ACKを適切に出せていない可能性がありますけど…。
>(ファーム側でACKを出しているつもりが実は出していないて、
>データを上書きしてからACK設定を行っているなど)
ReadFileって実体はバルクINトランザクションなので、デバイスがACKを
返すことはないのではないでしょうか。
005654NGNG
>NAKがまずいとするとSTALLを返すか、0パケットを
>返すかのどちらかにしないといけないのでしょうか。

それは無いと思います。
NAKが続くこと自体を修正する必要は無い筈です。

お話を伺う限りですが…

デバイス側でACKにする制御を行っていると思いますが、
何らかの理由でACK制御が出来ていない場合がある可能性は
無いでしょうか。
(デバイス側のファームウェアの話です)

ACK制御ができていない状態で、バッファに次のデータを
上書きすると仰るような症状になるのかなぁーと思った次第です。
#あまり自信はありません。間違ってたらごめんなさいです。
005751NGNG
>>56
>ACK制御ができていない状態で、バッファに次のデータを
>上書きすると仰るような症状になるのかなぁーと思った次第です。
ホストからのデータ要求(INトランザクション)では、ACKを返すのは
ホストの筈なので最初意味がわからなかったのですが、言わんとされていることは
こういうことでしょうか?

つまり、一旦エンドポイントを送信可能な状態にしたら、ホストからACKが帰るまでは
エンドポイントに書き込みはしないほうがいい、ということでしょうか?

これは、確かにそうみたいです。明らかにエンドポイントがオーバーフローしていない
場合でも、ACKが返る前に書き込みを行なうとデータが失われることがあるようです。
(今私が使っている石がたまたまそうなのかもしれませんが)そのために、直接石の
エンドポイントにデータを書くのではなく、石の外に256バイトのリングバッファを
設けて一旦そこに書いておいて、ホストからACKが返ったら
エンドポイントに転送するようにしています。

ちなみに使っている石はこれです。
http://www.national.com/pf/US/USBN9604.html

なんかデバドラの話じゃなくなってきてすみません。
0058デフォルトの名無しさんNGNG
コントローラの取説見てないけど、FIFOがうまいことやってくれないの?
他社の石はreadyな限りガンガン書き込んで無問題だったけど。
005951NGNG
>>58
普通FIFOってそういう物のような気がしますよねえ。

ですが、1KByte/sec程度のデータの送信テストをしてみると、
>>57に書いたように一旦バッファリングしておいてACK確認後FIFOに書き込むと
うまく受信できたのですが、タイミングお構いなしで直にFIFOに書くと時々
データが欠けるんですよ。

まあ、あくまで私が試した限りにおいては、と言うことなので
私の石やBulkUsbの使い方がスットコドッコイな可能性も多いにあります。
006058NGNG
取説さらっと見ましたが,FIFOが1段しか無いから[ACK]確認後に次データ書き込みで正解なの鴨。
うちが使ったコントローラは2段FIFOだったんで,空いてる方に書き込み可能だったです。。。

あとはFIFO fullだかready処理の確認を入念に行うですかねぇ。。。
0061デフォルトの名無しさんNGNG
今日発売(だっけ?)のCマガジンにデバドラ特集があるねえ。
っても、WDMの基本構造のみだけど。
MS-DOSからWindowsのハードウェアサポートの歴史を書いて、
筆者が使ってるというWDMの雛形を示して、
それを使った単純なドライバと単純なアプリケーションを
IOCTLで連携させる、みたいな感じ。

入門者向けですね。 ドライバ書籍を買う金はない、
DDKドキュメントじゃ基本構造部分からしてよくわからん、
DDKに付いてるようなやつじゃなく、とってもプレーンなサンプルが欲しい。
そんな人は買っても良いかも。

MPEG4、USBit、暗号の歴史などなど、盛りだくさんの¥1,200(税込)
さあ、お申し込みはこち(以下略
0062デフォルトの名無しさん NGNG
日経ソフトウェアにもWDMの記事があった。

>APIから知るWindowsの仕組み 第20回
>デバイスドライバとプラグ・アンド・プレイの仕組みを学ぶ

今回は概略とプラグ&プレイ、次回でサンプルドライバを
作るとかいう内容だったよ。
0063デフォルトの名無しさんNGNG
>>61-62
なんで流行ってるんだろ。

スレ違いだけど、その日経の連載は結構良いな。
単行本化して欲しい。
0064デフォルトの名無しさんNGNG
>>61
ちょっと見たけど、ほんのちょっと表面かすった程度のことしか書いてないじゃん。
あの程度の情報はwebですぐ手に入るよ。
0065デフォルトの名無しさんNGNG
age
0066デフォルトの名無しさんNGNG
WDMプログラムの入門サイト教えて
0067デフォルトの名無しさんNGNG
>>1の
「ようこそBlueScreenへはワラタw
0068デフォルトの名無しさんNGNG
PICまわりコマンドの正式なドキュメントはどこにありまつか
0069デフォルトの名無しさんNGNG
アゲトカナクテワナ
0070デフォルトの名無しさんNGNG
http://pc2.2ch.net/test/read.cgi/tech/1071506396/l50
の939で質問したのですが、まともなレスを頂けませんでしたので
こちらで再度質問させて頂きます。

メモリ上に決まったサイズの領域を確保して、それをドライブの
ように扱う(RAMディスク)を作るにはDDKを使用するのが一番楽なので
しょうか。
0071デフォルトの名無しさんNGNG
>>70
http://www.cenatek.com/product_ramdisk.cfm
0072デフォルトの名無しさんNGNG
71さん、レスありがとうございます。
リンク先のような物を自分で作ってみたいと考えております。
このような物を作る場合、DDKを使うのが楽なのでしょうか。
0073デフォルトの名無しさんNGNG
>>70
DDK 「でも」楽に作れます。
世界中に存在する全ての Windows 用ドライバ開発環境を知っているわけではないので、
「一番楽」かどうかはわかりません。
0074デフォルトの名無しさんNGNG
楽?
007570NGNG
73さん、アドバイスありがとう御座います。
MSDNがあるので、DDKでやってみようと思います。
やはりドライバを書いて、あたかも「ドライブが在るように見せる」
という感じになるのですよね?

私はWeb系の開発ばかりなので、正直ドライバを作るような高度な
事は避けたいと考えていましたが、そうもいかないですよね。
作ろうと思ったのは、仕事絡みでは無いので時間が在るのがいいです。
0076デフォルトの名無しさんNGNG
  ,.,,,,.,,,,
 ミ・д・ミ <ほっしゅほっしゅ!
  "''''''"
0077デフォルトの名無しさんNGNG
>>75
NT4.0DDKにRAMDISKのサンプルあるよ
0078デフォルトの名無しさんNGNG
さぁ、盛り上がってまいりました
0079デフォルトの名無しさんNGNG
今だと1GBのRAMDISKも作れるのか、、、時代は変わるなあ
0080デフォルトの名無しさんNGNG
DDKに付いてるサンプルって、ソフトに流用しても問題ないのだろうか?
0081デフォルトの名無しさんNGNG
>>80
利用規定みたのなかった?
0082デフォルトの名無しさんNGNG
>>81
あったの?
じゃぁ探してみようかな。
0083デフォルトの名無しさんNGNG
DDK欲しい。
0084デフォルトの名無しさんNGNG
>>83
ネットに落ちてるのはこれぐらいかな

98DDK
http://download.microsoft.com/download/win98SE/Install/Gold/W98/EN-US/98DDK.EXE

NT4DDK
ftp://ftp.atfile.com/download/WindowsDDK/WinNT/nt4ddk.zip
0085デフォルトの名無しさんNGNG
過去ログくらい見ろよ
0086デフォルトの名無しさんNGNG
盛りsage
0087デフォルトの名無しさんNGNG
>>84
ありがとう。NT4DDKはダウンできなかったです。
2000とかはMSDNに入らないとだめなんですね。
0088デフォルトの名無しさんNGNG
>>87
スレ一覧をDDKで検索
0089デフォルトの名無しさんNGNG
>>87
これだな
WindowsDDK各種についてのスレ
http://pc2.2ch.net/test/read.cgi/tech/1049116134/

NT4DDK
http://download.microsoft.com/download/winntwks40/Install/1998/NT4/EN-US/nt4ddk.zip

XPDDK
http://shelek.org.ru/ddk/DDK_XP.ISO
http://windriver.ssarang.net/pds/DDK_XP.ISO
0090デフォルトの名無しさんNGNG
>>89
ありがとう。
これで W*lter On*y を超えられます。
0091デフォルトの名無しさんNGNG
Win2kDDKって一時期はMS自体が公式にWEBでダウンできるようにしてたよね。
以降、DDKはWEBで公開するのかと思っていたんだけど、なんで方針転換したのだろう。

ところでXPDDKって円盤自体はタダで送料のみ掛かるってことみたいだけど、
DDKだけ送ってもらうとどのぐらいかかるんでしょう?
0092デフォルトの名無しさんNGNG
デバッグ方法がわからんからテスト実行するとき
青くならないようにいつも祈ってる。
0093デフォルトの名無しさんNGNG
>>91
そもそも住所の書き方からしてわからないんだよな。
http://www.microsoft.com/whdc/ddk/ordernetddkcd.mspx
0094デフォルトの名無しさんNGNG
>>92
ドライバのプログラミングの本とかにwindbgの大体の使い方が載ってる。
できるなら、開発用とデバッグ用にパソコンが2台あったほうがいい。
デバッグ用はVmwareでも代用できる。

windbgの最新バージョンは
http://www.microsoft.com/whdc/ddk/debugging/installx86.mspx
あとシンボルが必要だから
http://www.microsoft.com/whdc/ddk/debugging/symbols.mspx
自分のドライバのシンボルも作っておくことが必要。
0095デフォルトの名無しさんNGNG
>>91
http://pc2.2ch.net/test/read.cgi/tech/1049116134/1 によると $25
0096デフォルトの名無しさんNGNG
海外からだとこんなものなのか。
日本MSから送ればいいのに。
0097デフォルトの名無しさんNGNG
送料だけの無料DDKは無くなったみたいだよ。
DDKSuite3が199ドル+送料で入手可能。

1月中旬に頼んで2月頭に届きました。
0098デフォルトの名無しさんNGNG
>>97
Windows Server 2003 DDKは送料だけじゃないの?
0099デフォルトの名無しさんNGNG
送料だけでした。
$25

>>92
いたるところにDbgPrintを埋め込むしか・・・
0100デフォルトの名無しさんNGNG
PlatformSDKはUpdaterもあるのに、この扱いの違いはなんなんだ?
0101デフォルトの名無しさんNGNG
普通のソフト:誰でも作る → 便利になる
ドライバ:誰でも作れるというわけでもないし、作る奴も限られる → 何か不便なまま
だったりして。

>>92に関することで
青画面になるような例外って、
__try {
}
__except(){
}
でカバーできなないんかな?
■ このスレッドは過去ログ倉庫に格納されています