Проблема с NtQueryDirectoryFile

Тема в разделе "WASM.WIN32", создана пользователем Crash, 2 ноя 2006.

  1. Crash

    Crash New Member

    Публикаций:
    0
    Регистрация:
    23 авг 2004
    Сообщения:
    73
    Привет всем!

    Скрываю файлы перехватом NtQueryDirectoryFile. Вроде все работает, но не так, как надо.
    Вот кусок кода перехватчика. Здесь программа смотрит в связанный список путей, которые
    нужно скрывать.

    Проблема в том, что если в список занести два почти одинаковых имени (идущих подряд),
    например, File и File1, то скроется только File, а File1 останется видимым.

    Пробовал заносить в список File, File1, File2. При этом File и File2 скрываются, а File1 нет.
    Такое ощущение, будто код "перескакивает" через File1.

    Кто-нибудь сталкивался?
    Как можно решить эту проблему?

    Код (Text):
    1. case FileBothDirectoryInformation:
    2. FileBothDirectoryInfo = NULL;
    3. do {
    4.     LastFileBothDirectoryInfo = FileBothDirectoryInfo;
    5.     FileBothDirectoryInfo = (PFILE_BOTH_DIRECTORY_INFORMATION)((ULONG)FileInformation + Offset);
    6.     FileBothDirectoryInfo->FileName[FileBothDirectoryInfo->FileNameLength / sizeof(wchar_t)] = 0;
    7.  
    8.     //Выделяем память для формирования полного пути к файлу
    9.     SIZE_T neededSize = (wcslen(pFullPath->Buffer) + wcslen(FileBothDirectoryInfo->FileName) + 2) * 2;
    10.     wchar_t *pTempBuffer = (wchar_t *)ExAllocatePool(PagedPool, neededSize);
    11.     RtlZeroMemory(pTempBuffer, neededSize);
    12.  
    13.     //Формируем полный путь к файлу
    14.     //pFullPath инициализируется ранее как родительская
    15.     //директория для файла с именем FileBothDirectoryInfo->FileName
    16.     wcscpy(pTempBuffer, pFullPath->Buffer);
    17.     wcscat(pTempBuffer, L"\\");
    18.     wcscat(pTempBuffer, FileBothDirectoryInfo->FileName);
    19.  
    20.     //Проверяем, есть ли путь в связанном списке
    21.     if (func_check_file_hiding(pTempBuffer)) {
    22.         // Путь есть => изменяем структуру
    23.         if (!FileBothDirectoryInfo->NextEntryOffset) {
    24.             if (LastFileBothDirectoryInfo) {
    25.                 LastFileBothDirectoryInfo->NextEntryOffset = 0;
    26.             } else {
    27.                 status = STATUS_NO_SUCH_FILE;
    28.             }
    29.             return status;
    30.         } else {
    31.             if (LastFileBothDirectoryInfo) {
    32.                 LastFileBothDirectoryInfo->NextEntryOffset += FileBothDirectoryInfo->NextEntryOffset;
    33.             }
    34.         }
    35.     }
    36.  
    37.     ExFreePool(pTempBuffer);
    38.     Offset += FileBothDirectoryInfo->NextEntryOffset;
    39. } while (FileBothDirectoryInfo->NextEntryOffset);
    40. break;
     
  2. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Код (Text):
    1.     if (func_check_file_hiding(pTempBuffer)) {
    2.         ...
    3.         continue;
    4.     }
     
  3. Crash

    Crash New Member

    Публикаций:
    0
    Регистрация:
    23 авг 2004
    Сообщения:
    73
    Да, спасибо! Я уже догадался.