revival
驱动牛犊
驱动牛犊
  • 注册日期2004-07-01
  • 最后登录2010-08-04
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望2点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
阅读:1641回复:5

请教设备插拔时,Driver执行过程

楼主#
更多 发布于:2004-09-16 10:58
本人的的一款USB设备。本来想在拔出USB线时不显示意外拔出的对话框,昨天来逛了一圈,找到了一些主题。以为在QueryCapabilities时将设备性能的SurpriseRemovalOK = 1即可。
我的程序是在AddDevice中即获得设备性能的,
NTSTATUS
HandlePnPAddDevice(
    IN PDRIVER_OBJECT DriverObject,
    IN PDEVICE_OBJECT PhysicalDeviceObject
    )
...
QueryCapabilities(deviceExtension->TopOfStackDeviceObject,
                                 &deviceExtension->DeviceCapabilities);
... //此处观察已有deviceExtension->DeviceCapabilities.SurpriseRemovalOK = 1;
}

并且在PnP的Dispath函数中对IRP_MN_QUERY_CAPABILITIES没再作处理,只是输出此时deviceExtension->DeviceCapabilities.SurpriseRemovalOK的值
    switch (irpStack->MinorFunction) {
         。。。
    case IRP_MN_QUERY_CAPABILITIES:
           DbgPrint("SurpriseRemoval",deviceExtension->DeviceCapabilities.SurpriseRemovalOK)
        . . .
}

随后发现这样做仍会弹出意外删除的对话框。

我进一步想看看拔电缆的过程,发现程序并不会走到上面minorFunction中对IRP_MN_SURPRISE_REMOVAL的处理代码中,只是走到了IRP_MN_REMOVE_DEVICE。这和我一开始的理解不太一样。呵呵

我是新手,刚接触不久,那位niu哥能指引一下??
多谢。
新手上路
revival
驱动牛犊
驱动牛犊
  • 注册日期2004-07-01
  • 最后登录2010-08-04
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望2点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-09-17 14:52
多著各位
新手上路
wxy0126
驱动牛犊
驱动牛犊
  • 注册日期2002-11-22
  • 最后登录2004-11-01
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-09-17 12:57
补充一点
irpstack是IoGetCurrentIrpStackLocation(Irp);返回的当前
PIO_STACK_LOCATION
学并快乐着
wxy0126
驱动牛犊
驱动牛犊
  • 注册日期2002-11-22
  • 最后登录2004-11-01
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-09-17 12:54
在IRP_MN_QUERY_CAPABILITIES:处理中这样写:
{
 PDEVICE_CAPABILITIES pCapabilities = irpStack->Parameters.DeviceCapabilities.Capabilities;
ASSERT(pCapabilities->Version >= 1);
IoSkipCurrentIrpStackLocation (Irp);
pCapabilities->SurpriseRemovalOK = TRUE;
ntStatus = IoCallDriver (deviceExtension->TopOfStackDeviceObject, Irp);
//如果不想显示意外删除提示框,设为true
    pCapabilities->SurpriseRemovalOK = TRUE;
........................//io处理数减1
}
学并快乐着
revival
驱动牛犊
驱动牛犊
  • 注册日期2004-07-01
  • 最后登录2010-08-04
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望2点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-09-16 15:44
 
在case IRP_MN_QUERY_CAPABILITIES:
{//先下传
//在设置你的那个参数=1;
}
具体的你可以收一下原来的帖子,讲到过


我曾在函数的
HandleQueryCapabilities(。。)
{
。。。
IoSetCompletionRoutine(Irp, (PIO_COMPLETION_ROUTINE)CompletionRoutine,(PVOID)&event, TRUE , TRUE, TRUE);
IoCallDriver(deviceExtension->TopOfStackDeviceObject,Irp);
。。。
}
之后重新设置过该值,还是不行。
另外也试过在CompletionRoutine中设置该值,结果驱动重新安装的时候就死机了。呵呵

我再试试看吧,多谢。
刚刚接触,觉得驱动非常难于调试。
新手上路
qifeng8
驱动小牛
驱动小牛
  • 注册日期2003-08-26
  • 最后登录2013-01-31
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望80点
  • 贡献值0点
  • 好评度21点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-09-16 15:36
在case IRP_MN_QUERY_CAPABILITIES:
{//先下传
//在设置你的那个参数=1;
}
具体的你可以收一下原来的帖子,讲到过
游客

返回顶部