阅读:1397回复:1
驱动中的双向链表管理问题
typedef struct _LinkItem
{ PFILE_OBJECT *pFileObject; .............. _LinkItem *pNext; _LinkItem *pPrev; }LINKITEM,*PLINKITEM; //Global Variables KSPIN_LOCK g_LinkLock; PLINKITEM g_LinkHead; NTSTATUS InitGlobalVariables() { .............. g_LinkHead = NULL; KeInitializeSpinLock(&g_LinkLock); return STATUS_SUCCESS; } PLINKITEM FindLinkItemByFileObject(PFILE_OBJECT pFileObject,KIRQL *Irql) { PLINKITEM pLinkItem = NULL; PLINKITEM pTempLinkItem; if(NULL != pFileObject) { if(NULL != Irql) KeAcquireSpinLock(&g_LinkLock, Irql); pTempLinkItem = g_LinkHead; while(pTempTransInfo != NULL) { if(pTempLinkItem->pFileObject == pFileObject)//蓝屏 { pLinkItem = pTempLinkItem; break; } pTempLinkItem = pTempLinkItem->pNext; } if(NULL != Irql) KeReleaseSpinLock(&g_LinkLock, *Irql); } return pLinkItem; } void RemoveLinkItem(PLINKITEM pLinkItem,KIRQL *Irql) { DbgPrint("RemoveTransInfo"); if(pLinkItem != NULL) { if(NULL != Irql) KeAcquireSpinLock(&g_LinkLock, Irql); if(pLinkItem->pNext != NULL) pLinkItem->pNext->pPrev = pLinkItem->pPrev; if(pTransInfo->pPrev != NULL) ppLinkItem->pPrev->pNext = pLinkItem->pNext; if(pLinkItem == g_LinkHead) g_LinkHead = g_LinkHead->pNext; ExFreePool(pLinkItem); if(NULL != Irql) KeReleaseSpinLock(&g_LinkLock, *Irql); } } PLINKITEM NewTransInfo(PFILE_OBJECT pFileObject,KIRQL *Irql) { PLINKITEM pLinkItem = NULL; pLinkItem = (PLINKITEM)ExAllocatePoolWithTag(NonPagedPool, (sizeof(LINKITEM)), MEM_TAG); if(pLinkItem != NULL) { memset(pLinkItem,0,sizeof(LINKITEM)); pLinkItem->pFileObject = pFileObject; pLinkItem->pPrev = NULL; KeAcquireSpinLock(&g_LinkLock, Irql); pLinkItem->pNext = g_TransInfoHead; if(NULL != g_LinkHead) g_LinkHead->pPrev = pLinkItem; g_TransInfoHead = pLinkItem; KeReleaseSpinLock(&g_LinkLock, *Irql); } return pLinkItem; } 以上代码为驱动中的双向链表管理代码 实际运行一段时间后蓝屏,根据蓝屏错误指示,发生错误位置在 FindLinkItemByFileObject(PFILE_OBJECT pFileObject,KIRQL *Irql) { ....... if(pTempLinkItem->pFileObject == pFileObject)//蓝屏 根据蓝屏信息指示,此时的pTempLinkItem成为了一个无效地址 请问以上双向链表管理代码何处有问题?该如何修正? |
|
沙发#
发布于:2007-09-10 17:49
while(pTempTransInfo != NULL)
pTempTransInfo 是啥东西? |
|