日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

1.APC机制

發(fā)布時(shí)間:2025/3/20 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 1.APC机制 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

線(xiàn)程是不能“殺掉”、“掛起”、“恢復(fù)”的,線(xiàn)程在執(zhí)行的時(shí)候自己占據(jù)著CPU,別人怎么可能控制它呢?

舉個(gè)極端的例子:如果不調(diào)用API,屏蔽中斷,并保證代碼不出現(xiàn)異常,線(xiàn)程將永久占用CPU,何談控制呢?所以說(shuō)線(xiàn)程如果想“死",一定是自己執(zhí)行代碼把自己殺死,不存在“他殺”這種情況!

那如果想改變一個(gè)線(xiàn)程的行為該怎么辦呢?

可以給他提供一個(gè)函數(shù),讓它自己去調(diào)用,這個(gè)函數(shù)就是APC (Asyncroneus Procedure Call),即異步過(guò)程調(diào)用

APC隊(duì)列

kd> dt KTHREADnt! KTHREAD...+0x034 ApcState _KAPC_STATE... kd> dt _kapc_state nt!_KAPC_STATE+0x000 ApcListHead //2個(gè)APC隊(duì)列用戶(hù)APC和內(nèi)核APC+0x010 Process //線(xiàn)程所屬或者所掛靠的進(jìn)程_KPROCESS+0x014 KernelApcInProgress //內(nèi)核APC是否正在執(zhí)行+0x015 KernelApcPending //是否有正在等待執(zhí)行的內(nèi)核APC 1=有+0x016 UserApcPending //是否有正在等待執(zhí)行的用戶(hù)APC 1=有

用戶(hù)APC: APC函數(shù)地址位于用戶(hù)空間,在用戶(hù)空間執(zhí)行
內(nèi)核APC: APC函數(shù)地址位于內(nèi)核空間,在內(nèi)核空間執(zhí)行

kd> dt _kapc nt!_KAPC+0x000 Type //類(lèi)型APC類(lèi)型為0x12+0x002 Size //本結(jié)構(gòu)體的大小0x30+0x004 Spare0 //未使用+0x008 Thread //目標(biāo)線(xiàn)程+0x00c ApcListEntry //APC隊(duì)列掛的位置+0x014 KernelRoutine //指向一個(gè)函數(shù)(調(diào)用ExFreePoolWithTag釋放APC)+0x018 RundownRoutine //未使用+0x01c NormalRoutine //用戶(hù)APC總?cè)肟诨蛘哒嬲膬?nèi)核apc函數(shù)+0x020 NormalContext //內(nèi)核APC: NULL用戶(hù)APC:真正的APC函數(shù) +0x024 SystemArgument1 //APC函數(shù)的參數(shù)+0x028 SystemArgument2 //APC函數(shù)的參數(shù)+0x02c ApcStateIndex //掛哪個(gè)隊(duì)列,有四個(gè)值: 0 1 2 3+0x02d ApcMode //內(nèi)核APC用戶(hù)APC+0x02e Inserted //表示本apc是否已掛入隊(duì)列掛入前: 0掛入后1

+0x01c NormalRoutine 可以找到你提供APC函數(shù)在哪,并不完全等于APC函數(shù)的地址

如果我想改變一個(gè)線(xiàn)程:

  • 提供一個(gè)APC
  • 提供+0x01c執(zhí)行要執(zhí)行的函數(shù)在哪
  • 把這個(gè)APC存到KTHREAD.+0x34 ApcState.ApcListHead
  • 當(dāng)前的線(xiàn)程什么時(shí)候會(huì)執(zhí)行我們提供的這些APC函數(shù)?

    判斷是否有APC要執(zhí)行

    如果有APC

    處理apc函數(shù)KiDeliverApc,這里我門(mén)發(fā)現(xiàn)只有用戶(hù)的apc,其實(shí)內(nèi)核的apc是一定會(huì)處理的它會(huì)先處理內(nèi)核apc在處理用戶(hù)的apc。



    KiServiceExit函數(shù):
    這個(gè)函數(shù)是系統(tǒng)調(diào)用、異常或中斷返回用戶(hù)空間的必經(jīng)之路。

    KiDeliverApc函數(shù):
    負(fù)責(zé)執(zhí)行APC函數(shù)

    總結(jié)

    以上是生活随笔為你收集整理的1.APC机制的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。