1:
对于插件的支持,我想都是每个人都有不同程度的依赖吧,为什么在SDK 的编程中,他能很好的识别哪些表述,但是到了WDK的就不行了,
我想首先应该是配置的问题,导致了插件无法识别,那么我们能不能用其他的方法来解决这个问题呢?
其实,这是很简单的。
通过加入所需要的头文件,插件就可以支持了。
2:
在实现应用层与内核的通信过程中,我们可以使用三种方式的读取方法
(1):缓冲读取
(2):直接读取
(3):都不是读取
目前,我只能使用第一种的方式处理通信的问题,在实现通信的过程中,应用层将发出一个IRP ,如果传入了信息,信息将保存在
pIrp->AssociatedIrp.SystemBuffer; 中,
写入的长度与返回应用层的长度可以通过:
uIn = irpStack->Parameters.DeviceIoControl.InputBufferLength;
uOut = irpStack->Parameters.DeviceIoControl.OutputBufferLength;
他们来获得,当然,我们要实现通信,必须要捕获这样的IRP ,捕获的方法:
(1)我们首先要定义我们自己的操作码,这个当内核识别IRP的时候,会去匹配我们的信息,操作码必须分别在应用层和内涵层都定义一样的, 具体可看 WDK 的 CTL_CODE
(2)捕获IRP 的方法:
首先当然是获取当前的: irpStack = IoGetCurrentIrpStackLocation(pIrp);
然后通过 uCode = irpStack->Parameters.DeviceIoControl.IoControlCode;
PIO_STACK_LOCATION 下的域,得到操作码,
最后在 将信息取得,取信息的顺序,先是得到传入的(如果有),然后才是设置返回。。
在应用层中的发送信息的方法:
我主要使用的是 DeviceIoControl(), 这个函数,当然,首先必须打开内核的符号链接,也就是内核对外的借口名,
HANDLE handle = CreateFile("////.//xumin",
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
0,
NULL);
这是一种方式,好像OpenFile(), 也是可以的。。。
然后就是DeviceIoControl(), 的操作了,读写由你设置,这部分也可以用 ReadFile() 和 WriteFile 来做。。。
3:为什么我的驱动卸载后不能再次的加载,加载提示符号链接已存在
这个问题在于原来创建的驱动在卸载时,没有删除符号链接,导致的,这个问题困扰了我好久,调试了一个下午,真的让人郁闷