質問者
FilterCreate関数の引数のlpFilterNameとは?

全般的な情報交換
-
先日も質問させていただき、連投となってしまいまして申し訳ありません。
Minifilter-APIのFilterCreate関数の引数のlpFilterNameとは何を入力すればよいのでしょうか?
パラメータの意味を直訳すると、「ミニフィルタの名前を含むwide-character string」となりますが、
「ドライバ名」や「ドライバ名.sys」という名前ではアクセスできませんでした。
ご存知の方がいらっしゃいましたらご教示ください。
よろしくお願い致します。
#include <stdio.h>#include <windows.h>#include <fltUser.h>int main(void){HFILTER hFilter;LPCWSTR wStrW = (LPCWSTR)"minispy.sys";HRESULT hResult = FilterCreate(wStrW,&hFilter);if(hFilter == INVALID_HANDLE_VALUE){printf("ERROR-100 %x\n",GetLastError());}return 0;}- 移動 Mike Wang (MSCS) 2012年10月2日 12:49 (移動元:Windows デバイスドライバー開発)
すべての返信
-
FilterCreate に何を渡すのが正しいのかはわかりませんが、エラーの直接的原因は
LPCWSTR wStrW = (LPCWSTR)"minispy.sys";
という行にあると思います。
LPCWSTR(const WCHAR*)は、UNICODE文字列用のポインタです。それに対し、強制キャストで渡そうとしている文字列は、ANSI形式の文字列です。
データ構造そのものが違いますのでおそらくそれがエラーの原因だと思います。無理やりキャストするのではなく、UNICODE文字列を参照しなければなりません。
この場合は、
LPCWSTR wStrW = L"minispy.sys";
とする必要があります。
わんくま同盟,Microsoft MVP for Visual C++(Oct 2005-) http://blogs.wankuma.com/tocchann/ -
ご返信ありがとうございます!
LPCWSTR wStrW = L"minispy.sys";としましたがエラーは解消されませんでした・・・
Visual Studioで実装していますが、カーネル部分にアクセスする権限がないのかなーとも思っています。
下記のようにボリュームの情報を取得する関数でもエラーが出ました。
PINSTANCE_FULL_INFORMATION data = (PINSTANCE_FULL_INFORMATION)buffer;
HRESULT hResult = S_OK;
hResult = FilterVolumeFindFirst( FilterVolumeBasicInformation,
volumeBuffer,
sizeof(buffer)-sizeof(WCHAR), //save space to null terminate name
&volumeBytesReturned,
&volumeIterator );
もしカーネル部分にアクセスできないのであれば、設定を変更しなければなりませんが・・・
ご教示いただけませんか。よろしくお願い致します。
-
> Visual Studioで実装していますが、カーネル部分にアクセスする権限がないのかなーとも思っています。
そんなことありません。 VS で Build したバイナリでも、適切な FltLib.lib をリンクしていれば、ちゃんと動きます。
今回の問題の原因は3点あると思います。
1つ目は、ANSI / Unicode の問題。(これは既にとっちゃんさんが指摘済み。)
2つ目は、FilterCreate() の 1st Parameter にセットしている Filter Name が適切ではないこと。
3つ目は、アプリを実行する時の権限の問題。2つ目の FilterCreate() API 1st Parameter にセットしている Filter Name ですが、この Parameter にはその名のとおり Filter Name を指定する必要があります。
minispy フィルタの場合は、以下のようにセットする必要があると思います。 (確認はしてませんが。)-------------------------------
LPCWSTR wStrW = L"minispy";
-------------------------------フィルタ名は以下の方法で確認できます。
----------------------------------------
<フィルタ名の確認方法>
1. 管理者権限でコンソール ウィンドウ(cmd.exe)を起動。
2. "fltmc" コマンドを実行。
----------------------------------------上記手順で実行すると、以下の様な出力結果が得られると思います。
以下の出力は Win Vista x86 環境のものですが、Win 7 でも同じような結果になると思います。
Win XP では、Legacy Filter が組み込まれているはずなので、ちょっとだけ違う出力になったはず。
なお以下の出力は MiniSpy フィルタをインストールしていないので、MiniSpy は表示されません。 (当たり前の話ですけど。)++++++++++++++++++++++++++++++++++++++++++++
C:\Windows\system32>fltmc
フィルター名 インスタンス数 階層 フレーム
------------------------------ ------------- ------------ -----
MpFilter 5 328000 0
luafv 1 135000 0
FileInfo 5 45000 0
++++++++++++++++++++++++++++++++++++++++++++FilterCreate() API 1st Parameter にセットするフィルタ名は、"フィルター名" 部分に表示されている名前になります。
たとえば、Limited User Account (LUA) File Virtualization Filter Driver である "lufav" フィルタのハンドルを取得したいのであれば、以下の様にセットします。-------------------------------
LPCWSTR wStrW = L"luafv";
-------------------------------3つ目のアプリを実行する時の権限の問題ですが、上記でも少し触れましたが、File System Filter Manager API を使用するアプリは管理者権限で実行させる必要があります。
推測ですが、VS 上から実行していませんか?
FilterCreate() API コール後の GetLastError() で ERROR_ACCESS_DENIED (5) が返されるのは、おそらくそのためです。
(ただし、File System Filter Manager API のドキュメントを確認する限り、GetLastError() で Error Code が取得できるとは書いていないので、必ずしもこの Error Code が当てになる訳ではないようです。)
先に示した "FltMC" コマンドも内部的には File System Filter Manager API を使用している様ですが、一般ユーザ権限で起動したコンソール ウィンドウでは動きません。ですので、FilterCreate() API 1st Parameter に適切なフィルタ名をセットして、VS 上で Build したバイナリを管理者権限のコンソール ウィンドウで実行させれば、ちゃんと動くと思います。
-
FilterCreate は相変わらずアクセス違反を返すのでしょうか?それとも、何か別のエラーを返すようになったのでしょうか?エラーは解消されていないということなので、解消しないとダメなのでは?と思うのですが...
akaponさん自身は何かに納得して次に進んでいるのかもしれませんが、外野の我々はなんでいきなり違う関数なの?という状況です。
もしかしたら、フィルタードライバの作成経験者にとっては当たり前の内容なのかもしれませんが、あいにくドライバ関係は全くの未経験なので、そのあたりはさっぱりわかりません。
とりあえず、FilterVolumeFindFirstを呼び出す部分のソース見る範囲では、
- volumeBuffer は具体的にどのようなデータなのか?
- sizeof(buffer) が返す値は意図したものなのか?
の2か所が問題だろうと類推できます。
もっとも、エラーの具体的な情報がないので、本当にそうなのかについてはわかりませんが。
わんくま同盟,Microsoft MVP for Visual C++(Oct 2005-) http://blogs.wankuma.com/tocchann/