Здаствуйте! Зарание извиняюсь за C... У меня вопрос по перехвату ф-ии ZwQueryDirectoryFile. В драйвере меняю обработчик. В обработчике сначала идет вызов TRUE-ф-ии ZwQueryDirectoryFile, затем некоторые манипуляции с буфером FileInformation (естественно кое-что пытаюсь скрыть ). Проблема в том что это "что-то" может быть первой структурой в буфере. Почему-то смещение на вторую стуктуру (оно же размер первой) у меня всегда ==0, и соответственно непонятно на стколько делать сдвиг (или как то иначе ее прибивать). С остальными записями все ok. Для запроса FILE_BOTH_DIR_INFORMATION записи в буфере имеют такую стр-ру (NTIFS.H): Код (Text): typedef struct _FILE_BOTH_DIR_INFORMATION { ULONG NextEntryOffset; ULONG FileIndex; LARGE_INTEGER CreationTime; LARGE_INTEGER LastAccessTime; LARGE_INTEGER LastWriteTime; LARGE_INTEGER ChangeTime; LARGE_INTEGER EndOfFile; LARGE_INTEGER AllocationSize; ULONG FileAttributes; ULONG FileNameLength; ULONG EaSize; CCHAR ShortNameLength; WCHAR ShortName[12]; WCHAR FileName[1]; } FILE_BOTH_DIR_INFORMATION, *PFILE_BOTH_DIR_INFORMATION; Вот код: Код (Text): // в обработчике... PFILE_BOTH_DIR_INFORMATION CurrInfo; // ... вызов TRUE-ф-ии ... // ... свич по FileInformationClass case BothDirInfo: { __try { CurrInfo = (PFILE_BOTH_DIR_INFORMATION)FileInformation; i = 0; while (1) { DbgPrint("Struct #: %4u\tNextEntryOffset: %4u\tName: %ws\n", i,CurrInfo->NextEntryOffset, CurrInfo->FileName); if ((ULONG)(CurrInfo->NextEntryOffset) == 0) break; (ULONG)CurrInfo += (ULONG)CurrInfo->NextEntryOffset; i++; } } // ... А вот что выдает DebugView: Код (Text): Struct #: 0 NextEntryOffset: 0 Name: AUTOEXEC.BAT Struct #: 0 NextEntryOffset: 112 Name: boot.ini Struct #: 1 NextEntryOffset: 120 Name: Bootfont.bin Struct #: 2 NextEntryOffset: 112 Name: cmdcons Struct #: 3 NextEntryOffset: 104 Name: cmldr Struct #: 4 NextEntryOffset: 120 Name: CONFIG.SYS Struct #: 5 NextEntryOffset: 112 Name: IO.SYS Struct #: 6 NextEntryOffset: 112 Name: MSDOS.SYS Struct #: 7 NextEntryOffset: 120 Name: NTDETECT.COM Struct #: 8 NextEntryOffset: 104 Name: ntldr Struct #: 9 NextEntryOffset: 120 Name: pagefile.sys Struct #: 10 NextEntryOffset: 144 Name: System Volume Information Struct #: 11 NextEntryOffset: 0 Name: tmp (^^ Это истинное содержимое диска C. Слегка подправил - для красоты) Что за "странность" в первой строке? Почему там Offset 0? По выводу DbgView понятно, что сначала сработал бряк. Счетчик i сбросился. Потом почему-то в этом буфере _первой_ оказалась запись поторая _должна_ была быть _второй_ (куда AUTOEXEC.BAT пропал...). Как это устранить? P.S. Большое спасибо Ms-Rem за статьи по перехвату! Просто отлично, особенно часть 3!
Странно... такое чувство что как будто вызывается функция 2 раза? Кстати, у тебя в Total Commander'е скрываются файлы? А то у меня то скрываются, то показываются :|