Не могу удалить "портфель"

Тема в разделе "WASM.WIN32", создана пользователем coocky, 11 сен 2008.

  1. coocky

    coocky New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2007
    Сообщения:
    195
    Привет.Есть тут у меня функция рекурсивного удаления папки с файлами
    Все хорошо работает,но только не с портфелем,который находится внутри папки
    При попытки удалить возвращает статус ошибки STATUS_CANNOT_DELETE
    вот код фунции,для удаления имено папки
    Код (Text):
    1. BOOLEAN RemoveDirectoryW (LPCWSTR lpPathName)
    2. {
    3.     FILE_DISPOSITION_INFORMATION FileDispInfo;
    4.     OBJECT_ATTRIBUTES ObjectAttributes;
    5.     IO_STATUS_BLOCK IoStatusBlock;
    6.     UNICODE_STRING NtPathU;
    7.     HANDLE DirectoryHandle;
    8.     NTSTATUS Status;
    9.  
    10.  
    11.  
    12.     if (!RtlDosPathNameToNtPathName_U (lpPathName,
    13.         &NtPathU,
    14.         NULL,
    15.         NULL))
    16.         return FALSE;
    17.  
    18.     ObjectAttributes.Length = sizeof(OBJECT_ATTRIBUTES);
    19.     ObjectAttributes.RootDirectory = NULL;
    20.     ObjectAttributes.ObjectName = &NtPathU;
    21.     ObjectAttributes.Attributes = OBJ_CASE_INSENSITIVE| OBJ_INHERIT;
    22.     ObjectAttributes.SecurityDescriptor = NULL;
    23.     ObjectAttributes.SecurityQualityOfService = NULL;
    24.  
    25.  
    26.     Status = ZwCreateFile (&DirectoryHandle,
    27.         FILE_READ_ATTRIBUTES|DELETE|SYNCHRONIZE,  
    28.         &ObjectAttributes,
    29.         &IoStatusBlock,
    30.         NULL,
    31.         0,
    32.         FILE_SHARE_DELETE|FILE_SHARE_READ|FILE_SHARE_WRITE,
    33.         FILE_OPEN,
    34.         FILE_DIRECTORY_FILE|FILE_SYNCHRONOUS_IO_NONALERT|FILE_OPEN_REPARSE_POINT,
    35.         NULL,
    36.         0);
    37.  
    38.     RtlGetProcessHeaps(1,heaps_array);
    39.     RtlFreeHeap (heaps_array[0],0,
    40.         NtPathU.Buffer);
    41.  
    42.     if (!NT_SUCCESS(Status))
    43.     {
    44.         //CHECKPOINT;
    45.         RtlSetLastWin32ErrorAndNtStatusFromNtStatus (Status);
    46.         return FALSE;
    47.     }
    48.  
    49.     FileDispInfo.DeleteFile = TRUE;
    50.  
    51.     Status = ZwSetInformationFile (DirectoryHandle,
    52.         &IoStatusBlock,
    53.         &FileDispInfo,
    54.         sizeof(FILE_DISPOSITION_INFORMATION),
    55.         FileDispositionInformation);
    56.  
    57.     if (!NT_SUCCESS(Status))
    58.     {
    59.        
    60.         ZwClose(DirectoryHandle);
    61.         RtlSetLastWin32ErrorAndNtStatusFromNtStatus (Status);
    62.         return FALSE;
    63.     }
    64.  
    65.     Status = ZwClose (DirectoryHandle);
    66.     if (!NT_SUCCESS(Status))
    67.     {
    68.        
    69.         RtlSetLastWin32ErrorAndNtStatusFromNtStatus (Status);
    70.         return FALSE;
    71.     }
    72.  
    73.     return TRUE;
    74. }
    75.  
    76. }
    Не кто не подскажет-в чем трабла может быть? Ведь остальные папки отлично удаляются.
     
  2. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    Дык портфель вроде не папка, а shell extension object.
     
  3. coocky

    coocky New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2007
    Сообщения:
    195
    А с точки зрения файловой системы?
     
  4. DEEP

    DEEP Андрей

    Публикаций:
    0
    Регистрация:
    27 апр 2008
    Сообщения:
    491
    Адрес:
    г. Владимир
    Если не изменяет мне память - с позиций ФС "портфель" подобен папке "Control Panel" и ей подобным. Т.е. директория сия - чисто логическая.
    Могу ошибаться. Гляньте содержимое папки содержащей Портфель из-под Нортона или ему подобного ФМ.

    Хм. нет, видимо это обычная папка, только с некоей виндовой надстройкой над ней, запрещающей её удалять.
    Щас перезагружусь из-под DOS, попробую удалить оттуда...

    ЗЫ. по моему перспективное направление вирусописания - прописать себя Портфелем %)
     
  5. coocky

    coocky New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2007
    Сообщения:
    195
    Вообщем-то любой файловый менеджер легко удаляет портфель...
    Подсмотрел через FileSpy за Far_ом ..Он имено на портфеле,перед удаление устанавливает атрибуты FILE_NORMAL_ATTRIBUTE

    Я тоже так могу вручную..Все работает.Но как дойти до этого? Не буду же я проверять,что это "портфель" :)
     
  6. DEEP

    DEEP Андрей

    Публикаций:
    0
    Регистрация:
    27 апр 2008
    Сообщения:
    491
    Адрес:
    г. Владимир
    Видимо, тупо снимать со всего удаляемого бит FILE_ATTRIBUTE_READONLY. В общем-то, логично =)
     
  7. apple

    apple Виктор

    Публикаций:
    0
    Регистрация:
    26 апр 2005
    Сообщения:
    907
    Адрес:
    Russia
    1. папка с расширением {85BBD920-42A0-1069-A2E4-08002B30309D}
    В ней
    2.1. файл desktop.ini
    Код (Text):
    1. [.ShellClassInfo]
    2. CLSID={85BBD920-42A0-1069-A2E4-08002B30309D}
    3. ConfirmFileOp=0
    2.2. файл базы данных Briefcase Database
     
  8. apple

    apple Виктор

    Публикаций:
    0
    Регистрация:
    26 апр 2005
    Сообщения:
    907
    Адрес:
    Russia
    Код (Text):
    1. Журнал.{FF393560-C2A7-11CF-BFF4-444553540000}
    2. Интернет.{FBF23B42-E3F0-101B-8488-00AA003E56F8}
    3. Корзина.{645FF040-5081-101B-9F08-00AA002F954E}
    4. Мои документы.{450D8FBA-AD25-11D0-98A8-0800361B1103}
    5. Мой компьютер.{20D04FE0-3AEA-1069-A2D8-08002B30309D}
    6. Назначенные задания.{D6277990-4C6A-11CF-8D87-00AA0060F5BF}
    7. Панель управления.{21EC2020-3AEA-1069-A2DD-08002B30309D}
    8. Папка кэша ActiveX.{88C6C381-2E85-11D0-94DE-444553540000}
    9. Папка подписки.{F5175861-2688-11D0-9C5E-00AA00A45957}
    10. Портфель.{85BBD920-42A0-1069-A2E4-08002B30309D}
    11. Принтеры.{2227A280-3AEA-1069-A2DE-08002B30309D}
    12. Рабочий стол.{00021400-0000-0000-C000-000000000046}
    13. Сетевое окружение.{208D2C60-3AEA-1069-A2D7-08002B30309D}
    14. Удаленный доступ к сети.{992CFFA0-F557-101A-88EC-00DD010CCC48}
    15. Шрифты.{BD84B380-8CA2-1069-AB1D-08000948F534}
    16. The Microsoft Network.{00028B00-0000-0000-C000-000000000046}