Windows Driver开发_NT Driver框架:The driver is not in a state to accept this command

Posted 17岁boy想当攻城狮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Windows Driver开发_NT Driver框架:The driver is not in a state to accept this command相关的知识,希望对你有一定的参考价值。

通常我们可以使用一些驱动加载工具来改变我们驱动的行为,如加载驱动时执行入口函数与卸载函数,这里是我用当我们点击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框架。

以上是关于Windows Driver开发_NT Driver框架:The driver is not in a state to accept this command的主要内容,如果未能解决你的问题,请参考以下文章

YJX_Driver_009_DDK_HelloWorld_NT

YJX_Driver_022_NT式驱动的安装

Windows驱动开发-_DRIVER_OBJECT结构体

Windows Driver开发_安装与配置环境

Windows Driver开发_安装与配置环境

Windows Driver开发_TraceEvents调试以及加载驱动的方法