worldcup
驱动小牛
驱动小牛
  • 注册日期2004-08-19
  • 最后登录2006-10-19
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1484回复:10

怎样才能不重启机器就可以测试驱动程序?

楼主#
更多 发布于:2004-08-25 12:23
每次编译生成新的sys文件,用控制面板重新安装inf后,就提示要
重启机器,这样调试太麻烦,怎样不重启就可以更新sys文件,使应
用层程序可以测试??

也许我的调试方式不对,大家都是如何调试的,请指教!!
谢谢!!!
bingjie
驱动小牛
驱动小牛
  • 注册日期2001-08-15
  • 最后登录2007-11-29
  • 粉丝0
  • 关注0
  • 积分36分
  • 威望5点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-08-26 10:01
先停用设备,再启用设备
asmsys
驱动老牛
驱动老牛
  • 注册日期2002-03-29
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望17点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-08-26 10:09
2K下好象不行
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
地板#
发布于:2004-08-26 10:43
看你是什么了KMD的基本没问题,WDM的难说,FILE SYSTEM的只能在XP以后动态卸载,在XP以后OS新提供了函数支持。。。。
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
worldcup
驱动小牛
驱动小牛
  • 注册日期2004-08-19
  • 最后登录2006-10-19
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-08-26 11:03
还有,就是用softice调试时,是不是每次编译生成sys后,必须重新
安装一遍驱动(通过添加/删除新硬件),这样softice才可以调试新
的驱动程序,可每安装一次系统都要我重启,太费时间了,难道softice
不能装载新的驱动进行调试?

大家都是如何使用softice,难道也要无数次的启动机器???
没有时间仔细研究softice,请大家谅解!!!
谢谢!
acidfish
驱动小牛
驱动小牛
  • 注册日期2002-05-20
  • 最后登录2009-11-11
  • 粉丝0
  • 关注0
  • 积分21分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-08-26 11:32
需不需要reboot,得看你的驱动程序所驱动的那个PDO是否可以随时卸栽。体现到你的driver层面,就是你的driver是否可以被调用unload例程。一旦系统调用了你的驱动的unload函数,那么你的驱动也就卸载了,这时候你可以简单的把最新的.sys文件覆盖到原来的.sys文件。再想办法启动这个驱动。

据个usb的例子,usb设备联到电脑上以后,驱动加载,当usb拔出以后,驱动就卸载,这时候你把更新后的.sys文件拷贝到system32/drivers里边覆盖原来的.sys,然后再插上usb设备,这时候启动的驱动就是你的最新的驱动。
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
6楼#
发布于:2004-08-26 12:03
需不需要reboot,得看你的驱动程序所驱动的那个PDO是否可以随时卸栽。体现到你的driver层面,就是你的driver是否可以被调用unload例程。一旦系统调用了你的驱动的unload函数,那么你的驱动也就卸载了,这时候你可以简单的把最新的.sys文件覆盖到原来的.sys文件。再想办法启动这个驱动。

据个usb的例子,usb设备联到电脑上以后,驱动加载,当usb拔出以后,驱动就卸载,这时候你把更新后的.sys文件拷贝到system32/drivers里边覆盖原来的.sys,然后再插上usb设备,这时候启动的驱动就是你的最新的驱动。

对必须要能卸载的,不然即使你覆盖了,其实内存中的还是原来的,就只能重新启动了.
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
Sundsea
驱动老牛
驱动老牛
  • 注册日期2003-05-06
  • 最后登录2012-06-05
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望35点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-08-26 12:14
[quote]需不需要reboot,得看你的驱动程序所驱动的那个PDO是否可以随时卸栽。体现到你的driver层面,就是你的driver是否可以被调用unload例程。一旦系统调用了你的驱动的unload函数,那么你的驱动也就卸载了,这时候你可以简单的把最新的.sys文件覆盖到原来的.sys文件。再想办法启动这个驱动。

据个usb的例子,usb设备联到电脑上以后,驱动加载,当usb拔出以后,驱动就卸载,这时候你把更新后的.sys文件拷贝到system32/drivers里边覆盖原来的.sys,然后再插上usb设备,这时候启动的驱动就是你的最新的驱动。

对必须要能卸载的,不然即使你覆盖了,其实内存中的还是原来的,就只能重新启动了. [/quote]

没错,禁用启用设备也是一样的.
worldcup
驱动小牛
驱动小牛
  • 注册日期2004-08-19
  • 最后登录2006-10-19
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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!

谢谢!!
worldcup
驱动小牛
驱动小牛
  • 注册日期2004-08-19
  • 最后登录2006-10-19
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-08-26 18:27
不好意思,字打错了,应是"我现在没有什么硬件用来--测试--驱动"
worldcup
驱动小牛
驱动小牛
  • 注册日期2004-08-19
  • 最后登录2006-10-19
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2004-08-27 13:05
如何才能不重新启动机器就可以调试驱动?
楼上的代码如何改才可以!

谢谢!!
游客

返回顶部