« 利用0day在win7下从user权限提升到system权限演示千岛湖归来 »

双向链表的添加、查找、删除算法

前段时间看一个很早前写的驱动,发现对双向链表的操作还有BUG,删除时会蓝屏,修正了一下,把修正后的代码贴出来,方便日后使用前直接复制,大牛不用看了。

 
 
typedef struct _FILELIST
{
     LIST_ENTRY ListEntry;
     WCHAR wFilePath[260];
}FILELIST,*PFILELIST;
FILELIST g_FileListHeader;
FAST_MUTEX g_FileListMutex;
 
 
//查找
BOOLEAN bIsInFileList(CONST WCHAR *wFilePath)
{
     BOOLEAN retval=FALSE;
     FILELIST *pFileList;
 
    
     ExAcquireFastMutex(&g_FileListMutex);
     pFileList=(FILELIST *)g_FileListHeader.ListEntry.Blink;
     while(pFileList!=(FILELIST *)&g_FileListHeader.ListEntry)
     {
         if(_wcsicmp(pFileList->wFilePath,wFilePath)==0)
         {
              retval=TRUE;
              break;
         }
         pFileList=(FILELIST *)pFileList->ListEntry.Blink;
     }
     ExReleaseFastMutex(&g_FileListMutex);
     return retval;
}
//添加
BOOLEAN AddFileList(CONST WCHAR *wFilePath)
{
     FILELIST *pFileList;
    
     if(wcslen(wFilePath)>=260)
         return FALSE;
 
     if(bIsInFileList(wFilePath))
         return TRUE;
 
     pFileList=ExAllocatePoolWithTag(NonPagedPool,sizeof(FILELIST),POOL_TAG);
     if(!pFileList)
         return FALSE;
 
     wcscpy(pFileList->wFilePath,wFilePath);
     ExAcquireFastMutex(&g_FileListMutex);
     InsertTailList(&g_FileListHeader.ListEntry,&pFileList->ListEntry);
     ExReleaseFastMutex(&g_FileListMutex);
     return TRUE;
}
//删除结点
BOOLEAN DeleteFileList(CONST WCHAR *wFilePath)
{
     BOOLEAN retval=FALSE;
     FILELIST *pFileList;
 
     ExAcquireFastMutex(&g_FileListMutex);
     pFileList=(FILELIST *)g_FileListHeader.ListEntry.Blink;
     while(pFileList!=(FILELIST *)&g_FileListHeader.ListEntry)
     {
         if(_wcsicmp(pFileList->wFilePath,wFilePath)==0)
         {
              retval=TRUE;
              RemoveEntryList(&pFileList->ListEntry);
              ExFreePoolWithTag(pFileList,POOL_TAG);
              break;
         }
         pFileList=(FILELIST *)pFileList->ListEntry.Blink;
     }
     ExReleaseFastMutex(&g_FileListMutex);
     return retval;
}
//清空
BOOLEAN ClearFileList()
{
     LIST_ENTRY *pFileList;
 
     ExAcquireFastMutex(&g_FileListMutex);
     while(g_FileListHeader.ListEntry.Blink!=&g_FileListHeader.ListEntry)
     {
         pFileList=RemoveTailList(&g_FileListHeader.ListEntry);
         ExFreePoolWithTag(pFileList,POOL_TAG);
     }
     ExReleaseFastMutex(&g_FileListMutex);
     return TRUE;
}
 
 
//创建 初始化
InitializeListHead(&g_FileListHeader);
 

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

日历

最新评论及回复

最近发表

Powered By Z-Blog 2.0 bate Build Theme by toboku

Copyright langouster. Some Rights Reserved.   苏ICP备06046736号