Я тоже попал в эту проблему.
Мой встроенный USB-накопитель для чтения только для чтения отслеживает команды SCSI от хоста. В Mac OS X (10.5): на подключаемом модуле драйвер OS X очень хорошо говорит устройству, чтобы предотвратить удаление носителя (команда SCSI PREVENT/ALLOW MEDIUM REMOVAL). Мое устройство принимает эту команду. Позже, когда пользователь сигнализирует о том, что устройство должно быть выбрано, OS X, опять-таки неплохо, снова отправляет PREVENT/ALLOW REMOVAL с помощью значка ALLOW, а затем отправляет SCSI START/STOP, указывающий на остановку (или выброс, не могу вспомнить). Красивый.
Windows XP, однако, просто перестает отправлять команду SCSI TEST UNIT READY. Я смотрел; «безопасно удалять аппаратные средства» не посылает никакой сигнал SCSI, это просто приводит к тому, что сигнал готовности TEST UNIT READY прекращается, что он делал каждую секунду или около того. В основном Windows просто моется.
TEST UNIT READY таймаут может работать с Windows, но это отвратительный способ обнаружения состояния остановки устройства. Плюс он не будет работать с OS X, так как OS X не проверяет мое устройство каждую секунду, как Windows; Я получил бы ложный результат.
ОБНОВЛЕНИЕ 15 ноября 2009
Sondergaard здесь отчетное.
Очень многое зависит от того, является ли ответ устройства на команду SCSI «Запрос» USB Mass-Storage-Class самоопределяется как «съемный» или «фиксированный».
Если флаг говорит об удалении, единственный способ, которым я мог бы сказать, что пользователь Windows XP «остановил» мое устройство, заключается в том, что команды, готовые к тестированию, покидают каждую секунду. Если флаг не говорит об удалении, нет регулярного потока команд, готовых к тестированию. USB suspend не мог рассчитываться ни на одном из них, примерно в 1/4 моих тестов «безопасно удалить» НЕ отправил USB suspend. Не знаю, почему это было непротиворечиво. Поэтому, если вы хотите быть уверенным, лучшая рекомендация, которую я могу сделать для совместимости с WINDOWS XP ТОЛЬКО, заключается в том, чтобы ответить INQUIRY как «съемный», искать регулярные команды TEST UNIT READY, а затем, когда они перестанут считать себя безопасным удалением.
OS X (10.6) - это совсем другая история. Как я писал выше, это гораздо более вежливо. Он отправляет SCSI START/STOP, чтобы развернуть или открутить устройство, иногда все самостоятельно, без ввода пользователем. Но это означает, что если вы интерпретируете STOP как пропущенный пользователь и отсоединяетесь каким-либо уродливым способом, внутренним для вашего устройства, OS X может сильно запутаться, когда он снова попытается открутить диск. Если ваше устройство помечено как съемное, OS X отправит команду ALLOW REMOVAL перед STOP (или это был EJECT в этом случае?), Это было бы неплохим признаком того, что все прошло.
Я не исчерпывающе стараюсь использовать разные конфигурации. Мое приложение доступно только для чтения с двумя разделами и должно идентифицироваться как NON съемное, поскольку Windows XP отказывается признать более одного раздела для съемных USB-накопителей (OS X не имеет проблем в любом случае). Поэтому большинство моих тестов было в этой конфигурации.
Надеюсь, это поможет.
Это не относится к суперпользователю. Решение, вероятно, связано с каким-то мониторингом sysfs или худшим хакером ядра. – shodanex