File System Minifilter и хендл файла при ЗАКРЫТИИ
От: sergey77666 Марс  
Дата: 19.01.18 06:51
Оценка:
Уточнение предыдущей темы.

Сохраняю хендл к файлу в каждом IRP_MJ_WRITE. С этим все отлично. Я добавляю его в связанный список, моя функция проверяет нету ли там такого на данный момент, и пишет в лог, был ли он (то есть изменен уже существовавший) или создан новый. Там все более-менее в порядке.
Однако когда я начинаю в IRP_MJ_CLEANUP искать его в этом списке, то совпадение так и не обнаруживается.

С IRP_MJ_CLOSE — то же самое.

Какой именно хендл имелся в виду в пред-предыдущем абзаце?
Вначале было так:
pFileObject = *Data->Iopb->TargetFileObject;
...
add_to_list(..., &pFileObject)

Как и посоветовали в предыдущей теме. (И как я это понял).

Но с ним была проблема, вроде как для одного и того же открытого файла при write их получалось 2 (обнаружил, когда сделал дамп через %d) — то одно число, то другое.

А для просто FILE_OBJECT, без указателя — нет оператора ==.

Поэтому перешел на fileObject.FsContext
Больше этой проблемы не было, однако в IRP_MJ_CLOSE все равно ничего не вышло, и, собственно, в IRP_MJ_CLOSE этот FsContext просто-напросто всегда равен 0, как показал его дамп.

Что еще можно придумать?
Мне его надо именно хранить между write и close.
Отредактировано 19.01.2018 6:56 sergey77666 . Предыдущая версия . Еще …
Отредактировано 19.01.2018 6:55 sergey77666 . Предыдущая версия .
Отредактировано 19.01.2018 6:55 sergey77666 . Предыдущая версия .
Отредактировано 19.01.2018 6:52 sergey77666 . Предыдущая версия .
Re: File System Minifilter и хендл файла при ЗАКРЫТИИ
От: okman Беларусь https://searchinform.ru/
Дата: 19.01.18 08:28
Оценка:
Здравствуйте, sergey77666, Вы писали:

S>Вначале было так:

S>
S>pFileObject = *Data->Iopb->TargetFileObject;
S>...
S>add_to_list(..., &pFileObject)
S>

S>Как и посоветовали в предыдущей теме. (И как я это понял).

А зачем ты разыменовываешь TargetFileObject? Это ошибка.
Здесь нужно работать не со структурами FILE_OBJECT, а с указателями на них.
И, например, при поиске в списке сравнивать указатели, а не структуры. Тогда все будет работать.
Каждому открытому хэндлу (HANDLE) обычно соответствует один указатель на FILE_OBJECT.

Короче, в терминологии языка C++ правильно так:
std::list<FILE_OBJECT *> myList;
но не так:
std::list<FILE_OBJECT> myList;

Когда тебе приходит IRP_MJ_WRITE — сохраняй указатель (именно указатель, а не копию структуры!) на FILE_OBJECT,
взятый из Data->Iopb->TargetFileObject в своем списке. Когда придет IRP_MJ_CLEANUP — ищешь этот указатель в
списке. И т.д.
Re[2]: File System Minifilter и хендл файла при ЗАКРЫТИИ
От: sergey77666 Марс  
Дата: 19.01.18 08:36
Оценка:
Здравствуйте, okman, Вы писали:

O>Здравствуйте, sergey77666, Вы писали:


S>>Вначале было так:

S>>
S>>pFileObject = *Data->Iopb->TargetFileObject;
S>>...
S>>add_to_list(..., &pFileObject)
S>>

S>>Как и посоветовали в предыдущей теме. (И как я это понял).

O>А зачем ты разыменовываешь TargetFileObject? Это ошибка.


Так и думал.

Но сделал иначе. FsContext все-таки приходит в IRP_MJ_CLEANUP, вот его и решил использовать. Чем плохо?
Re[3]: File System Minifilter и хендл файла при ЗАКРЫТИИ
От: okman Беларусь https://searchinform.ru/
Дата: 19.01.18 08:49
Оценка:
Здравствуйте, sergey77666, Вы писали:

S>Так и думал.


S>Но сделал иначе. FsContext все-таки приходит в IRP_MJ_CLEANUP, вот его и решил использовать. Чем плохо?


В FsContext файловая система хранит указатель на File Control Block / Stream Control Block (FCB/SCB),
т.е. данные, связанные с файлом или потоком. Два и более разных FILE_OBJECT могут иметь одинаковые
указатели FsContext (например, когда два разных хэндла ссылаются на один и тот же файл).
Если тебя это не смущает — тогда все ок. Просто для минифильтров использовать FsContext это
немного "не по фэншую", обычно принято либо использовать указатели на FILE_OBJECT, либо контексты.
Re[4]: File System Minifilter и хендл файла при ЗАКРЫТИИ
От: sergey77666 Марс  
Дата: 19.01.18 09:30
Оценка:
Здравствуйте, okman, Вы писали:

O>Здравствуйте, sergey77666, Вы писали:


S>>Так и думал.


S>>Но сделал иначе. FsContext все-таки приходит в IRP_MJ_CLEANUP, вот его и решил использовать. Чем плохо?


O>В FsContext файловая система хранит указатель на File Control Block / Stream Control Block (FCB/SCB),

O>т.е. данные, связанные с файлом или потоком. Два и более разных FILE_OBJECT могут иметь одинаковые
O>указатели FsContext (например, когда два разных хэндла ссылаются на один и тот же файл).
O>Если тебя это не смущает — тогда все ок. Просто для минифильтров использовать FsContext это
O>немного "не по фэншую", обычно принято либо использовать указатели на FILE_OBJECT, либо контексты.

Все-таки на PFILE_OBJECT перейду.
А зачем с киберфорума ушел?
Re[5]: File System Minifilter и хендл файла при ЗАКРЫТИИ
От: okman Беларусь https://searchinform.ru/
Дата: 20.01.18 05:13
Оценка:
Здравствуйте, sergey77666, Вы писали:

S>А зачем с киберфорума ушел?


Форумы отнимают слишком много времени.
Иногда общение на форуме полезно, происходит обмен опытом. Иногда оно превращается в бесполезное
убивание времени, не дающее никаких профитов. В моем случае первое плавно перетекло во второе.
Re[6]: File System Minifilter и хендл файла при ЗАКРЫТИИ
От: sergey77666 Марс  
Дата: 20.01.18 06:45
Оценка:
Здравствуйте, okman, Вы писали:

O>Здравствуйте, sergey77666, Вы писали:


S>>А зачем с киберфорума ушел?


O>Форумы отнимают слишком много времени.

O>Иногда общение на форуме полезно, происходит обмен опытом. Иногда оно превращается в бесполезное
O>убивание времени, не дающее никаких профитов. В моем случае первое плавно перетекло во второе.

В общем-то все верно. Только там еще какой-то чудак тебе накануне писал, что от тебя никакого толку и тому подобное. Вот из-за таких, как он, на киберфоруме бесполезно сидеть (из-за того, что их большинство)?
Отредактировано 20.01.2018 6:45 sergey77666 . Предыдущая версия .
Re[7]: File System Minifilter и хендл файла при ЗАКРЫТИИ
От: okman Беларусь https://searchinform.ru/
Дата: 20.01.18 16:19
Оценка:
Здравствуйте, sergey77666, Вы писали:

S>Только там еще какой-то чудак тебе накануне писал, что от тебя никакого толку и тому подобное.


Просто совпадение ))
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.