Доброе время суток! У меня вопрос - почему может функция: FltRegisterFilter возвращать ошибку C0000034h ? вызов: CONST FLT_REGISTRATION FilterRegistration = { sizeof( FLT_REGISTRATION ), // Size FLT_REGISTRATION_VERSION, // Version 0, // Flags NULL, // Context Callbacks, // Operation callbacks DriverUnload, // FilterUnload fInstanceSetup, // InstanceSetup fInstanceQueryTeardown, // InstanceQueryTeardown fInstanceTeardownStart, // InstanceTeardownStart fInstanceTeardownComplete, // InstanceTeardownComplete NULL, // GenerateFileName NULL, // GenerateDestinationFileName NULL // NormalizeNameComponent }; status = FltRegisterFilter( DriverObject, &FilterRegistration, &FilterHandle ); Заранее спасибо!
Скорее всего, некорректная установка, в частности, не хватает соответствующих записей в реестре. Ссылка по теме здесь.
x64 Спасибо, уже нашел где был баг ) Вопрос второй - регистрируется фильтр, даже запускается, но callback-и не запускаются, почему? (callback-и - это простые заглушки которые выводят сообщения в дебагере) Код (Text): CONST FLT_REGISTRATION FilterRegistration = { sizeof( FLT_REGISTRATION ), // Size FLT_REGISTRATION_VERSION, // Version 0, // Flags NULL, // Context Callbacks, // Operation callbacks DriverUnload, // FilterUnload NULL, // InstanceSetup SpyQueryTeardown, // InstanceQueryTeardown NULL, // InstanceTeardownStart NULL, // InstanceTeardownComplete NULL, // GenerateFileName NULL, // GenerateDestinationFileName NULL // NormalizeNameComponent }; Код (Text): __try { // // Make driver unloadable // DriverObject->DriverUnload = DriverUnload; // // Create device // status = IoCreateDevice( DriverObject, 0, &DriverName, FILE_DEVICE_UNKNOWN, 0, TRUE, &FilterData.DeviceObject ); if (!NT_SUCCESS( status )) { __leave; } // // Create symbolic link // status = IoCreateSymbolicLink( &SymbolicLinkName, &DriverName ); if (!NT_SUCCESS( status )) { IoDeleteDevice( FilterData.DeviceObject ); return status; } // // Register with FltMgr // status = FltRegisterFilter( DriverObject, &FilterRegistration, &FilterData.FilterHandle ); DbgBp(); if (!NT_SUCCESS( status )) { __leave; } status = FltBuildDefaultSecurityDescriptor( &sd, FLT_PORT_ALL_ACCESS ); if (!NT_SUCCESS( status )) { __leave; } RtlInitUnicodeString( &uniString, FILTER_PORT_NAME ); InitializeObjectAttributes( &oa, &uniString, OBJ_KERNEL_HANDLE | OBJ_CASE_INSENSITIVE, NULL, sd ); status = FltCreateCommunicationPort( FilterData.FilterHandle, &FilterData.ServerPort, &oa, NULL, SpyConnect, SpyDisconnect, SpyMessage, 1 ); FltFreeSecurityDescriptor( sd ); if (!NT_SUCCESS( status )) { __leave; } // // Start filtering i/o // status = FltStartFiltering( FilterData.FilterHandle ); if (!NT_SUCCESS( status )) { FltUnregisterFilter( FilterData.FilterHandle ); } DbgPrint("Helow from kernel!\n"); } __finally { if (!NT_SUCCESS( status )) { if (FilterData.ServerPort != NULL) { FltCloseCommunicationPort( FilterData.ServerPort ); } if (FilterData.FilterHandle != NULL) { FltUnregisterFilter( FilterData.FilterHandle ); } } } Заранее Спасибо!
Как можно узнать путь к файлу или папке которую затребовала пользовательская программа для открытия ? (IRP_MJ_CREATE) Хоть подскажите в какую строну рыть. Всем заранее спасибо
О, эта задачка мягко говоря непростая. Если по-простому для и тестов нужно, тогда IoVolumeDeviceToDosName() + pIoStackLocation->FileObject->FileName. Если нужно грамотное коммерческое решение, тогда см. соответствующие посты у меня в блоге, плюс кое-какие трюки. Работа с именами файлов в ядре - штука геморройная, надо чётко понимать, что там с ними происходит.
Как можно запретить загрузку файла? например я уже нашел что данный запрос должен быть отклонен, как мне это сделать? как я понимаю нужно вернуть FLT_PREOP_COMPLETE статус, но после этого - идет exception все время Где подводные камни? что делаю не так? Заранее спасибо!
Что есть "загрузка"? Открытие файла или что-то ещё? Да, но перед этим следует установить, например, STATUS_ACCESS_DENIED в поле Data->IoStatus.Status. Какой exception? Где? Код покажи. Слишком мало информации для анализа.
я имел виду открытие (IRP_MJ_CREATE) ну етого я не учел exception 0xC0000005, пока что не определил где (не успел), но это происходит только после того как я сделал return FLT_PREOP_COMPLETE;
А как была решена проблема как-нибудь знает ? Я всегда писал legacy и тут решил попробывать mini filter. FltRegisterFilter проходит успешно, FltStartFiltering аналогично, но калбеки не вызываются. Ключи Instances Altitude Flags DefaultInstance добавляю в DriverEntry
Во-первых, какие именно колбеки тебе нужны? Ты уверен, что правильно заполнил структуру FLT_REGISTRATION и, в частности, поле-массив OperationRegistration? Во-вторых, ты пробовал сделать всё в точности так, как в сэмплах WDK из папки \src\filesys\miniFilter?