阅读:1641回复:5
请教设备插拔时,Driver执行过程
本人的的一款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哥能指引一下?? 多谢。 |
|
|
沙发#
发布于:2004-09-17 14:52
多著各位
|
|
|
板凳#
发布于:2004-09-17 12:57
补充一点
irpstack是IoGetCurrentIrpStackLocation(Irp);返回的当前 PIO_STACK_LOCATION |
|
|
地板#
发布于: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 } |
|
|
地下室#
发布于:2004-09-16 15:44
在case IRP_MN_QUERY_CAPABILITIES: 我曾在函数的 HandleQueryCapabilities(。。) { 。。。 IoSetCompletionRoutine(Irp, (PIO_COMPLETION_ROUTINE)CompletionRoutine,(PVOID)&event, TRUE , TRUE, TRUE); IoCallDriver(deviceExtension->TopOfStackDeviceObject,Irp); 。。。 } 之后重新设置过该值,还是不行。 另外也试过在CompletionRoutine中设置该值,结果驱动重新安装的时候就死机了。呵呵 我再试试看吧,多谢。 刚刚接触,觉得驱动非常难于调试。 |
|
|
5楼#
发布于:2004-09-16 15:36
在case IRP_MN_QUERY_CAPABILITIES:
{//先下传 //在设置你的那个参数=1; } 具体的你可以收一下原来的帖子,讲到过 |
|