阅读:3887回复:4
有关 IRP_MN_QUERY_DEVICE_RELATIONS 的问题,急待。
小弟也做了一个USB 232 的驱动, 一些串口应用软件已经可以正常运行了,但是却又遇到这样一个问题,请大家帮一下忙。
用我的虚拟串口连modem后,安装的时候搜索硬件时找不到modem设备。我用Dbgview查看之后发现,是因为我没处理下面这个IRP。 我现在的想法是首先把modem的信息读出来;然后在IRP_MN_QUERY_DEVICE_RELATIONS里面,添加一个新设备;以后再在后续的pnp询问中逐个返回modem信息。 可是我在第一步就卡住了! case IRP_MN_QUERY_DEVICE_RELATIONS: switch (irpStack->Parameters.QueryDeviceRelations.Type) { case BusRelations: { 。。。 status = IoCreateDevice(pDEx->Self->DriverObject, sizeof(PDEVICE_EXTENSION), &pdoUniName, FILE_DEVICE_UNKNOWN, FILE_AUTOGENERATED_DEVICE_NAME, FALSE, &pdo); 这步成功。。。pDEx->AttachedPDO = pdo... i = (0 == Irp->IoStatus.Information) ? 0 :((PDEVICE_RELATIONS) Irp->IoStatus.Information)->Count; // The current number of PDOs in the device relations structure length = sizeof(DEVICE_RELATIONS) + ((pDEx->NumPDOs + i) * sizeof (PDEVICE_OBJECT)); relations = (PDEVICE_RELATIONS) ExAllocatePool (NonPagedPool, length); if (NULL == relations) { Irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES; IoCompleteRequest(Irp, IO_NO_INCREMENT); return STATUS_INSUFFICIENT_RESOURCES; } // // Copy in the device objects so far // if (i) { RtlCopyMemory ( relations->Objects, ((PDEVICE_RELATIONS) Irp->IoStatus.Information)->Objects, i * sizeof (PDEVICE_OBJECT)); } relations->Count = pDEx->NumPDOs + i; // // For each PDO on this bus add a pointer to the device relations // buffer, being sure to take out a reference to that object. // The PlugPlay system will dereference the object when it is done with // it and free the device relations buffer. // if (pDEx->NumPDOs) { relations->Objects[relations->Count-1] = pDEx->AttachedPDO; ObReferenceObject (pDEx->AttachedPDO); } // // Set up and pass the IRP further down the stack // Irp->IoStatus.Status = STATUS_SUCCESS; if (0 != Irp->IoStatus.Information) { ExFreePool ((PVOID) Irp->IoStatus.Information); } Irp->IoStatus.Information = (ULONG_PTR)relations; IoSkipCurrentIrpStackLocation (Irp); status = IoCallDriver (pDEx->TopOfStack, Irp); return status; 可是驱动运行到这个地方就重启了。 以上代码基本是照搬DDK例子的,实在想不通,怎么会这样,郁闷ing。 大家帮我看看,代码有什么不妥的地方吗? 还是我的思路就不对? [编辑 - 4/14/05 by kb219] [编辑 - 4/14/05 by kb219] |
|
沙发#
发布于:2005-04-14 18:42
看有的资料说。。。这个功能码应该有底层总线处理的吧。。。。。
你把它直接传递到底层驱动试试如何。。。。。 |
|
|
板凳#
发布于:2005-04-15 08:23
如果直接传递到底层驱动的话,返回值是 0xBB-STATUS_NOT_SUPPORTED。
会不会是我的驱动和总线没有衔接好哪? 是否在inf文件中要做一些修改哪?我原来的inf文件没有提及serenum.sys。 |
|
地板#
发布于:2005-04-18 12:54
收队。
|
|
地下室#
发布于:2005-04-18 14:32
如果直接传递到底层驱动的话,返回值是 0xBB-STATUS_NOT_SUPPORTED。 这个我就不是很清楚了。。。INF没有必要修改吧。。。 反正一般的,,这个例程用于枚举设备,,,由总线驱动处理的。 |
|
|