驅動中煉表的使用

2021-10-08 08:43:52 字數 1916 閱讀 5989

ddk中定義了list_entry雙向鍊錶結構,這樣把資料和鍊錶分開的定義方法,降低了耦合度。

typedef struct list entry mydatastruct,

*pmydatastruct;鍊錶的初始化

initializelisthead(plist_ entry plisthead)

引數為煉表頭的位址,該函式的作用就是把flink和blink都設定為煉表頭的位址。

判斷鍊錶是否為空

islistentry(plist_ entry plisthead)

該函式的原理就是判斷鍊錶的flink和blink的值一樣,如果不一樣 說明鍊錶不為空。

鍊錶的插入

void insertheadtist (plist_ entry plisthead,plist_ entry entry);

引數1:雙向鍊錶頭部的指標

引數2:要插入資料的鍊錶節點指標

尾部插入

void inserttailtist (plist_ entry plisthead,plist_ entry entry);

引數1:雙向鍊錶頭部的指標

引數2:要插入資料的鍊錶節點指標

鍊錶的刪除

可以使用miprocessloadentry來進行鍊錶的刪除(第三個引數為false),更加的安全.

removeheadlist(&plisthead);

引數:煉表頭的指標

該函式返回值為使用者自定義資料的指標,在list_entry是自定義結構第乙個元素的情況下。

如果不是,那麼就需要位址減去到結構頭的大小。

ddk定義containing_record巨集,實現了無論list_entry是否是自定義結構的第乙個元素都能返回自定義資料開頭的指標。

引數1:自定義資料的list_entry位址

引數2:結構體的名字

引數3:結構體中的list_entry的名字

#include

typedef

struct _mydatastruct

mydatastruct,

*pmydatastruct;

void

driverunload

(pdriver_object pdriverobject)

ntstatus driverentry

(pdriver_object pdriverobject, punicode_string preg)

pmydata->x = i;

pmydata->y = i;

//使用頭部插入方式

insertheadlist

(&listhead,

&pmydata->listentry);}

while(!

islistempty

(&listhead)

)return status_success;

}

一般來說直接減去結構體中鍊錶的偏移即可,ddk提供了乙個巨集containing_record來實現這個操作。

//結構體

typedef

struct _irp_entry

irp_entry,

*pirp_entry;

containing_record

( plist,鍊錶位址

irp_entry,

//結構體名

listentry)

;//鍊錶欄位名

驅動中的鍊錶

今天被鍊錶掀翻一地,原來許多我以為的,都不是我以為的。最近在提交 中煎熬,也可以說難忘吧!不過,其實還是學到了許多東西,在這還是感謝我的老大吧!鍊錶有很多種不同的型別 單向鍊錶,雙向鍊錶以及迴圈鍊錶 spi中建立匯流排鍊錶 裝置鍊錶 初始化匯流排鍊錶 static list head spi bus...

驅動中雙向鍊錶

ddk中標準雙向鍊錶形成乙個環結構,結構體定義 doubly linked list structure.can be used as either a list head,or as link words.typedef struct list entry list entry,plist ent...

在驅動中使用鍊錶

原始出處 在驅動程式的開發中經常需要用到鍊錶,常見的鍊錶有單向鍊錶和雙向鍊錶,我們只介紹雙向鍊錶的使用方法,ddk為我們提供了標準的雙向鍊錶 list entry,但這個鍊錶裡面沒有資料,不能直接使用,我們需要自己定義乙個結構體型別,然後將list entry作為結構體的乙個子域,如下 所示 typ...