Windows Vistaで外付けUSB HDDが切断できない

本当は「アンマウントできない」という方がぴったりなのだが、Windowsの場合は一般的では無いため、切断にした。

以前のエントリで「暗号化メディアは環境に依存しないものを選ぶべきだ」ということを書いた。
今度こそ移行完了?
なので早速、エントリ中で紹介したハードウェアで暗号化/複合化を済ましてしまうUSBの外付けHDDであるHDS-PH320U2を導入してみた。
BUFFALO ハードウェア暗号化/耐衝撃機能搭載 USB2.0用 ポータブルHDD HDS-PH320U2
BUFFALO ハードウェア暗号化/耐衝撃機能搭載 USB2.0用 ポータブルHDD HDS-PH320U2

既に使用しているが、SecureLockWareであれだけ苦労したのが嘘のように、自宅のCore i7環境でも快適に使えている。
それは良いのだが、困ったことが一つ発生した。
USBで接続した機器、例えば外付けのHDDは現在接続していることを示すタスクトレイ-アイコンをクリックすることで、明示的に切断を指示することができる。

機器の設定にもよるが、一般的にはこの指示によりHDDはキャッシュがフラッシュされてPCより明示的に切断されるはずだ。しかし、このHDDではそれができないのである。

このようなエラーは他のHDDでも発生していたが、大抵の場合、その原因は他のプロセスが同HDD内のデータにアクセスしているためであり、該当のプロセスを終了することで解決できていた。しかし、今回はそのようなアプリケーションは無いにも関わらず切断することができないのである。

このような場合、一見アクセスしているプロセスが無くてもO/S側でハンドルをロックしているケースがあるのを経験的に知っていたため、実際に該当のHDDをロックしているプロセスが無いかどうか、Handleというコマンドで調べてみることにした。※
Handle - By Mark Russinovich

※Handleについては既にNyaRuRuさんが取り上げており、そちらが詳しい。
ファイルを開いているプロセスを調べる - NyaRuRuの日記
同様にProcess Explorerでもハンドルを検索できるはずなのだが、私の環境ではProcess Explorerでは外付けのUSB HDDのハンドルを取得することができなかったため、バニラなコマンドを使用している。

使い方は簡単であり、例えばi:ドライブのハンドルがなんらかのプロセスによって使用されている場合、Handle.exeにパスを通して

handle i:

と実行するだけである。(管理者権限が必要)

実行結果

C:\Windows\system32>handle i:

Handle v3.42
Copyright (C) 1997-2008 Mark Russinovich
Sysinternals - www.sysinternals.com

System             pid: 4       504: I:\$Extend\$RmMetadata\$TxfLog\$TxfLogContainer00000000000000000001
System             pid: 4       BC8: I:\System Volume Information\{0d8e4ddd-c65f-11dd-9277-001e4fd555ec}{3808876b-c176-4e48-b7ae-04046e6cc752}
System             pid: 4      2024: I:\$Extend\$RmMetadata\$TxfLog\$TxfLogContainer00000000000000000002
System             pid: 4      207C: I:\System Volume Information\{3808876b-c176-4e48-b7ae-04046e6cc752}
System             pid: 4      208C: I:\$Extend\$RmMetadata\$TxfLog\$TxfLog.blf
System             pid: 4      20A8: I:\System Volume Information\{cae95c05-ca32-11dd-bf1f-001e4fd555ec}{3808876b-c176-4e48-b7ae-04046e6cc752}
System             pid: 4      20B0: I:\$Extend\$RmMetadata\$Txf

pid: 4はシステムプロセスだが、システムプロセスがなにかいろいろと使っていることは確かなようである。(NTFSのトランザクションメタデータらしい)
Handle.exeはハンドルを強制的にクローズする機能も持っているが、システムプロセスのハンドルを強制的にクローズするのはしたくない。(恐らくできない?)

そこで、ハンドルをクローズするのではなく"ドライブを除去"する、というコマンドがUwe Sieber氏によって開発されているので、今度はそちらを試すことにした。

RemoveDrive V1.9 - Safe removal of drives/ Uwe Sieber
こちらも使い方は簡単だ。i:ドライブを切断するまで待つ場合

removedrive i: -L

と指定する。(管理者権限が必要)
しかし、実行してみると以下のように延々と待ちになってしまい、ドライブを除去することができなかった。

C:\Windows\system32>removedrive i: -L

RemoveDrive V1.9 - prepares drives for safe removal
Freeware by Uwe Sieber - www.uwe-sieber.de
Removing Drive 'I:\' (BUFFALO Disk Drive USB Device)
check for open handles on disk '\Device\00000079'
removal failed
Press Ctrl+C to cancel. Trying..............
failed

\Device\00000079のディスク装置でオープンされているハンドルをチェックしてみろ、と言われているがそもそもそのディスク装置を強制的に切断したいんだが。

removedriveコマンドはデバッグモードと呼ばれる、ログを採取するオプション"-D"と現在オープンされているハンドルがあればそれを表示する"-H"オプションがあるので、それも併せて試してみることにした。

C:\Windows\system32>removedrive i: -L -H -D

RemoveDrive V1.9 - prepares drives for safe removal
Freeware by Uwe Sieber - www.uwe-sieber.de
volume=\\?\Volume{0016adfe-c65a-11dd-b643-001e4fd555ec}
Removing Drive 'I:\' (BUFFALO Disk Drive USB Device)
checking for open handles on I:\... none found
checking for open handles on J:\... none found
RemoveDevice('I:\', '\\?\Volume{0016adfe-c65a-11dd-b643-001e4fd555ec}', '\Device\HarddiskVolume7', 1)
Volume's DeviceNumber=1
Dev's DevInst=4288
Device to remove
  ID=USBSTOR\DISK&VEN_BUFFALO&PROD_DISK_DRIVE&REV_1.20\11210804312B&1
Found removable parent Device to remove
  ID=USB\VID_0411&PID_012B\11210804312B

CM_Query_And_Remove_SubTree  Success=0 VetoType=6 VetoName=USBSTOR\CdRom&Ven_BUFFALO&Prod_USB-ATA_Bridge&Rev_1.20\11210804312B&0CM_Query_And_Remove_SubTree  Success=0 VetoType=6 VetoName=USBSTOR\CdRom&Ven_BUFFALO&Prod_USB-ATA_Bridge&Rev_1.20\11210804312B&0CM_Query_And_Remove_SubTree  Success=0 VetoType=6 VetoName=USBSTOR\CdRom&Ven_BUFFALO&Prod_USB-ATA_Bridge&Rev_1.20\11210804312B&0
check for open handles on disk '\Device\00000079'
removal failed
Press Ctrl+C to cancel. Trying...
CM_Query_And_Remove_SubTree  Success=0 VetoType=6 VetoName=USBSTOR\CdRom&Ven_BUFFALO&Prod_USB-ATA_Bridge&Rev_1.20\11210804312B&0.
CM_Query_And_Remove_SubTree  Success=0 VetoType=6 VetoName=USBSTOR\CdRom&Ven_BUFFALO&Prod_USB-ATA_Bridge&Rev_1.20\11210804312B&0.
CM_Query_And_Remove_SubTree  Success=0 VetoType=6 VetoName=USBSTOR\CdRom&Ven_BUFFALO&Prod_USB-ATA_Bridge&Rev_1.20\11210804312B&0......
failed

むう、オープンされているハンドルはi: j:ともに無いと判断されているが、それでも除去に失敗しているのが判る。※
CM_Query_And_Remove_SubTreeというPnP Configuration Managerのファンクションの呼び出し結果が0だが、実際には失敗しているようだ。(リトライしている)

※j:ドライブは仮想CDドライブとして認識されており、このドライブ中の認証アプリケーションによってパスワード認証を行うことでi:ドライブが有効になる仕組みだ。

という訳で、こうなってしまうとWindowsをシャットダウンしない限り、HDDは切断することができないのである。(コネクタを抜くことで物理的に切断することはできるが、その後はWindowsを再起動しないと二度とHDDの認証が成功しないため、暗号化されたドライブにもアクセスできない)
うー、振り出しに戻るか。なさけない。