




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第詳解C語言內(nèi)核中的自旋鎖結(jié)構(gòu)提到自旋鎖那就必須要說鏈表,在上一篇《驅(qū)動(dòng)開發(fā):內(nèi)核中的鏈表與結(jié)構(gòu)體》文章中簡(jiǎn)單實(shí)用鏈表結(jié)構(gòu)來存儲(chǔ)進(jìn)程信息列表,相信讀者應(yīng)該已經(jīng)理解了內(nèi)核鏈表的基本使用,本篇文章將講解自旋鎖的簡(jiǎn)單應(yīng)用,自旋鎖是為了解決內(nèi)核鏈表讀寫時(shí)存在線程同步問題,解決多線程同步問題必須要用鎖,通常使用自旋鎖,自旋鎖是內(nèi)核中提供的一種高IRQL鎖,用同步以及獨(dú)占的方式訪問某個(gè)資源。
首先以簡(jiǎn)單的鏈表為案例,鏈表主要分為單向鏈表與雙向鏈表,單向鏈表的鏈表節(jié)點(diǎn)中只有一個(gè)鏈表指針,其指向后一個(gè)鏈表元素,而雙向鏈表節(jié)點(diǎn)中有兩個(gè)鏈表節(jié)點(diǎn)指針,其中Blink指向前一個(gè)鏈表節(jié)點(diǎn)Flink指向后一個(gè)節(jié)點(diǎn),以雙向鏈表為例。
#includentifs.h
#includentstrsafe.h
//鏈表節(jié)點(diǎn)指針
typedefstruct_LIST_ENTRY
struct_LIST_ENTRY*Flink;//當(dāng)前節(jié)點(diǎn)的后一個(gè)節(jié)點(diǎn)
struct_LIST_ENTRY*Blink;//當(dāng)前節(jié)點(diǎn)的前一個(gè)結(jié)點(diǎn)
}LIST_ENTRY,*PLIST_ENTRY;
typedefstruct_MyStruct
ULONGx;
ULONGy;
LIST_ENTRYlpListEntry;
}MyStruct,*pMyStruct;
VOIDUnDriver(PDRIVER_OBJECTdriver)
DbgPrint("驅(qū)動(dòng)卸載成功\n");
//By:LyShark
NTSTATUSDriverEntry(INPDRIVER_OBJECTDriver,PUNICODE_STRINGRegistryPath)
DbgPrint("By:LyShark\n");
DbgPrint("Email:me@\n");
//初始化頭節(jié)點(diǎn)
LIST_ENTRYListHeader={0};
InitializeListHead(ListHeader);
//定義鏈表元素
MyStructtestA={0};
MyStructtestB={0};
MyStructtestC={0};
testA.x=100;
testA.y=200;
testB.x=1000;
testB.y=2000;
testC.x=10000;
testC.y=20000;
//分別插入節(jié)點(diǎn)到頭部和尾部
InsertHeadList(ListHeader,testA.lpListEntry);
InsertTailList(ListHeader,testB.lpListEntry);
InsertTailList(ListHeader,testC.lpListEntry);
//節(jié)點(diǎn)不為空則移除一個(gè)節(jié)點(diǎn)
if(IsListEmpty(ListHeader)==FALSE)
RemoveEntryList(testA.lpListEntry);
//輸出鏈表數(shù)據(jù)
PLIST_ENTRYpListEntry=NULL;
pListEntry=ListHeader.Flink;
while(pListEntry!=ListHeader)
//計(jì)算出成員距離結(jié)構(gòu)體頂部內(nèi)存距離
pMyStructptr=CONTAINING_RECORD(pListEntry,MyStruct,lpListEntry);
DbgPrint("節(jié)點(diǎn)元素X=%d節(jié)點(diǎn)元素Y=%d\n",ptr-x,ptr-
//得到下一個(gè)元素地址
pListEntry=pListEntry-Flink;
Driver-DriverUnload=UnDriver;
returnSTATUS_SUCCESS;
鏈表輸出效果如下:
如上所述,內(nèi)核鏈表讀寫時(shí)存在線程同步問題,解決多線程同步問題必須要用鎖,通常使用自旋鎖,自旋鎖是內(nèi)核中提供的一種高IRQL鎖,用同步以及獨(dú)占的方式訪問某個(gè)資源。
#includentifs.h
#includentstrsafe.h
//鏈表節(jié)點(diǎn)指針
typedefstruct_LIST_ENTRY
struct_LIST_ENTRY*Flink;//當(dāng)前節(jié)點(diǎn)的后一個(gè)節(jié)點(diǎn)
struct_LIST_ENTRY*Blink;//當(dāng)前節(jié)點(diǎn)的前一個(gè)結(jié)點(diǎn)
}LIST_ENTRY,*PLIST_ENTRY;
typedefstruct_MyStruct
ULONGx;
ULONGy;
LIST_ENTRYlpListEntry;
}MyStruct,*pMyStruct;
//定義全局鏈表和全局鎖
LIST_ENTRYmy_list_header;
KSPIN_LOCKmy_list_lock;
//初始化
voidInit()
InitializeListHead(my_list_header);
KeInitializeSpinLock(my_list_lock);
//函數(shù)內(nèi)使用鎖
voidfunction_ins()
KIRQLIrql;
//加鎖
KeAcquireSpinLock(my_list_lock,Irql);
DbgPrint("鎖內(nèi)部執(zhí)行\(zhòng)n");
//釋放鎖
KeReleaseSpinLock(my_list_lock,Irql);
VOIDUnDriver(PDRIVER_OBJECTdriver)
DbgPrint("驅(qū)動(dòng)卸載成功\n");
//By:LyShark
NTSTATUSDriverEntry(INPDRIVER_OBJECTDriver,PUNICODE_STRINGRegistryPath)
DbgPrint("By:LyShark\n");
DbgPrint("Email:me@\n");
//初始化鏈表
Init();
//分配鏈表空間
pMyStructtestA=(pMyStruct)ExAllocatePool(NonPagedPoolExecute,sizeof(pMyStruct));
pMyStructtestB=(pMyStruct)ExAllocatePool(NonPagedPoolExecute,sizeof(pMyStruct));
//賦值
testA-x=100;
testA-y=200;
testB-x=1000;
testB-y=2000;
//向全局鏈表中插入數(shù)據(jù)
if(NULL!=testANULL!=testB)
ExInterlockedInsertHeadList(my_list_header,(PLIST_ENTRY)testA-lpListEntry,my_list_lock);
ExInterlockedInsertTailList(my_list_header,(PLIST_ENTRY)testB-lpListEntry,my_list_lock);
function_ins();
//移除節(jié)點(diǎn)A并放入到remove_entry中
PLIST_ENTRYremove_entry=ExInterlockedRemoveHeadList(testA-lpListEntry,my_list_lock);
//輸出鏈表數(shù)據(jù)
while(remove_entry!=my_list_header)
//計(jì)算出成員距離結(jié)構(gòu)體頂部內(nèi)存距離
pMyStructptr=CONTAINING_RECORD(remove_entry,MyStruct,lpListEntry);
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年塑膠耳塞項(xiàng)目市場(chǎng)調(diào)查研究報(bào)告
- 智能燈光場(chǎng)景控制系統(tǒng)行業(yè)跨境出海戰(zhàn)略研究報(bào)告
- 碘沙葡胺企業(yè)數(shù)字化轉(zhuǎn)型與智慧升級(jí)戰(zhàn)略研究報(bào)告
- 鹽酸丁卡因企業(yè)縣域市場(chǎng)拓展與下沉戰(zhàn)略研究報(bào)告
- 智能手環(huán)情緒監(jiān)測(cè)與調(diào)節(jié)企業(yè)制定與實(shí)施新質(zhì)生產(chǎn)力戰(zhàn)略研究報(bào)告
- 煙花文化國際交流論壇行業(yè)跨境出海戰(zhàn)略研究報(bào)告
- 火龍果冰淇淋風(fēng)味罐頭企業(yè)制定與實(shí)施新質(zhì)生產(chǎn)力戰(zhàn)略研究報(bào)告
- 智能戒指情緒識(shí)別器企業(yè)制定與實(shí)施新質(zhì)生產(chǎn)力戰(zhàn)略研究報(bào)告
- 智能數(shù)據(jù)解讀云平臺(tái)行業(yè)跨境出海戰(zhàn)略研究報(bào)告
- 上?;ɑ茕N售合同范例
- 制作自然發(fā)酵酸奶的方法
- 《肖申克的救贖》中英雙語劇本
- 護(hù)士長管理能力培訓(xùn)講義課件
- 第六章電力系統(tǒng)自動(dòng)低頻減載裝置
- 2022年黑龍江省鄉(xiāng)村醫(yī)生招聘筆試試題及答案解析
- 濟(jì)南市海綿城市建設(shè)建筑與小區(qū)改造項(xiàng)目案例-山東省經(jīng)濟(jì)技術(shù)開發(fā)中心宿舍-2
- 辯護(hù)詞貪污罪、受賄罪
- 術(shù)后1月 省中乳腺breast-q量表附有答案
- 幼兒園辦學(xué)資料:幼兒圖書目錄
- 串聯(lián)分壓并聯(lián)分流
- 扣款申請(qǐng)單(標(biāo)準(zhǔn)模版)
評(píng)論
0/150
提交評(píng)論