yexin218
驱动牛犊
驱动牛犊
  • 注册日期2008-02-22
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分72分
  • 威望384点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
阅读:1922回复:2

关于内存释放

楼主#
更多 发布于:2010-04-12 21:44
今天碰到一个比较棘手的内存处理问题。
首先来看一个数据结构:
typedef struct _IRP_AND_FILTER
{
   PIRP            pIrp;
   PMS_FILTER      pFilter;
   ULONG           OutputBufferLength;
}IrpAndFilter, *PIrpAndFilter;

其中pIrp是一个IRP指针,pFilter指的是一个Filter Driver的实例,最后一个数字式OutputBuffer的长度。接着看代码:
pIrpFilter = (PIrpAndFilter)NdisAllocateMemoryWithTagPriority(pFilter->FilterHandle,sizeof(IrpAndFilter),FILTER_ALLOC_TAG, LowPoolPriority);

        if(pIrpFilter != NULL)

这里为这个结构分配了一个size为sizeof(IrpAndFilter)的空间。谁分配,谁释放的原则告诉我们等资源不再使用的时候需要释放。现在的问题是:pIrp在内核的调度函数执行完毕,调用IoCompleteRequest(pIrp, IO_NO_INCREMENT);之后仍然不能释放,因为里面还有一个OutputBuffer的数据需要传递给User层,而且估计会在程序关闭时 Cleanup,释放这些资源。然后是pFilter这个是指向Filter实例的指针,用完也不能释放,因为其他部分程序会使用到,而且最后程序在 FilterDetach()释放该资源,现在只剩下OutputBufferLength,这个用完就可以释放了。所以纠结的是现在这个资源怎么办啊?接着看这个资源是如何使用的:
Status = PsCreateSystemThread(&threadHandle,
                                      THREAD_ALL_ACCESS,
                                      NULL,
                                      NULL,
                                      NULL,
                                      (PKSTART_ROUTINE) sendMyOwnPacketThread,
                                      pIrpFilter
                                     );

 以线程的方式传给sendMyOwnPacketThread函数,然后:
VOID
sendMyOwnPacketThread(
    IN PIrpAndFilter                 pIrpAndFilter
)
{
    NTSTATUS                    Status;
//拿到这些资源
   pFilter = (PMS_FILTER)pIrpAndFilter->pFilter;//get current filter instance
    pIrp =  (PIRP)pIrpAndFilter->pIrp;//get current IPR
    OutputBuffer = (PUCHAR)pIrp->AssociatedIrp.SystemBuffer;
    OutputBufferLength = (ULONG)pIrpAndFilter->OutputBufferLength;
//使用资源

//结束前
 pIrp->IoStatus.Status = Status;
    pIrp->IoStatus.Information = bufSize;
    IoCompleteRequest(pIrp, IO_NO_INCREMENT);
    PsTerminateSystemThread(STATUS_SUCCESS);//end the thread
//是否释放资源
//NdisFreeMemory(pIrpAndFilter,sizeof(IrpAndFilter),0);
}

 我测试过了,释放资源有问题,就如前面说的,两个指针都不能释放,这下就傻眼了,没有释放,程序倒是正常执行,释放反而错了。我知道那两个资源不能在这里释放,可是我Allocate一块空间了,难道就这样了...还是至少要释放ULONG那一块资源呢?不得而知!!望知道的指点一二。
zhangguangkai
驱动牛犊
驱动牛犊
  • 注册日期2008-09-06
  • 最后登录2010-10-30
  • 粉丝0
  • 关注0
  • 积分39分
  • 威望336点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2010-04-13 18:22
用全局变量去保存那些指针不就得了,一个不够就用全局指针链表
yexin218
驱动牛犊
驱动牛犊
  • 注册日期2008-02-22
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分72分
  • 威望384点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2010-04-13 19:08
引用第1楼zhangguangkai于2010-04-13 18:22发表的  :
用全局变量去保存那些指针不就得了,一个不够就用全局指针链表

好像有几分道理
游客

返回顶部