阅读:1484回复:10
怎样才能不重启机器就可以测试驱动程序?
每次编译生成新的sys文件,用控制面板重新安装inf后,就提示要
重启机器,这样调试太麻烦,怎样不重启就可以更新sys文件,使应 用层程序可以测试?? 也许我的调试方式不对,大家都是如何调试的,请指教!! 谢谢!!! |
|
沙发#
发布于:2004-08-26 10:01
先停用设备,再启用设备
|
|
板凳#
发布于:2004-08-26 10:09
2K下好象不行
|
|
地板#
发布于:2004-08-26 10:43
看你是什么了KMD的基本没问题,WDM的难说,FILE SYSTEM的只能在XP以后动态卸载,在XP以后OS新提供了函数支持。。。。
|
|
|
地下室#
发布于:2004-08-26 11:03
还有,就是用softice调试时,是不是每次编译生成sys后,必须重新
安装一遍驱动(通过添加/删除新硬件),这样softice才可以调试新 的驱动程序,可每安装一次系统都要我重启,太费时间了,难道softice 不能装载新的驱动进行调试? 大家都是如何使用softice,难道也要无数次的启动机器??? 没有时间仔细研究softice,请大家谅解!!! 谢谢! |
|
5楼#
发布于:2004-08-26 11:32
需不需要reboot,得看你的驱动程序所驱动的那个PDO是否可以随时卸栽。体现到你的driver层面,就是你的driver是否可以被调用unload例程。一旦系统调用了你的驱动的unload函数,那么你的驱动也就卸载了,这时候你可以简单的把最新的.sys文件覆盖到原来的.sys文件。再想办法启动这个驱动。
据个usb的例子,usb设备联到电脑上以后,驱动加载,当usb拔出以后,驱动就卸载,这时候你把更新后的.sys文件拷贝到system32/drivers里边覆盖原来的.sys,然后再插上usb设备,这时候启动的驱动就是你的最新的驱动。 |
|
6楼#
发布于:2004-08-26 12:03
需不需要reboot,得看你的驱动程序所驱动的那个PDO是否可以随时卸栽。体现到你的driver层面,就是你的driver是否可以被调用unload例程。一旦系统调用了你的驱动的unload函数,那么你的驱动也就卸载了,这时候你可以简单的把最新的.sys文件覆盖到原来的.sys文件。再想办法启动这个驱动。 对必须要能卸载的,不然即使你覆盖了,其实内存中的还是原来的,就只能重新启动了. |
|
|
7楼#
发布于:2004-08-26 12:14
[quote]需不需要reboot,得看你的驱动程序所驱动的那个PDO是否可以随时卸栽。体现到你的driver层面,就是你的driver是否可以被调用unload例程。一旦系统调用了你的驱动的unload函数,那么你的驱动也就卸载了,这时候你可以简单的把最新的.sys文件覆盖到原来的.sys文件。再想办法启动这个驱动。 对必须要能卸载的,不然即使你覆盖了,其实内存中的还是原来的,就只能重新启动了. [/quote] 没错,禁用启用设备也是一样的. |
|
8楼#
发布于:2004-08-26 18:26
我现在没有什么硬件用来此时驱动,只是在网上抄了个helloWDM的例子,编译可以通过,代码如下:
NTSTATUS DriverEntry( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath ) { UNICODE_STRING nameString, linkString; PDEVICE_OBJECT deviceObject; NTSTATUS status; WCHAR wBuffer[200]; DriverObject->DriverUnload = DriverUnload; RtlInitUnicodeString( &nameString, L"\\Device\\HelloWorld" ); status = IoCreateDevice( DriverObject,0,&nameString,FILE_DEVICE_UNKNOWN,0,TRUE,&deviceObject); if (!NT_SUCCESS( status )) return status; RtlInitUnicodeString( &linkString, L"\\??\\HelloWorld" ); status = IoCreateSymbolicLink (&linkString, &nameString); if (!NT_SUCCESS( status )) { IoDeleteDevice (DriverObject->DeviceObject); return status; } DriverObject->MajorFunction[IRP_MJ_CREATE] = MydrvDispatch; DriverObject->MajorFunction[IRP_MJ_CLOSE] = MydrvDispatch; DbgPrint("DriverEntry\n"); return STATUS_SUCCESS; } static NTSTATUS MydrvDispatch (IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) { NTSTATUS status; PIO_STACK_LOCATION irpSp; UNREFERENCED_PARAMETER( DeviceObject ); irpSp = IoGetCurrentIrpStackLocation( Irp ); switch (irpSp->MajorFunction) { case IRP_MJ_CREATE: DbgPrint("Hello World!\n"); Irp->IoStatus.Status = STATUS_SUCCESS; Irp->IoStatus.Information = 0L; break; case IRP_MJ_CLOSE: Irp->IoStatus.Status = STATUS_SUCCESS; Irp->IoStatus.Information = 0L; break; } IoCompleteRequest( Irp, 0 ); return STATUS_SUCCESS; } VOID DriverUnload (IN PDRIVER_OBJECT pDriverObject) { UNICODE_STRING nameString; RtlInitUnicodeString( &nameString, L"\\??\\HelloWorld" ); IoDeleteSymbolicLink(&nameString); IoDeleteDevice(pDriverObject->DeviceObject); return; } 可就是每次编译后再安装都必须重新启动机器,太麻烦,请大家帮我看看 这个程序如何改进,才能实现你们说的动态卸载,不用总是启动机器! 再顺便请教个问题,在softice中怎么输出驱动中的调试信息,象DbgPrint("DriverEntry\n")这样的,我是用check编译的,加载 了nms! 谢谢!! |
|
9楼#
发布于:2004-08-26 18:27
不好意思,字打错了,应是"我现在没有什么硬件用来--测试--驱动"
|
|
10楼#
发布于:2004-08-27 13:05
如何才能不重新启动机器就可以调试驱动?
楼上的代码如何改才可以! 谢谢!! |
|