
Q1:PCIDEBUG.DLLのI/O命令がうまく動かない
PCIDEBUG.DLLをWindows98で、IDEコントローラのアドレスにI/Oアクセスしてみたのですが、うまくいきません。なぜでしょうか。
A:
Windows95,98ではDLLの中からライブラリーにあるI/O命令を使ってI/Oを出しています。このため、既にデバイスドライバーがロードされている場合、プロテクトされてしまいうまくいきません。
デバイスマネージャーでドライバーを停止させ使用してください。なおNTではカーネルモードからI/Oを出しているためこのような事はありません。
95,98でもそうすれば良いのですが、現在はこうなっています。そのため95,98では高速にI/Oを出せます。
Q:95で使うにはDDK95が必要ですか?
A:
Windows95で動作させる場合はVxDをDDK95を使ってコンパイルしなければ動作しません。
しかしMicrosoftの資料にDDK98でWindows
95用のVxDを作る方法が紹介されていました。
ソースの
VMM.INC をincludeする前にWIN40COMPAT EQU 1
VMM.H をincludeする前に #define WIN40COMPAT 1
を追加します。
Microsoft Windows 98 DDK 環境で、Windows 95 上でも動作する仮想デバイス
ドライバを作成する方法がありました。
Q2:2つのエンドポイントを同時に制御
エンドポイントを2つ(IN,OUT)もつUSBデバイスを設計しています。DDKのサンプルを元にドライバーを作ってみたのですが、マルチスレットのソフトで二つのパイプを同時に使用するとどうもうまくいきません。
IRPは一度に一つしか出してはいけないのでしょうか?
UUSBD.DLLではどうなんでしょうか
A:
UUSBDではできます。DDKにあるサンプルbulkusbは一つのIRPを処理中に新たなIRPが来る事を想定して作られていません。デバイスオブジェクトの中に現在処理中のIRPを覚えている場所があるのですが、これが1つしかなく、次にIRPがくるとこれが上書きされてしまうためです。
Q3:ドライバー作成についてよい書籍はありませんか?
A:
私は、DDKのオンラインマニュアルやサンプルプログラムなどが最も役立ちました。DDKのマニュアルもDDKのバージョンによって少しづつ詳しくなっているようなので、USBについては、98DDKよりWindows2000DDKの方がよいでしょう。WDMやUSBについての日本語の本があると良いのですが、まだ見たことありません。
Q4:インターラプト転送の読み出し長について
早速、私のUSBデバイスをUUSBDで動作させてみました。このデバイスはインタラプト転送のパイプを持っています。このパイプからReadする時に1byteづつ読むとうまくよめません。なぜでしょうか
A:
この点については私もWindowsのUSBドライバー(USBD)に関する情報不足で正確には分らないところがあります。いろいろ調べたところインターラプト転送の場合は、Readのバイト数がUSBデバイスから送られてくるデータ長より短いとこうなるようです。エンドポイントディスクリプターにあるwMaxPacketSizeの大きさを用意しておけば問題無いと思います。
詳細がわかりましたらおしらせします。