Здравствуйте! Код прекрасно работал в 2k/XP/2k3, но в висте почему-то не скрывает. Код (Text): static void GetFileName( IN PVOID Information, IN FILE_INFORMATION_CLASS FileInformationClass, OUT PWCHAR *FileName, OUT ULONG *NameLength ) { PFILE_DIRECTORY_INFORMATION FileDirectoryInfo = (PFILE_DIRECTORY_INFORMATION)Information; PFILE_FULL_DIRECTORY_INFORMATION FileFullDirectoryInfo = (PFILE_FULL_DIRECTORY_INFORMATION)Information; PFILE_BOTH_DIRECTORY_INFORMATION FileBothDirectoryInfo = (PFILE_BOTH_DIRECTORY_INFORMATION)Information; PFILE_NAMES_INFORMATION FileNamesInfo = (PFILE_NAMES_INFORMATION)Information; switch (FileInformationClass) { case FileDirectoryInformation : *NameLength = FileDirectoryInfo->FileNameLength >> 1; *FileName = FileDirectoryInfo->FileName; break; case FileFullDirectoryInformation : *NameLength = FileFullDirectoryInfo->FileNameLength >> 1; *FileName = FileFullDirectoryInfo->FileName; break; case FileBothDirectoryInformation : *NameLength = FileBothDirectoryInfo->FileNameLength >> 1; *FileName = FileBothDirectoryInfo->FileName; break; case FileNamesInformation : *NameLength = FileNamesInfo->FileNameLength >> 1; *FileName = FileNamesInfo->FileName; break; } } NTSTATUS NewNtQueryDirectoryFile( IN HANDLE FileHandle, IN HANDLE Event OPTIONAL, IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, IN PVOID ApcContext OPTIONAL, OUT PIO_STATUS_BLOCK IoStatusBlock, OUT PVOID FileInformation, IN ULONG FileInformationLength, IN FILE_INFORMATION_CLASS FileInformationClass, IN BOOLEAN ReturnSingleEntry, IN PUNICODE_STRING FileName OPTIONAL, IN BOOLEAN RestartScan) { NTSTATUS status = TrueNtQueryDirectoryFile(FileHandle, Event, ApcRoutine, ApcContext, IoStatusBlock, FileInformation, FileInformationLength, FileInformationClass, ReturnSingleEntry, FileName, RestartScan); if (NT_SUCCESS(status)) { PFILE_DIRECTORY_INFORMATION FileDirectoryInfo, LastFileDirectoryInfo; ULONG Offset = 0; ULONG NameLength; PWCHAR FileName; if (ReturnSingleEntry) { while (NT_SUCCESS(status)) { GetFileName(FileInformation, FileInformationClass, &FileName, &NameLength); if (!IsAddedFilesList(HiddenFiles, FileName, NameLength)) break; DPRINT("Hiding file: %ws", FileName); if (RestartScan) return STATUS_NO_MORE_FILES; status = TrueNtQueryDirectoryFile(FileHandle, NULL, NULL, NULL, IoStatusBlock, FileInformation, FileInformationLength, FileInformationClass, TRUE, NULL, FALSE); } } else do { FileDirectoryInfo = (PFILE_DIRECTORY_INFORMATION)((ULONG)FileInformation + Offset); Offset += FileDirectoryInfo->NextEntryOffset; GetFileName(FileDirectoryInfo, FileInformationClass, &FileName, &NameLength); if (IsAddedFilesList(HiddenFiles, FileName, NameLength)) { DPRINT("Hiding file: %ws", FileName); if (!FileDirectoryInfo->NextEntryOffset) { if (LastFileDirectoryInfo) { LastFileDirectoryInfo->NextEntryOffset = 0; } else status = STATUS_NO_MORE_FILES; break; } else { if (LastFileDirectoryInfo) { LastFileDirectoryInfo->NextEntryOffset += FileDirectoryInfo->NextEntryOffset; } } } else LastFileDirectoryInfo = FileDirectoryInfo; } while (FileDirectoryInfo->NextEntryOffset); } return status; } Смотрю отладочные сообщения - все работает, и нужные файлы отфильтровывает. Почему в Vista этот код не работает?
Да, только что проверил. Программы под вистой, например TotalCommander скрытые таким образом файлы не видит. Но через проводник файлы видны. Каким образом провордник в висте определяет список файлов в папке?
Ты не все классы обрабатываешь - есть же еще FILE_ID_BOTH_DIRECTORY_INFORMATION и FILE_ID_FULL_DIRECTORY_INFORMATION - там тоже есть имена файлов, поэтому если их не контролировать, будет видно.
Спасибо! Теперь все работает! P.S. а как загрузить драйвер в Vista 64-bit? Не получается ни в режиме отладки, ни в режиме загрузки неподписанных драйверов...
Хм. Странно, я добавил. У меня файл, то появляется то исчезает... у кого-то похожее бывало? Пробовал на Вин7.