2534|2

67

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

windows驱动开发菜鸟问:如何停止驱动 [复制链接]

我刚学习驱动程序的开发,编译好以后用DriverStudio的DriverMonitor加载,可是停不掉,不得已重启系统。请问有什么方法可以在不重启系统情况下把驱动停止?谢谢!下面是驱动代码,系统是xp sp2。



  1. #define NTNAME_STRING     L"\\device\\test_driver1"
  2. #define WIN32NAME_STRING  L"\\dosdevices\\test_driver1"

  3. VOID
  4. test_driver1Unload(PDRIVER_OBJECT pdriver_object)
  5. {
  6.   PDEVICE_OBJECT pdevice_object ;
  7.   UNICODE_STRING win32_name ;

  8.   PAGED_CODE();

  9.   RtlInitUnicodeString(&win32_name,WIN32NAME_STRING);
  10.   IoDeleteSymbolicLink(&win32_name);

  11.   pdevice_object = pdriver_object->DeviceObject ;
  12.   if(pdevice_object!=NULL)
  13.     IoDeleteDevice(pdevice_object);
  14. }

  15. NTSTATUS
  16. test_driver1CreateClose(__in PDEVICE_OBJECT pdevice_object,
  17.                          __in PIRP pirp)
  18. {
  19.   PIO_STACK_LOCATION psLocation  ;

  20.   PAGED_CODE();

  21.   psLocation = IoGetCurrentIrpStackLocation(pirp);
  22.   if(psLocation->MajorFunction==IRP_MJ_CREATE ||
  23.      psLocation->MajorFunction==IRP_MJ_CLOSE)
  24.   {
  25.     pirp->IoStatus.Status      = STATUS_SUCCESS;
  26.     pirp->IoStatus.Information = 0 ;
  27.     IoCompleteRequest(pirp, IO_NO_INCREMENT) ;
  28.   }
  29.   else
  30.   {
  31.     DbgPrint("\nInvalid major function code in test_driver1CreateClose\n") ;
  32.     return STATUS_NOT_IMPLEMENTED ;
  33.   }

  34.   return STATUS_SUCCESS ;
  35. }

  36. NTSTATUS
  37. test_driver1DeviceControl(__in PDEVICE_OBJECT pdevice_object,
  38.                            __in PIRP pirp)
  39. {
  40.   PIO_STACK_LOCATION psLocate ;
  41.   PCHAR inbuf, outbuf, str = "driver replies" ;
  42.   ULONG len ;

  43.   PAGED_CODE();

  44.   psLocate = IoGetCurrentIrpStackLocation(pirp);
  45.   if(psLocate->Parameters.DeviceIoControl.IoControlCode==BUFFER_METHOD_0)
  46.   {
  47.     len    = psLocate->Parameters.DeviceIoControl.InputBufferLength ;
  48.     inbuf  = pirp->AssociatedIrp.SystemBuffer ;
  49.     outbuf = pirp->AssociatedIrp.SystemBuffer ;
  50.     RtlCopyBytes(outbuf,str,strlen(str)+1) ;   
  51.     pirp->IoStatus.Information = len ;
  52.     pirp->IoStatus.Status = STATUS_SUCCESS ;
  53.     IoCompleteRequest(pirp, IO_NO_INCREMENT) ;
  54.     return STATUS_SUCCESS ;
  55.   }
  56.   else
  57.   {
  58.     DbgPrint("\ninvalid Io control parameter in test_driver1DeviceControl\n") ;
  59.     return STATUS_INVALID_PARAMETER ;
  60.   }
  61.   
  62. }

  63. NTSTATUS
  64. DriverEntry(__in PDRIVER_OBJECT pdriver_object,
  65.              __in PUNICODE_STRING pregistry_path)
  66. {
  67.   /*driver returned status*/
  68.   NTSTATUS status = STATUS_SUCCESS;

  69.   PDEVICE_OBJECT pdevice_object ;
  70.   UNICODE_STRING nt_name, win32_name ;
  71.   RtlInitUnicodeString(&nt_name, NTNAME_STRING) ;

  72.   status = IoCreateDevice(pdriver_object,
  73.                           0,
  74.                           &nt_name,
  75.                           FILE_DEVICE_UNKNOWN,
  76.                           FILE_DEVICE_SECURE_OPEN,
  77.                           FALSE,
  78.                           &pdevice_object
  79.                           ) ;
  80.   if(status != STATUS_SUCCESS ) {
  81.     DbgPrint("\nIoCreateDevice failed with 0x%x\n", status) ;
  82.     return status ;
  83.   }

  84.   pdriver_object->MajorFunction[IRP_MJ_DEVICE_CONTROL] = test_driver1DeviceControl ;
  85.   pdriver_object->MajorFunction[IRP_MJ_CREATE]         = test_driver1CreateClose ;
  86.   pdriver_object->MajorFunction[IRP_MJ_CLOSE]          = test_driver1CreateClose ;

  87.   RtlInitUnicodeString(&win32_name, WIN32NAME_STRING) ;

  88.   status  = IoCreateSymbolicLink(&win32_name, &nt_name) ;
  89.   if(!NT_SUCCESS(status)) {
  90.     DbgPrint("IoCreateSymbolicLink failed with 0x%x",status);
  91.     return status ;
  92.   }

  93.   return status ;  
  94. }
复制代码

最新回复

谢谢楼上的朋友,原来是漏掉了unload的回调。谢谢!结帖。  详情 回复 发表于 2008-7-4 08:42
点赞 关注

回复
举报

75

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
DriverEntry中加入:
pdriver_object->DriverUnload = test_driver1Unload;
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
谢谢楼上的朋友,原来是漏掉了unload的回调。谢谢!结帖。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表