helin
驱动牛犊
驱动牛犊
  • 注册日期2004-03-23
  • 最后登录2004-09-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1591回复:3

我写的关于SurpriseRemoval的code,一加载就重启,大虾看看是什么原因,谢谢

楼主#
更多 发布于:2004-03-29 20:08
        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)之后
到底什么原因啊?
helin
驱动牛犊
驱动牛犊
  • 注册日期2004-03-23
  • 最后登录2004-09-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-09-13 17:57
还有我觉得一次也可以
直接把赋值放在IoCallDriver(stackDeviceObject, Irp)后面就可以
哦,对了
你的代码里怎么没有向下传递IRP的系统调用? :o
helin
驱动牛犊
驱动牛犊
  • 注册日期2004-03-23
  • 最后登录2004-09-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-09-13 17:51
这一段代码的目的是去掉USB外设接入主机后产生的托盘按钮
刚开始也是这样想的,认为一次赋值就可以了
但存在一个问题
最后解决掉了
我的毕业论文里这样写到:
I/O请求包IRP_MN_QUERY_CAPABILITIES在设备已经被枚举但是功能与过滤驱动程序加载之前被即插即用管理器发送给总线驱动程序,总线驱动初始化结构体DEVICE_CAPABILITIES并将该结构体返回给即插即用管理器;当设备栈已经建立起来并且上层驱动程序也已经加载成功之后,即插即用管理器又一次发出该I/O请求包,此时首先由上层驱动程序处理该请求包并将处理后的结果向下层传递,从而确定该设备的某些特征。
可以看出,必须两次赋值才能够达到这一目的,当时代码这么写就是看到坛子上有人提出的建议
原来这段代码没有问题
只是驱动程序整体上的加锁和解锁没有处理好
我是新手
你觉着我说的哪儿不对就指出来
谢谢啦 :)
qifeng8
驱动小牛
驱动小牛
  • 注册日期2003-08-26
  • 最后登录2013-01-31
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望80点
  • 贡献值0点
  • 好评度21点
  • 原创分0分
  • 专家分0分
地板#
发布于: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;
游客

返回顶部