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

本文详细介绍了在Windows驱动开发中,如何在驱动加载和卸载时调用相应的函数。通过设置DriverUnload函数,确保驱动在卸载时能够正确执行收尾工作。在卸载过程中,系统会检查驱动是否存在Unload函数,如果没有,则不会卸载。同时,讨论了卸载驱动时引用计数器的重要性,确保在卸载前没有线程和IRP正在处理。提供了一个简单的示例,展示了如何定义和设置Unload函数,以便在卸载驱动时避免错误。
摘要由CSDN通过智能技术生成

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

17岁boy想当攻城狮

感谢打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值