Помогите найти ошибку в коде

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

  1. coocky

    coocky New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2007
    Сообщения:
    195
    Код (Text):
    1. case FileBothDirectoryInformation :
    2.                 FileBothDirectoryInfo = NULL;
    3.                 do
    4.                 {
    5.                     LastFileBothDirectoryInfo = FileBothDirectoryInfo;
    6.                     FileBothDirectoryInfo = (PVOID)((ULONG)FileInformation + Offset);
    7.                     if (FileBothDirectoryInfo->FileNameLength > 1 && FileBothDirectoryInfo->FileName[0] == 0x5F00)
    8.                     {
    9.                         if (!FileBothDirectoryInfo->NextEntryOffset)
    10.                         {
    11.                             if (LastFileBothDirectoryInfo) LastFileBothDirectoryInfo->NextEntryOffset = 0;
    12.                             else status = STATUS_NO_SUCH_FILE;
    13.                             return status;
    14.                         } else
    15.                         if (LastFileBothDirectoryInfo) LastFileBothDirectoryInfo->NextEntryOffset += FileBothDirectoryInfo->NextEntryOffset;
    16.                     }
    17.  
    18.                     Offset += FileBothDirectoryInfo->NextEntryOffset;
    19.  
    20.                 } while (FileBothDirectoryInfo->NextEntryOffset);
    21.             break;
    Вот код Ms_Rem который скрывает все файлы начинающиеся на "_"
    Однако есть такой казус.Все вроде хорошо работает,пока мы не доходим до последнего файла в списке, т.е когда
    FileBothDirectoryInfo->NextEntryOffset=0;
    Мы попадаем в блок
    Код (Text):
    1. if (!FileBothDirectoryInfo->NextEntryOffset)
    2.                         {
    3.                             if (LastFileBothDirectoryInfo) LastFileBothDirectoryInfo->NextEntryOffset = 0;
    4.                             else status = STATUS_NO_SUCH_FILE;
    5.                             return status;
    6.                         }
    А оттуда в if (LastFileBothDirectoryInfo) LastFileBothDirectoryInfo->NextEntryOffset = 0;
    и выходим со статусом OK.
    В итоге файл видно...
    :dntknw:((
     
  2. coocky

    coocky New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2007
    Сообщения:
    195
    Забыл добавить.Это происходит тогда,когда файл,который следовал перед файлом последним,тоже попадал в категорию скрытия.
    Т.е если цепочка такова _111.txt->222.txt->_333.txt все работает,
    а вот такой вариант не прячет последний файл
    222.txt->_111.txt->_333.txt
     
  3. Klayd

    Klayd Степан

    Публикаций:
    0
    Регистрация:
    7 апр 2006
    Сообщения:
    59
    Адрес:
    Киев
    Когдато писал такое, вот вроде правильный код
    Код (Text):
    1.            
    2.             case FileBothDirectoryInformation :
    3.             {
    4.                 FileBothDirectoryInfo = (PFILE_BOTH_DIRECTORY_INFORMATION)FileInformation;
    5.                 while(IsFileHidden(FileBothDirectoryInfo->FileName, FileBothDirectoryInfo->FileNameLength))
    6.                 {
    7.                     if(FileBothDirectoryInfo->NextEntryOffset != 0)
    8.                     {
    9.                         if(((PFILE_BOTH_DIRECTORY_INFORMATION)((ULONG)FileBothDirectoryInfo + FileBothDirectoryInfo->NextEntryOffset))->NextEntryOffset != 0)
    10.                             ((PFILE_BOTH_DIRECTORY_INFORMATION)((ULONG)FileBothDirectoryInfo + FileBothDirectoryInfo->NextEntryOffset))->NextEntryOffset += FileBothDirectoryInfo->NextEntryOffset;
    11.                         RtlCopyMemory(FileBothDirectoryInfo,
    12.                                      (PVOID)((ULONG)FileBothDirectoryInfo + FileBothDirectoryInfo->NextEntryOffset),
    13.                                      sizeof(FILE_BOTH_DIRECTORY_INFORMATION) + ((PFILE_BOTH_DIRECTORY_INFORMATION)((ULONG)FileBothDirectoryInfo + FileBothDirectoryInfo->NextEntryOffset))->FileNameLength - 2);
    14.                     }
    15.                     else
    16.                         return STATUS_NO_MORE_FILES;
    17.                 }
    18.                 while(FileBothDirectoryInfo->NextEntryOffset > 0)
    19.                 {
    20.                     if(!WasHidden)
    21.                         LastFileBothDirectoryInfo = FileBothDirectoryInfo;
    22.                     WasHidden = FALSE;
    23.                     FileBothDirectoryInfo = (PFILE_BOTH_DIRECTORY_INFORMATION)((ULONG)FileBothDirectoryInfo + FileBothDirectoryInfo->NextEntryOffset);
    24.                     if(IsFileHidden(FileBothDirectoryInfo->FileName, FileBothDirectoryInfo->FileNameLength))
    25.                     {
    26.                         if(FileBothDirectoryInfo->NextEntryOffset > 0)
    27.                         {
    28.                             LastFileBothDirectoryInfo->NextEntryOffset += FileBothDirectoryInfo->NextEntryOffset;
    29.                             WasHidden = TRUE;
    30.                         }
    31.                         else
    32.                             LastFileBothDirectoryInfo->NextEntryOffset = 0;
    33.                     }
    34.                 }
    35.                 break;
    36.             }
    зы: исправил
     
  4. coocky

    coocky New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2007
    Сообщения:
    195
    Klayd сорри,не работает :)
    Вот ситуация.Создаю в пустом каталоге три папки temp1 temp2 temp3 Все они должны быть скрыты.
    смотрю отладчиком. И так проходим ".", затем ".."-условие if(IsFileHidden) нигде не выполняется ,все ОК ,потом попадаем на папку temp1-по алфавиту.NextEntryOffset>0 ,значит присваиваем
    Код (Text):
    1. LastFileBothDirectoryInfo->NextEntryOffset = LastFileBothDirectoryInfo->NextEntryOffset + FileBothDirectoryInfo->NextEntryOffset;
    Теперь папка temp2. Все таким же макаром.
    Последняя папка temp3. NextEntryOffset==0.
    Делаем
    Код (Text):
    1. LastFileBothDirectoryInfo->NextEntryOffset = 0;
    В итоге прчется только temp3 и temp1. :)
    Блин.Что ж такое? :)
    Если б знал,как работает, сам бы постарался написать :)
     
  5. EvilPhreak

    EvilPhreak New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2007
    Сообщения:
    154
    coocky
    Ищи по форуму - такой вопрос про скрытие появлялся и был даже рабочий код.
     
  6. coocky

    coocky New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2007
    Сообщения:
    195
    Я знаю, искал :)
    Вот нашел РАБОЧИЙ код-привел его выше :)