скрытие файлов NtQueryDirectoryFile в Висте

Тема в разделе "WASM.WIN32", создана пользователем Igi, 28 окт 2007.

  1. Igi

    Igi New Member

    Публикаций:
    0
    Регистрация:
    7 дек 2005
    Сообщения:
    35
    Здравствуйте! Код прекрасно работал в 2k/XP/2k3, но в висте почему-то не скрывает.

    Код (Text):
    1. static
    2. void GetFileName(
    3.         IN  PVOID Information,
    4.         IN  FILE_INFORMATION_CLASS FileInformationClass,
    5.         OUT PWCHAR *FileName,
    6.         OUT ULONG  *NameLength
    7.         )
    8. {
    9.     PFILE_DIRECTORY_INFORMATION      FileDirectoryInfo = (PFILE_DIRECTORY_INFORMATION)Information;
    10.     PFILE_FULL_DIRECTORY_INFORMATION FileFullDirectoryInfo = (PFILE_FULL_DIRECTORY_INFORMATION)Information;
    11.     PFILE_BOTH_DIRECTORY_INFORMATION FileBothDirectoryInfo = (PFILE_BOTH_DIRECTORY_INFORMATION)Information;
    12.     PFILE_NAMES_INFORMATION          FileNamesInfo = (PFILE_NAMES_INFORMATION)Information;
    13.  
    14.  
    15.     switch (FileInformationClass)
    16.     {
    17.         case FileDirectoryInformation :
    18.            *NameLength = FileDirectoryInfo->FileNameLength >> 1;
    19.            *FileName = FileDirectoryInfo->FileName;
    20.         break;
    21.  
    22.         case FileFullDirectoryInformation :
    23.             *NameLength = FileFullDirectoryInfo->FileNameLength >> 1;
    24.             *FileName = FileFullDirectoryInfo->FileName;
    25.         break;
    26.  
    27.         case FileBothDirectoryInformation :
    28.             *NameLength = FileBothDirectoryInfo->FileNameLength >> 1;
    29.             *FileName = FileBothDirectoryInfo->FileName;
    30.         break;
    31.  
    32.         case FileNamesInformation :
    33.             *NameLength = FileNamesInfo->FileNameLength >> 1;
    34.             *FileName = FileNamesInfo->FileName;
    35.         break;
    36.     }
    37. }
    38.  
    39. NTSTATUS NewNtQueryDirectoryFile(
    40.     IN HANDLE FileHandle,
    41.     IN HANDLE Event OPTIONAL,
    42.     IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
    43.     IN PVOID ApcContext OPTIONAL,
    44.     OUT PIO_STATUS_BLOCK IoStatusBlock,
    45.     OUT PVOID FileInformation,
    46.     IN ULONG FileInformationLength,
    47.     IN FILE_INFORMATION_CLASS FileInformationClass,
    48.     IN BOOLEAN ReturnSingleEntry,
    49.     IN PUNICODE_STRING FileName OPTIONAL,
    50.     IN BOOLEAN RestartScan)
    51. {
    52.     NTSTATUS status = TrueNtQueryDirectoryFile(FileHandle, Event, ApcRoutine, ApcContext, IoStatusBlock, FileInformation, FileInformationLength, FileInformationClass, ReturnSingleEntry, FileName, RestartScan);
    53.    
    54.     if (NT_SUCCESS(status))
    55.     {
    56.         PFILE_DIRECTORY_INFORMATION FileDirectoryInfo, LastFileDirectoryInfo;
    57.         ULONG  Offset = 0;
    58.         ULONG  NameLength;
    59.         PWCHAR FileName;
    60.  
    61.         if (ReturnSingleEntry)
    62.         {              
    63.             while (NT_SUCCESS(status))
    64.             {
    65.                 GetFileName(FileInformation, FileInformationClass, &FileName, &NameLength);
    66.                 if (!IsAddedFilesList(HiddenFiles, FileName, NameLength))
    67.                     break;
    68.                 DPRINT("Hiding file: %ws", FileName);
    69.                 if (RestartScan) return STATUS_NO_MORE_FILES;
    70.                 status = TrueNtQueryDirectoryFile(FileHandle, NULL, NULL, NULL, IoStatusBlock, FileInformation, FileInformationLength, FileInformationClass, TRUE, NULL, FALSE);
    71.             }
    72.         } else     
    73.         do
    74.         {
    75.             FileDirectoryInfo = (PFILE_DIRECTORY_INFORMATION)((ULONG)FileInformation + Offset);
    76.             Offset += FileDirectoryInfo->NextEntryOffset;
    77.             GetFileName(FileDirectoryInfo, FileInformationClass, &FileName, &NameLength);
    78.             if (IsAddedFilesList(HiddenFiles, FileName, NameLength))
    79.             {
    80.                 DPRINT("Hiding file: %ws", FileName);
    81.                 if (!FileDirectoryInfo->NextEntryOffset)
    82.                 {
    83.                     if (LastFileDirectoryInfo)
    84.                     {
    85.                         LastFileDirectoryInfo->NextEntryOffset = 0;
    86.                     } else status = STATUS_NO_MORE_FILES;
    87.                     break;
    88.                 } else
    89.                 {
    90.                     if (LastFileDirectoryInfo)
    91.                     {
    92.                         LastFileDirectoryInfo->NextEntryOffset += FileDirectoryInfo->NextEntryOffset;                      
    93.                     }
    94.                 }
    95.             } else LastFileDirectoryInfo = FileDirectoryInfo;          
    96.         } while (FileDirectoryInfo->NextEntryOffset);
    97.     }
    98.     return status;
    99. }
    Смотрю отладочные сообщения - все работает, и нужные файлы отфильтровывает. Почему в Vista этот код не работает?
     
  2. Igi

    Igi New Member

    Публикаций:
    0
    Регистрация:
    7 дек 2005
    Сообщения:
    35
    Да, только что проверил. Программы под вистой, например TotalCommander скрытые таким образом файлы не видит. Но через проводник файлы видны. Каким образом провордник в висте определяет список файлов в папке?
     
  3. ECk

    ECk Member

    Публикаций:
    0
    Регистрация:
    9 апр 2004
    Сообщения:
    454
    Адрес:
    Russia
    Ты не все классы обрабатываешь - есть же еще FILE_ID_BOTH_DIRECTORY_INFORMATION и FILE_ID_FULL_DIRECTORY_INFORMATION - там тоже есть имена файлов, поэтому если их не контролировать, будет видно.
     
  4. Igi

    Igi New Member

    Публикаций:
    0
    Регистрация:
    7 дек 2005
    Сообщения:
    35
    Спасибо! Теперь все работает!
    P.S. а как загрузить драйвер в Vista 64-bit?

    Не получается ни в режиме отладки, ни в режиме загрузки неподписанных драйверов...
     
  5. PROFi

    PROFi New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2003
    Сообщения:
    690
    Igi

    P.S. а как загрузить драйвер в Vista 64-bit?
    F8 при загрузке
     
  6. discens

    discens New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2008
    Сообщения:
    13
    Хм. Странно, я добавил. У меня файл, то появляется то исчезает... у кого-то похожее бывало? Пробовал на Вин7.