`
yexin218
  • 浏览: 970865 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
社区版块
存档分类
最新评论

疑问:关于内存释放

阅读更多

今天碰到一个比较棘手的内存处理问题。

首先来看一个数据结构:

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那一块资源呢?不得而知!!望知道的指点一二。

 

网上有人回复说:

写道
用全局变量去保存那些指针不就得了,一个不够就用全局指针链表
 我觉得倒是不错的主意

2
4
分享到:
评论
Global site tag (gtag.js) - Google Analytics