NtDeleteFile & STATUS_DELETE_PENDING

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

  1. gribodemon

    gribodemon New Member

    Публикаций:
    0
    Доброго времени суток!
    Столкнулся с 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
    Конкретнее.
     
  3. gribodemon

    gribodemon New Member

    Публикаций:
    0
    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
    Сейчас создал тестовый файл - потестить.
    Код (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
    gribodemon
    Конечно не спасает. Относитесь к таким документациям с долей сомнения.
    Эта функция появилась в XP по одной простой причине - чтобы не открывать файл, удалять его и закрывать вызывать всего одну функцию удаления.
     
  6. gribodemon

    gribodemon New Member

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

    [​IMG]

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

    gribodemon New Member

    Публикаций:
    0
    Сейчас посмотрел - сначала происходит ошибка на 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
    unlocker

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

    gribodemon New Member

    Публикаций:
    0
    Эта? 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
    http://myunlocker.ru/faq/
    там же есть скриншот со списком программ, которые заняли фаел

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

    gribodemon New Member

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

    wasm_test wasm test user

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

    gribodemon New Member

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

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

    wasm_test wasm test user

    Публикаций:
    0
    http://windowsxp.mvps.org/processlock.htm
    use the f google
     
  15. gribodemon

    gribodemon New Member

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

    gribodemon New Member

    Публикаций:
    0
    А вот OH.exe из Windows Resource Kits явно жжот:

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

    wasm_test wasm test user

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

    gribodemon New Member

    Публикаций:
    0
    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
    * cstrings.exe == program.exe

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

    gribodemon New Member

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