Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > скрытие файлов


Автор: Вознесенец 3.10.2005, 01:31
Проблема такая: нужно скрыть файл, чтоб он не отображался в браузере. Причем файл не только тот, который сам создаёшь, а любой на диске. Нельзя через аттрибуты, н-р, FileAttributes.Hidden,
т.к. когда в свойствах папки выставлено "отбражать скрытые и ситеммные файлы", он всё-равно виден. MSDN перерыл, нужной функции не нашел.
smile

Автор: _hunter 3.10.2005, 10:30
а ее и нету...
тут хук на findfirst, etc... ставить нужно...

Автор: Вознесенец 5.10.2005, 12:40
Есть идея спрятать его через NTFS права доступа, в винде в настройках ставится глочка запретить просмотр. Вот только как это сделать?.....

Автор: _hunter 5.10.2005, 12:53
http://forum.vingrad.ru/index.php?showtopic=18464

Автор: Вознесенец 5.10.2005, 13:55
сенкс!!!
а хук на FindFirstFile или FindNextFile каким макаром можно поставить?

Автор: Вознесенец 6.10.2005, 17:19
Вот пытался реализовать через NTFS-права доступа.
Код

    SID_IDENTIFIER_AUTHORITY sia;
    PSID ps;
    PACL pOldAcl, pNewAcl ;
    char* filename="D:\\I HERE.txt";

    if(AllocateAndInitializeSid(&sia,2,SECURITY_BUILTIN_DOMAIN_RID,
   DOMAIN_ALIAS_RID_POWER_USERS,0,0,0,0,0,0,&ps)==0)
        MessageBox("Не удалось выделить память и инициальзировать SID",":(",MB_OK);

    PSECURITY_DESCRIPTOR pSD;
    if(GetNamedSecurityInfo(filename,SE_FILE_OBJECT,DACL_SECURITY_INFORMATION,
                        NULL,NULL,&pOldAcl,NULL,&pSD)!=ERROR_SUCCESS)
        MessageBox("Не удалось получить копию дескриптора безопасности",":(",MB_OK);
    LocalFree(pSD);
    
    EXPLICIT_ACCESS ea;
    
    ea.grfAccessMode=DENY_ACCESS;
    ea.grfAccessPermissions=GENERIC_ALL;
    ea.grfInheritance=INHERIT_ONLY_ACE;
    ea.Trustee.MultipleTrusteeOperation=NO_MULTIPLE_TRUSTEE;
    ea.Trustee.pMultipleTrustee=NULL;
    ea.Trustee.TrusteeForm=TRUSTEE_IS_SID;
    ea.Trustee.TrusteeType=TRUSTEE_IS_UNKNOWN;
    ea.Trustee.ptstrName=(char*)ps;

    if(SetEntriesInAcl(1,&ea,pOldAcl,&pNewAcl)!=ERROR_SUCCESS)
    {
        DWORD dw=GetLastError();      //ошибка - малый размер буффера !!!
        MessageBox("Не удалось создать новый список прав доступа (ACL)",":(",MB_OK);
        exit(0);
    }

    if(SetNamedSecurityInfo(filename,SE_FILE_OBJECT,DACL_SECURITY_INFORMATION,
        NULL,NULL,pNewAcl,NULL)!=ERROR_SUCCESS)
        MessageBox("Скрыть не получилось",":(",MB_ICONERROR|MB_OK);

Функция SetEntriesInAcl не изменяет значения pNewAcl, ошибка - малый размер буффера !!! Дальше прога просто вылетает smile Может неправильно заполняю структуру EXPLICIT_ACCESS ea ?
smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)