【WDM】Windows Driver Model相談室【デバドラ】
レス数が900を超えています。1000を超えると表示できなくなるよ。
0001デフォルトの名無しさん
NGNG親切に説明してくれてる書籍ってあるんでしょうか
0831デフォルトの名無しさん
2009/04/01(水) 09:00:22「Windows Vista カーネルソフトウェア開発技法」
「Windows Vistaデバイスドライバプログラミング」
とりあえずフリーのWDKのインストールまではできたのですが
wdm.hとntddk.hがコンパイラバージョンが合わないとかで
サンプルがビルドできないorz
とりあえず本待ちだ
もってるVCがバージョン6だからだ
とりあえず7以降のがほしいってことで
0834デフォルトの名無しさん
2009/04/01(水) 15:13:520835デフォルトの名無しさん
2009/04/01(水) 15:17:14基本CUIだぞ。
>>834
パス通したり設定さえやってればVCで動くプロジェクトも作れる。
WDKサンプルのままmakefileとか使った方が手っ取り早いが。
2000用のは作ったことがあるのですよ
なのでだいじょうぶかなぁと
0837デフォルトの名無しさん
2009/04/01(水) 22:39:550838デフォルトの名無しさん
2009/04/02(木) 16:10:48Limuxのカーネル関係勉強してからWindowsをさわろうと思う。
0839デフォルトの名無しさん
2009/04/02(木) 22:56:47どれでビルドしても2000でもXPでもvistaでも使えるようだけど、
各osのビルド環境で別々に作ったドライバを使ったほうがいいの?
0840デフォルトの名無しさん
2009/04/09(木) 14:32:040841デフォルトの名無しさん
2009/04/09(木) 16:04:15どのOSにも存在する機能を使ってるぶんには同じ。
XPとかVistaにしかない関数を使うんなら、OS毎にビルドするなり
ダイナミックロードするなりすればよろし。
0842デフォルトの名無しさん
2009/04/09(木) 19:14:220843デフォルトの名無しさん
2009/04/27(月) 23:19:49IDEの設定についてです。
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ソースによると思うけれども
手元では、inc\api と inc\ddk をインクルードファイルの設定に入れてる。
>>844
MajorFunction[IRP_MJ_POWER] の中で
IRP_MN_SET_POWERやIRP_MN_QUERY_POWER で引っ掛けて
Parameters.Power.ShutdownType や powerState.SystemState を
見れば、ある程度、判るよ。
というか、普通実装してあるはずだけど。
0846843
2009/05/09(土) 16:04:32ありがとうございます
実はあの後色々錯誤してapiとddkのみ
インクルードファイルに設定することにしました。
再確認できてよかったです。
0847デフォルトの名無しさん
2009/05/10(日) 23:18:12あるデバイスに対して、I/Oの入出力と
割り込みのハンドリングを行うだけの
簡単なドライバを作りたいのですが、
簡単なサンプルソースはどこかに無いでしょうか?
(ソースファイル1つ、ヘッダファイル1つくらいのもの)
DDKのサンプルは少々複雑で・・・。
よろしくお願いします。
0848デフォルトの名無しさん
2009/05/16(土) 05:26:191>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
宜しくお願いします。
Cで書けばOK。
0850デフォルトの名無しさん
2009/05/16(土) 14:58:58build通りました!ありがとうございました!
0851デフォルトの名無しさん
2009/05/19(火) 01:01:24infファイルは自分で書くしかないのでしょうか?
0852デフォルトの名無しさん
2009/05/23(土) 14:34:46MSDN会員だけ先行して公開されてる
0853デフォルトの名無しさん
2009/06/02(火) 00:16:09デバイスマネージャ→ドライバの詳細上のデジタル署名者欄で
署名なしとされてしまう模様。
リリース署名したがVista x64でのこれがどうも気になる。
やっぱロゴテスト合格しないとここは署名なしのままなのかな。
0854デフォルトの名無しさん
2009/06/02(火) 01:06:110855デフォルトの名無しさん
2009/06/10(水) 05:12:17高卒だけど怪しいのみつけた、一応はあらゆるプロトコルの解析ができるみたい
すれ違いだったらすまん
0856デフォルトの名無しさん
2009/09/06(日) 18:21:59UPPERなりLOWERなりにSetupDIで突っ込むんだろうね。
アプリが大変だね。CDB・CBW・タスクファイル・・・
0857デフォルトの名無しさん
2009/10/22(木) 15:24:45フック時に起動させるモジュールの対象パスを取得、コマンド引数を取得したいと思っています。
モジュールの対象パスは取得することは成功したのですが、コマンド引数の文字列の取得を行うことができません。
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:07PCやってるなんてお�hるかもしれんのう。
0859デフォルトの名無しさん
2009/11/17(火) 00:07:240860デフォルトの名無しさん
2009/11/17(火) 02:30:380861デフォルトの名無しさん
2009/12/10(木) 15:08:06サンプル見てもコンパイルの仕方すら分からない状況ですが
まあそれは調べたらあったのでいいとして
アプリケーションとどうやって通信するのかとか、ドライバ自体をどうやってシステムに登録するのかとか
ほとんど何も分からないし調べても出てこないんですが
サンプルコードでもあれば教えてください
0862デフォルトの名無しさん
2009/12/10(木) 15:46:58まずはWDDFの書籍買って一から勉強しろ。
0863デフォルトの名無しさん
2009/12/10(木) 21:30:27geekなサイトにもぐりこんでだいたいやり方は分かった
0864862
2009/12/10(木) 22:49:39いや、アフォでなければ分かる。
WDKあるならドキュメント読めば全部きっちり載ってる。
英語が面倒で見てすらいないんだろ。
大体、
> サンプルコードでもあれば教えてください
って、network\ndis\filterにndisのlowerfilterがあるわけだが。
ろくに探しもしてないことが明白。
0865デフォルトの名無しさん
2009/12/13(日) 23:04:150866デフォルトの名無しさん
2009/12/23(水) 16:54:59これ見るとIoIsWdmVersionAvailableの引数が
Vistaと7で同じになってるんだけど誤記じゃないの?
RtlIsNtDdiVersionAvailableのほうを使うべきと書いてあるのはこの問題があるから?
でもこの関数をXP以前のOSで使おうとしてもライブラリのリンクができない。
0867デフォルトの名無しさん
2010/01/05(火) 12:43:34いったいどういう仕組みなんだろ?
ユーザーランドのコードを対応するものに変換してくれるとか?
0868デフォルトの名無しさん
2010/02/17(水) 06:46:430869デフォルトの名無しさん
2010/02/18(木) 08:09:490871デフォルトの名無しさん
2010/02/18(木) 16:45:20ありがとうございます。
助かりました。
0872デフォルトの名無しさん
2010/02/22(月) 09:51:03GetLastErrorでアクセス拒否が返されるんですが、何が悪いですか。
ドライバ側:
(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) で動作させてます。
0875872
2010/02/22(月) 10:59:39return CompleteIrp(Irp,STATUS_SUCCESS,0);
で記述してますが、その前のDebugPrintExが表示されないので
そもそもIRP_MJ_CREATE前の I/Oマネージャによるアクセス権限チェックで
弾かれてるような印象です。
0876デフォルトの名無しさん
2010/02/22(月) 22:56:350877872
2010/02/23(火) 08:29:56CreateFile( ifDetail->DevicePath,
GENERIC_READ,
0,
NULL, OPEN_EXISTING, 0, NULL);
にしてみましたが、ダメでした。
WinDDKサンプルの Toaster Bus だとうまく I/O できるので、
その辺の差異を見ないといけない・・・にしてもよくわからない。
0878872
2010/02/23(火) 08:34:14Toaster Bus だと inf で Registry にアクセス権の設定をして、
IoCreateDevice で FILE_DEVICE_SECURE_OPEN を指定してますが・・・
0879デフォルトの名無しさん
2010/02/23(火) 19:28:270880デフォルトの名無しさん
2010/02/23(火) 21:56:34単純にCreateFileするユーザーのアクセス権限で
Administrators指定して開けばいける気がする。
0881872
2010/02/24(水) 11:13:23あと CUI なプログラムなので、
(1) DOS窓開始ユーザを Administrator で実行して実行してみたり、
(2) Explorerから実行ファイル右クリックで別ユーザ→Administrator指定して実行してみたり
でも変わらずです。
Class が UNKNOWN なドライバだけどUpper や Lower がいるはずもないし・・・
うちのマシン環境が腐ってる・・・?OS入れ直ししてみた方がいいんでしょうか。
0882872
2010/02/24(水) 16:20:44CreateFile の 第1引数のパスの末尾に"\\" を追加するとうまくいきました
・・・が、そういう仕様ですか?
MSDN みてますが、第1引数 lpFileName の指定で特筆無いし・・・
本当に正しいのか良く分からないです。
0883デフォルトの名無しさん
2010/02/24(水) 19:52:08てかなんで\\を追加とかいう不可思議な発想に至ったのか
0884872
2010/02/24(水) 21:41:20Windows Vista デバイスドライバプログラミングの書籍にあるサンプルプログラムに
Detail で DevicePath を取得したあと \\hoge を追加したパスで
CreateFile してて、それだとうまくいきました。
んで、色々パスを試したら \\ を追加すれば
動くって所に(たまたま)行き着いた、ってトコです。
0885デフォルトの名無しさん
2010/02/25(木) 06:31:060887デフォルトの名無しさん
2010/02/25(木) 13:57:170888872
2010/02/25(木) 14:28:58結局今のPCの環境がおかしい・・・何が違うんだorz
OS入れなおしてみるか・・・。お騒がせ(?)しました。
0889872
2010/02/25(木) 14:42:18転載OKなんかな。
http://www.sbcr.jp/books/download/art.asp?newsid=2095
からダウンロードして展開できたソース 1-8\open_close_final\VistaSample2
をまんま使用。
どういう仕組みでメモリ破壊してるんでしょう??
0890デフォルトの名無しさん
2010/02/25(木) 14:49:330891872
2010/02/25(木) 14:54:20HANDLE 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);
0892872
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;
}
0893872
2010/02/25(木) 15:00:561-8\open_close_final\VistaSample1 が対応するドライバで、
inf の クラスとGUIDを Unknown に変更して使ってみてます。
ってそういう意味じゃない?
0894デフォルトの名無しさん
2010/02/25(木) 16:53:480895デフォルトの名無しさん
2010/02/25(木) 19:06:210896デフォルトの名無しさん
2010/02/25(木) 20:05:18アンインストールをちゃんとやらないでドライバだけいれたから
レジストリがおかしくなってるか、ドライバが実は古いままとか
そういうのはないかな。別のPCでも大丈夫なあたり。
できれば仮想環境とかですぐに元に戻せる環境を使って
最初から今のドライバでうまくいくか試したほうが速いと思う。
今の自分のドライバのGUIDに変なエントリがないか調べてみるのもあり。
あと、正直勉強不足だった。
\\つけた後にオプションとかやるんだな。
ただ列挙したデバイスインターフェイスのGUID+4桁の数字
ちなみに俺はおっさんなので、SetupDi使うのがめんどくさくて
CreateDeviceの固定された名前でどうにかしてしまうことが多い。
0897デフォルトの名無しさん
2010/02/25(木) 20:06:59消しすぎた。
デバイスインターフェイスのGUID+4桁の数字
でアクセスできるのが普通だと思うから
サンプルがそれでちゃんと動くかどうか確認してみたほうがよい
と書くつもりだった。
>SetupDiEnumDeviceInterfaces(
>deviceInformationHandle,
>NULL, pGuid, 0, &interfaceDeviceData);
0決め打ちはマズイと書いてみる。
0899デフォルトの名無しさん
2010/02/28(日) 09:37:30File 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:44WinUsb_ControlTransfer()使うんだ、と言うところまでは理解した……つもりなのだが、
いざ実行してみるとFALSEが返ってGetLastError()はERROR_GEN_FAILUREになる。
ReadPipeとWritePipeはうまく行ってるので、WINUSB_INTERFACE_HANDLEがとれてないという
ことは無いと思うのだけど、ドコのナニに問題があるのか全然分からない。
同じところで詰まった人、ヒントで良いんでおしえてくだちいorz
0901デフォルトの名無しさん
2010/08/07(土) 04:07:36ComPortのドライバを作っていまして、
ドライバの割り込み待ち中に、通信先の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>ドライバはシリアル受信等の割り込みがあるまで、そこで待ち続ける必要があるようなのですが、
常識的に考えて、ソレはアリエナイ。
queueにでも突っ込んでおいて、STATUS_PENDINGを返して、
指定の状態変化が起きたらcompleteする感じで良いハズ。
0904901 ソース 1/2
2010/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/2
2010/08/07(土) 11:54:56NTSTATUS 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;
}
簡略化しましたがこれが全貌です。
以上、お時間のある方いらっしゃいましたらお相手していただけると嬉しいです。
0906901
2010/08/08(日) 01:04:22KeWaitForSingleObjectでタイムアウトを設定し、
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:35KeWaitForで固まるのが困るときはタイムアウト設定したり
スレッド別に用意したりすると思うが、別にドライバに限った話じゃないし
話を聞いた感じだと、
アプリ側でスレッドつくるべきなんじゃないかと思うけどね。
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受信通知条件が違っているとその辺の処理の扱いが変わってくるからな。
0912デフォルトの名無しさん
2010/10/06(水) 20:08:19方法ってありますか。
解像度の変更が出来ないソフトがあって困ってます。
0913デフォルトの名無しさん
2010/10/07(木) 10:14:42特定ソフトだけの問題ならアプリ側のアクセスをどうにかするほうが楽そう
0914デフォルトの名無しさん
2010/10/21(木) 20:54:35非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あたりだろうけど、できるかどうかはわからん。
0916sage
2010/10/27(水) 18:12:47自己レス
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それはDPInstもそうなってるので、仕様だと思う。
DPInstでインストールするとドライバの日付やバージョンで管理するらしく
複数残ったままになる。ただ、アプリケーションの追加と削除に項目として残るので
普通に全部アンインストールすれば問題ない。
0918デフォルトの名無しさん
2010/12/12(日) 19:39:33windows7上で、magicmouseを動かしたいんで、
ドライバを、書いてくれっ!
現状だと、スワイプが使えないんだ!
0919デフォルトの名無しさん
2010/12/12(日) 23:17:360920デフォルトの名無しさん
2010/12/12(日) 23:19:54すまない、
誘導してくれないか。
0921デフォルトの名無しさん
2010/12/13(月) 10:49:51http://hibari.2ch.net/test/read.cgi/software/127868739
この辺か?
0922デフォルトの名無しさん
2010/12/13(月) 18:22:15>windows7上で、magicmouseを動かしたいんで、
ドライバ署名の問題もあるから自分で書けばいいじゃんw。
0923デフォルトの名無しさん
2011/01/28(金) 22:05:12とあるアプリケーションの音を、劣化なしに録音したいのですが、
録音デバイスはマイクとライン入力程度で、まともな手段で録音出来ません。
とりあえず、ollydbgで見てみたら、waveOutWriteは呼ばれず、DSoundから
直接DeviceIOControlが呼ばれており、DirectX系から、ハードウェアが
直接制御されているようです。あと、WriteFileはコールされていませんでした。
ここで、DeviceIOControl 関数の引数inBuffをじゃっかん弄っても、音に変化が
なさそう(?)でした。この関数でバッファ転送してると思ってたので、行き詰まって
しまいました。
なんか勘違いとかしてるんでしょうか?
もしくは、上記の目的のために、別の手段はありませんでしょうか?
0924デフォルトの名無しさん
2011/01/28(金) 22:12:290925デフォルトの名無しさん
2011/01/28(金) 23:10:07大抵は、サウンドチップの製造元のドライバ入れれば、
ステレオミキサーから録音できるようになる。
0926デフォルトの名無しさん
2011/01/28(金) 23:56:410927923
2011/01/29(土) 00:00:14COMで実装されてるぽい(たぶん)ので、上手いことフック出来ません。
そもそもCOMもDirectSound詳しくないのですが、COMあたりから
攻めた方が賢いでしょうか?
>>925
そうなんですか!ちょい調べてみます。
納入先にそれを要求するのは厳しいかもしれませんが、検討してみます。
0929デフォルトの名無しさん
2011/01/29(土) 00:28:41レス数が900を超えています。1000を超えると表示できなくなるよ。