kb219
驱动牛犊
驱动牛犊
  • 注册日期2004-08-17
  • 最后登录2008-06-19
  • 粉丝0
  • 关注0
  • 积分208分
  • 威望22点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
阅读:3887回复:4

有关 IRP_MN_QUERY_DEVICE_RELATIONS 的问题,急待。

楼主#
更多 发布于:2005-04-14 18:19
小弟也做了一个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]
aiwadgj
驱动老牛
驱动老牛
  • 注册日期2004-11-13
  • 最后登录2020-12-24
  • 粉丝0
  • 关注0
  • 积分119分
  • 威望84点
  • 贡献值0点
  • 好评度14点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2005-04-14 18:42
看有的资料说。。。这个功能码应该有底层总线处理的吧。。。。。

你把它直接传递到底层驱动试试如何。。。。。
酒也在沉溺,何时麻醉我抑郁。过去了的一切会平息。。。。。。。
kb219
驱动牛犊
驱动牛犊
  • 注册日期2004-08-17
  • 最后登录2008-06-19
  • 粉丝0
  • 关注0
  • 积分208分
  • 威望22点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-04-15 08:23
如果直接传递到底层驱动的话,返回值是 0xBB-STATUS_NOT_SUPPORTED。

会不会是我的驱动和总线没有衔接好哪?

是否在inf文件中要做一些修改哪?我原来的inf文件没有提及serenum.sys。
kb219
驱动牛犊
驱动牛犊
  • 注册日期2004-08-17
  • 最后登录2008-06-19
  • 粉丝0
  • 关注0
  • 积分208分
  • 威望22点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-04-18 12:54
收队。
aiwadgj
驱动老牛
驱动老牛
  • 注册日期2004-11-13
  • 最后登录2020-12-24
  • 粉丝0
  • 关注0
  • 积分119分
  • 威望84点
  • 贡献值0点
  • 好评度14点
  • 原创分0分
  • 专家分0分
  • 社区居民
地下室#
发布于:2005-04-18 14:32
如果直接传递到底层驱动的话,返回值是 0xBB-STATUS_NOT_SUPPORTED。

会不会是我的驱动和总线没有衔接好哪?

是否在inf文件中要做一些修改哪?我原来的inf文件没有提及serenum.sys。


这个我就不是很清楚了。。。INF没有必要修改吧。。。

反正一般的,,这个例程用于枚举设备,,,由总线驱动处理的。
酒也在沉溺,何时麻醉我抑郁。过去了的一切会平息。。。。。。。
游客

返回顶部