通常我们可以使用一些驱动加载工具来改变我们驱动的行为,如加载驱动时执行入口函数与卸载函数,这里是我用当我们点击Start时会调用DriverEvent函数,并且正常加载
但当我们点击Stop卸载时确报了错:
报错的大致意思是:这个驱动不支持这样的操作
这个原因是因为我们没有设置Unload函数,Windows Driver Server在卸载的时候会先检查这个驱动是否具有Unload函数,如果没有则不会去卸载,如果有的 情况下Server会将它从内核空间中移除,在移除之前会先调用Unload,在这个里面我们可以去做一些收尾工作,然后Server会将它移除。
Server移除它是有条件的,首先必须确保这个驱动里已经没有线程和没有IRP(I/O Request Package,即输入输出请求包,上层与下层没有任何联系了)在处理了,比如上层软件使用CreateFile函数与驱动建立了联系,那么就处于被引用的状态,在DRIVER里有一个引用计数器,当这个Driver被其它程序所使用时会使这个引用计数器递增,当卸载时需要保证它为0,同时当增加设备对象引用时也会使这个引用计数器递增1
首先创建一个Unload函数:
VOID UnloadDevice (IN PDRIVER_OBJECT pDriverObject){
}
然后在DriverEvent函数里将它指向:
NTSTATUS DriverEntry (
IN PDRIVER_OBJECT pDriverObject,
IN PUNICODE_STRING pRegistryPath )
{
pDriverObject->DriverUnload = UnloadDevice;
return STATUS_SUCCESS;
}
当我们设置完Unload函数之后重新build,在加载然后Stop就可以看到成功了:
注意这个设置Unload方式在WDK框架上不适用,仅适用于NT框架。