Мне бы пришлось противоречить LordDoskias , так как OBJECT_TYPE_INITIALIZER не является документированным объектом, и это может иметь и будет меняться с исправлениями и обновлениями ОС.
Не подходите к этой проблеме, так как она только вызовет больше проблем и ничего не решит.
Не говоря уже о патч-гвардии, которая будет BSOD системы, если вы измените структуру системы.
Если вы хотите ограничить доступ к файлам, нет другого пути, чем просто использовать минифильтр. Есть несколько примеров Microsoft здесь , из которых вы можете черпать вдохновение, а также научиться реализовывать свой драйвер правильным и поддерживаемым способом.
И наконец, что еще более важно, иллюзорно думать, что вы сможете блокировать все, что хотите, с помощью методов перехвата, и я просто приведу один пример: сопоставленные файлы.
Вот сценарий с использованием блокнота, который использует сопоставленные файлы для записи своих данных на диск.
- CreateFile -> получает дескриптор файла -> вы видите это
- CreateFileMapping -> получает дескриптор отображения -> вы не видите этого
- CloseHandle (FileHandle) -> вы видите это
- MapViewOfFile, возвращающий буфер памяти, страница которого поддерживается файлом -> вы не видите этого
- Изменить буфер памяти -> вы не видите этого
- Распаковать и закрыть FileMappingHandle -> вы не видите этого
- Асинхронизация системных рабочих потоков диспетчера памяти выполняет запись в файл подкачки для синхронизации. Даже после того, как все дескрипторы были закрыты или во время изменения буфера в памяти, в зависимости от того, когда ОС хочет. -> вы не видите этого
Это то, чего вам не хватает при зацепке. И это только один сценарий. Их множество, поэтому, пожалуйста, делайте все правильно.
Как это изменится, если вы используете минифильтр?
Вы, конечно, также перехватите CreateFile, CreateFileMapping (проверьте FltAcquireForSectionSynchronization callback), а затем из минифильтра вы увидите все PAGING_WRITE, поступающие из диспетчера памяти (см. IoGetTopLevelIrp () ) в обратном вызове отправки.
Удачи дальше.