lazy-write

Тема в разделе "WASM.WIN32", создана пользователем Maveric, 6 июл 2005.

  1. Maveric

    Maveric New Member

    Публикаций:
    0
    Регистрация:
    19 янв 2004
    Сообщения:
    90
    Написал сервис для физического отключения винта. Сначала для каждого тома на диске вызываю FSCTL_LOCK_VOLUME потом FSCTL_DISMOUNT_VOLUME и FSCTL_UNLOCK_VOLUME. Все это для того чтобы сбросить буфер файловой системы и размонтировать её. Потом собственно отключается физический диск. И всё это замечательно работает на WinXP SP2. На некторых машинах с SP1 возникла проблема. Все операции по отключению проходят без ошибок. Но физический диск из системы не удаляется, хочет перезагрузки. Если его всё же физически выдернуть, то в трее всплывет окно которое гласит, что для выдернутого диска есть отложенная запись.

    Подскажите как победить эту заразу.
     
  2. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"




    ФИЗИЧЕСКОГО? А вилку из розетки твоя программа выдергивать не умеет?



    А если серьезно, то вот кусок кода из Sync от Four-F
    Код (Text):
    1. FlushVolume proc dwDriveLetter:DWORD, fbEject:BOOL
    2.  
    3. local hVolume:HANDLE
    4. local buffer[32]:CHAR
    5.  
    6.     mov eax, dwDriveLetter
    7.     and eax, 0FFh
    8.     invoke wsprintf, addr buffer, $CTA0("\\\\.\\%c:"), eax
    9.  
    10.     invoke CreateFile, addr buffer, GENERIC_READ + GENERIC_WRITE,
    11.             FILE_SHARE_READ + FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL
    12.     .if eax != INVALID_HANDLE_VALUE
    13.  
    14.         mov hVolume, eax
    15.  
    16.         mov eax, dwDriveLetter
    17.         and eax, 0FFh
    18.         invoke wsprintf, addr buffer, $CTA0("Flushing drive %c\n"), eax
    19.         invoke PrintConsole, addr buffer, 0
    20.  
    21.         invoke FlushFileBuffers, hVolume
    22.         .if eax != 0
    23.             .if fbEject
    24.                 invoke EjectMedia, hVolume
    25.                 .if eax == TRUE
    26.                     mov eax, dwDriveLetter
    27.                     and eax, 0FFh
    28.                     invoke wsprintf, addr buffer, $CTA0("Drive %c ejected\n"), eax
    29.                     invoke PrintConsole, addr buffer, 0                
    30.                 .endif
    31.             .endif
    32.         .else
    33.             invoke PrintLastError
    34.         .endif
    35.         invoke ZwClose, hVolume
    36.  
    37.     .else
    38.         invoke PrintLastError
    39.     .endif
    40.  
    41.     ret
    42.  
    43. FlushVolume endp
    44.  
     
  3. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"
    и еще ты забыл послать IOCTL_DISK_EJECT_MEDIA
     
  4. Maveric

    Maveric New Member

    Публикаций:
    0
    Регистрация:
    19 янв 2004
    Сообщения:
    90
    Насчёт „Написал сервис для физического отключения винта. “ - круто подмечено. Постараюсь больше так не делать. Фокус с FlushFileBuffers проделывал тоже. А IOCTL_DISK_EJECT_MEDIA по-моему обречено на провал, т.к. диск имеет тип DRIVE_FIXED. Интересно как это делает format.com