您的位置:首页 > 其它

Windows内核中使用List链表来模拟FIFO操作

2015-04-04 21:25 633 查看
驱动程序经常操纵硬件,经常使用FIFO类似的缓冲数据结构,前面一篇文章介绍了使用一个CCircularFifo(/article/7770143.html)来仿真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来模拟队列,都是很好的选择。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: