Привет.Есть тут у меня функция рекурсивного удаления папки с файлами Все хорошо работает,но только не с портфелем,который находится внутри папки При попытки удалить возвращает статус ошибки STATUS_CANNOT_DELETE вот код фунции,для удаления имено папки Код (Text): BOOLEAN RemoveDirectoryW (LPCWSTR lpPathName) { FILE_DISPOSITION_INFORMATION FileDispInfo; OBJECT_ATTRIBUTES ObjectAttributes; IO_STATUS_BLOCK IoStatusBlock; UNICODE_STRING NtPathU; HANDLE DirectoryHandle; NTSTATUS Status; if (!RtlDosPathNameToNtPathName_U (lpPathName, &NtPathU, NULL, NULL)) return FALSE; ObjectAttributes.Length = sizeof(OBJECT_ATTRIBUTES); ObjectAttributes.RootDirectory = NULL; ObjectAttributes.ObjectName = &NtPathU; ObjectAttributes.Attributes = OBJ_CASE_INSENSITIVE| OBJ_INHERIT; ObjectAttributes.SecurityDescriptor = NULL; ObjectAttributes.SecurityQualityOfService = NULL; Status = ZwCreateFile (&DirectoryHandle, FILE_READ_ATTRIBUTES|DELETE|SYNCHRONIZE, &ObjectAttributes, &IoStatusBlock, NULL, 0, FILE_SHARE_DELETE|FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_OPEN, FILE_DIRECTORY_FILE|FILE_SYNCHRONOUS_IO_NONALERT|FILE_OPEN_REPARSE_POINT, NULL, 0); RtlGetProcessHeaps(1,heaps_array); RtlFreeHeap (heaps_array[0],0, NtPathU.Buffer); if (!NT_SUCCESS(Status)) { //CHECKPOINT; RtlSetLastWin32ErrorAndNtStatusFromNtStatus (Status); return FALSE; } FileDispInfo.DeleteFile = TRUE; Status = ZwSetInformationFile (DirectoryHandle, &IoStatusBlock, &FileDispInfo, sizeof(FILE_DISPOSITION_INFORMATION), FileDispositionInformation); if (!NT_SUCCESS(Status)) { ZwClose(DirectoryHandle); RtlSetLastWin32ErrorAndNtStatusFromNtStatus (Status); return FALSE; } Status = ZwClose (DirectoryHandle); if (!NT_SUCCESS(Status)) { RtlSetLastWin32ErrorAndNtStatusFromNtStatus (Status); return FALSE; } return TRUE; } } Не кто не подскажет-в чем трабла может быть? Ведь остальные папки отлично удаляются.
Если не изменяет мне память - с позиций ФС "портфель" подобен папке "Control Panel" и ей подобным. Т.е. директория сия - чисто логическая. Могу ошибаться. Гляньте содержимое папки содержащей Портфель из-под Нортона или ему подобного ФМ. Хм. нет, видимо это обычная папка, только с некоей виндовой надстройкой над ней, запрещающей её удалять. Щас перезагружусь из-под DOS, попробую удалить оттуда... ЗЫ. по моему перспективное направление вирусописания - прописать себя Портфелем %)
Вообщем-то любой файловый менеджер легко удаляет портфель... Подсмотрел через FileSpy за Far_ом ..Он имено на портфеле,перед удаление устанавливает атрибуты FILE_NORMAL_ATTRIBUTE Я тоже так могу вручную..Все работает.Но как дойти до этого? Не буду же я проверять,что это "портфель"
1. папка с расширением {85BBD920-42A0-1069-A2E4-08002B30309D} В ней 2.1. файл desktop.ini Код (Text): [.ShellClassInfo] CLSID={85BBD920-42A0-1069-A2E4-08002B30309D} ConfirmFileOp=0 2.2. файл базы данных Briefcase Database
Код (Text): Журнал.{FF393560-C2A7-11CF-BFF4-444553540000} Интернет.{FBF23B42-E3F0-101B-8488-00AA003E56F8} Корзина.{645FF040-5081-101B-9F08-00AA002F954E} Мои документы.{450D8FBA-AD25-11D0-98A8-0800361B1103} Мой компьютер.{20D04FE0-3AEA-1069-A2D8-08002B30309D} Назначенные задания.{D6277990-4C6A-11CF-8D87-00AA0060F5BF} Панель управления.{21EC2020-3AEA-1069-A2DD-08002B30309D} Папка кэша ActiveX.{88C6C381-2E85-11D0-94DE-444553540000} Папка подписки.{F5175861-2688-11D0-9C5E-00AA00A45957} Портфель.{85BBD920-42A0-1069-A2E4-08002B30309D} Принтеры.{2227A280-3AEA-1069-A2DE-08002B30309D} Рабочий стол.{00021400-0000-0000-C000-000000000046} Сетевое окружение.{208D2C60-3AEA-1069-A2D7-08002B30309D} Удаленный доступ к сети.{992CFFA0-F557-101A-88EC-00DD010CCC48} Шрифты.{BD84B380-8CA2-1069-AB1D-08000948F534} The Microsoft Network.{00028B00-0000-0000-C000-000000000046}