私もこの問題にぶつかりました。
私の組み込み USB 読み取り専用大容量ストレージ プロジェクトは、ホストからの SCSI コマンドを監視します。Mac OS X (10.5) の場合: プラグインで、OS X ドライバーは、メディアの削除を防止するようにデバイスに適切に指示します (SCSI コマンド PREVENT/ALLOW MEDIUM REMOVAL)。私のデバイスはこのコマンドを受け入れます。その後、ユーザーがデバイスをイジェクトする必要があることを知らせると、OS X は再び非常に適切に、ALLOW フラグを付けて PREVENT/ALLOW REMOVAL を再度送信し、停止を示す SCSI START/STOP を送信します (またはイジェクト、覚えていません)。美しい。
ただし、Windows XP は、SCSI コマンド TEST UNIT READY の送信を単に停止しているように見えます。私は見ました。「ハードウェアを安全に取り外す」は、SCSI 信号をまったく送信しません。1 秒ごとに行っていた TEST UNIT READY 信号の送信を停止するだけです。基本的に、Windows はうまく機能しません。
TEST UNIT READY タイムアウトは Windows で機能する可能性がありますが、デバイスの停止状態を検出するにはお粗末な方法です。さらに、OS X は Windows のように毎秒デバイスに ping を送信しないため、OS X では動作しません。偽陽性になります。
2009 年 11 月 15 日更新
Sondergaard がここで報告します。
USB Mass-Storage-Class SCSI の「Inquiry」コマンドに対するデバイスの応答が、「取り外し可能」または「固定」のどちらとして識別されるかに大きく依存します。
フラグがリムーバブルと表示されている場合、Windows XP ユーザーがデバイスを「停止」したかどうかを知る唯一の方法は、テスト ユニット準備完了コマンドが毎秒停止することです。フラグにリムーバブルと表示されていない場合は、テスト ユニット対応コマンドの定期的なストリームはありません。私のテストの約1/4では、「安全に削除」してもUSBサスペンドは送信されませんでした。なぜそれが一貫していないのか分かりません。したがって、確実に確認したい場合は、WINDOWS XP との互換性のために私ができる最善の推奨事項は、「取り外し可能」として問い合わせに応答し、通常の TEST UNIT READY コマンドを探し、それらが停止したら、安全に削除されたと見なすことです。
OS X (10.6) は別の話です。上にも書きましたが、もっと丁寧です。SCSI START/STOP を送信して、デバイスのスピンアップまたはスピンダウンを行いますが、ユーザーの入力なしですべて単独で実行されることもあります。しかし、これは、STOP をユーザーが終了したことを示していると解釈し、デバイス内部で何らかの醜い方法で切断すると、OS X がディスクを再び回転させようとしたときに非常に混乱する可能性があることを意味します。デバイスがリムーバブルとしてマークされている場合、OS X は STOP の前に ALLOW REMOVAL コマンドを送信します (この場合は EJECT でしたか?)。
さまざまな構成を徹底的に試したわけではありません。私のアプリケーションは 2 つのパーティションで読み取り専用であり、Windows XP がリムーバブル USB ドライブに対して複数のパーティションを認識することを拒否するため、非リムーバブルとして識別する必要があります (OS X はどちらの方法でも問題ありません)。したがって、私のテストのほとんどはこの構成で行われました。
お役に立てれば。