我有一个命令行 java 程序,我需要从内核模式驱动程序(Windows 上的 MiniFilter 驱动程序)调用它。
可能吗 ?有什么我需要注意避免问题的吗?我怎样才能做到这一点 ?
我有一个命令行 java 程序,我需要从内核模式驱动程序(Windows 上的 MiniFilter 驱动程序)调用它。
可能吗 ?有什么我需要注意避免问题的吗?我怎样才能做到这一点 ?
java 程序在用户模式下运行。您不能只从内核模式到用户模式进行函数调用。但是你可以在两者之间进行交流。
通常,用户模式程序通过在与驱动程序关联的设备对象上打开的句柄上调用用户模式 IO API 来调用驱动程序的功能。有标准的 IO 操作,如读取和写入(即调用 Win32 APIReadFile()
或WriteFile()
C/C++),但您也可以使用DeviceIoControl()
. 您传递一个操作代码和一对缓冲区:一个带有参数/输入到驱动程序,一个用于接收其输出。在此之上,您可以为用户模式程序构建一种机制,以从驱动程序请求“调用”或消息,并且驱动程序在它想要发送这样的调用/消息之前不会完成请求。它会在输出中传递它的参数挂起的 DeviceIoControl 请求的缓冲区。然后程序可以使用另一个 DeviceIoControl() 调用,可能使用不同的操作代码,在输入缓冲区中将结果返回给驱动程序。
从 Java 调用 DeviceIoControl() 会增加负担。为此,您可能需要在 DLL 中使用JNI和一些 C/C++ 代码。
当心驱动程序依赖于用户模式程序的陷阱。您可能不想在等待用户模式响应的驱动程序中实现阻塞调用,因为用户模式程序可能会崩溃或被杀死并且永远不会完成驱动程序正在等待的调用,然后您有一个挂起的线程,可能在你的java程序之外的某个进程中。即使你实现了发送到用户模式的调用的异步完成,你可能希望你的调用有一个超时机制,这样如果用户模式程序没有完成调用,你可以清理任何相关的上下文,例如待处理呼叫集合中的呼叫标识符。还要注意类似于多线程或多任务处理中的问题,例如死锁。