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