Windows内核中使用List链表来模拟FIFO操作
2015-04-04 21:25
633 查看
驱动程序经常操纵硬件,经常使用FIFO类似的缓冲数据结构,前面一篇文章介绍了使用一个CCircularFifo(/article/7770143.html)来仿真FIFO结构,内部开辟了一个大缓冲,使用固定长度数组作为缓冲区,只要缓冲区大小开的合适,完全满足工程使用需求。
FIFO的本质是一个队列,完全可以用内核中的List来实现:
2015_09_25编辑:如果在应用层,使用C/C++语言,使用std::queue,std::list来模拟队列,都是很好的选择。
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来模拟队列,都是很好的选择。
相关文章推荐
- java模拟LinkedList实现双链表,完成基本操作
- c++ list 链表 基本操作和使用
- Windows内存管理(1)--分配内核内存 和 使用链表
- Linux内核---60.linux内核链表list的使用
- linux 内核链表操作头文件list.h
- 在Windows上使用终端模拟程序连接操作Linux以及上传下载文件
- Linux 内核链表 list.h 的使用
- linux 内核链表操作头文件list.h C++
- Windows内存管理(1)--分配内核内存 和 使用链表
- 20150203 【 内核链表 kernel_list.h 】 list_head 使用
- STL--> list 双向循环链表容器 接口使用及介绍。 模拟实现 STL list容器
- list.h内核链表是如何定义和操作的呢
- list_head内核链表的使用
- 使用Socket模拟Http的GET操作
- 关于Windows内核空间操作的一些说明
- 漫谈兼容内核之十四:Windows的跨进程操作
- 避免使用循环来操作List
- 使用VBA操作文件(3):Windows Scripting Host
- windows自带的使用键盘代替鼠标操作问题._百度知道
- 使用Virtual PC进行Windows内核调试的详细过程