NtDeleteFile & STATUS_DELETE_PENDING

Тема в разделе "WASM.WIN32", создана пользователем gribodemon, 26 дек 2009.

  1. gribodemon

    gribodemon New Member

    Публикаций:
    0
    Регистрация:
    17 июн 2009
    Сообщения:
    138
    Доброго времени суток!
    Столкнулся с subj'ем.
    По каким-то причинам, я не могу ровно 60 сек удалить файл (т.е. NtDeleteFile возвращает STATUS_DELETE_PENDING), в который недавно была произведена запись и который недавно был запущен.
    Знаю, звучит бредово, но это именно это и происходит.
    Смотрел в ProcessMonitor'е что в это время происходит - там только FAST_IO_DISALLOWED и DELETE_PENDING.

    P.S.: NtDeleteFile я использую, чтобы избежать такую вещь, как ERROR_SHARING_VIOLATION.

    Вообще, сначала, думал что проблема в проактивной защите моего HIPS'а (ну, может, драйвер блокирует удаление файлов, т.к. анализирует его ... или ещё что-то). Однако, HIPS я снёс, проверил SSDT & Shadow SSDT - там всё чисто, а проблема осталась.
    Использую Windows 7 7600 (+ TrueCrypt 6.2a).

    В чём же может быть проблема? Пожалуйста, посоветуйте какие-нибудь программы для диагностики таких ситуаций.
     
  2. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Конкретнее.
     
  3. gribodemon

    gribodemon New Member

    Публикаций:
    0
    Регистрация:
    17 июн 2009
    Сообщения:
    138
    x64
    Так написано же:
    http://undocumented.ntinternals.net...d Functions/NT Objects/File/NtDeleteFile.html
    Т.е. если кто-то открыл (CreateFile) файл без FILE_SHARE_DELETE, то ошибки STATUS_SHARING_VIOLATION не будет при удалении.
     
  4. gribodemon

    gribodemon New Member

    Публикаций:
    0
    Регистрация:
    17 июн 2009
    Сообщения:
    138
    Сейчас создал тестовый файл - потестить.
    Код (Text):
    1.     HANDLE hFile = CreateFile("C:\\test.txt", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    2.     // Deleting file
    3.     WCHAR szPathDeleteFile[MAX_PATH] = {L"\\??\\c:\\test.txt"};
    4.     UNICODE_STRING usFilePath;
    5.     usFilePath.Buffer = szPathDeleteFile;
    6.     usFilePath.Length = (USHORT)wcslen(szPathDeleteFile) * sizeof WCHAR;
    7.     usFilePath.MaximumLength = usFilePath.Length + 1 * sizeof WCHAR;
    8.     OBJECT_ATTRIBUTES ObjectAttributes;
    9.     InitializeObjectAttributes(&ObjectAttributes, &usFilePath, OBJ_CASE_INSENSITIVE, 0, NULL);
    10.     NTSTATUS ntstat = (NTSTATUS)XNtDeleteFile(&ObjectAttributes);
    Ошибко: 0xC0000043.
    Так что, от ERROR_SHARING_VIOLATION оно не спасает.

    Однако, вопрос насчёт DELETE_PENDING остаётся открытым.
     
  5. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    gribodemon
    Конечно не спасает. Относитесь к таким документациям с долей сомнения.
    Эта функция появилась в XP по одной простой причине - чтобы не открывать файл, удалять его и закрывать вызывать всего одну функцию удаления.
     
  6. gribodemon

    gribodemon New Member

    Публикаций:
    0
    Регистрация:
    17 июн 2009
    Сообщения:
    138
    Great
    Хм. Разве в XP?
    Сейчас смотрю ntdll.dll в w2ksp3. Она там есть:

    [​IMG]

    По поводу DELETE_PENDING.
    Хочу отметить, что тестировал на w2k, однако, бага замечено не было.
     
  7. gribodemon

    gribodemon New Member

    Публикаций:
    0
    Регистрация:
    17 июн 2009
    Сообщения:
    138
    Сейчас посмотрел - сначала происходит ошибка на kernel32!CreateFile() 0x00000032 (ERROR_SHARING_VIOLATION), а затем уже NtDeleFile возвращает STATUS_PENDING.
    Т.е. возможно, сначала нужно решить проблему с ERROR_SHARING_VIOLATION.
    С файлом работаю только я. И открываю я файл примерно так:

    Код (Text):
    1. hFile = CreateFile(szFilePath, GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
    Мало того, что я закрываю файл через CloseHandle, но я ещё и расшариваю его для удаления - FILE_SHARE_DELETE.
    Стало быть, с файлом работает кто-то ещё. Но кто? Как это выяснить? Подскажите программки.
    Почему STATUS_PENDING происходит ровно 60 сек? Причём CreateFile (да, в цикле я пытаюсь его ещё открыть) возвращает все эти 60 сек - ERROR_ACCESS_DENIED.
     
  8. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    unlocker

    MSDN утверждает, что она доступна начиная с XP:
     
  9. gribodemon

    gribodemon New Member

    Публикаций:
    0
    Регистрация:
    17 июн 2009
    Сообщения:
    138
    Эта? http://download.cnet.com/Unlocker/3000-2248_4-10493998.html
    Что-то не пойму как с помощью неё можно что-то диагностировать. Вижу есть интерфейс для Move || Delete File, однако как с помощью неё получить список программ использующих опред. файл - хз. =)
    Сайт программы явно жжот: http://ccollomb.free.fr/unlocker HTTP ERROR 403
    README размером в 1.5KB жжот ещё больше.
    Точно эта программа?
     
  10. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    http://myunlocker.ru/faq/
    там же есть скриншот со списком программ, которые заняли фаел

    UPD: Но вообще сайт про ту же самую программу. Просто там есть инфа о ней на русском.
     
  11. gribodemon

    gribodemon New Member

    Публикаций:
    0
    Регистрация:
    17 июн 2009
    Сообщения:
    138
    Great
    Да хз. Сейчас попытался его вызвать на *.ncb файле, который невозможно читать (ибо открыт в MS VS Studio) - вызываю Unlocker для него и он пишет: No Locking Handle Found.
    Что-то какая-то нестабильная программа совсем. =(
     
  12. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    [​IMG]
    У вас неправильная студия или неправильный анлокер и он делает неправильный мёд =\
     
  13. gribodemon

    gribodemon New Member

    Публикаций:
    0
    Регистрация:
    17 июн 2009
    Сообщения:
    138
    Great
    Качал последнюю версию unlocker1.8.8 и unlocker1.8.7.
    Странно это всё.

    А других тулз не имеется?
     
  14. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    http://windowsxp.mvps.org/processlock.htm
    use the f google
     
  15. gribodemon

    gribodemon New Member

    Публикаций:
    0
    Регистрация:
    17 июн 2009
    Сообщения:
    138
    Great
    Wow. До этого много раз юзал ProcessExplorer вот уж не думал, что под пунктом меню "Find Handle Or DLL" скрывается поиск хэндлов на опред. файл, заданный через имя.
    Respect.
     
  16. gribodemon

    gribodemon New Member

    Публикаций:
    0
    Регистрация:
    17 июн 2009
    Сообщения:
    138
    А вот OH.exe из Windows Resource Kits явно жжот:

    Чуть что - сразу Reboot. =)
     
  17. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Это так называемый NtGlobalFlag. Чтобы изменять некоторые параметры в нем нужен ребут, как я помню. Это всегда в винде было
     
  18. gribodemon

    gribodemon New Member

    Публикаций:
    0
    Регистрация:
    17 июн 2009
    Сообщения:
    138
    Great
    Должен заметить, у меня очень странные вещи происходят.
    Сейчас выявилась ошибка связанная с SHARING VIOLATION.
    Допустим, сижу в MS VS 2005, нажимаю F5, Shift + F5, _изменяю какой-либо код, снова F5 и вижу следующее:
    Сделал лог в ProcessMonitor'е: http://www.sendspace.com/file/8rsbl8
    Выжимка:
    Это можно как-то объяснить? Почему происходит Sharing Violation при CreateFile, если последний раз был SUCCESS на CloseFile'е?
    И действительно - посмотрел в ProcessExplorer'е - открытых хэндлов на program.exe нет, но всё равно постоянно происходит SHARING VIOLATION.

    Plz, help!
     
  19. gribodemon

    gribodemon New Member

    Публикаций:
    0
    Регистрация:
    17 июн 2009
    Сообщения:
    138
    * cstrings.exe == program.exe

    Верните редактирование! =)
    придет время - вернем
     
  20. gribodemon

    gribodemon New Member

    Публикаций:
    0
    Регистрация:
    17 июн 2009
    Сообщения:
    138
    Возможно, это как-то связано с тем, что у меня стоит TrueCrypt и я выполняю операции на закриптованном логическом диске?
    Может, драйвер TrueCrypt глючит?