Ice_Bin
驱动牛犊
驱动牛犊
  • 注册日期2002-02-25
  • 最后登录2004-01-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2692回复:1

完成例程的问题(Irp->PendingReturned到底因该怎么处理?)

楼主#
更多 发布于:2003-07-20 10:08
这是我将一buffer传给完成例程
*nextIrpStack = *currentIrpStack;
IoSetCompletionRoutine(Irp, IKWriteFileComplete,inbuffer, TRUE,TRUE,TRUE);

这是我的完成例程

NTSTATUS
IKWriteFileComplete(
    PDEVICE_OBJECT DeviceObject,
    PIRP Irp,
    PVOID Context
    )
{
    PIO_STACK_LOCATION  myIrpSp=IoGetCurrentIrpStackLocation( Irp );
    ULONG length=myIrpSp->Parameters.Write.Length;

          。。。
    RtlZeroMemory(getbuffer,length);
    RtlCopyMemory(getbuffer,Context,length);
    ExFreePool(Context);

    if(Irp->PendingReturned)
    {
        IoMarkIrpPending(Irp);
        return STATUS_SUCCESS;
    }
    return STATUS_SUCCESS;
}

在完成例程里面取得inbuffer然后进行处理,处理完了后free它
但是居然有的时候free它的时候居然产生了bad pool call,怎么会这样?

哪位大虾能不能解释清楚一点Irp->PendingReturned的处理过程?
也就是完成例程的处理过程。

谢谢!
好好学习 天天向上
lu0
lu0
论坛版主
论坛版主
  • 注册日期2001-06-10
  • 最后登录2016-04-05
  • 粉丝2
  • 关注0
  • 积分-6311分
  • 威望21111点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-07-29 09:50
 在COMPLETION ROUTINE被调用时刻, MEMORY可能已经被UNLOCK. IRP可能被改动, 有N种状况. 不是有一定的规则的. 你的代码没有贴全, 无法看到问题所在.
Regards, Lu Lin Webmaster of Inside Programming http://www.lu0s1.com
游客

返回顶部