Программа должна следить за реестром. Драйвер работает на основе коллбаков. Как реализовать следующее: передавать информацию о хукнутой операции реестра в основную программу?
В работе с драйверами я новичок, единственное рациональное решение которое я нашел выглядит так:
Через DeviceIoControl передаем указатель на буфер. Все отловленное через коллбаки записываем туда. Программа каждую секунду посылает через DeviceIoControl указатель на другой буфер и считывает данные из старого(обнуляет его после считывания). Коллбаки записывают в новый. Через 1 секунду опять меняем буферы местами. И так до бесконечности)
Как я успел заметить реестр меняется все время. 2 буфера используются, чтобы все не спуталось и была синхронность в чтении-записи. Насколько я понял не существует аналога DeviceIoControl от лица драйвера. Но наверняка существует более удобный способ осуществить мою задумку)
Re: Связь драйвера с программой(постоянная пересылка)
B>Программа должна следить за реестром. Драйвер работает на основе коллбаков. Как реализовать следующее: передавать информацию о хукнутой операции реестра в основную программу?
Сие уже обсуждалось неоднократно. Я лично пришёл к выводу, что через APC пользовательские будет эффективнее всего. По крайне мере, из того, что документировано.
B>Программа каждую секунду...
С другой стороны, если данных предполагается реально много, то, возможно, лучше всего будет организовать paged-буфер, который лочится и мапится в адресное пространство управляющего приложения, которое, в свою очередь, выгребает оттуда данные по сигналу события. Ну, разумеется, не забудем всё это синхронизацией на fast mutex-ах обложить.
Re[2]: Связь драйвера с программой(постоянная пересылка)
Здравствуйте, x64, Вы писали:
B>>Программа должна следить за реестром. Драйвер работает на основе коллбаков. Как реализовать следующее: передавать информацию о хукнутой операции реестра в основную программу?
x64>Сие уже обсуждалось неоднократно. Я лично пришёл к выводу, что через APC пользовательские будет эффективнее всего. По крайне мере, из того, что документировано.
А почему нельзя сделать по-простому, пусть драйвер складывает эту информацию в какую-нибудь свою память (не важно, циклический буфер, связанный список буферов и т.п.), а программа пусть через IRP_MJ_WRITE вычитывает эти данные по штуке за раз?
Оверхед при этом будет не такой уж и большой, чтобы об этом так уж сильно париться. Вряд ли там данные летают гигабайтами в секунду. Но зато код будет простой и понятный.
Единственный интересный вопрос — что должен делать драйвер, если складывать информацию больше некуда (программа не успевает подгребать)? Но этот вопрос в любом случае имеется, каким бы способом информация не передавалась от драйвера в user space.
Re[3]: Связь драйвера с программой(постоянная пересылка)
Данные приходят с большой скоростью и в больших количествах(однако следует учесть возможность нечастого прихода данных). Я думаю передавать их все равно стоит пакетами, а не по 1 записи. Почти уверен, что будет переполнение(хотя надо попробовать).
Кстати, драйвер же "однопотоковый"?) То есть если например драйвер обрабатывает запрос реестра и приходит запрос от программы на чтение, драйвер сначала закончит работу с реестром и только потом перейдет на запрос от программы?(хотя, как я понимаю с помощью мьютексов все равно можно без проблем синхронизировать это дело)
Если так, то, что если использовать мьютексы в связке с 2-мя буфферами(проецируемыми файлами)? При каждом перехвате реестра анлочим мьютекс, ожидающая анлока программа поставляет драйверу второй буфер, а сама считывает из первого(хотя в первом на этот момент может быть уже не 1 запись, а например 3) лочит мьютекс. И так далее.
Re: Связь драйвера с программой(постоянная пересылка)