前段时间看一个很早前写的驱动,发现对双向链表的操作还有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);