【WDM】Windows Driver Model相談室【デバドラ】
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
NGNG0666デフォルトの名無しさん
2008/08/12(火) 22:58:01フィルタドライバのっけて座標やボタンの状態を取得できるところまできたんですが、
連射させるところで行き詰まってしまいました。
ボタンを押したら Read が発生するんですが、次に離すまでRead がこないので
ボタン状態を変更しようにもできません。
なんとかしてボタンを押したことにしたり離したりしたことにできないでしょうか?
できるものなら何かヒントをお願いします。
0667デフォルトの名無しさん
2008/08/12(火) 23:18:07フィルタかけるところが違うんじゃないか?
0668666
2008/08/13(水) 12:29:51そこらへん調べてみます
ありがとうございました
0669デフォルトの名無しさん
2008/08/14(木) 03:07:29もしかしてIRP_MJ_READにデバッグ出力を入れただけだとしたら
下位のドライバがpendingにしてるから次のreadが来ないのでは。
0670デフォルトの名無しさん
2008/08/19(火) 20:26:36どうもです。恥ずかしながら私がアタッチしてたのはリモートデスクトップ用の
マウスクラス(?)のようで、ACPI のほうにアタッチしたら今度はREADそのものが
こない状況になりました。
DDK サンプルの mouclass やら moufiltr を見ると根本的に間違っていた気がします。
とは言え、moufiltr は USB マウスにアタッチしても Read 処理ではなく
MouFiltr_ServiceCallback() で処理するようになっていますが、GPAF のソースを
見ると(ゲームパッドとは言え)、Read で Hid 処理をしてたりするのでゲームパッドと
マウスの構造は同じ Hid でも違うのかなぁ、なんて思ったり。
結局、PS/2やUSBの選択、どの上位フィルタとして作るのが良いのかわからない状況に
なってしまいました。
今は本買って基礎からお勉強中です。フィルタドライバにまで関して言及してある
書籍って少ないですねぇ。
0671デフォルトの名無しさん
2008/08/20(水) 10:33:44ボタンに連射を付けるだけなら普通にmoufiltrで十分だとは思うけど。
連射発行タイミングをチェックするスレッドで
必要に応じてServiceCallback風の動作をすることと、
次の要求が来たときに下位ドライバにコマンドを発行せずに
スルー処理を追加する必要があるはず。
0672デフォルトの名無しさん
2008/08/20(水) 23:01:18どうもです。その ServiceCallback 風の動作をするというのがなかなか敷居が高そうで・・・
海外掲示板とか覗いていたら
「WRITE 時に mouclass の ServiceCallback をコールしたらBSOD になったけどどうすれば良い?」
みたいな内容のスレッドがあって結局未解決のようでした。
とりあえず、そのせんで行ってみて色々試して見ます。
0673672
2008/08/21(木) 22:26:24ありがとうございました。
ところでフィルタドライバは動的にアンロードできないと聞いたんですがXP や VISTAでも無理なんでしょうか?
SCManager 使ってドライバを停止および削除して、SetupDIでフィルタ対象デバイスを再起動させると
フィルタはされなくなるんですが、ドライバそのものはアンロード処理されずにロードされっぱなしになってるようで…
単なるつくりの問題ですか?
0674デフォルトの名無しさん
2008/08/22(金) 02:13:24普通にデバイスいなくなったら元ドライバとセットでアンロードされると思うんだけど。
それでアンロードされてない、ってことは終了処理にミスがあるんじゃね?
スレッド終了うまくいってないとか。
0675673
2008/08/22(金) 23:21:10もっと調べてみます。どもでした。
0676デフォルトの名無しさん
2008/08/23(土) 08:42:14フィルタドライバがWDMならデバイスを抜くとフィルタドライバも開放されるんだけど
私がHIDでやったときは、WDMだとうまくいかなかったのでNTドライバにしました。
そうするとデバイスを抜いただけではアンロードされないですが、SetupDI系の関数で
アンロードさせることはできます。
0677デフォルトの名無しさん
2008/08/23(土) 09:17:20USBデバイスのフィルタドライバを書き、そのデバイスに対し
SetupDiSetClassInstallParamsでDIF_PROPERTYCHANGE/DICS_PROPCHANGE指定して
SetupDiCallClassInstallerを呼び出しいる。
で、無視できない確率でドライバアンロードに失敗する。
自前ドライバの処理でIRP_MN_QUERY_REMOVE_DEVICEに対し
STATUS_SUCCESSを持たせて下位ドライバを呼び出しているのに、
IRP_MN_CANCEL_REMOVE_DEVICEが飛んでくる。
これって、下位ドライバがリムーブを拒否してるんだと思うが
何が原因かわからん。
何か思いつく事があったら教えてください、皆の衆。
0678デフォルトの名無しさん
2008/08/23(土) 21:22:52ありがとうございます。
アンロードされずに残ったドライバを、DriverWalker などでアンロードさせようとしても失敗しちゃうんですよね。
何か解放してないんでしょうねorz
0679デフォルトの名無しさん
2008/08/24(日) 17:21:54動きを見てみればいいんでない?
0680デフォルトの名無しさん
2008/08/25(月) 23:32:13これでCPUのクロック数を変化させることってできますか?
WinRing0
ttp://openlibsys.org/index-ja.html
0681デフォルトの名無しさん
2008/08/25(月) 23:38:070682まつせ
2008/08/25(月) 23:49:320683デフォルトの名無しさん
2008/08/26(火) 21:59:10Host:Vista or XP、Target:Vistaの構成で1394接続って可能ですかね?
手順通りにやってもうまくいきません。
0684デフォルトの名無しさん
2008/08/26(火) 22:20:55Host XP Target Vistaで普通にできてる。
だが、使っている1394アダプタによっては動かないことがある。
VIAの古いチップではだめだった。
外人でも似たような人はいるが具体的な話はまだ見たことが無い。
ホスト側はTIのチップつんだやつにしとけ ぐらいしか書いてないが
今時はTIのチップ積んでることなんてあまりないので難しいかも。
手順に問題が無いのであれば
とりあえずホスト側の1394の交換をしてみることをオススメする。
0685693
2008/08/27(水) 22:37:11ケーブルを疑って新しいケーブルに交換したらうまく動きました。
別のマシンでは動いていたんで、まさかとは思ったんですが・・・
Vistaは1394ネットアダプタがないんで通信できてるのかよくわかんないですね。
ともかくありがとうございました。
0686デフォルトの名無しさん
2008/08/28(木) 23:17:50C言語は多少経験ありますが、ドライバ開発はまったくないので手探り状態で勉強してます。
ディスプレイ関連の操作をしたいのでサンプルソースのvideo\displays\mirror\miniを参考に
下記コードにてビルドをしようとしたのですが、DriverEntryの定義エラーがでました。
そこでntddk.hをインクルードしてみたのですが、今度はminiport.hで再定義エラー(C2011)が出てしまいます。
インクルードする順番など変えてみたのですがエラーが出まくりの状態です。
#include "dderror.h"
#include "devioctl.h"
#include "miniport.h"
#include "ntddvdeo.h"
#include "video.h"
NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING pRegistryPath)
{
NTSTATUS ntStatus = STATUS_SUCCESS;
return ntStatus;
}
付属のサンプル等は問題なくビルドできています。
どうすればビルドできるか教えていただけないでしょうか。
よろしくお願いします。
環境:WDK6001.18001 Windows XP x86 Checked Build
Windows XP SP2
0687デフォルトの名無しさん
2008/08/28(木) 23:22:390688686
2008/08/28(木) 23:27:46まじですか・・・
ntddk.hインクルードしない下記のようなエラーが出てしまいます
c:\winddk\test\main.c(31) : error C2061: syntax error : identifier 'DriverEntry'
c:\winddk\test\main.c(31) : error C2059: syntax error : ';'
c:\winddk\test\main.c(31) : error C2146: syntax error : missing ')' before identifier 'pDriverObject'
c:\winddk\test\main.c(31) : error C2061: syntax error : identifier 'pDriverObject'
c:\winddk\test\main.c(31) : error C2059: syntax error : ','
c:\winddk\test\main.c(31) : error C2059: syntax error : ')'
ntddk.hインクルードすると上のエラーはなくなりますが代わりに再定義エラーが100個以上・・・
VS.NET2003インストールしてあるのは関係ないですよね・・・?
0689デフォルトの名無しさん
2008/08/28(木) 23:27:510690デフォルトの名無しさん
2008/08/28(木) 23:29:47SOURCE とか makefile はちゃんとコピーした?
0691686
2008/08/28(木) 23:30:26フォルダ別に作ってMAKEFILEとSOURCESをコピーして
SORCESの"TARGETNAME"と"SOURCES"だけ編集してビルドしてます。
0692デフォルトの名無しさん
2008/08/28(木) 23:42:52#include <wdm.h>
NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING pRegistryPath)
{
NTSTATUS ntStatus = STATUS_SUCCESS;
return ntStatus;
}
だとどうよ?
0694デフォルトの名無しさん
2008/08/29(金) 00:03:06video.h とか使う場合は wdm.h とかの include 無理なんかな。
0695686
2008/08/29(金) 00:08:35そうなんですよね
サンプルのようにDriverEntryの戻り値型と引数型を変更すると
ビルドできるんですが、DriverEntryってどこ調べてもNTSTATUSと
PDRIVER_OBJECT、PUNICODE_STRINGで定義されてるので・・・
0696デフォルトの名無しさん
2008/08/29(金) 01:47:15これはドライバ開発をする人が誰もがはまる。
WDMドライバを開発=フィルタドライバorクラスドライバ
だが、ある程度共通化できるルーチンが多い場合に備えて
クラスドライバをMSが用意し、そこからリクエストをするのがminiportドライバ
miniportでは専用のライブラリ関数が用意されていて
それら以外の関数は使ってはいけない。
したがってntddk.hをインクルードできないし、してはいけないし
MSは共存させるつもりもない。
それでも無理やりやるのは完全にハックになり
サービスパックやパッチが当たっただけで動かなくなる可能性がある。
0697デフォルトの名無しさん
2008/08/29(金) 21:07:590698デフォルトの名無しさん
2008/08/29(金) 22:32:28ServicesレジストリのStartキーが0ならブートローダーのときに呼ばれる。
起動ディスクを読み込むのに必要なデバイスのStartキーはすべて0になっていないと0x7Bが出る。
OSインストール時にIDEデバイスとか登録されてはいるが
カーネルメモリ節約のために必要の無いデバイスはStartが4になっている。
そのためディスクを付け替えたりすると起動しないことがある。
0699デフォルトの名無しさん
2008/08/30(土) 08:39:30minispy、filespyサンプルの処理内容を理解するのに役立つ書籍や入門サイトがあったら教えていただきたいです
目的は、ファイルの上書きやコピーなど高レベルなファイルI/O監視ドライバを作成することです(フックではなくドライバで行いたいです)
サンプルでは低レベルなIO情報まで監視されてしまうため、これを改造できないかなと考えてます
自分は、ドライバ開発経験はなしです。キーボードのフィルタドライバサンプルは、日本語の書籍で勉強し、軽くは理解しています。
…ソースコードが少ないminispyを理解したいんですが、ミニドライバの資料ってあまりみたことないです
0700デフォルトの名無しさん
2008/08/30(土) 13:00:02違ったらよいんだが、
Windows XP フィルタドライバプログラミング [入門と実践]
を読んで「軽くは理解しています。」と思っているなら認識改めたほうがいい。
あれで得た知識(見たサンプル)は全く役にたたない。
0701デフォルトの名無しさん
2008/08/30(土) 16:18:14素朴な疑問だが上書きやコピーといった監視だったら、ドライバつかわんでも
FindFirstChangeNotification()という手もある。
これじゃあなんかまずい理由あるの?
0702デフォルトの名無しさん
2008/08/30(土) 19:59:59フィルタドライバプログラミングではないです。それは参考にしてないです。
API徹底理解っていうムックと。Cマガのバックナンバーです。
「ダミー関数はこんな感じで作って」、「でもPnPのダミー関数は別」ってことくらいしか理解してないです。
filespyを見ても、「なんでこのファンクションを監視するんだ?」って疑問しかわかないんです。かと言って、USBドライバを最終目標にしてる書籍はfilespyの世界とは畑違いな気がして
>>701
あのAPIの詳細は知らないんですが、ファイルを操作したユーザー名やアプリケーション名が取得できるならやってみたいです。
ただ、ローカルだけでなく、リムーバブルやサーバーやネットワークPCも監視が条件なので
0703デフォルトの名無しさん
2008/08/30(土) 21:43:59ローカルならPIDが入ってくるからそこからユーザートークンに変換すればいい
でもネットワークドライブはまた別の話になるよ
リモートのPIDなんか分かってもしょうがないしね
そもそもSMBのリダイレクタのPIDしか入ってこないだろうし
0704デフォルトの名無しさん
2008/08/31(日) 00:32:13それが上書きなのかコピーなのかというような意図?は、カーネルレベルでは
失われているような気がするんだけど。
0705デフォルトの名無しさん
2008/08/31(日) 01:03:30まずはWindows Internals(和訳名インサイドWindows?)読んでみたらどうだ。
0706デフォルトの名無しさん
2008/08/31(日) 07:19:19フィルタドライバで分かるのは削除と同じボリューム内の移動だけだね
というかやりたいこと具体的に言わんと
0707702
2008/08/31(日) 10:10:41minifilterで作っていきたいと思います。ネットワークからリモートログインしてきたユーザーの監視はしません。自分がリモートで操作したファイルは監視します。
>>705
ドライバ系のAPI知識はゼロに近くて、ファイルシステムのフの字も知らないです。インサイドウィンドウズの購入してみます。…でも金がないので会社から借ります
>>706
やりたいのは、フックベースで実現できていたファイル監視をドライバに移植することです。
>>704
コピーや上書きは、フックベースでも追いきれないとこがあったんで「ReadFileで処理したアドレスがWriteFileで処理されたらコピー扱い」みたいなマージをしており、ドライバでもマージしようかなと考えてます
長い旅路になりそうです。ありがとうございました
0708デフォルトの名無しさん
2008/09/02(火) 01:37:50シリアルクロスケーブルを購入したのですが、
どちらのPCにもシリアルポートがないようなのです。
調べてみたところ、USB シリアル変換機というのを利用すれば、
それを経由してシリアル通信ができそうなのですが、
この変換機はPC1台につき1個、つまり2個必要であると考えて問題
ないでしょうか。
また、クロスケーブルではなく、ストレートのシリアルケーブルでは、
デバッグはできないものなのでしょうか。
0709デフォルトの名無しさん
2008/09/02(火) 06:40:140710デフォルトの名無しさん
2008/09/02(火) 14:19:43つまり、シリアルポートがない場合は、
リモートからのデバッグはできないと。
デバッグといっても、DbgPrintの結果を確認したいだけなので、
ローカルでDebugViewを使う方法でもよいのですが、
リモートの方法も気になるところです。
0711デフォルトの名無しさん
2008/09/02(火) 14:59:28>また、クロスケーブルではなく、ストレートのシリアルケーブルでは、
>デバッグはできないものなのでしょうか。
時代が変わって、232cなんて使わなくなってきたのは分かるが・・・
0712デフォルトの名無しさん
2008/09/02(火) 20:03:230713デフォルトの名無しさん
2008/09/02(火) 22:29:21作ってます。
汎用性を持たせるためにinf及びdelファイルを書き換えるだけで
インストーラ、アンインストーラは再コンパイル不要とした作りに
したいと思っています。
そこで、特定のINFファイルから"USB\VID_xxxx&PID_xxxx"を
抜き出して行うような方式としたいとおもうのですがなにか
方法(Win32 API)は無いでしょうか。
0714デフォルトの名無しさん
2008/09/03(水) 00:10:22INFが適切なら実行するだけでインストールしてくれる
あと、DPINSTをAPI化したDIFとかいうやつもある。
0715713
2008/09/03(水) 21:16:14たしかにINFのみでインストールだけなら可能なのですが、
コマンド等でカスタマイズも考えているので...
で、自ら調べた結果、GetPrivateProfileStringが
INIだけでなくINFにも使えそうなので、これを組み
合わせて作ろうと思うのですが他に何かいいアイディアは
ありますか?
0716デフォルトの名無しさん
2008/09/03(水) 22:35:580717713
2008/09/10(水) 13:20:32何とかできそうです。
ありがとうございました。
0718デフォルトの名無しさん
2008/09/15(月) 22:45:22インストールしたのですが、なんだかロードされてない感じがします。
(KdPrintなどのデバッグメッセージが表示されない)
起動時に読み込まれるドライバには署名が必須という条件にひっかかかっているのかと思い
Bcdedit.exe /set nointegritychecks ON
を実行してみましたが何も変わりませんでした。
VISTA にインストールするにはどうしたらよいのでしょうか?
ちなみに XP だと問題なく動作しました。
0719デフォルトの名無しさん
2008/09/15(月) 23:36:24フィルタされてるのでは。
KdPrintExかDbgPrintEx使ってみたらどう?
0720デフォルトの名無しさん
2008/09/16(火) 00:28:460721デフォルトの名無しさん
2008/09/16(火) 01:03:020722718
2008/09/16(火) 10:32:18使用してみましたが、結果変わらずでした。フィルタされてないようです。
>>720
してないです。署名はどのような設定だろうと必要なんでしょうか?
テスト用の署名では公開できないと思うので、公開しようと思ったら
リリース用の署名をとらないと駄目ってことでしょうか?
>>721
http://www.microsoft.com/japan/whdc/winlogo/drvsign/drvsign.mspx
では x86 も「ロード時に読み込まれるドライバには埋め込み署名が含まれている必要が
あります」とあります。
0723デフォルトの名無しさん
2008/09/16(火) 10:52:05公開前提ならテスト署名で動作確認後にリリース署名確保でいいと思う。
デバイス固有でいいならkbfilter使うよりクラスでHIDミニドライバ作ることも検討した方が楽だろうけど。
http://www.microsoft.com/japan/whdc/winlogo/drvsign/kmcs_walkthrough.mspx
の右からダウンロードできる、
http://download.microsoft.com/download/c/f/6/cf670671-64aa-4eb2-abbf-bb33dc4ac834/KMCS_Walkthrough_jpn.doc
これを見るとそのオプションは製品版VISTAでは存在しないことになってる。
テスト署名であれば
bcdedit.exe /set TESTSIGNING ON
でロードできるようだが。
0724718
2008/09/16(火) 22:13:50存在しないことになってたんですねorz
テスト署名してみたところ、無事ロードされるようになりました。
でも HD DVD とか Bluray とか再生できなくなるのかな・・・?
みなさん、ありがとうございました。
0725デフォルトの名無しさん
2008/09/17(水) 09:26:140726デフォルトの名無しさん
2008/10/04(土) 02:38:08そこで、事始めに 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 を受信したときに、
頻繁にブルースクリーンが発生します。ファイルサイズが小さな場合は成功するときもあるのですが・・・
スレッド間での排他処理を記述しなければならないのかなとも思いましたが、単にリクエストを下位デバイスに渡すだけでも
そういった処理は記述する必要なのでしょうか?
0727デフォルトの名無しさん
2008/10/05(日) 10:00:09その問題のソースをどこかにアップして、ブルースクリーンの内容を全部書けば
すぐ解決するのになんで答えを省くかな
0728デフォルトの名無しさん
2008/10/07(火) 08:13:49サンプルでは、ドライバ側のFltGetFileInfomationでファイル名取得しとんがやけどその時点てとれるんかな。今日デバッガ準備して確認するけど。暇な人、教えてください(´・ω・`)
0729デフォルトの名無しさん
2008/10/09(木) 20:56:200730デフォルトの名無しさん
2008/10/12(日) 19:20:53ブルースクリーンの内容を書かないと何もいえない。
まずはBSODへの対処の仕方を
MSDNでよく読んで実践してみることをお勧めする。
ただ、フィルタードライバーのR/Wでそういうことが起きているということなら
バッファの取り扱いが適切で無いと推測する。
ファイルシステムの場合、R/Wへのアクセスが3種類ぐらい来るので
それらを適切に扱わないとすぐ問題がでたはず。
>>729
%sではなく%wsとするとちょっといいことがあるかも。
0731デフォルトの名無しさん
2008/10/14(火) 08:04:50ありがとうございます.指摘の通りバッファの扱いが不適切なのかもしれません.
まず,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
0732デフォルトの名無しさん
2008/10/14(火) 08:16:13PDEVICD_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 に値を設定するということでしょうか?
0734727
2008/10/14(火) 13:30:12733さんが正解。
NtWriteFile内のIoGetRelatedDeviceObject()でトップレベル
(あなたのドライバ)のDriverObjectを手に入れて
DriverObject->DriverObject->FastIoDispath->FastIoWrite()でクラッシュしてる。
ebxがFastIoDispathでこれがNULLだから[ebx+0C]にあたる
FastIoWriteをコールするときにds:0023:0000000Cを参照。
0735デフォルトの名無しさん
2008/10/16(木) 08:39:40本当にありがとうございます.
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 など)と“ファイルが見つかりません”
のメッセージが表示されうまく行きませんでした.
後者のファイルもうまく開くようにするための良い方法はありますでしょうか?
質問ばかりで申し訳ありません・・・
何か良い方法などがありましたらお願いします
0736デフォルトの名無しさん
2008/10/16(木) 10:38:44signtool sign /v /s my /n testca test.sys
でドライバファイルに埋め込み署名したところ、ファイルのプロパティの
デジタル署名タブでは「問題ありません」になるのに、CreateService()
で登録してデバイスマネージャのドライバの詳細で確認すると
「デジタル署名されていません。」になってしまいます。
これはテスト証明書だからでしょうか?それとも何か手順が漏れているのでしょうか?
0737デフォルトの名無しさん
2008/10/16(木) 11:17:10テスト証明書だからですね。
テスト証明書を「(あなたが)信頼する発行元」として登録したので、”ファイル”のプロパティーでは「問題ありません」になります。
が、テスト署名の手順ではその証明書(のルートの証明書)へのマイクロソフトのCross-Certificateができないため、
その署名はカーネルモジュールへの署名としては「”マイクロソフトからは”信頼されない証明書による署名」になります。
redirect先に、ファイルを作る。
0739デフォルトの名無しさん
2008/10/16(木) 23:16:23ありがとうございます。
ということは正式な証明書をとれば大丈夫そうですね。
しかし、日本で頼むと6万とか9万超とかなんであんなに高いんだろう。
0740デフォルトの名無しさん
2008/10/19(日) 18:37:59WinXP環境でドライバ設計中に、PAGE_FAULT_IN_NONPAGED_AREA(0x00000050)
という文字を吐くブルースクリーンが頻度は小さいですが出ます。
通常、ドライバの問題であれば、設計中のドライバの名前が表示される
ブルースクリーンが表示されると思うのですが、原因を検討中です。
どういった原因が考えられるか同じような問題に出くわした方がいらしたら
ご教授願います。
ちなみにドライバが画像処理ボード用です。
失せろ。
0742デフォルトの名無しさん
2008/10/19(日) 23:42:27日本に来て勉強しながら頑張ってるのかもしれないぢゃないか
0743デフォルトの名無しさん
2008/10/19(日) 23:55:580744デフォルトの名無しさん
2008/10/20(月) 01:33:530745デフォルトの名無しさん
2008/10/23(木) 23:45:13そういうのってminispyサンプルを改造すれば実装できるでしょうか?
試しにドライバ側のソースを下記のようにいじってみたんですが読み取り専用にはできませんでした
PreOperationコールバック関数内で
PFLT_CALLBACK_DATA->Iopb->MajorFunctionがIRP_MJ_CREATEのときに
FLT_CALLBACK_DATA->Iopb->MajorFunction->Paramamters.Create.SecurityContext->DesirendAccessにGENERIC_WRITEを代入
アタッチしたドライブのIRPを読み取り専用に書き換えるっていうイメージだったんですが、正常に読み書きできましたorz
0747デフォルトの名無しさん
2008/10/27(月) 20:18:44CPUのプロセッサ数(コア数?)を取得する方法を探してるんだけど誰かおせーてー
というかデバイスドライバはサンプルとか入門ページとか数なくてホントワケワカメ。
なんで、それ探すために
「WDMデバイスドライバプログラミング完全ガイド下巻」の購入を検討しているんだけど
関数リファレンスとかどこぞで公開されてないんでしょーか?
0748デフォルトの名無しさん
2008/10/27(月) 20:36:43詳細情報を自前で取りに行ったら?
0749デフォルトの名無しさん
2008/10/27(月) 21:48:06とりあえず、
>「WDMデバイスドライバプログラミング完全ガイド下巻」の購入
は止めとけ。
ほとんどがNTドライバの話(WDMでもこの知識は必要だが)で、WDMについては下巻の後半のみ
KeNumberProcessors
0751デフォルトの名無しさん
2008/10/28(火) 05:46:35うおー
ありがとー
リファレンス英語版のMSDNにはあるんだね
特にデバイス制御が目的じゃなくて
APIフックの為にカーネルモードで走らせれる環境が必要で
デバドラ作ってるんだけどガイド本はどうしようかな
しかしほんとに毎日BlueScreen何回見てることやら・・・
0752デフォルトの名無しさん
2008/10/31(金) 12:34:470753デフォルトの名無しさん
2008/10/31(金) 14:55:53参照渡しってDirect-IO(MDL渡し)のことか?
0754デフォルトの名無しさん
2008/10/31(金) 15:37:35MDLはよくわからんが、多分そんな感じ
ドライバがIrp->AssociatedIrp.SystemBufferで取得したparamに値を代入した場合
アプリ側でその値は取得できるのかな?っみたいな。。
0755デフォルトの名無しさん
2008/10/31(金) 16:30:36ttp://www.sciencepark.co.jp/community/report/report27.html
METHOD_BUFFEREDにして、lpOutBufferで読むとか。
0757デフォルトの名無しさん
2008/10/31(金) 23:15:55ドライバ→アプリのデータを、アプリが用意したバッファにドライバがコピーするのでなく、
ドライバの持ってるバッファのアドレスをアプリに渡したいのか??(それは無理)
MDLを知らないってことは基礎知識が全く無いってことだよな、やめとけ
>>756
なぜにlpOutBuffer?
METHOD_BUFFEREDではドライバ側ではIN/OUT同一のバッファだけど、ドライバでバッファにセット
したデータは、lpInBuffer側にしかコピーされないよ
0758デフォルトの名無しさん
2008/10/31(金) 23:51:39ドライバとアプリで同時に読み書きしたいとかそんなところ?
排他制御やら面倒そうだが名前つきのFileMappingで出来るんじゃないかな。
それはともかくWDK SP1が出たね。
0759デフォルトの名無しさん
2008/11/04(火) 13:34:27ドライバ側で、パッドに実装されているボタン以外のイベント(17~32あたり)を発生させることは可能でしょうか?
やりたい事は、可能だと思う。
事前に、適当なreportDescriptorを返すとかで。
元からそのパッドに存在しないボタンに振り替えするのは
760が書いてるようにReportDescriptorをでっちあげる必要がある。
もちろんボタン数が増えてデータサイズが増えたら
Reportもそれに併せて手を入れないといけない。
やる気になればマウスだろうがキーボードだろうがHIDの機能なら全部振り替えできなくもない。
つーか箱○改造版ではキーボード振り替えやってる。
独自ドライバ使ってるデバイスの場合、フィルタでやっても
動作しない可能性があるので、独自にドライバ起こす方が無難。
0762デフォルトの名無しさん
2008/11/04(火) 15:14:22USBでぶっさした機器は直接 HID機器ではない扱いで
HIDドライバが 4アナログ 32点 提供 それのマッピングは任意にできるぜ
0763759
2008/11/05(水) 10:56:55とりあえずreportDescriptorでググってみたが、ezusbやpicのマイコン関連しか出てこない。。
もしかしてこれってWDMより外のはなし?
0764デフォルトの名無しさん
2008/11/05(水) 11:04:12HIDの話しだからWDMの外と言われればそーかもな
USB.org行ってHIDのドキュメント漁ってくるのが確実。
あとは公開されてるゲームパッドドライバのソースを見る。
HID部分についてはWDM以外のLinuxとかでも同じなので
そっち系のソースを見る方が分かりやすいかもね。
「USAGE_PAGE」でググるとソースが見つかりやすい。
>>762
質問者は既存のゲームパッドの動作改造目的なんだから
「マッピング部分を差し替える=ReportDescriptorを差し替える」部分をやらなきゃいけないわけだ。
その方法論について聞かれているわけで、視点がちょっと違うんでない?
0766759
2008/11/06(木) 12:24:36ググってみたが、 ttp://www.tamanegi.org/prog/vtchid/くらいしか見つけられんかった;
とりあえず参考にしてみようと思うが、ソースが複雑過ぎる><
■ このスレッドは過去ログ倉庫に格納されています