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

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

レス数が900を超えています。1000を超えると表示できなくなるよ。
0001デフォルトの名無しさんNGNG
ようこそ、Blue Screenへ(・∀・)
0830チン顧問 ◆RitalinnSs NGNG?DIA(144556)
今のWDKのセットアップから
親切に説明してくれてる書籍ってあるんでしょうか

0831デフォルトの名無しさん2009/04/01(水) 09:00:22
この辺
「Windows Vista カーネルソフトウェア開発技法」
「Windows Vistaデバイスドライバプログラミング」
0832チン顧問 ◆RitalinnSs NGNG?DIA(144556)
ありがとうございます

とりあえずフリーのWDKのインストールまではできたのですが
wdm.hとntddk.hがコンパイラバージョンが合わないとかで
サンプルがビルドできないorz
とりあえず本待ちだ
0833チン顧問 ◆RitalinnSs NGNG?DIA(144556)
とりあえず原因はわかった
もってるVCがバージョン6だからだ
とりあえず7以降のがほしいってことで
0834デフォルトの名無しさん2009/04/01(水) 15:13:52
どやって、ビルドしようとしてんだ・・・?
0835デフォルトの名無しさん2009/04/01(水) 15:17:14
いきなりVCでWDK動かそうとするなよ。
基本CUIだぞ。

>>834
パス通したり設定さえやってればVCで動くプロジェクトも作れる。
WDKサンプルのままmakefileとか使った方が手っ取り早いが。
0836チン顧問 ◆RitalinnSs NGNG?DIA(144556)
いちおうVS6はあって
2000用のは作ったことがあるのですよ

なのでだいじょうぶかなぁと
0837デフォルトの名無しさん2009/04/01(水) 22:39:55
VC9EE+WDK+DDKWizardでIDE依存症のあなたも幸せ
0838デフォルトの名無しさん2009/04/02(木) 16:10:48
最近知った言葉:UMDF、KMDF、WDF
Limuxのカーネル関係勉強してからWindowsをさわろうと思う。
0839デフォルトの名無しさん2009/04/02(木) 22:56:47
ビルド環境ってOSごとにあるけど違いとかある?
どれでビルドしても2000でもXPでもvistaでも使えるようだけど、
各osのビルド環境で別々に作ったドライバを使ったほうがいいの?
0840デフォルトの名無しさん2009/04/09(木) 14:32:04
ねーよw
0841デフォルトの名無しさん2009/04/09(木) 16:04:15
>>839
どのOSにも存在する機能を使ってるぶんには同じ。
XPとかVistaにしかない関数を使うんなら、OS毎にビルドするなり
ダイナミックロードするなりすればよろし。
0842デフォルトの名無しさん2009/04/09(木) 19:14:22
ターゲットじゃねえぞ
0843デフォルトの名無しさん2009/04/27(月) 23:19:49
教えてください。
IDEの設定についてです。

WinDDK\6001.18002\inc配下に
api
atl21
atl30
crt
ddk
mfc42
wdf
というフォルダがそれぞれありますが、

Visual Studio 2008の
ツール→オプション→プロジェクトおよびソリューション→VC++ディレクトリ
にてインクルードディレクトリを設定しようと考えているのですが、
設定する対象フォルダは「ddk」のみで大丈夫でしょうか?
※インテリセンス機能を使いたいので。。。


宜しくお願いします。
0844デフォルトの名無しさん2009/04/30(木) 22:21:56
シャットダウン再起動休止状態スタンバイスリープなどを
ドライバ内で検出する方法があれば教えてください
0845デフォルトの名無しさん2009/05/04(月) 23:57:22
>>843
ソースによると思うけれども
手元では、inc\api と inc\ddk をインクルードファイルの設定に入れてる。

>>844
MajorFunction[IRP_MJ_POWER] の中で
IRP_MN_SET_POWERやIRP_MN_QUERY_POWER で引っ掛けて
Parameters.Power.ShutdownType や powerState.SystemState を
見れば、ある程度、判るよ。

というか、普通実装してあるはずだけど。
08468432009/05/09(土) 16:04:32
>>845
ありがとうございます
実はあの後色々錯誤してapiとddkのみ
インクルードファイルに設定することにしました。


再確認できてよかったです。
0847デフォルトの名無しさん2009/05/10(日) 23:18:12
ドライバ初心者です。
あるデバイスに対して、I/Oの入出力と
割り込みのハンドリングを行うだけの
簡単なドライバを作りたいのですが、
簡単なサンプルソースはどこかに無いでしょうか?
(ソースファイル1つ、ヘッダファイル1つくらいのもの)
DDKのサンプルは少々複雑で・・・。
よろしくお願いします。
0848デフォルトの名無しさん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

宜しくお願いします。
0849 ◆0uxK91AxII 2009/05/16(土) 11:00:05
>>848
Cで書けばOK。
0850デフォルトの名無しさん2009/05/16(土) 14:58:58
>>849
build通りました!ありがとうございました!
0851デフォルトの名無しさん2009/05/19(火) 01:01:24
最近のDDK(WDK)ってgeninf.exeは付属していないのでしょうか?
infファイルは自分で書くしかないのでしょうか?
0852デフォルトの名無しさん2009/05/23(土) 14:34:46
VS2010ベータ出るな
MSDN会員だけ先行して公開されてる
0853デフォルトの名無しさん2009/06/02(火) 00:16:09
ドライバでWindowsロゴテスト受けてないと、リリース署名つけても
デバイスマネージャ→ドライバの詳細上のデジタル署名者欄で
署名なしとされてしまう模様。
リリース署名したがVista x64でのこれがどうも気になる。

やっぱロゴテスト合格しないとここは署名なしのままなのかな。
0854デフォルトの名無しさん2009/06/02(火) 01:06:11
そりゃカタログファイルが無いからな。
0855デフォルトの名無しさん2009/06/10(水) 05:12:17
http://www.dhs-tools.at/products_finisar_busdoctor_eng.htm
高卒だけど怪しいのみつけた、一応はあらゆるプロトコルの解析ができるみたい
すれ違いだったらすまん
0856デフォルトの名無しさん2009/09/06(日) 18:21:59
IRPをキャプチャするフィルタを好きなところ、あるいは、全部の
UPPERなりLOWERなりにSetupDIで突っ込むんだろうね。
アプリが大変だね。CDB・CBW・タスクファイル・・・
0857デフォルトの名無しさん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 );

これら引数からアプリ起動時のコマンド引数の文字列を取得する方法をご存知の方をご存知の方がいましたら、
教えていただけないでしょうか。よろしくお願いいたします。
0858デフォルトの名無しさん2009/11/17(火) 00:07:07
まぁーPCやってることが2chやってることと同義だって考えてる人にとっちゃ
PCやってるなんてお�hるかもしれんのう。
0859デフォルトの名無しさん2009/11/17(火) 00:07:24
誤爆ですw
0860デフォルトの名無しさん2009/11/17(火) 02:30:38
お�hる
0861デフォルトの名無しさん2009/12/10(木) 15:08:06
ndisフィルタでパケットフィルタ作りたいんだが
サンプル見てもコンパイルの仕方すら分からない状況ですが
まあそれは調べたらあったのでいいとして
アプリケーションとどうやって通信するのかとか、ドライバ自体をどうやってシステムに登録するのかとか
ほとんど何も分からないし調べても出てこないんですが
サンプルコードでもあれば教えてください
0862デフォルトの名無しさん2009/12/10(木) 15:46:58
WDK7のサンプルソースみれば一発だろ。
まずはWDDFの書籍買って一から勉強しろ。
0863デフォルトの名無しさん2009/12/10(木) 21:30:27
いや一発じゃないだろう、お前は超能力者か何かか?
geekなサイトにもぐりこんでだいたいやり方は分かった
08648622009/12/10(木) 22:49:39
>>863
いや、アフォでなければ分かる。
WDKあるならドキュメント読めば全部きっちり載ってる。
英語が面倒で見てすらいないんだろ。

大体、

> サンプルコードでもあれば教えてください

って、network\ndis\filterにndisのlowerfilterがあるわけだが。
ろくに探しもしてないことが明白。
0865デフォルトの名無しさん2009/12/13(日) 23:04:15
痛々しい863age
0866デフォルトの名無しさん2009/12/23(水) 16:54:59
http://msdn.microsoft.com/en-us/library/aa490588.aspx
これ見るとIoIsWdmVersionAvailableの引数が
Vistaと7で同じになってるんだけど誤記じゃないの?
RtlIsNtDdiVersionAvailableのほうを使うべきと書いてあるのはこの問題があるから?
でもこの関数をXP以前のOSで使おうとしてもライブラリのリンクができない。
0867デフォルトの名無しさん2010/01/05(火) 12:43:34
WinDriverってカーネルコード書かないでドライバ作れるけど
いったいどういう仕組みなんだろ?
ユーザーランドのコードを対応するものに変換してくれるとか?
0868デフォルトの名無しさん2010/02/17(水) 06:46:43
DDKで、DuplicateHandleの代わりになるものってある?





0869デフォルトの名無しさん2010/02/18(木) 08:09:49
ZwDuplicateObject かな?
0870 ◆0uxK91AxII 2010/02/18(木) 09:40:09
ObReferenceObject みたいなモノってある?
0871デフォルトの名無しさん2010/02/18(木) 16:45:20
>>869
ありがとうございます。
助かりました。
0872デフォルトの名無しさん2010/02/22(月) 09:51:03
自作ドライバにインタフェース作成してユーザから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が悪い・・・?
0873デフォルトの名無しさん2010/02/22(月) 09:52:56
環境忘れてた。
開発、動作とも WinXP で CheckBuild(6001.18002) で動作させてます。
0874 ◆0uxK91AxII 2010/02/22(月) 10:23:48
IRP_MJ_CREATEのhandlerで、STATUS_SUCCESSを返していないとか。
08758722010/02/22(月) 10:59:39
返答どうもです。IRP_MJ_CREATE のルーチンでは、

return CompleteIrp(Irp,STATUS_SUCCESS,0);

で記述してますが、その前のDebugPrintExが表示されないので
そもそもIRP_MJ_CREATE前の I/Oマネージャによるアクセス権限チェックで
弾かれてるような印象です。
0876デフォルトの名無しさん2010/02/22(月) 22:56:35
FILE_SHARE_READ | FILE_SHARE_WRITE を0にしてみたら?
08778722010/02/23(火) 08:29:56
>>876

CreateFile( ifDetail->DevicePath,
GENERIC_READ,
0,
NULL, OPEN_EXISTING, 0, NULL);

にしてみましたが、ダメでした。
WinDDKサンプルの Toaster Bus だとうまく I/O できるので、
その辺の差異を見ないといけない・・・にしてもよくわからない。
08788722010/02/23(火) 08:34:14
SECURE_OPEN は必須ですか?
Toaster Bus だと inf で Registry にアクセス権の設定をして、
IoCreateDevice で FILE_DEVICE_SECURE_OPEN を指定してますが・・・
0879デフォルトの名無しさん2010/02/23(火) 19:28:27
制限ユーザでCreateFileしてる・・・ワケないよな
0880デフォルトの名無しさん2010/02/23(火) 21:56:34
>>878
単純にCreateFileするユーザーのアクセス権限で
Administrators指定して開けばいける気がする。

08818722010/02/24(水) 11:13:23
実行ユーザは Administrators のグループに追加されてます・・・

あと CUI なプログラムなので、
(1) DOS窓開始ユーザを Administrator で実行して実行してみたり、
(2) Explorerから実行ファイル右クリックで別ユーザ→Administrator指定して実行してみたり
でも変わらずです。

Class が UNKNOWN なドライバだけどUpper や Lower がいるはずもないし・・・
うちのマシン環境が腐ってる・・・?OS入れ直ししてみた方がいいんでしょうか。
08828722010/02/24(水) 16:20:44
色んな所のサンプルをあさって比較しながら色々試してみたところ、
CreateFile の 第1引数のパスの末尾に"\\" を追加するとうまくいきました
・・・が、そういう仕様ですか?

MSDN みてますが、第1引数 lpFileName の指定で特筆無いし・・・
本当に正しいのか良く分からないです。
0883デフォルトの名無しさん2010/02/24(水) 19:52:08
それはないなー
てかなんで\\を追加とかいう不可思議な発想に至ったのか
08848722010/02/24(水) 21:41:20
>>883
Windows Vista デバイスドライバプログラミングの書籍にあるサンプルプログラムに
Detail で DevicePath を取得したあと \\hoge を追加したパスで
CreateFile してて、それだとうまくいきました。

んで、色々パスを試したら \\ を追加すれば
動くって所に(たまたま)行き着いた、ってトコです。
0885デフォルトの名無しさん2010/02/25(木) 06:31:06
メモリ壊してるだけだろwww
08868722010/02/25(木) 11:28:06
>>885
どういう仕組みでメモリ破壊になってるんでしょう。
0887デフォルトの名無しさん2010/02/25(木) 13:57:17
お前のソースをここに貼ったら教えてやらんでもない
08888722010/02/25(木) 14:28:58
違うPCでやると、>>882 関係なしにうまくいくので、
結局今のPCの環境がおかしい・・・何が違うんだorz

OS入れなおしてみるか・・・。お騒がせ(?)しました。
08898722010/02/25(木) 14:42:18
>>887
転載OKなんかな。

http://www.sbcr.jp/books/download/art.asp?newsid=2095

からダウンロードして展開できたソース 1-8\open_close_final\VistaSample2
をまんま使用。

どういう仕組みでメモリ破壊してるんでしょう??
0890デフォルトの名無しさん2010/02/25(木) 14:49:33
同じ登録のドライバが先にいるんじゃね?
08918722010/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);
08928722010/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;
}
08938722010/02/25(木) 15:00:56
>>890
1-8\open_close_final\VistaSample1 が対応するドライバで、
inf の クラスとGUIDを Unknown に変更して使ってみてます。

ってそういう意味じゃない?
0894デフォルトの名無しさん2010/02/25(木) 16:53:48
パス名の最後の文字が「表」とか「申」とか「能」で終わってる
0895デフォルトの名無しさん2010/02/25(木) 19:06:21
strcpyとかstrcatとか使ってる時点で読む気をなくす('A`)
0896デフォルトの名無しさん2010/02/25(木) 20:05:18
最初から改造したやついれた?
アンインストールをちゃんとやらないでドライバだけいれたから
レジストリがおかしくなってるか、ドライバが実は古いままとか
そういうのはないかな。別のPCでも大丈夫なあたり。
できれば仮想環境とかですぐに元に戻せる環境を使って
最初から今のドライバでうまくいくか試したほうが速いと思う。
今の自分のドライバのGUIDに変なエントリがないか調べてみるのもあり。

あと、正直勉強不足だった。
\\つけた後にオプションとかやるんだな。
ただ列挙したデバイスインターフェイスのGUID+4桁の数字

ちなみに俺はおっさんなので、SetupDi使うのがめんどくさくて
CreateDeviceの固定された名前でどうにかしてしまうことが多い。
0897デフォルトの名無しさん2010/02/25(木) 20:06:59
>>896
消しすぎた。

デバイスインターフェイスのGUID+4桁の数字
でアクセスできるのが普通だと思うから
サンプルがそれでちゃんと動くかどうか確認してみたほうがよい

と書くつもりだった。
0898 ◆0uxK91AxII 2010/02/25(木) 22:50:42
割とどうでも良い事だけど。

>SetupDiEnumDeviceInterfaces(
>deviceInformationHandle,
>NULL, pGuid, 0, &interfaceDeviceData);

0決め打ちはマズイと書いてみる。
0899デフォルトの名無しさん2010/02/28(日) 09:37:30
Windows Driver Kit Version 7.1.0
File Name: GRMWDK_EN_7600_1.ISO
Version: 7.1.0
Date Published: 2/26/2010
Language: English
Download Size: 619.8 MB
http://www.microsoft.com/downloads/details.aspx?FamilyID=36a2630f-5d56-43b5-b996-7633f2ec14ff&DisplayLang=en
http://download.microsoft.com/download/4/A/2/4A25C7D5-EFBE-4182-B6A9-AE6850409A78/GRMWDK_EN_7600_1.ISO
0900デフォルトの名無しさん2010/04/20(火) 23:53:44
WinUSB使ってデバドラ作ってるんだけども、ベンダーリクエストがどうにも通らない……
WinUsb_ControlTransfer()使うんだ、と言うところまでは理解した……つもりなのだが、
いざ実行してみるとFALSEが返ってGetLastError()はERROR_GEN_FAILUREになる。

 ReadPipeとWritePipeはうまく行ってるので、WINUSB_INTERFACE_HANDLEがとれてないという
ことは無いと思うのだけど、ドコのナニに問題があるのか全然分からない。

 同じところで詰まった人、ヒントで良いんでおしえてくだちいorz
0901デフォルトの名無しさん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の勉強はごく最近始めたもので、
知識不足な点が多いとは思いますが、宜しくお願いいたします。
0902デフォルトの名無しさん2010/08/07(土) 05:30:44
ソースうp
0903 ◆0uxK91AxII 2010/08/07(土) 11:26:55
>>901
>ドライバはシリアル受信等の割り込みがあるまで、そこで待ち続ける必要があるようなのですが、
常識的に考えて、ソレはアリエナイ。
queueにでも突っ込んでおいて、STATUS_PENDINGを返して、
指定の状態変化が起きたらcompleteする感じで良いハズ。
0904901 ソース 1/22010/08/07(土) 11:51:57
ソースは次のようになっています。
やはり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へ続きます----
0905901 ソース 2/22010/08/07(土) 11:54:56
---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;
}

簡略化しましたがこれが全貌です。
以上、お時間のある方いらっしゃいましたらお相手していただけると嬉しいです。
09069012010/08/08(日) 01:04:22
>>903 レスありがとうございます。

KeWaitForSingleObjectでタイムアウトを設定し、
STATUS_PENDINGを返すようにしました。

しかし、自作のWin32アプリからドライバへ、DeviceIoControl関数により
IOCTL_SERIAL_WAIT_ON_MASKを送信してみたところ、
すぐにDeviceIoControl関数から抜けて次の処理を行ってしまい、
一般に出回っているComPortのドライバと同じふるまい(DeviceIoControl関数から抜けなくなる)
をさせることができませんでした。
0907デフォルトの名無しさん2010/08/08(日) 04:13:26
つーか問題にしてるのは何?
他のシリアルドライバとの違いなのか、
シリアルドライバとして正しい振る舞いがわからないのか。

手っ取り早いのはMS標準シリアルドライバでどう動くのか確認して、同じように実装すること。
挙動を見る限り、その比較対象のドライバはPENDING抜けしてないでしょ。

フリーズする/しないはアプリ側の作りの違いだと思うから、そこは気にしなくてもよさそうじゃね?
0908デフォルトの名無しさん2010/08/08(日) 19:32:35
確かに何を問題にしてるかよくわからんな

KeWaitForで固まるのが困るときはタイムアウト設定したり
スレッド別に用意したりすると思うが、別にドライバに限った話じゃないし

話を聞いた感じだと、
アプリ側でスレッドつくるべきなんじゃないかと思うけどね。

0909デフォルトの名無しさん2010/08/09(月) 21:14:21
返信ありがとうございます。

ドライバと通信を行うWin32アプリは、一般に出回っているシリアル通信ソフトを考えています。
また、参考にしていたシリアルドライバはMS標準のものです。

整理しますと、自作のシリアルドライバとMS標準のものでは次の違いが発生しています。

自作のシリアルドライバとシリアル通信ソフト(Win32アプリ)での挙動:
  Win32アプリからドライバへ、DeviceIoControl関数でシリアルデータ受信割り込み待ち命令を送信すると
  アプリ側の処理がそこから先に進まないうえ、
  Win32アプリ(のGUI)がフリーズする

MS標準のシリアルドライバとシリアル通信ソフト(Win32アプリ)での挙動:
  Win32アプリからドライバへ、DeviceIoControl関数でシリアルデータ受信割り込み待ち命令を送信すると
  アプリ側の処理がそこから先に進まなくなるにも関わらず、
  Win32アプリ(のGUI)はフリーズしない


これらから、MS標準のシリアルドライバと同じ挙動をさせるには
Win32アプリをDeviceIoControl関数から抜けなくさせ、
なおかつアプリのGUIが固まらないようにしなければならないと解釈しています。

どなたかお時間のある方いらっしゃいましたら
ヒントを頂けると嬉しいです。
0910デフォルトの名無しさん2010/08/10(火) 04:02:52
同じアプリを使っている前提で話すけど

アプリがフリーズしているように見えるかどうかはWindowsから送られてくる
メッセージ処理をしているかどうかで決まる。
だからDeviceIoControlで止まっていたらアプリは必ずフリーズする。

だから>>908のように、「固まって困る場合=メッセージ処理したい場合」として
スレッドやタイムアウトをするべきであると書いた。

よって、MS標準のドライバの場合はOKで、
自作のはフリーズするというのは理にかなっていない。

もう一度アプリ側の調査をよくよくやってみることをおすすめする。
0911デフォルトの名無しさん2010/08/10(火) 14:50:45
WAIT_ON_MASK以外の応答が違っているとか。
受信通知条件が違っているとその辺の処理の扱いが変わってくるからな。
0912デフォルトの名無しさん2010/10/06(水) 20:08:19
USBカメラの解像度設定とかを横取りして、常にある値を指定するような
方法ってありますか。
解像度の変更が出来ないソフトがあって困ってます。
0913デフォルトの名無しさん2010/10/07(木) 10:14:42
フィルタドライバ書けばできるだろうけど
特定ソフトだけの問題ならアプリ側のアクセスをどうにかするほうが楽そう
0914デフォルトの名無しさん2010/10/21(木) 20:54:35
WDK付属のMSVADみたいな仮想デバイスドライバのインストーラを書いてるんだが

非PnPなのでDPInstは諦めてdevconのソースを流用しているんだが、
これだとデバイスを削除した後にドライバ・パッケージがシステム内に残ったままになる
(devconのremoveコマンドとdp_deleteコマンドの中身を組み合わせてる)

誰か、ドライバ・パッケージまで削除できる良い方法を知らない?
DIFxAPIと組み合わせれば何とかなるのかな?
0915デフォルトの名無しさん2010/10/23(土) 00:02:11
誰も返事しないから嘘を承知で。

・\RootのなんとかにするとDPInstでもインストールできなかったっけ?
 と思ってToasterみてたらよくわからんGUIDだった。
 とにかく、Inf/Inxをちゃんと書けばDPInstが使えると思う
・どうしても無理ならDIFxなんとかを改造すれば使える
 DPInstのコアAPIなのでこっちならパッケージのインストール、アンインストールができるはず。

多分DIFxPkgsあたりだろうけど、できるかどうかはわからん。
0916sage2010/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の仕様なんだろうか?
0917デフォルトの名無しさん2010/10/27(水) 21:02:04
>>916
それはDPInstもそうなってるので、仕様だと思う。
DPInstでインストールするとドライバの日付やバージョンで管理するらしく
複数残ったままになる。ただ、アプリケーションの追加と削除に項目として残るので
普通に全部アンインストールすれば問題ない。
0918デフォルトの名無しさん2010/12/12(日) 19:39:33
お願いっ!
windows7上で、magicmouseを動かしたいんで、
ドライバを、書いてくれっ!
現状だと、スワイプが使えないんだ!
0919デフォルトの名無しさん2010/12/12(日) 23:17:36
そういうスレじゃねーから
0920デフォルトの名無しさん2010/12/12(日) 23:19:54
>>919
すまない、
誘導してくれないか。
0921デフォルトの名無しさん2010/12/13(月) 10:49:51
◆こんなソフトウェアつくってください〜Part15〜◆
http://hibari.2ch.net/test/read.cgi/software/127868739

この辺か?
0922デフォルトの名無しさん2010/12/13(月) 18:22:15
>>918
>windows7上で、magicmouseを動かしたいんで、

ドライバ署名の問題もあるから自分で書けばいいじゃんw。
0923デフォルトの名無しさん2011/01/28(金) 22:05:12
スレ違いだったらごめんなさう、質問させてください。

とあるアプリケーションの音を、劣化なしに録音したいのですが、
録音デバイスはマイクとライン入力程度で、まともな手段で録音出来ません。

とりあえず、ollydbgで見てみたら、waveOutWriteは呼ばれず、DSoundから
直接DeviceIOControlが呼ばれており、DirectX系から、ハードウェアが
直接制御されているようです。あと、WriteFileはコールされていませんでした。

ここで、DeviceIOControl 関数の引数inBuffをじゃっかん弄っても、音に変化が
なさそう(?)でした。この関数でバッファ転送してると思ってたので、行き詰まって
しまいました。

なんか勘違いとかしてるんでしょうか?
もしくは、上記の目的のために、別の手段はありませんでしょうか?
0924デフォルトの名無しさん2011/01/28(金) 22:12:29
そういう場合、普通はDirectSoundをフックする
0925デフォルトの名無しさん2011/01/28(金) 23:10:07
>>923
大抵は、サウンドチップの製造元のドライバ入れれば、
ステレオミキサーから録音できるようになる。
0926デフォルトの名無しさん2011/01/28(金) 23:56:41
劣化防止が目的ならばASIOなどで鳴らして光OUTを光INで受けるしか信用ならない
09279232011/01/29(土) 00:00:14
>>924
COMで実装されてるぽい(たぶん)ので、上手いことフック出来ません。
そもそもCOMもDirectSound詳しくないのですが、COMあたりから
攻めた方が賢いでしょうか?

>>925
そうなんですか!ちょい調べてみます。
納入先にそれを要求するのは厳しいかもしれませんが、検討してみます。
09289232011/01/29(土) 00:02:31
>>926
確かにそうなんですが、ハード的な制約や導入は出来るだけ押さえたいです。
0929デフォルトの名無しさん2011/01/29(土) 00:28:41
条件の後出しなんて最低だと思いませんか
レス数が900を超えています。1000を超えると表示できなくなるよ。