Вызов Java-программы из драйвера режима ядра

У меня есть Java-программа командной строки, которую мне нужно будет вызвать из драйвера режима ядра (драйвер MiniFilter в Windows).

Является ли это возможным ? Есть ли что-то, о чем мне нужно позаботиться, чтобы избежать проблем? Как я могу это сделать ?


person Krag    schedule 23.11.2017    source источник
comment
Возможно, ответил stackoverflow.com/a/684023/3991696   -  person vishwarajanand    schedule 23.11.2017


Ответы (1)


Программа java работает в пользовательском режиме. Вы не можете просто вызвать функцию из режима ядра в режим пользователя. Но вы можете общаться между ними.

Обычно программа пользовательского режима вызывает функциональные возможности драйвера, вызывая API ввода-вывода пользовательского режима для дескриптора, открытого на объекте устройства, связанном с драйвером. Существуют стандартные операции ввода-вывода, такие как чтение и запись (т. Е. Вызов Win32 API ReadFile() или WriteFile() в C / C ++), но вы также можете реализовать свои собственные пользовательские / проприетарные операции, используя DeviceIoControl(). Вы передаете код операции и пару буферов: один с аргументами / вводом для драйвера, а другой для получения его вывода. Вдобавок к этому вы могли бы создать механизм, позволяющий программе пользовательского режима запрашивать «вызовы» или сообщения от драйвера, и драйвер не будет выполнять запрос, пока он не захочет отправить такой вызов / сообщение. Он передаст свои аргументы в буфер output ожидающего запроса DeviceIoControl. Затем программа могла бы использовать другой вызов DeviceIoControl (), возможно, с другим кодом операции, чтобы вернуть результаты драйверу во входном буфере input.

У вас есть дополнительная нагрузка, вызывающая DeviceIoControl () из Java. Для этого вам может потребоваться использовать JNI и немного кода C / C ++ в DLL.

Остерегайтесь ошибок, связанных с тем, что драйвер зависит от программы пользовательского режима. Вероятно, вы не хотите реализовывать блокирующий вызов в драйвере, который ожидает ответа из пользовательского режима, потому что программа пользовательского режима может дать сбой или быть убитой и никогда не завершить вызов, которого ожидает драйвер, и тогда у вас есть зависший поток, вероятно, в каком-то процессе, отличном от вашей java-программы. Даже если вы реализуете асинхронное завершение вызовов, отправленных в пользовательский режим, вы, вероятно, захотите, чтобы ваши вызовы имели механизм тайм-аута, чтобы, если программа пользовательского режима не завершила вызов, вы могли очистить любой связанный контекст, например идентификатор вызова в коллекции ожидающих вызовов. Также обратите внимание на проблемы, похожие на проблемы, связанные с многопоточностью или многозадачностью, например тупик. Также обратите внимание, что данные, передаваемые из режима ядра в режим пользователя, обычно должны копироваться в буфер вывода пользовательского режима и не содержать никаких указателей на виртуальные адреса в адресном пространстве ядра или адресном пространстве других процессов.

person asynchronos    schedule 29.11.2017