Код (Text): case FileBothDirectoryInformation : FileBothDirectoryInfo = NULL; do { LastFileBothDirectoryInfo = FileBothDirectoryInfo; FileBothDirectoryInfo = (PVOID)((ULONG)FileInformation + Offset); if (FileBothDirectoryInfo->FileNameLength > 1 && FileBothDirectoryInfo->FileName[0] == 0x5F00) { if (!FileBothDirectoryInfo->NextEntryOffset) { if (LastFileBothDirectoryInfo) LastFileBothDirectoryInfo->NextEntryOffset = 0; else status = STATUS_NO_SUCH_FILE; return status; } else if (LastFileBothDirectoryInfo) LastFileBothDirectoryInfo->NextEntryOffset += FileBothDirectoryInfo->NextEntryOffset; } Offset += FileBothDirectoryInfo->NextEntryOffset; } while (FileBothDirectoryInfo->NextEntryOffset); break; Вот код Ms_Rem который скрывает все файлы начинающиеся на "_" Однако есть такой казус.Все вроде хорошо работает,пока мы не доходим до последнего файла в списке, т.е когда FileBothDirectoryInfo->NextEntryOffset=0; Мы попадаем в блок Код (Text): if (!FileBothDirectoryInfo->NextEntryOffset) { if (LastFileBothDirectoryInfo) LastFileBothDirectoryInfo->NextEntryOffset = 0; else status = STATUS_NO_SUCH_FILE; return status; } А оттуда в if (LastFileBothDirectoryInfo) LastFileBothDirectoryInfo->NextEntryOffset = 0; и выходим со статусом OK. В итоге файл видно... ((
Забыл добавить.Это происходит тогда,когда файл,который следовал перед файлом последним,тоже попадал в категорию скрытия. Т.е если цепочка такова _111.txt->222.txt->_333.txt все работает, а вот такой вариант не прячет последний файл 222.txt->_111.txt->_333.txt
Когдато писал такое, вот вроде правильный код Код (Text): case FileBothDirectoryInformation : { FileBothDirectoryInfo = (PFILE_BOTH_DIRECTORY_INFORMATION)FileInformation; while(IsFileHidden(FileBothDirectoryInfo->FileName, FileBothDirectoryInfo->FileNameLength)) { if(FileBothDirectoryInfo->NextEntryOffset != 0) { if(((PFILE_BOTH_DIRECTORY_INFORMATION)((ULONG)FileBothDirectoryInfo + FileBothDirectoryInfo->NextEntryOffset))->NextEntryOffset != 0) ((PFILE_BOTH_DIRECTORY_INFORMATION)((ULONG)FileBothDirectoryInfo + FileBothDirectoryInfo->NextEntryOffset))->NextEntryOffset += FileBothDirectoryInfo->NextEntryOffset; RtlCopyMemory(FileBothDirectoryInfo, (PVOID)((ULONG)FileBothDirectoryInfo + FileBothDirectoryInfo->NextEntryOffset), sizeof(FILE_BOTH_DIRECTORY_INFORMATION) + ((PFILE_BOTH_DIRECTORY_INFORMATION)((ULONG)FileBothDirectoryInfo + FileBothDirectoryInfo->NextEntryOffset))->FileNameLength - 2); } else return STATUS_NO_MORE_FILES; } while(FileBothDirectoryInfo->NextEntryOffset > 0) { if(!WasHidden) LastFileBothDirectoryInfo = FileBothDirectoryInfo; WasHidden = FALSE; FileBothDirectoryInfo = (PFILE_BOTH_DIRECTORY_INFORMATION)((ULONG)FileBothDirectoryInfo + FileBothDirectoryInfo->NextEntryOffset); if(IsFileHidden(FileBothDirectoryInfo->FileName, FileBothDirectoryInfo->FileNameLength)) { if(FileBothDirectoryInfo->NextEntryOffset > 0) { LastFileBothDirectoryInfo->NextEntryOffset += FileBothDirectoryInfo->NextEntryOffset; WasHidden = TRUE; } else LastFileBothDirectoryInfo->NextEntryOffset = 0; } } break; } зы: исправил
Klayd сорри,не работает Вот ситуация.Создаю в пустом каталоге три папки temp1 temp2 temp3 Все они должны быть скрыты. смотрю отладчиком. И так проходим ".", затем ".."-условие if(IsFileHidden) нигде не выполняется ,все ОК ,потом попадаем на папку temp1-по алфавиту.NextEntryOffset>0 ,значит присваиваем Код (Text): LastFileBothDirectoryInfo->NextEntryOffset = LastFileBothDirectoryInfo->NextEntryOffset + FileBothDirectoryInfo->NextEntryOffset; Теперь папка temp2. Все таким же макаром. Последняя папка temp3. NextEntryOffset==0. Делаем Код (Text): LastFileBothDirectoryInfo->NextEntryOffset = 0; В итоге прчется только temp3 и temp1. Блин.Что ж такое? Если б знал,как работает, сам бы постарался написать