MiniFilter - Как обнаружить только действия ввода-вывода, инициированные пользователем?

Мне нужно обнаруживать только действия ввода-вывода, инициированные пользователем. Когда я говорю «Пользователь», я на самом деле имею в виду пользователя (двойной щелчок, чтобы открыть файл, ввести и т. д.).

Data->RequestorMode == 1, печатает только пользовательский режим, и мне нужны действия, инициированные пользователем.

Итак, мне нужно знать, как печатать только транзакции, сделанные самим пользователем. (Открыть файл, дважды щелкнуть, ввести и т. д., как было сказано ранее)

Какие-либо предложения?

Спасибо!


person user3449011    schedule 24.12.2016    source источник


Ответы (2)


Когда вы дважды щелкаете файл, вы просите Explorer выполнить действие от вашего имени. Проводник делает это, изучая расширение файла, ища приложение, связанное с этим расширением, и запуская его с инструкциями по открытию файла.

Загрузчик Windows отвечает за загрузку приложения в память и его запуск. Для этого он должен открыть как минимум исполняемый файл и обычно одну или несколько библиотек DLL. После запуска приложения оно также может открыть некоторые файлы конфигурации, прежде чем откроет файл, запрошенный пользователем.

Все эти открытые операции выполняются в одном контексте. Ядро знает, какой процесс инициировал открытие файла, но не может определить, был ли он открыт загрузчиком Windows или самим приложением, или отличить файл конфигурации от файла, дважды щелкнутого пользователем. Таким образом, вы не сможете обнаружить инициированные пользователем операции открытия файлов из драйвера фильтра файловой системы.

Вместо этого можно использовать расширение проводника Windows, хотя это будет работать только для файлов, которые открываются с помощью проводника или одного из стандартных диалоговых окон, т. е. для большинства, но не для всех приложений.

person Harry Johnston    schedule 25.12.2016

Data->RequestorMode == 1, печатает только пользовательский режим

so

if (Data->RequestorMode == UserMode) DbgPrint("%x\n", Data->RequestorMode);

печатать только UserMode

или лучше сказать - if UserMode print UserMode - печатать только UserMode ..

person RbMm    schedule 24.12.2016
comment
Я приведу пример, чтобы лучше объяснить себя: допустим, я открываю файл abc.txt. Вызовы пользовательского режима будут следующими: открыть кучу dll, открыть блокнот, открыть abc.txt. Я хочу отфильтровать это и поймать только abc.txt (или что-либо еще, что пользователь открыл). Как поймать только то, что открывает пользователь (человек)? Как двойной щелчок и Enter) - person user3449011; 25.12.2016
comment
@ user3449011: нельзя. Windows знает только, что программа открывает файл, и у нее нет возможности определить, открывает ли она файл, потому что пользователь явно попросил об этом или по какой-то другой причине. - person Harry Johnston; 25.12.2016
comment
@HarryJohnston - на самом деле попытка OP была найдена в пользовательском режиме или в режиме ядра. и он не может понять, что такое - FLT_CALLBACK_DATA.RequestorMode - начать с stackoverflow .com/questions/41292697/ - person RbMm; 25.12.2016
comment
Пример, который он приводит в комментарии выше, показывает, что он пытается различать файлы, открытые пользователем, и файлы, открытые программным обеспечением. Я полагаю, что его предыдущий вопрос был просто немного запутанным, потому что он не понимал, что на самом деле означает пользовательский режим. - person Harry Johnston; 25.12.2016
comment
@HarryJohnston - if (Data->RequestorMode) { DbgPrint("mode %d\n", Data->RequestorMode); } Он всегда печатает значение 1 - как вы думаете, может ли этот код печатать значение 0? это только вопрос c/c++ для понимания заявления if (Data->RequestorMode) - person RbMm; 25.12.2016
comment
Вы неверно истолковали вопрос, он не об этом спрашивает. Он говорит, что оператор отладки выполняется как для abc.txt, так и для notepad.exe, и он хочет, чтобы он выполнялся только для abc.txt. (В этом недоразумении нет вашей вины; вопрос был написан не очень ясно.) - person Harry Johnston; 25.12.2016
comment
@HarryJohnston - но OP не может понять, почему if (Data->RequestorMode) { DbgPrint("mode %d\n", Data->RequestorMode); } никогда не печатает 0 (KernelMode) - но потому что if (Data->RequestorMode) - мы никогда не печатаем, когда RequestorMode == 0 потому что if. Я говорю в начале - просто удалите if перед печатью. однако это очень распространенная задача в драйверах - когда мы проверяем RequestorMode (KernelMode или UserMode) и на основе этого делаем другое (скажем, более строгую проверку параметров или разрешаем/запрещаем доступ) - person RbMm; 26.12.2016
comment
но OP не может понять, почему if (Data->RequestorMode) { DbgPrint(mode %d\n, Data->RequestorMode); } никогда не печатать 0 - я понимаю, почему вы так думаете, но я абсолютно уверен, что это не то, что на самом деле имел в виду OP. - person Harry Johnston; 26.12.2016
comment
хорошо, может быть, мой плохой английский здесь проблема. но я основывался на этом: / - person RbMm; 26.12.2016