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