Я тоже затронул эту проблему.
Мой встроенный проект 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
Зондергаард здесь отчитывается.
Многое зависит от того, идентифицирует ли устройство ответ на команду SCSI «Запрос» SCSI класса запоминающего устройства самостоятельно как «съемный» или «фиксированный».
Если флаг говорит «съемный», то единственный способ узнать, «остановил» ли мой пользователь Windows XP мое устройство, - это то, что команды, готовые для тестирования, перестают поступать каждую секунду. Если флаг не говорит «съемный», то нет регулярного потока команд test-unit-ready. Нельзя было рассчитывать на USB-приостановку, примерно в 1/4 моих тестов «безопасно удалить» НЕ отправлял USB-приостановку. Понятия не имею, почему это не соответствует. Поэтому, если вы хотите быть уверенным, лучшая рекомендация, которую я могу дать для совместимости только с WINDOWS XP, - это отвечать на запрос как «съемный», искать обычные команды TEST UNIT READY, а затем, когда они перестанут, считать себя удаленным.
OS X (10.6) - это отдельная история. Как я уже писал выше, это гораздо более вежливо. Он отправляет SCSI START / STOP для ускорения или замедления устройства, иногда само по себе, без участия пользователя. Но это означает, что если вы интерпретируете STOP как сообщение о том, что пользователь прошел, и отключаете его любым уродливым способом, внутренним для вашего устройства, OS X может очень запутаться, когда попытается снова раскрутить диск. Если ваше устройство помечено как съемное, OS X перед STOP отправит команду ALLOW REMOVAL (или это было EJECT в этом случае?), Это было бы довольно хорошим признаком того, что оно прошло.
Я не исчерпывающе пробовал разные конфигурации. Мое приложение доступно только для чтения с двумя разделами и должно быть идентифицировано как НЕ Съемное, потому что Windows XP отказывается подтверждать более одного раздела для съемных USB-накопителей (OS X не имеет проблем в любом случае). Поэтому большая часть моего тестирования была в этой конфигурации.
Надеюсь, это поможет.