windows内核驱动中的链表结构

windows内核驱动中的链表结构与数据结构中的链表结构在构造上有很大不同,以循环双链表为例

数据结构中的链表结构: 数据就像集装箱,可以直接放置在火车上,而节点就像每节之间的挂接装置.

内核驱动中的链表结构: 数据就像车厢,自带挂接装置(节点)

1.链表结构体不同

数据结构中的链表结构,包含有节点和数据,

struct DataList{

  DataType data;

  struct DataList* next;

  struct DataList* prev;

};

驱动中的链表结构,仅包含有节点,没有数据。

struct DriverList{

  struct DriverList* next;

  struct DriverList* prev;

};

2.数据结构中的数据,可以直接封装在链表结构体中; 而在驱动链表结构中,要将链表结构封装在数据中,  

struct DataEntry{

  struct DriverList node;

  DataType data;

};

以下是示例代码

 1 #pragma once
 2
 3 typedef struct List {
 4     struct List * next;
 5     struct List * prev;
 6 }List, *Plist;
 7
 8 void initList(Plist head);
 9 bool isEmpty(Plist pHead);
10 void addFirst(Plist pHead, Plist pNewNode);
11 void addLast(Plist pHead, Plist pNewNode);
12 void traverse(Plist pHead, void (*pfun)(void *));
13
14 void initList(Plist head)
15 {
16     head->next = head;
17     head->prev = head;
18 }
19
20
21 bool isEmpty(Plist pHead)
22 {
23     if (pHead->next == pHead || pHead->prev == pHead)
24         return true;
25     return false;
26 }
27
28 void addFirst(Plist pHead, Plist pNewNode)
29 {
30     // list is not empty
31     if (pHead->next != pHead)
32     {
33         pHead->next->prev = pNewNode;
34         pNewNode->next = pHead->next;
35     }
36     else
37     {
38         pHead->prev = pNewNode;
39         pNewNode->next = pHead;
40     }
41     pHead->next = pNewNode;
42     pNewNode->prev = pHead;
43 }
44
45 void addLast(Plist pHead, Plist pNewNode)
46 {
47     // list is not empty
48     if (pHead->next != pHead)
49     {
50         pNewNode->prev = pHead->prev;
51         pHead->prev->next = pNewNode;
52     }
53     else
54     {
55         pHead->next = pNewNode;
56         pNewNode->prev = pHead;
57     }
58     pHead->prev = pNewNode;
59     pNewNode->next = pHead;
60 }

List.h

 1 #include "stdafx.h"
 2 #include <cstdlib>
 3 #include <iostream>
 4 #include <cstring>
 5 #include "List.h"
 6
 7 #define SIZE 20
 8 #define ARLEN 10
 9
10 typedef struct Student {
11     List listEntry;
12     int age;
13     char name[SIZE];
14     double weight;
15 }Student, *Pstudent;
16
17 using namespace std;
18
19 void printStudent(Plist pHead);
20
21 int main()
22 {
23     List head;
24     initList(&head);
25     Pstudent pStu[ARLEN];
26     for (int i = 0; i < ARLEN; i++)
27     {
28         pStu[i] = (Pstudent)malloc(sizeof(Student));
29         pStu[i]->age = i;
30         pStu[i]->weight = i*1.2;
31         sprintf_s(pStu[i]->name, "%s%d","student",i);
32         addLast(&head, &pStu[i]->listEntry);
33     }
34     printStudent(&head);
35 }
36
37 void printStudent(Plist pHead)
38 {
39     Pstudent pStu;
40     Plist current = pHead->next;
41     while (current != pHead)
42     {
43         pStu = (Pstudent)(current);
44         cout << "stu->name = " << pStu->name << ", stu->age = "
45             << pStu->age << ", stu->weight = " << pStu->weight << endl;
46         current = current->next;
47     }
48 }

main.c

output:

stu->name = student0, stu->age = 0, stu->weight = 0
stu->name = student1, stu->age = 1, stu->weight = 1.2
stu->name = student2, stu->age = 2, stu->weight = 2.4
stu->name = student3, stu->age = 3, stu->weight = 3.6
stu->name = student4, stu->age = 4, stu->weight = 4.8
stu->name = student5, stu->age = 5, stu->weight = 6
stu->name = student6, stu->age = 6, stu->weight = 7.2
stu->name = student7, stu->age = 7, stu->weight = 8.4
stu->name = student8, stu->age = 8, stu->weight = 9.6
stu->name = student9, stu->age = 9, stu->weight = 10.8
请按任意键继续. . .

原文地址:https://www.cnblogs.com/endenvor/p/8967659.html

时间: 2024-10-14 00:49:27

windows内核驱动中的链表结构的相关文章

YJX_Driver_036_在驱动中使用链表sys部分

1. 在驱动中使用链表sys部分 A.链表结构 B.链表的初始化 C.在链表中插入数据(结点) D.链表数据的删除 E.链表的遍历 2. //链表指针结构LIST_ENTRY//初始化链表InitializeListHead//判断链表是否为空IsListEmpty//在头部插入结点InsertHeadList//在尾部插入结点 InsertTailList//从链表中删除 //头部删除RemoveHeadList //尾部删除RemoveTailList

【转】深入Windows内核——C++中的消息机制

上节讲了消息的相关概念,本文将进一步聊聊C++中的消息机制. 从简单例子探析核心原理 在讲之前,我们先看一个简单例子:创建一个窗口和两个按钮,用来控制窗口的背景颜色.其效果 图1.效果图  Win32Test.h 1 #pragma once 2 3 #include <windows.h> 4 #include <atltypes.h> 5 #include <tchar.h> 6 7 //资源ID 8 #define ID_BUTTON_DRAW 1000 9 #d

第02节:Linux 内核驱动中的指定初始化

2.1 什么是指定初始化 在标准 C 中,当我们定义并初始化一个数组时,常用方法如下: int a[10] = {0,1,2,3,4,5,6,7,8}; 按照这种固定的顺序,我们可以依次给 a[0] 和 a[8] 赋值.因为没有对 a[9] 赋值,所以编译器会将 a[9] 默认设置为0.当数组长度比较小时,使用这种方式初始化比较方便.当数组比较大,而且数组里的非零元素并不连续时,这时候再按照固定顺序初始化就比较麻烦了. 比如,我们定义一个数组 b[100],其中 b[10].b[30] 需要初始

Pjlib中的链表结构

Pjlib的链表结构跟常见的链表结构有所区别,如下图所示: ? ? ? ? ? ? 图1:一般链表结构 ? ? ? ? ? 图2:pjlib中的链表结构 可以看到一般的双向链表是链表节点包含数据域,而pjlib中是数据域包含链表节点.一般的链表指针域是链表结构的指针,而pjlib中是数据结构的指针.这种结构的优势我还没有体会到,可能要慢慢体会吧,但对链表头的理解却造成些许困惑.链表头是一个单独的list,而prev和next指向的是含有list的data结构,这种结构总让我觉得怪怪的. Pjli

内核驱动中常见的miscdevice、platform_device、platform_driver

最近在看驱动模型,是越看越糊涂,以前接触比较多的都是一些字符驱动,对字符驱动的框架有一定的了解.后来因为想在驱动中实现设备文件的创建,又了解了一下,sysfs文件系统和udev设备文件系统,必然就涉及到了驱动模型.可是发现驱动模型和以前接触的字符驱动没什么联系.比如,以前写字符驱动,主要的内容就是实现file_operations结构体里的函数,然后就是申请设备号,注册字符设备,根本就没有涉及到设备驱动模型.而驱动模型里,device_driver根本没有涉及到设备操作的函数.file_oper

javascript中的链表结构—双向链表

1.概念 上一个文章里我们已经了解到链表结构,链表的特点是长度不固定,不用担心插入新元素的时候新增位置的问题.插入一个元素的时候,只要找到插入点就可以了,不需要整体移动整个结构. 这里我们了解一下双向链表的结构.尽管从链表中头节点遍历到尾节点很容易,但是反过来,从后向前遍历就没有那么简单.通过给Node对象增加一个属性,该属性存储指向前驱节点的链接,这样就容易多了.此时祥链表中插入一个节点需要更多的工作,我们需要指出该节点正确的前驱和猴急.但是在从链表中删除节点的时候效率更高了,不需要再查找待删

linux内核驱动中_IO, _IOR, _IOW, _IOWR 宏的用法与解析

在驱动程序里, ioctl() 函数上传送的变量 cmd 是应用程序用于区别设备驱动程序请求处理内容的值.cmd除了可区别数字外,还包含有助于处理的几种相应信息. cmd的大小为 32位,共分 4 个域:     bit31~bit30 2位为 “区别读写” 区,作用是区分是读取命令还是写入命令.     bit29~bit15 14位为 "数据大小" 区,表示 ioctl() 中的 arg 变量传送的内存大小.     bit20~bit08  8位为 “魔数"(也称为&q

向Windows内核驱动传递用户层定义的事件Event,并响应内核层的通知

完整的程序在下载:http://download.csdn.net/detail/dijkstar/7913249 用户层创建的事件Event是一个Handle句柄,和内核中的创建的内核模式下的KEVENT是一个东西.因此,在应用层创建的事件,可以在内核层获得并使用.这一部分的原理,见张帆编著的<Windows驱动技术详解>章节8.5.4,P237页: 程序是来自于<Windows驱动技术详解>章节8.5.4(驱动程序和应用程序交互事件对象)和章节10.2.1(DPC定时器). 首

深入Windows内核——C++中的消息机制

<编程思想之消息机制>一文中我们讲了消息的相关概念和消息机制的模拟,本文将进一步聊聊C++中的消息机制. 从简单例子探析核心原理 在讲之前,我们先看一个简单例子:创建一个窗口和两个按钮,用来控制窗口的背景颜色.其效果如下: 图 2 :效果图 Win32Test.h #pragma once #include <windows.h> #include <atltypes.h> #include <tchar.h> //资源ID #define ID_BUTTO