1. 程式人生 > >Windows核心中使用List連結串列來模擬FIFO操作

Windows核心中使用List連結串列來模擬FIFO操作

驅動程式經常操縱硬體,經常使用FIFO類似的緩衝資料結構,前面一篇文章介紹了使用一個

FIFO的本質是一個佇列,完全可以用核心中的List來實現:

//
//自定義資料結構
//
typedef struct _MYDATASTRUCT 
{
	ULONG number;	
	LIST_ENTRY ListEntry;
} MYDATASTRUCT;

//
//使用雙鏈表模擬FIFO操作
//
#pragma INITCODE
VOID LinkListTest() 
{
	LIST_ENTRY	linkListHead;

	//初始化連結串列和自旋鎖
	InitializeListHead(&linkListHead);


	MYDATASTRUCT *pData = NULL;	
	int i = 0;
	//
	// 模擬FIFO入隊操作
	//		向連結串列的尾部連續插入10個元素
	//
	KdPrint(("開始從隊尾插入資料, sizeof() = %d\n", sizeof(LIST_ENTRY)));
	for (i=0 ; i<10 ; i++)
	{
		pData = (MYDATASTRUCT *)ExAllocatePool(PagedPool,sizeof(MYDATASTRUCT));
		pData->number = i;
		InsertTailList(&linkListHead,&pData->ListEntry);//插入隊尾
	}
	
	
	//
	// 模擬FIFO出隊
	//		從連結串列的頭部出隊
	//
	KdPrint(("開始從對頭出隊資料\n"));
	while(!IsListEmpty(&linkListHead))
	{
		LIST_ENTRY *pEntry = RemoveHeadList(&linkListHead);//從對頭出隊
		pData = CONTAINING_RECORD(pEntry, MYDATASTRUCT, ListEntry);
		KdPrint(("--%d\n", pData->number));
		ExFreePool(pData);
	}
}

2015_09_25編輯:如果在應用層,使用C/C++語言,使用std::queue,std::list來模擬佇列,都是很好的選擇。