各位老兄,
我想在驱动程序中添加自己定义的函数,然后在应用程序中调用该函数,不借用DeviceIoControl、ReadFile、WriteFile和该函数通信。
请问,这样能实现吗?若能实现,怎么做?
你只要把你自定义的函数暴露出来,在应用程序中直接调用你函数也是可以的
为什么不借用DeviceIoControl、ReadFile、WriteFile?
文件系统驱动程序可以用CreateFile、DeleteFile、MoveFile、FindFirstFile……
注册进程/线程通知可以用CreateThread、LoadLibrary……
设置注册表回调可以用RegCreateKeyEx、RegOpenKeyEx……
Hook SSDT只要能到内核就可以。
gs1234537,
我如何才能把我得自定义函数暴露出来啊?
cnzdgs,
我觉得调用DeviceIoControl等函数,不够自由,有的时候用不着带太多的参数,这些都是会影响通信速度的!
1楼的意思是让你直接Call函数的地址。
DeviceIoControl是最快的了,也是最方便的,不用经过其它驱动程序,只要input、output都给0就不用来回复制参数。另外,应用层直接调NTDLL.dll中的ZwXXX函数可以免于在中间过程浪费时间。
cnzdgs,
我如何获得自定义函数的地址啊?
在应用程序中如何Call这个地址呢?用什么函数啊?
不太明白!能讲一下吗?
另外,NTDLL.dll中的ZwXXX函数如何查看啊?
直接调用的的方法我没试过,因为即使你可以调用,但程序并没有切入到内核级,所以无法执行内核级的操作,这样的程序没有实际意义。
NTDLL.dll中的ZwXXX与驱动程序调用的ZwXXX在形式上是完全相同的,也是一一对应的。系统API最终都要通过NTDLL.dll进入内核。不过MS好象没提供h文件和lib文件,需要动态链接。
5 楼说的不是很对哦!
DeviceIoControl 并不是最快的了,也不是最方便的,直接调用才是.
用户态的程序是无法直接调用RING0地址的函数, 但可以利用 KeAddSystemServiceTable 来
把自己函数添加到 SSDT 中去,再利用 SYSENTER指令 或 INT 2EH来调用它(INT 2EH 兼容性好些 ).
看看 是怎么评价这两种方法:
--------------------------------------------------------------------
编写伪设备驱动并为应用程序提供 DeviceIoControl 也可以用来扩展内核。
然而在这种情况下,每个要使用 DeviceIoControl 的程序都必须打开一个设备句柄、
发出 DeviceIoControl,最后关闭设备。通过系统服务来扩展内核有其独到的好处。
首先也是最为重要的就是应用程序不必理会驱动程序。程序只需要链接到提供系统服务接口的 DLL
就像 NTDLL.DLL 为 KERNEL32.DLL 提供接口一样)。更进一步讲,DeviceIoContol 要慢的多,
特别是在 DeviceIoControl 需要在应用程序与驱动程序间需要传递大量数据的时候。
通过使用这中添加系统服务的技术,可以编写一组系统服务并提供一个人人都能用的用户级的接口 DLL。
这种实现比起 DeviceIoControl 方法来要更干净、更标准。
--------------------------------------------------------------------
DeviceIoControl 除了通信效率低,还有其它缺陷,比如它只适合用户态到内核态的单向通信,
这时考虑的就是用共享内存之类通信机制.