MFCを使ってPCからSDカードリーダーを通し、
microSDカードにデータの読み書きするプログラムを作成しております。
SDカードのライトプロテクト切り替えでロックかけるような機能を
microSDカードで実現できるAPIなどはありますでしょうか?
また、WindowsからアクセスできるSDカードの論理アドレス領域以外にも
物理アドレスでアクセスできる領域も存在するのでしょうか?
存在するとしたらどうやってアクセスできるのでしょうか?
その領域にロックに関する情報もあるのでしょうか?
参考になるHPなどがあれば助かります。
以上、よろしくお願いします。
なんか俺俺用語が使われてて日本語の意味がわからんのだが・・・
ロックというのが「ライトプロテクト」のつもりであるとして
microSD を SD アダプタにいれてアクセスすれば LOCK タブでライトプロテクトできる
> microSDカードで実現できるAPIなどはありますでしょうか?
API レベルでは無いと思う。
FilterDriver でも書けば可能
ドライブレベルで開いて Lock すれば可能かも?
とりあえずお約束で。すべての仕様はここにある
http://www.sdcard.org/home
物理的レベルの話ではなくて CPRM の話なのかな?
http://www.4Centity.com/
半ば余談です。
> FilterDriver でも書けば可能
> ドライブレベルで開いて Lock すれば可能かも?
デバドラ上からWindowsネイティブAPIのフック(ntoskrnl.exe上のNtCreateFileとか)を
行うことも可能なようで、コール時点でアクセスフラグと対象デバイス先から判断
すればこのパターンには適用できるカモ、と思ったりしました。
通常のフィルタドライバと違って、IRPを意識しなくてもフックが行えるようです。
(但し、DriverEntryやUnload等の主要構成は必要)
# 一度試してみたい部分ではあったりもします。
遠まわしに書いて意味不明な日本語になってしまった。 orz
> コール時点でアクセスフラグと対象デバイス先から判断
フック先で、デバイスとしてSD系のメディアが指定 且つ FILE_WRITE_XXXXXフラグが
指定されている場合にSTATUS_ACCESS_DENIEDをリターンする、ということです。
# 先にも書いていますが、まだ文献を読んだ程度なのでできるかどうかはわかりませ
ん。
tetrapodさま、早速の御回答ありがとうございます。
下手な日本語で申し訳ございません。
英語の方はもっと下手なんです><;
今回、SDアダプタは使いません。
ドライブレベルで開いてバイナリーデータの読み書きをしています。
他人から更新を防ぐため、ロックをかけたい話が出てきたので・・・
URLありがとうございます。がんばって翻訳します。
玲音 (st.lain) さま、ご回答ありがとうございます。
貴重な情報を元に、もうちょっと調べてみます。
tetrapodさん指摘のようにアダプタ側でのロックで十分だと思っていたので、
URLの案内をしませんでしたが、そのようではないので一応案内します。
>> Hooking Windows NT System Services
> http://www.windowsitlibrary.com/Content/356/06/2.html
書籍「Undocumented Windows」のほぼ全容がサイトに掲載されていると思われますが、
その一部としてのカーネルフック部分です。
(Amazonでも購入できるようですが、日米共にプレミア値段がついています)
ただ、この手になると開発も特に注意が必要なのでまずもって別の手段(若しくは
運用ルールとか)を見直したほうが無難だと思われます。
玲音 (st.lain) さま、URLありがとうございます。
参考になります。
やはり私のレベルでの話ではなさそうですね。
もうちょっと解析して、上の人に話しします。
何度もありがとうございました。
助かりました。
> ただ、この手になると開発も特に注意が必要なのでまずもって別の手段(若しくは
> 運用ルールとか)を見直したほうが無難だと思われます。
めっちゃ御意
> 他人から更新を防ぐため、ロックをかけたい話が出てきたので・・・
「話」のレベルならフィルタドライバとか API フックとかに手を出さないほうがいい
Windows 自体を一瞬でぶっ壊すことができる代物だし
下手をすると rootkit に応用できる代物だし
習得に数ヶ月以上かかると思われる代物だし
他人ソフトとの共存を考える上では、やみくもな対策は逆効果だ。
プログラムを使う側の立場で考えるとき
ウィルス対策ソフトのリアルタイム検査と俺プログラムのアクセスと
どっちが優先されるべき?
ウィルス対策ソフトのリアルタイム駆除と俺プログラムのアクセスと
どっちが優先されるべき?
プログラミング以外の考察を先に行いポイントを抑えておくのが先だぞ。
tetrapodさま、ご回答ありがとうございます。
なるなる^^話がどんどん難しくなってきましたね。
microSDカードのソフト上でのロック実現は難しいことですね。
皆様の貴重な時間潰してしまい申し訳ございません。
ありがとうございました。
依然、ややこしいと言えばややこしいですが、ふと思ったことを。
誰からのロック、という定義がなされていないので見当はずれカモ
しれませんが、例えばドライブを指定することによる形式からの保護と
いう意味では使える手カモしれません。
(一般的なPGやユーザーによるエクスプローラ等の操作からは有効?)
「unique volume name」でググると
>> Getting the unique volume name for an unmounted drive
というタイトル表示されます。
そのサンプルはアンマウント状態にあるドライブ(パーティション)のボリューム名が
取得できるものです。(デバイスタイプ等も出力してくれます)
CreateFile()が\\?\volume{xxx}の形式によるオープンを許可しているので、
ディスク管理ツールからドライブレターを外して、自前プログラムはボリューム名
を使用したオープンを行えば、安易な操作からの保護はできるカナ・・・と。
ごめんなさい、書き忘れました。
\\?\volume{xxx}の形式によるオープンがドライブ指定のオープンと同等で
あることと、\\?\volume{xxx}\hoge.txtのような指定も可能であることは
確認しています。
ドライブレターのシンボリックリンクのような働きになっているかと
妄想してます。(どっちがどっちのリンクかは知りませんが)
玲音 (st.lain)さま、丁寧なご回答ありがとうございます。
日本語が下手なので、何度も申し訳ございません。
基本的には、microSDをSDアダプタにいれて、
LOCKタブでライトプロテクトしたような状態にしたいです。
つまり、自分のツールからロックかけると他のツール、エクスプローラ、
他人から参照はできるけど、更新ができないようにしたいです。
アンマウント状態にあるドライブをボリューム名でオープンできるのは
知りませんでした。勉強になります^^
現在のつくりは
SDカードドライブ名を利用し、CreateFile()でオープンし、
SetFilePointer()で読み書きセクタに移動、
ReadFile()、WriteFile()でバイナリデータの読み書きを行っています。
今はセキュリティ対応でロック機能を入れてほしい話が出て、調査中です。
何度もすみませんでした。
読み取りアクセスを許可しなければならないのが難しいですね。
完全な排他アクセスであれば、DeviceIoControl( FSCTL_LOCK_VOLUME ) でできるかも?
>「話」のレベルならフィルタドライバとか API フックとかに手を出さないほうがいい
> Windows 自体を一瞬でぶっ壊すことができる代物だし
> 下手をすると rootkit に応用できる代物だし
> 習得に数ヶ月以上かかると思われる代物だし
そのとおりですね。
何度もブルー画面になることを覚悟しないとだめですね。
ウイルス対策ソフトの検索にひっかかってスパイウエアと間違われる可能性も
あると思います。
> 今回、SDアダプタは使いません。
> ドライブレベルで開いてバイナリーデータの読み書きをしています。
> 他人から更新を防ぐため、ロックをかけたい話が出てきたので・・・
ってことは、USB I/Fは独自開発ですか?
USBドライバーは、USBストレージデバイス(マイクロソフト製)を使うとしても、
ハード側は独自開発となるとハード側の対応ですね。
うまくハードでプロテクトかけるように作ればいいと思います。
>今はセキュリティ対応でロック機能を入れてほしい話が出て、調査中です。
新規にユーザーを作ってユーザー権限でロックかける方法もありかとおもいますね。