Windows核心中使用List連結串列來模擬FIFO操作
阿新 • • 發佈:2019-02-10
驅動程式經常操縱硬體,經常使用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來模擬佇列,都是很好的選擇。