シャノンさま、ITOさまアドバイスありがとうございます。
>完全な排他アクセスであれば、DeviceIoControl( FSCTL_LOCK_VOLUME ) でできるか
も?
これは使ってませんでした。ありがとうございます。追加します(汗汗;;)
ただ、今回は処理中の排他アクセスではありません。
>ハード側は独自開発となるとハード側の対応ですね。
>うまくハードでプロテクトかけるように作ればいいと思います。
ハード側の開発はしません。市販のSDカードリーダーを使います。
>新規にユーザーを作ってユーザー権限でロックかける方法もありかとおもいますね。
バイナリデータなので、この方法もできないと思います・・・
>完全な排他アクセスであれば、DeviceIoControl( FSCTL_LOCK_VOLUME ) でできるか
も?
DeviceIoControlはハード側(今回はSDカードリーダーのメーカー)の確認が必要です。
関数は動作してもハード側で無視している可能性があります。
>> 新規にユーザーを作ってユーザー権限でロックかける方法もありかとおもいますね。
> バイナリデータなので、この方法もできないと思います・・・
ディレクトリーで制限かける関数があったはずです。
ITOさま、ありがとうございます。
>DeviceIoControlはハード側(今回はSDカードリーダーのメーカー)の確認が必要で
す。
>関数は動作してもハード側で無視している可能性があります。
そうですか。今使ってるSDカードリーダーは正しく動作しました。
SDカードリーダーが替わると正しく動作しない場合もあるということですね。
今回は決まったSDカードリーダーしか使わないので問題ないかも・・・?
>ディレクトリーで制限かける関数があったはずです。
使うSDカードはFATファイルシステムですけど、
ファイル、フォルダはありません。
固定の論理アドレスからバイナリーデータを書き込みます。
エクスプローラで見るとまっさらに見えます。
そこに大きいファイルを入れるとデータが上書きされるのでロックしたい話です。
データがあるフィールド領域を読取り専用とかにしてもいいと思いますけど・・・
> そうですか。今使ってるSDカードリーダーは正しく動作しました。
> SDカードリーダーが替わると正しく動作しない場合もあるということですね。
読み書き、フォーマット等、メモリーカードにおいての基本的な動作は
もちろんすると思いますが、今回のようなロックするといったような機能は
動作するとは限らないと思います。
> 使うSDカードはFATファイルシステムですけど、
> ファイル、フォルダはありません。
> 固定の論理アドレスからバイナリーデータを書き込みます。
> エクスプローラで見るとまっさらに見えます。
通常のメモリカードの使い方でないような気がしますが.......
>通常のメモリカードの使い方でないような気がしますが.......
基本的に一緒ですけど、データがファイルではなく、
論理アドレスで存在します。
読取り側がPCではなくて、物理アドレスしか参照できないため?
なぜこう作られたのか私にもよくわかりません。
目的と手段がはっきり認識できていない様な気がします。
ファイルを勝手に書き換えられるとマズイのであれば、
ファイル作成時に照合用ファイルにタイムスタンプを暗号化で保存しておき、
ファイル読込時に照合用ファイルに保存したタイムスタンプと比較する等で、
オリジナルかどうかかなりの精度で判断できるのでは?
他にもやり方は色々ありますのでロックするしかないと思い込まず、
まずはなるべく沢山の実現手段を見つけることが重要かと思います。
> 基本的に一緒ですけど、データがファイルではなく、
> 論理アドレスで存在します。
やはり、通常のメモリカードの使い方でないと思います。
普通アドレス管理は、Windowsの標準USBドライバーのひとつである、
「USBSTOR.SYS」で行います。
つまり使う側は、アドレスを意識しなくてもいいはずです。
「SDカードリーダー」は独自のデバイスドライバーを使っていませんか?
使用方法等、SDカードリーダー」のメーカに相談をしてみたほうがいいと思います。
それとも、すでにkimさんのグループでデバイスドライバーを開発したのですか?
誤解を招くとまずいので補足です。
> 普通アドレス管理は、Windowsの標準USBドライバーのひとつである、
>「USBSTOR.SYS」で行います。
SDカード等をUSBメモリーとして扱う場合です。
まとめてみると…
・microSDカードを直接読み込める特定のリーダーを使っている。
・挿入したカードはWindows上でドライブとして見えないといけない。
・カードにはファイルとしてではなく、直接データを書き込む。この仕様は変更できな
い。
・カードに他のプログラムからデータを書き込めないようにロックしたい。
かな? 難敵ですな。
> 使うSDカードはFATファイルシステムですけど、
っていうのがよくわからん。
直接セクタデータを書き込んだら、ファイルシステムなんかぶっ壊れると思うけど。
おそらくその場合、エクスプローラでドライブを開こうとすると「フォーマットされてい
ません」とか出ると思う。
それならおいそれとデータの書き込みはできないね。フォーマットされたら困るけど。
FATファイルシステムであるという前提を崩せないなら、ファイルとして扱ったほうがい
いと思う。
皆さん、アドバイスありがとうございます。
>「SDカードリーダー」は独自のデバイスドライバーを使っていませんか?
市販のSDカードリーダーで、独自のデバイスドライバーは使っていません。
シャノンさん、まとめてくれてありがとうございます。
そのとおりです。
データ書き込み開始位置がSDカードの真ん中くらいなので、
FATファイルシステム領域はそのまま残しています。
フォーマットしてもデータは壊れません。
データ領域クリア処理を作ってデータを消します。
ファイルとして扱うと、読取り機器側で物理アドレスが特定できないらしいです。
ソフト上で完全ロックできないですね。
他人を“ロック”しないといけないかも^^;
更新されたら使えないだけなので、他のセキュリティ対策をしっかりします。
みなさま、どうもありがとうございました。
駄レスです。回答に直接関係ありません・・・。
市販のカードリーダーでminiSDが直接読めるタイプのものを使っていますが
メディアはもちろん、ドライブ側にも読み取りとする為の物理機構は無いです。
その為、通常の用途でも変更の保障はユーザー操作次第です。
# 使っているのは、多分Mitsumi製で値段が2,000円ほど。
# 5スロットあって、ドライブ認識直後はいきなり5ドライブがエクスプローラ
# 上に出現します。
# デバイスマネージャなどから使わないスロットを無効にしないと邪魔だったり。
ドライバもWinXP標準ドライバでの認識となり、OSインストール時も
不明な場所のデバイスとしてメディア容量が認識されていた記憶があります。
やっぱり諦めきれないので。
シャノンさんがまとめてくれた様に、通常の方法では困難であることと、
仕様上を見直したほうが、というのは山々ですが。(それは仕方ないのでしょう)
既にあがっているフィルタドライバほど危険ではない方法として、3rdライブラリの
madshiによるシステムワイドフック(SYSTEM_WIDE)オプションにてWin32::CreateFile()
を自前処理しては、と思います。
カーネルレベルフックというわけではないので、ブルーバックが出る不安もないです。
失敗した間合いでも精々?、再起動を余儀なくされる程度ですむと思います。
流れとしては、
1. ユーザーログオンショートカットにCreateFile()フック用のプログラム
を仕込んでおいて、ログイン時にAPIを書き換え。
(この場合、ログオフでフックが解除されるハズ)
2-a. 通常はminiSDへの書き込みを不許可。つまり、MyCreateFile()が本来の
CreateFile()を呼ぶ前にINVALID_HANDLE_VALUEを返す。もちろん、SetLastError()も
忘れずに?
2-b. Callerが特定(miniSDへの書き込みを行いたい)プロセスの場合は、本来呼ばれる
べきCreateFile()をそのままコール。
で大丈夫だと思います。
プロセスの許可不許可に関しては、インジェクトDLL内で共有セクションを作って
おけば、プロセスIDなりで判定が行えると思います。
後は、万が一のためにタスクトレイからMyCreateFile()内での判定自体を無効にする
ような切り替え機能をつけてあげるとか・・。
# FATとのことなので、TxF関連も大丈夫だとは思いますが・・・。使ったことないので
# わかりかねる部分です。
突っ込みどころが満載なので、不備があればご指摘お願いします。
# 私が妄想するにこの方法での抜け穴として挙がるのが、Win32サブシステム外からの
# ファイル操作が思い当たります。私の記憶では、POSIXサブシステムのような場合は
# 直接ZwCreateFile()がコールされたと思います。
> 1. ユーザーログオンショートカットにCreateFile()フック用のプログラム
> を仕込んでおいて、ログイン時にAPIを書き換え。
> (この場合、ログオフでフックが解除されるハズ)
これをやるためにはW32サービスプログラムを作らなければならないと思います。
ウイルス対策ソフトのリアルタイム検索機能で使っているプログラムがそれに
あたいすると思います。
ひょっとして「madshi」のライブラリーで作れるのかもしてませんが......
># 直接ZwCreateFile()がコールされたと思います。
コールされたとしても、デバイスドライバーやサービスプログラム内で使用しないと
意味がないと思いますが.......
> これをやるためにはW32サービスプログラムを作らなければならないと思います。
madshiでのフックを行うと、全てのプログラム(csrss.exeを含む)に対して自動的に
フックが行われます。どのような仕組みかは知りませんが、その後もプロセスが生成
されたとしても自動的にフックが行われます。
なので、ログイン時にフックを起動するプログラムを常駐させるようにしておけば
十分であると思われます。
> ウイルス対策ソフトのリアルタイム検索機能で使っているプログラムがそれに
その手のプログラムは一般にフィルタドライバだったと思います。
> コールされたとしても、デバイスドライバーやサービスプログラム内で使用しないと
> 意味がないと思いますが.......
どこぞの文献を見た限りの私の解釈では、
Win32サブシステムの場合、CreateFile()→NtCreateFile()≒ZwCreateFile()
フックを行った場合、MyCreateFile()→CreateFile()→(略)
POSIXサブシステムの場合、ファイルオープン関数→ZwCreateFile()
だったと思います。
なので、CreateFile()でフックしたとしても、サブシステムが異なる場合は
MyCreateFile()が呼ばれない、ということを言いたいのですが間違いでしょうか?
補足し忘れました。
> madshiによるシステムワイドフック(SYSTEM_WIDE)オプションにて
とわざわざ明記したのは、madshiにはフックタイプが「システムワイドフック」と
「プロセスフック」の2種類があります。
> 全てのプログラム(csrss.exeを含む)に対して
プロセスフックの場合は、この限りではありません。