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