Mass Storage認識を高速化にトライ(失敗編)

  • 投稿日:
  • by
  • カテゴリ:

USB Selectを使って Mass Storageモードに切り替えた場合、PCがカードを認識するまでに時間がかかる件。これは、USB Selectの問題ではなく、標準のMass Storageドライバの問題です。従って、基本的に独自のドライバを持つ以外に、解決方法がないと思われます。

一体、ナニにそんなに時間がかかるのか? 可能性としては、miniSDをシステムからアンマウントして、さらにドライバ側でマウントしなおす部分が時間を食っているというものが考えられます。ならば、とりあえず、事前にカードをアンマウントしてみてはどうだろう……。と、思い、試みてみました。

まぁ、タイトルからも判るように、結論から言えば失敗に終わりました。カードがアンマウントされていようがいまいが、認識にかかる時間はおよそ60秒全然変わりませんでした。あとは、Mass Storageモードになったら、ドライバがminiSDを掴みっぱなしにするとか、そういう工夫が必要な気がします。多分、Card ExportIIのドライバはそんなことをしているんでしょう。(未確認)

悔しいので、アンマウントの方法について書いておきます。アンマウントの方法はMSDNにドキュメントがあります。やることは、storeapi.libに入っている、OpenStore()とDismountStore()を呼ぶだけです。

HANDLE hstore = OpenStore(L"DSK1:"); // DSK1: はminiSD
if (hstore != INVALIDE_HANDLE_VALUE)
{
DismountStore(hstore);
}
以上、終了……と、いいたいところですが、このコードは、Windows Mobile SDKではビルドできません。必要なヘッダ(storemgr.h)はあるものの、肝心のライブラリ(storeapi.lib)が含まれていないからです。……ソンナンバッカリダ oTL

それで、終わってしまったら、実験になりませんから、手を尽くして調べた結果、次のコードと等価であることが判りました。

HANDLE hstore = CreateFile(L"\\StoreMgr\\DSK1:", 0, 0, NULL, 0, 0, NULL);
if (hstore != INVALID_HANDLE_VALUE)
{
(*(BOOL (*) (HANDLE hStore))(0xF000E3F8))(hstore);
}
おいおい、直接アドレス指定で飛んでいるよ。こんなコード久しぶりに見た oTL
で、これを走らせれば、あっという間に、miniSDカードが見えなくなります。目出度し!?
いや、それはともかく、この状態からMass Storageに切り替えても認識速度に差はなかったのだから、徒労に終わったと言うべきですな oTL