Написал сервис для физического отключения винта. Сначала для каждого тома на диске вызываю FSCTL_LOCK_VOLUME потом FSCTL_DISMOUNT_VOLUME и FSCTL_UNLOCK_VOLUME. Все это для того чтобы сбросить буфер файловой системы и размонтировать её. Потом собственно отключается физический диск. И всё это замечательно работает на WinXP SP2. На некторых машинах с SP1 возникла проблема. Все операции по отключению проходят без ошибок. Но физический диск из системы не удаляется, хочет перезагрузки. Если его всё же физически выдернуть, то в трее всплывет окно которое гласит, что для выдернутого диска есть отложенная запись. Подскажите как победить эту заразу.
ФИЗИЧЕСКОГО? А вилку из розетки твоя программа выдергивать не умеет? А если серьезно, то вот кусок кода из Sync от Four-F Код (Text): FlushVolume proc dwDriveLetter:DWORD, fbEject:BOOL local hVolume:HANDLE local buffer[32]:CHAR mov eax, dwDriveLetter and eax, 0FFh invoke wsprintf, addr buffer, $CTA0("\\\\.\\%c:"), eax invoke CreateFile, addr buffer, GENERIC_READ + GENERIC_WRITE, FILE_SHARE_READ + FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL .if eax != INVALID_HANDLE_VALUE mov hVolume, eax mov eax, dwDriveLetter and eax, 0FFh invoke wsprintf, addr buffer, $CTA0("Flushing drive %c\n"), eax invoke PrintConsole, addr buffer, 0 invoke FlushFileBuffers, hVolume .if eax != 0 .if fbEject invoke EjectMedia, hVolume .if eax == TRUE mov eax, dwDriveLetter and eax, 0FFh invoke wsprintf, addr buffer, $CTA0("Drive %c ejected\n"), eax invoke PrintConsole, addr buffer, 0 .endif .endif .else invoke PrintLastError .endif invoke ZwClose, hVolume .else invoke PrintLastError .endif ret FlushVolume endp
Насчёт „Написал сервис для физического отключения винта. “ - круто подмечено. Постараюсь больше так не делать. Фокус с FlushFileBuffers проделывал тоже. А IOCTL_DISK_EJECT_MEDIA по-моему обречено на провал, т.к. диск имеет тип DRIVE_FIXED. Интересно как это делает format.com