partime
驱动牛犊
驱动牛犊
  • 注册日期2002-02-27
  • 最后登录2009-11-09
  • 粉丝0
  • 关注0
  • 积分211分
  • 威望61点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
阅读:1397回复:1

驱动中的双向链表管理问题

楼主#
更多 发布于:2007-09-07 18:29
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成为了一个无效地址
请问以上双向链表管理代码何处有问题?该如何修正?
zjan521
驱动牛犊
驱动牛犊
  • 注册日期2002-10-02
  • 最后登录2010-07-20
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望91点
  • 贡献值0点
  • 好评度74点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-09-10 17:49
while(pTempTransInfo != NULL)

pTempTransInfo 是啥东西?
游客

返回顶部