Странность с перехватом ZwQueryDirectoryFile...

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

  1. HALT

    HALT New Member

    Публикаций:
    0
    Регистрация:
    5 май 2005
    Сообщения:
    10
    Здаствуйте! Зарание извиняюсь за C...



    У меня вопрос по перехвату ф-ии ZwQueryDirectoryFile. В драйвере меняю обработчик. В обработчике сначала идет вызов TRUE-ф-ии ZwQueryDirectoryFile, затем некоторые манипуляции с буфером FileInformation (естественно кое-что пытаюсь скрыть :)). Проблема в том что это "что-то" может быть первой структурой в буфере. Почему-то смещение на вторую стуктуру (оно же размер первой) у меня всегда ==0, и соответственно непонятно на стколько делать сдвиг (или как то иначе ее прибивать). С остальными записями все ok.



    Для запроса FILE_BOTH_DIR_INFORMATION записи в буфере имеют такую стр-ру (NTIFS.H):


    Код (Text):
    1. typedef struct _FILE_BOTH_DIR_INFORMATION {
    2.     ULONG           NextEntryOffset;
    3.     ULONG           FileIndex;
    4.     LARGE_INTEGER   CreationTime;
    5.     LARGE_INTEGER   LastAccessTime;
    6.     LARGE_INTEGER   LastWriteTime;
    7.     LARGE_INTEGER   ChangeTime;
    8.     LARGE_INTEGER   EndOfFile;
    9.     LARGE_INTEGER   AllocationSize;
    10.     ULONG           FileAttributes;
    11.     ULONG           FileNameLength;
    12.     ULONG           EaSize;
    13.     CCHAR           ShortNameLength;
    14.     WCHAR           ShortName[12];
    15.     WCHAR           FileName[1];
    16. } FILE_BOTH_DIR_INFORMATION, *PFILE_BOTH_DIR_INFORMATION;


    Вот код:
    Код (Text):
    1. // в обработчике...
    2.  
    3. PFILE_BOTH_DIR_INFORMATION CurrInfo;
    4.  
    5. // ... вызов TRUE-ф-ии ...
    6. // ... свич по FileInformationClass
    7.  
    8. case BothDirInfo:
    9.         {
    10.  
    11.         __try
    12.         {
    13.             CurrInfo = (PFILE_BOTH_DIR_INFORMATION)FileInformation;
    14.             i = 0;
    15.                            
    16.             while (1)
    17.             {                                      
    18.                 DbgPrint("Struct #: %4u\tNextEntryOffset: %4u\tName: %ws\n", i,CurrInfo->NextEntryOffset, CurrInfo->FileName);
    19.                    
    20.                 if ((ULONG)(CurrInfo->NextEntryOffset) == 0)
    21.                     break;
    22.                
    23.                 (ULONG)CurrInfo += (ULONG)CurrInfo->NextEntryOffset;
    24.                 i++;
    25.             }
    26.                
    27.                
    28.         }
    29.  
    30. // ...


    А вот что выдает DebugView:


    Код (Text):
    1. Struct #:    0 NextEntryOffset:    0 Name: AUTOEXEC.BAT
    2. Struct #:    0 NextEntryOffset:  112 Name: boot.ini
    3. Struct #:    1 NextEntryOffset:  120 Name: Bootfont.bin
    4. Struct #:    2 NextEntryOffset:  112 Name: cmdcons
    5. Struct #:    3 NextEntryOffset:  104 Name: cmldr
    6. Struct #:    4 NextEntryOffset:  120 Name: CONFIG.SYS
    7. Struct #:    5 NextEntryOffset:  112 Name: IO.SYS
    8. Struct #:    6 NextEntryOffset:  112 Name: MSDOS.SYS
    9. Struct #:    7 NextEntryOffset:  120 Name: NTDETECT.COM
    10. Struct #:    8 NextEntryOffset:  104 Name: ntldr
    11. Struct #:    9 NextEntryOffset:  120 Name: pagefile.sys
    12. Struct #:   10 NextEntryOffset:  144 Name: System Volume Information
    13. Struct #:   11 NextEntryOffset:    0 Name: tmp


    (^^ Это истинное содержимое диска C. Слегка подправил - для красоты)



    Что за "странность" в первой строке? Почему там Offset 0?

    По выводу DbgView понятно, что сначала сработал бряк. Счетчик i сбросился.

    Потом почему-то в этом буфере _первой_ оказалась запись поторая _должна_ была быть _второй_ (куда AUTOEXEC.BAT пропал...).

    Как это устранить?



    P.S. Большое спасибо Ms-Rem за статьи по перехвату! Просто отлично, особенно часть 3!
     
  2. MaDF

    MaDF New Member

    Публикаций:
    0
    Регистрация:
    10 май 2005
    Сообщения:
    83
    Странно... такое чувство что как будто вызывается функция 2 раза? Кстати, у тебя в Total Commander'е скрываются файлы? А то у меня то скрываются, то показываются :|