Hatena::ブログ(Diary)

Kazzzの日記 このページをアンテナに追加 RSSフィード

2008-12-18

[][][]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は現在接続していることを示すタスクトレイ-アイコンクリックすることで、明示的に切断を指示することができる。
f:id:Kazzz:20081218180207p:image
機器の設定にもよるが、一般的にはこの指示によりHDDはキャッシュフラッシュされてPCより明示的に切断されるはずだ。しかし、このHDDではそれができないのである。
f:id:Kazzz:20081218180208p:image

このようなエラーは他の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の認証が成功しないため、暗号化されたドライブにもアクセスできない)
うー、振り出しに戻るか。なさけない。

通りすがりの者通りすがりの者 2009/05/14 13:38 Hotswap!は使ってみましたか?↓↓↓
http://mysite.verizon.net/kaakoon/hotswap/index_jpn.htm

KazzzKazzz 2009/05/14 17:04 情報ありがとうございます。
次回、同様の状況が発生した時にでも試してみようと思います。

おつるんおつるん 2011/08/07 07:42 Hotswapでも取り外せません。
「デバイス'xxx'がシステムの再起動を要求したため、デバイスを今削除できません」
と出ます。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証