typez
驱动牛犊
驱动牛犊
  • 注册日期2005-09-13
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望11点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1163回复:0

TDI 过滤驱动中IRP处理的问题

楼主#
更多 发布于:2009-08-12 12:24
本人在处理TDI_CONNECT的IRP时候出了问题,哪位大侠能帮忙看看,谢谢!

在TDI_CONNECT的DISPATCHER例程中

       WorkItem = ExAllocatePoolWithTag(......);
    IoCopyCurrentIrpStackLocationToNext(Irp);
    IoSetCompletionRoutine(
        Irp,
        TdiConnectComplete,
        WorkItem,
        TRUE,
        TRUE,
        TRUE);

    Status = IoCallDriver(DeviceExtension->LowerDeviceObject, Irp);
    return Status;

在完成例程中

    ExInterlockedInsertTailList(......);  // 将workitem放入到一个post processing 队列中
    KeSetEvent(&QueueEvent, IO_NO_INCREMENT, FALSE);  // 设置队列事件对象

    return STATUS_MORE_PROCESSING_REQUIRED;

在自己开的处理线程中
        dequeue(workitem);

    IoCompleteRequest(Irp, IO_NO_INCREMENT);   // complete irp
    ExFreePoolWithTag(......);  // free workitem

然后我写了一个小程序来测试。发觉目标ip能够连接成功的情况下,connect能正常返回。但是
在连不通的情况下,就死在connect函数那儿了。。。

还有,对于连接成功的情况下,如果我做了一些额外处理,这些处理返回了失败。
我想让原始的IRP也失败,因此设置了Irp->IoStatus.Status = xxx(失败代码),
再调用IoComplete,然后也不行了。。。






游客

返回顶部