Здравствуйте. Есть такая задача. Написать драйвер мини-фильтр, который бы при просмотре каталога 'c:\my' отдавал содержимое каталога 'd:\my'. При обработке 'pre-create' я: 1. сохраняю переданный PFILE_OBJECT 2. открываю каталог 'd:\my' 3. устанавливаю PFILE_OBJECT открытого каталога. 4. устанавливаю статус STATUS_SUCCESS и результат FLT_PREOP_COMPLETE 5. обработка завершена Тем не менее, мои функции IRP_MJ_CLOSE и IRP_MJ_QUERY_DIRECTORY для перехваченного объекта не вызываются. Что я делаю не так? Есть ещё один вариант. Во время обработки 'pre-create' подменять имя каталога, а во время 'post-create' возвращать его назад. Работоспособен ли такой способ?
vasalvit Да А зачем его возвращать назад? В чем смысл? в IRP_MJ_QUERY_INFORMATION будешь букву инкрементить и все дела Никто не узнает что это D: на самом деле
Не. Вариант с подменой имени почему-то не прокатывает. Система возвращает 'STATUS_INVALID_PARAMETER'. Я делаю так: 1. в pre-create создаю объект каталога 2. возвращаю его в pData->Iopb->TargetFileObject 3. вызываю 'FltSetCallbackDataDirty' 4. создаю контекст для этого объекта 5. возвращаю 'FLT_PREOP_COMPLETE' Но в pre-close мне приходит прежний объект файла без моего контекста. 'FltGetStreamHandleContext' возвращает 'STATUS_NOT_SUPPORTED'. В чём может быть проблема?
Немного не понял. Везде советуют переходить на мини-фильтры. А тут - обратный совет К тому же есть требование - написать драйвер мини-фильтр, вот и мучаюсь
Использовал 'RtlCreateUnicodeString' и 'RtlFreeUnicodeString'. Но там другая проблема. Если используется язык C, то чтобы добраться до имени файла необходима два раза снять 'CONST'. Уверен, что не зря M$ так хорошо спрятали имя файла Но просто подменить имя файла не получится. Мне нужно, чтобы ни одна прога и не догадывалась о том, что работает с другим файлом
Можно поподробнее, что за 'HE4'. А по поводу user-mode ... Есть требование - нужен драйвер мини-фильтр.
Возможно что проблема в том, что фильтр-менеджер не знает о проделанных тобою изменениях. В случае изменения параметров переданных в твою callback, в большинстве случаев необходимо вызвать функцию FLT_SET_CALLBACK_DATA_DIRTY(), правда не во всех. Но в случае изменения TargetFileObject Microsoft требует вызова данной функции. Она информирует фильтр-менеджер, что данные изменились.
Здравствуйте. Я попробовал использовать reparse — всё работает !!! Но есть одна проблема. Если натравить verifier на мой драйвер, то при его выгрузке получаю крэш: Код (Text): DRIVER_VERIFIER_DETECTED_VIOLATION (c4) A device driver attempting to corrupt the system has been caught. This is because the driver was specified in the registry as being suspect (by the administrator) and the kernel has enabled substantial checking of this driver. If the driver attempts to corrupt the system, bugchecks 0xC4, 0xC1 and 0xA will be among the most commonly seen crashes. Parameter 1 = 0x1000 .. 0x1020 - deadlock verifier error codes. Typically the code is 0x1001 (deadlock detected) and you can issue a '!deadlock' KD command to get more information. Arguments: Arg1: 00000060, A driver has forgotten to free its pool allocations prior to unloading. Arg2: 00000000, paged bytes Arg3: 0000084c, nonpaged bytes, Arg4: 00000011, total # of (paged+nonpaged) allocations that weren't freed. To get the name of the driver at fault, type dp ViBadDriver l1; dS @$p Then type !verifier 3 drivername.sys for info on the allocations that were leaked that caused the bugcheck. Если verifier выключен — то драйвер выгружается нормально. После экспериментов я выяснил, что verifier ругается на выделение памяти под новое имя файла, прежде чем вернуть STATUS_REPARSE. Естественно, я эту память не освобождаю — подразумевается, что это сделает система. Это серьёзная проблема, или можно проигнорировать verifier?
Да, эту цитату я знаю http://support.microsoft.com/kb/319447 Вот отсюда взята идея. Там освобождается системный буфер и выделяется свой. Свой буфер не освобождается. Я делаю точно также. А verifier ловит меня
vasalvit У нас существует правило на форуме - если сам нашел ответ - поделиться с ним. Чтоб не плодились похожие топики. Это ж всеже база знаний, а не вопросов )
Это чисто моя проблема Я написал простенький драйвер. Он перенаправлял файлы на самих себя. Реального перенаправления не было. Тестировал этот драйвер и на реальной и на виртуальной машине. По работе проблем не было, но при завершении .... Я решил не обращать на это внимание. Продолжил написание. Теперь драйвер перенаправлял не все файлы, а только введённые пользователем. Проблема с некорректным завершением исчезла. Почему так - не знаю Но проблема исчезла