Всем доброго! По количеству ответов, на мой предыдущий пост делаю вывод, что народу мало что известно об этом или просто это тема закрыта для обсуждения. И все же я продолжаю начатаю мной тему. Всем известна такая программа как notepad.exe, скажите и что??? Меня интересует метод открытия файлов, для этого программа использует мапирование файла в pagefile.sys, насколько я знаю. Так вот это и является для меня загадкой, единственный IPR запрос, посылаемый в систему notepad'oм при открытии файла является IRP_MJ_CREATE. Неужели весь буфер данных передается в этом запросе или есть какие-то дополнительные особенности при использовании мапирования? Вообщем, куда мнеглядеть, что бы обнаружеть буфер данных(содержимое файла)?
notepad.exe отображает файл в память как ты уже заметил. Система загружает необходимые страницы в память и сбрасывает на диск измененные. Поэтому ты не видишь этих операций в контексте самого процесса notepad.exe. Ты должен смотреть на операции с файловыми объектами, которые соответствуют секции созданной notepad.exe. Кое что на этот счет можно посмотреть на OSR. Так же посмотри Microsoft Windwos Internals by Mark E. Russinovich, David A. Solomon. А именно главу 7 Memory Management раздел Section Objects.
Очень рекомендую http://www.i.u-tokyo.ac.jp/edu/training/ss/lecture/. Лекции по внутреннему устройству Windows.
Для маппированных файлов используется кэширование. При этом IRP вообще не создается. Ищи "Fast I/O" и всё, что с этим связано. Для исследования бери FileSpy http://www.zezula.net/
eugene,Four-F, spasibo za soveti. eugene, spasibo za linki. Tak kak ya novichek v sistemnom programmirovanii mnogie terminalogii dlya menya zagadka "которые соответствуют секции созданной notepad.exe", chto ti pod etim podrazumevaesh? Four-F, ya reshil vsetaki ispol'sovat' filespy kak bazu dlya moego drivera, poka chto mne udalos' tol'ko podkluchit'sya k ustroistvu. Ya poluchayu vse IRP_MJ_XXX posilaemie emu, no FAST IO poka molchat. V pevonachal'noi versii ya ispol'soval metod podkluchenya ot Filemon i s Fast IO problem ne bilo, no k primeru ya ne zametil chto bi srabativali Fast IO pri rabote Notepad.exe, v kakom-to iz forumov pisali chto pri mapirovanii Fast IO vovse ne rabotayut, tol'ko IRP_MJ_XXX . I kak bit' s keshirovaniem? Eshe vopros, ob "shadow device", chto eto za metod, v kakih sluchiyah ego primenyayut?
"Fast I/O is specifically designed for rapid synchronous I/O on cached files. In fast I/O operations, data is transferred directly between user buffers and the system cache, bypassing the file system and the storage driver stack." Диспетчер кеша сам со всем справляется, похоже. В IFS Kit есть спец раздел посвященный файловым системам, фильтрам файловых систем и кешированию. Там же много внимания уделено исходникам FileSpy. "shadow device" - отдельный девайс, который не садится в стек и используется только для управления фильтрами (изменение режима работы, получение логов и т.п.). Короче, см. "control device object" в FileSpy - это и есть "shadow device". Ещё встречается термин "extra device object".
Я неправильно написал. Файловый объект будет один. Тот, на который указывает FilePointer из объекта CONTROL_AREA. Он и будет использоваться системой для чтения в память и записи на диск. Все это выглядит так: --> Section object pointers --> Control area | | | | FileObject <----------------------- С использованием FileObject будет происходить чтение с диска и запись на диск. Это будет paging I/O в произвольном контексте (Arbitrary Caller's Thread Context). Что касается "shadow device". Это не тоже самое что "control device object". Shadow device используется в диспатчере IRP_MJ_CREATE для открыия файла, с целью избежать рекурсивного вызова диспатчера IRP_MJ_CREATE. Читать IFS Faq.
Four-F, я проанализировал логи выдоваемые Filespy от zezula. Я был не прав говоря что Fast IO не прослеживаются при мапировании, они действительно появляются, но только при повторном открытии файла, т.е. из кэша. Также эта утиль показывает, что при первом открытии отрабатывает стандартный IRP_MJ_READ, осталось только разобраться почему у меня не работают Fast IO и почему я пропустил(наверное не заметил) этот IRP_MJ_READ. eugene, да статью про "shadow device" на OSR я читал, как раз там говорилось о рекурсиях. В силу плохого английского, я просто не смог уловить суть этого метода.
об "shadow device" от Valerio: вообще говоря SDO используется в IRP_MJ_CREATE для того чтобы избежать рекурсии (вероятно, то о чем писал и Мэйсон и все остальные) в связи со своими собственными подзапросами на открытие файла из этого же самого IRP_MJ_CREATE: если скажем в IRP_MJ_CREATE выполнить ZwCreateFile то мы опять попадем в IRP_MJ_CREATE обработчик в том же самом стеке и получим рекурсию, которая на втором-третьем таком вхождении даст BSOD. Поэтому и был изобретен SDO способ — свои подзапросы постим на только нам известный SDO, а при входе в IRP_MJ_CREATE первым делом смотрим — с какого устройства пришел IRP, если это наш SDO — то просто пропускаем запрос вниз не глядя и таким образом разруливается рекурсия.
Продолжаю тему... Filespy, на сколько я понял невыгружаемый драйвер, по крайней мере Unload работает только для XP, а для W2K просто остановака ведения лога. Почему? Я пытаюсь сейчас выгрузить драйвер в W2k, но он остается в списке загруженных драйверов, хоть и не работает, в чем может быть проблема: 1) я не удалил все созданные мной устройства? 2) может это быть из-за не обнуленных ссылок на объект (ObDereferenceObject), если да, то есть ли механизм определения количества ссылок?
Там в комментариях есть, IMHO, ответы на все вопросы. <font color="gray][ LuckyDevil</font><!--color--><font color="gray]: по крайней мере Unload работает только для XP ]</font><!--color--> и только в Debug версии. Код (Text): VOID DriverUnload ( IN PDRIVER_OBJECT DriverObject ) /*++ . . . WARNING: Microsoft does not officially support the unloading of File System Filter Drivers. This is an example of how to unload your driver if you would like to use it during development. This should not be made available in production code. <font color="gray][ LuckyDevil</font><!--color--><font color="gray]: а для W2K просто остановака ведения лога. Почему? ]</font><!--color--> Код (Text): VOID DriverUnload ( IN PDRIVER_OBJECT DriverObject ) /*++ . . . // // MULTIVERSION NOTE: // // We can only support unload for testing environments if we can enumerate // the outstanding device objects that our driver has. // . . . // // Get what device objects we can for this driver. Quit if there // are not any more. Note that this routine should always be defined // since this routine is only compiled for Windows XP and later. // status = (gSpyDynamicFunctions.EnumerateDeviceObjectList)(. . .); Функция IoEnumerateDeviceObjectList доступна только начиная с XP. Хотя, кажется, очень легко реализуется руками. <font color="gray][ LuckyDevil</font><!--color--><font color="gray]: Я пытаюсь сейчас выгрузить драйвер в W2k, но он остается в списке загруженных драйверов ]</font><!--color--> Если исходник оригинальный, то для W2k gFileSpyDriverObject->DriverUnload будет равно NULL. Код (Text): if (IS_WINDOWSXP_OR_LATER()) { gFileSpyDriverObject->DriverUnload = DriverUnload; } <font color="gray][ LuckyDevil</font><!--color--><font color="gray]: может это быть из-за не обнуленных ссылок на объект (ObDereferenceObject), если да, то есть ли механизм определения количества ссылок? ]</font><!--color--> Код (Text): VOID DriverUnload ( IN PDRIVER_OBJECT DriverObject ) /*++ . . . When a request is made to unload a driver the IO System will cache that information and not actually call this routine until the following states have occurred: - All device objects which belong to this filter are at the top of their respective attachment chains. - All handle counts for all device objects which belong to this filter have gone to zero.
Насколько я знаю, его фильтр изначально базировался на filespy from 2003 IFS Kit. Кажется, он уже несколько видоизменён. Спроси у автора.
Windows Server 2003 Service Pack 1 (SP1) Driver Development Kit (DDK) Но это не IFS Kit. Примеров драйверов файловых систем там нет.
\cdfs \fastfat \filter \nulmrx \OSR_docs \smbmrx dirs ifs_install.htm Four-F, ну если этот список не является примерами драйверов файловой системы, то... караул, если кому не жалко киньте их в мою сторону.
Не, погоди. Я попутал чуток. Это у тя содержимое каталога \src\filesys от Windows Server 2003 IFS Kit у него тоже билд 3790. Так что всё нормально. IFS Kit - надмножество над DDK. У DDK и IFS Kit может быть один и тот же номер билда, но в с IFS Kit дополнительно идут кое-кикие вещи для разработки драйверов файловых систем. Одни из последних: Windows Server 2003 IFS Kit 3790 Windows Server 2003 Service Pack 1 (SP1) Driver Development Kit (DDK) 3790.1830 Есть ли IFS Kit 3790.1830 я не знаю. У Зезулы спрашивал про его FileSpy?
Four-F, не еще, времени нет, хотелось бы с толком и расстановкой подойти к этому, а то если честно сам еще до конца не знаю с чего именно начать его закидывать вопросами.