Доброго времени суток! Столкнулся с 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). В чём же может быть проблема? Пожалуйста, посоветуйте какие-нибудь программы для диагностики таких ситуаций.
x64 Так написано же: http://undocumented.ntinternals.net...d Functions/NT Objects/File/NtDeleteFile.html Т.е. если кто-то открыл (CreateFile) файл без FILE_SHARE_DELETE, то ошибки STATUS_SHARING_VIOLATION не будет при удалении.
Сейчас создал тестовый файл - потестить. Code (Text): HANDLE hFile = CreateFile("C:\\test.txt", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); // Deleting file WCHAR szPathDeleteFile[MAX_PATH] = {L"\\??\\c:\\test.txt"}; UNICODE_STRING usFilePath; usFilePath.Buffer = szPathDeleteFile; usFilePath.Length = (USHORT)wcslen(szPathDeleteFile) * sizeof WCHAR; usFilePath.MaximumLength = usFilePath.Length + 1 * sizeof WCHAR; OBJECT_ATTRIBUTES ObjectAttributes; InitializeObjectAttributes(&ObjectAttributes, &usFilePath, OBJ_CASE_INSENSITIVE, 0, NULL); NTSTATUS ntstat = (NTSTATUS)XNtDeleteFile(&ObjectAttributes); Ошибко: 0xC0000043. Так что, от ERROR_SHARING_VIOLATION оно не спасает. Однако, вопрос насчёт DELETE_PENDING остаётся открытым.
gribodemon Конечно не спасает. Относитесь к таким документациям с долей сомнения. Эта функция появилась в XP по одной простой причине - чтобы не открывать файл, удалять его и закрывать вызывать всего одну функцию удаления.
Great Хм. Разве в XP? Сейчас смотрю ntdll.dll в w2ksp3. Она там есть: По поводу DELETE_PENDING. Хочу отметить, что тестировал на w2k, однако, бага замечено не было.
Сейчас посмотрел - сначала происходит ошибка на kernel32!CreateFile() 0x00000032 (ERROR_SHARING_VIOLATION), а затем уже NtDeleFile возвращает STATUS_PENDING. Т.е. возможно, сначала нужно решить проблему с ERROR_SHARING_VIOLATION. С файлом работаю только я. И открываю я файл примерно так: Code (Text): 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.
Эта? http://download.cnet.com/Unlocker/3000-2248_4-10493998.html Что-то не пойму как с помощью неё можно что-то диагностировать. Вижу есть интерфейс для Move || Delete File, однако как с помощью неё получить список программ использующих опред. файл - хз. =) Сайт программы явно жжот: http://ccollomb.free.fr/unlocker HTTP ERROR 403 README размером в 1.5KB жжот ещё больше. Точно эта программа?
http://myunlocker.ru/faq/ там же есть скриншот со списком программ, которые заняли фаел UPD: Но вообще сайт про ту же самую программу. Просто там есть инфа о ней на русском.
Great Да хз. Сейчас попытался его вызвать на *.ncb файле, который невозможно читать (ибо открыт в MS VS Studio) - вызываю Unlocker для него и он пишет: No Locking Handle Found. Что-то какая-то нестабильная программа совсем. =(
Great Качал последнюю версию unlocker1.8.8 и unlocker1.8.7. Странно это всё. А других тулз не имеется?
Great Wow. До этого много раз юзал ProcessExplorer вот уж не думал, что под пунктом меню "Find Handle Or DLL" скрывается поиск хэндлов на опред. файл, заданный через имя. Respect.
Это так называемый NtGlobalFlag. Чтобы изменять некоторые параметры в нем нужен ребут, как я помню. Это всегда в винде было
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!
Возможно, это как-то связано с тем, что у меня стоит TrueCrypt и я выполняю операции на закриптованном логическом диске? Может, драйвер TrueCrypt глючит?