]> Converting Compact Flash drive from Removable to Fixed Disk in Windows 2000

▼Windows 2000でリムーバブル ディスク扱いのコンパクトフラッシュ カードを固定ディスクとして認識させる▼

$Keywords: CompactFlash card, Removable Disk, fixed disk, NonRemovableMedia, cfadisk.sys $

$Id: W2konCF.html,v 1.2 2010-08-16 17:22:59+09 kabe Exp $


▽「リムーバブル ディスク」扱いによる制限

[リムーバブル ディスク (C:)]
図1. CFカードは「リムーバブル ディスク」に見えている

多くのCompactFlash (CF) カードは、パラレルATA変換基板を介してTrueIDEモードで 動かしていても、属性的には「リムーバブル ディスク」のままであるため、 Windows2000以降では複数のパーティションが切れないという制限がつきます。

DOSやUNIX系ではわざわざ制限してないので、そちらで 複数パーティションを作ってフォーマットもできますが、 Windowsにつないでディスクマネージャで見ると、 プロパティがおかしかったり フォーマットやパーティション削除の操作ができません。 新規インストール時も、わかりにくいエラーが出ます。

[パーティション作れない…]
図2. 「リムーバブル ディスク」ではパーティションが作れない


▼属性を固定ディスクにする


▽方法1: atapi.sysに固定ディスクだと教える

IDEコントローラを制御する atapi.sys の設定である、 HKLM\SYSTEM\CurrentControlSet\Services\atapi\Parameters\キーの NonRemovableMedia値(REG_MULTI_SZ)には、 固定ディスク扱いするディスクドライブ銘の一覧が書かれています。

ここに、使うCFカードの名前を追加して再起動すれば、固定ディスク扱いに なるようです。

[NonRemovableMediaキーに値を追加]
図3. NonRemovableMediaキーに値を追加

追加する文字列は、(たぶん) HKLM\SYSTEM\CurrentControlSet\Enum\IDE\DiskDeviceID\******\ キーの FriendlyName値 から拾います。

なお、このNonRemovableMedia値の初期値は %windir%\inf\mshdc.inf に書かれています。

◇Windows XP不可

NonRemovableMedia が使えるのは結局 Windows 2000 の atapi.sys だけで、Windows XP以降では使えません (レジストリは残っているが、atapi.sysからロジックが削除されている)。

Windows 2000 の atapi.sys に入替えてやれば一応 XP でも動きます。 もっとも、PCMCIAのメモリカード挿したりする度に XP標準の atapi.sys に戻ってしまったりするので、常用はめんどくさいかと思われます。


▽方法2:cfadiskフィルタドライバを使う

日立(旧IBM)のマイクロドライブ用のフィルタドライバを使うと、 このRemovable属性を上書きして固定ディスクに見せかけることができます。 本来は当然、マイクロドライブ用で使うことが利用条件ですが。

日立からはすでに配布されていないようなので、"xpfildrvr1224_320.zip"を 他所から 入手します。

解凍するとcfadisk.infが含まれているので、これを手持ちのCFカード用に 書き換えます。

▽Device IDの入手

とりあえずPCカードアダプタ経由でCFカードを接続して、 Hardware ID値を拾ってきます。 PCカードアダプタ経由で接続すれば IDE コントローラ扱いなので、 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\IDE\Disk********\ を掘る。
USBアダプタ経由の接続時は ...\ENUM\USBSTOR\ 以下に キーができますが、 CFカードではなくCF-USBコンバータのIDしか拾えないことがあるので おすすめしません。

[Device ID のありか]
図4. レジストリからDevice IDを拾う

Device IDの値は REG_MULTI_SZ型 なので、regedit.exe では うまく拾えないかもしれません。 上図のようにregedt32.exe なら全部の値を見ることができます。

Device IDは以下の形式を持ちます:

IDE\t*v(40)r(8)
t*
任意長のdevice-type code。ディスクはDisk
v(40)
ベンダ名と製品名。長さ40文字になるよう、"_"でパディング。
r(8)
8文字の revision number
例:(Transcendの1GB CFカード。revisionはフォーマット日になる?)
IDE\DiskTRANSCEND_______________________________20060726
IDE\TRANSCEND_______________________________20060726
IDE\DiskTRANSCEND_______________________________
TRANSCEND_______________________________20060726
GenDisk

▽cfadisk.infの書き換え

cfadisk.infの [cfadisk_device] 項 (Windows DDK的には [Models]項) に、拾った Device ID を埋め込みます。 今あるエントリは全部削除してから、エントリを書き加えます。

[cfadisk_device]
%Microdrive_devdesc% = cfadisk_install,IDE\DiskIBM-DSCM-11000__________________________SC2IC801
	↓
%Microdrive_devdesc% = cfadisk_install,IDE\DiskFLASH_CARD______________________________20080128

Device IDには、「互換用」のエントリとして何種類かの省略形もあり、 revision 番号のない形式:

IDE\t*v(40)
も使えます。 同じメーカーのCFカードはシリアル番号によらず固定ディスク化したいでしょうから、 revision (20080128) のない
%Microdrive_devdesc% = cfadisk_install,IDE\DiskFLASH_CARD______________________________
でも問題なく使えます。 何でもかんでも書くと、リムーバブルにしておきたいデバイスも 固定ディスク化されてしまうので注意!

OS標準のディスクとUSBメモリの設定は %windir%\INF\ 以下の disk.inf と usbstor.inf にあります。 GenDisk といったデフォルト用設定しか書いてないので、 自分でinfを書く際の参考にはしづらいかも
なお、 新規インストール時の[F6]押下で使えるドライバディスクにするには、 txtsetup.oemも追加で書く必要がありますが、独立ドライバではない フィルタドライバを書く方法はないようです。

▽インストール

対象のディスクデバイスに、ドライバ更新でフィルタドライバをインストールします。

ドライバ更新を行う際は、他アプリケーションを閉じるなど、 安全策を講じましょう。いきなりSTOPエラーで落ちたことがありました。 ディスクドライバ入れ替えは特殊な操作なので、用心に越したことはないです。

再起動して、該当ドライブが「ローカル ディスク」と表示されれば更新成功です。

[固定ディスクになった]
図5. 固定ディスクになった

cfadiskを使った場合は、 デバイスマネージャから [ドライバの詳細(D)...] を見ると cfadisk.sys と disk.sys (デフォルトのドライバ) がスタックされている 状態がわかります。

[ドライバ ファイルの詳細: cfadisk.sys/disk.sysを両方使っている]
図6. cfadisk.sys/disk.sysを両方使っている


CFのメーカによっては専用のツールで属性を「固定ディスク」に 書き換えられるらしいのですが、末端のユーザ用に配布している ベンダは無いようです。

(未確認:TranscendのCFカードならTrueIDE時は固定ディスク属性を返す?)


▼元に戻す場合

デバイスマネージャから、該当ドライブの [ドライバを更新(P)] で、 単なる「ディスク ドライブ」と表示されるドライバに入れ替えます。 ドライバが disk.sys だけに戻ります

が、実はcfadiskドライバは有効のままです。再起動しても固定ディスクのままです。

cfadisk.infにも書かれている、デバイス側のレジストリに追加される LowerFiltersの設定がクリアされない!ので、

HKLM\SYSTEM\CurrentControlSet\Enum\IDE\Diskデバイス名\******\ キーの LowerFilters,REG_MULTI_SZ,"cfadisk" 値を手動で削除してやる 必要があります。 このレジストリキーはACL的にSYSTEM権限でしか書き込みできないので、 Windows2000ではregedt32でいったんACLを追加してから値を削除します。

Windows2000で確認。XPではサービスパック次第では自動で消える?


かべ@sra-tohoku.co.jp