阅读:1589回复:3
我写的关于SurpriseRemoval的code,一加载就重启,大虾看看是什么原因,谢谢
case IRP_MN_QUERY_CAPABILITIES:
{ D12_KdPrint (("D12TEST.SYS: IRP_MN_QUERY_CAPABILITIES\n")); irpStack->Parameters.DeviceCapabilities.Capabilities->SurpriseRemovalOK = TRUE; irpStack->Parameters.DeviceCapabilities.Capabilities->Removable=TRUE; irpStack->Parameters.DeviceCapabilities.Capabilities->EjectSupported=TRUE; irpStack->Parameters.DeviceCapabilities.Capabilities->WarmEjectSupported=TRUE; deviceCapabilities = irpStack->Parameters.DeviceCapabilities.Capabilities; if(deviceCapabilities->Version != 1 || deviceCapabilities->Size < sizeof(DEVICE_CAPABILITIES)) { // // We don't support this version. Fail the requests // ntStatus = STATUS_UNSUCCESSFUL; break; } if (!IoIsWdmVersionAvailable(1, 0x20) /* & this is a for USB device */) { IoCopyCurrentIrpStackLocationToNext(Irp); ntStatus = IoCallDriver(stackDeviceObject, Irp); } if (NT_SUCCESS (ntStatus) ) { irpStack->Parameters.DeviceCapabilities.Capabilities->SurpriseRemovalOK = TRUE; irpStack->Parameters.DeviceCapabilities.Capabilities->Removable=TRUE; irpStack->Parameters.DeviceCapabilities.Capabilities->EjectSupported=TRUE; irpStack->Parameters.DeviceCapabilities.Capabilities->WarmEjectSupported=TRUE; } goto D12_Dispatch_Done; } 问题好像就是出在NT_SUCCESS (ntStatus)之后 到底什么原因啊? |
|
沙发#
发布于:2004-09-13 16:28
case IRP_MN_QUERY_CAPABILITIES:
{ pdc = irpStack->Parameters.DeviceCapabilities.Capabilities; if(pdc->Version<1 || pdc->Size<sizeof(DEVICE_CAPABILITIES)) { ntStatus = STATUS_UNSUCCESSFUL; return ntStatus; } pdc->SurpriseRemovalOK = TRUE; pdc->Removable = TRUE; pdc->EjectSupported=TRUE; pdc->WarmEjectSupported=TRUE; Irp->IoStatus.Status = STATUS_SUCCESS; } goto D12_Dispatch_CompleteRequest; break; |
|
板凳#
发布于:2004-09-13 17:51
这一段代码的目的是去掉USB外设接入主机后产生的托盘按钮
刚开始也是这样想的,认为一次赋值就可以了 但存在一个问题 最后解决掉了 我的毕业论文里这样写到: I/O请求包IRP_MN_QUERY_CAPABILITIES在设备已经被枚举但是功能与过滤驱动程序加载之前被即插即用管理器发送给总线驱动程序,总线驱动初始化结构体DEVICE_CAPABILITIES并将该结构体返回给即插即用管理器;当设备栈已经建立起来并且上层驱动程序也已经加载成功之后,即插即用管理器又一次发出该I/O请求包,此时首先由上层驱动程序处理该请求包并将处理后的结果向下层传递,从而确定该设备的某些特征。 可以看出,必须两次赋值才能够达到这一目的,当时代码这么写就是看到坛子上有人提出的建议 原来这段代码没有问题 只是驱动程序整体上的加锁和解锁没有处理好 我是新手 你觉着我说的哪儿不对就指出来 谢谢啦 :) |
|
地板#
发布于:2004-09-13 17:57
还有我觉得一次也可以
直接把赋值放在IoCallDriver(stackDeviceObject, Irp)后面就可以 哦,对了 你的代码里怎么没有向下传递IRP的系统调用? :o |
|