当前位置: 首页 > news >正文

调用nt!KiExitDispatcher的又一个函数nt!KeInsertQueueApc和nt!KiProcessDeferredReadyList函数分析和全局变量nt!KiIdleSummar

调用nt!KiExitDispatcher的又一个函数nt!KeInsertQueueApc和nt!KiProcessDeferredReadyList函数分析和全局变量nt!KiIdleSummary和nt!KiMask32Array的作用
0: kd> g
Breakpoint 41 hit
eax=0000001b ebx=804edc6c ecx=ffdff120 edx=00000000 esi=00000000 edi=ffdff120
eip=80a42c0c esp=f789ed18 ebp=f789ed38 iopl=0 nv up ei ng nz na po nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000282
nt!KiProcessDeferredReadyList:
80a42c0c 53 push ebx
0: kd> kc
#
00 nt!KiProcessDeferredReadyList
01 nt!KiExitDispatcher
02 nt!KeInsertQueueApc
03 nt!IopfCompleteRequest
04 mouclass!MouseClassServiceCallback
05 mouhid!MouHid_ReadComplete
06 nt!IopfCompleteRequest
07 HIDCLASS!HidpDistributeInterruptReport
08 HIDCLASS!HidpInterruptReadComplete

0: kd> dx -id 0,0,8954e020 -r1 (*((basesrv!_SINGLE_LIST_ENTRY *)0xffdffb50))
(*((basesrv!_SINGLE_LIST_ENTRY *)0xffdffb50)) [Type: _SINGLE_LIST_ENTRY]
[+0x000] Next : 0x89804080 [Type: _SINGLE_LIST_ENTRY *]
0: kd> dx -id 0,0,8954e020 -r1 ((basesrv!_SINGLE_LIST_ENTRY *)0x89804080)
((basesrv!_SINGLE_LIST_ENTRY *)0x89804080) : 0x89804080 [Type: _SINGLE_LIST_ENTRY *]
[+0x000] Next : 0x0 [Type: _SINGLE_LIST_ENTRY *]
0: kd> dt kthread 0x89804080-60
CSRSRV!KTHREAD
+0x000 Header : _DISPATCHER_HEADER
+0x010 MutantListHead : _LIST_ENTRY [ 0x89804030 - 0x89804030 ]
+0x018 InitialStack : 0xf75f7000 Void
+0x01c StackLimit : 0xf75f4000 Void
+0x020 KernelStack : 0xf75f692c Void
+0x024 ThreadLock : 0
+0x028 ContextSwitches : 0x25d
+0x02c State : 0x7 ''


+0x1bf AdjustReason : 0x1 ''


if (Thread->WaitStatus != STATUS_KERNEL_APC) { 没有运行
Thread->Quantum -= WAIT_QUANTUM_DECREMENT;
if (Thread->Quantum <= 0) {
Thread->Quantum = Process->ThreadQuantum;
Thread->Priority = KiComputeNewPriority(Thread, 1);
}
}

+0x050 WaitStatus : 0n256

#define STATUS_KERNEL_APC 0x100


参考:
00 nt!KiProcessDeferredReadyList
01 nt!KiExitDispatcher
02 nt!KeInsertQueueApc
03 nt!IopfCompleteRequest
参考结束:


前面是优先级调整部分:

//
// Save the value of thread's preempted flag and set thread preempted
// FALSE,
//

Preempted = Thread->Preempted; 可以再这里下断点:
Thread->Preempted = FALSE;

42 e Disable Clear 80a41f95 [d:\srv03rtm\base\ntos\ke\thredsup.c @ 398] 0001 (0001) nt!KiDeferredReadyThread+0x36d

0: kd> dv Preempted
Preempted = 0x00 ''


do {
Processor = Thread->IdealProcessor;
IdleSet = KiIdleSummary & Affinity;

0: kd> p
eax=00000001 ebx=0000000f ecx=00000003 edx=0000000f esi=89804020 edi=80a059f8
eip=80a41fbc esp=f789ece4 ebp=f789ed04 iopl=0 nv up ei pl zr na pe nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000246
nt!KiDeferredReadyThread+0x394:
80a41fbc a1806eb180 mov eax,dword ptr [nt!_KiIdleSummary (80b16e80)] ds:0023:80b16e80=00000002


0: kd> x nt!KiIdleSummary
80b16e80 nt!KiIdleSummary = 2

do {
Processor = Thread->IdealProcessor;
IdleSet = KiIdleSummary & Affinity;
if (IdleSet != 0) {

} else {
break;
}

} while (TRUE);


if ((IdleSet & AFFINITY_MASK(Processor)) == 0) {

0: kd> p
eax=00000002 ebx=0000000f ecx=00000003 edx=00000001 esi=89804020 edi=80a059f8
eip=80a41fce esp=f789ece4 ebp=f789ed04 iopl=0 nv up ei pl nz na po nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000202
nt!KiDeferredReadyThread+0x3a6:
80a41fce 850495b05ea080 test dword ptr nt!KiMask32Array (80a05eb0)[edx*4],eax ds:0023:80a05eb4=00000002

eax=00000002=IdleSet

AFFINITY_MASK

0: kd> x nt!KiMask32Array
80a05eb0 nt!KiMask32Array = unsigned long []
80a05eb0 nt!KiMask32Array = unsigned long [32]
80a05eb0 nt!KiMask32Array = unsigned long []
0: kd> dx -r1 (*((ntkrnlmp!unsigned long (*)[32])0x80a05eb0))
(*((ntkrnlmp!unsigned long (*)[32])0x80a05eb0)) [Type: unsigned long [32]]
[0] : 0x1 [Type: unsigned long]
[1] : 0x2 [Type: unsigned long]
[2] : 0x4 [Type: unsigned long]
[3] : 0x8 [Type: unsigned long]
[4] : 0x10 [Type: unsigned long]
[5] : 0x20 [Type: unsigned long]

+0x10e IdealProcessor : 0x1 ''

参考:另一个定义
#define AFFINITY_MASK(n) ((ULONG_PTR)1 << (n))
参考:另一个定义

#define AFFINITY_MASK(n) (KiAffinityArray[n])
#define KiAffinityArray KiMask32Array

http://www.gsyq.cn/news/116469.html

相关文章:

  • Hslcommunication
  • Ditto剪贴板管理器完整使用指南:从新手到高手的快速上手教程
  • PubMedBERT嵌入模型:生物医学语义搜索的终极指南
  • 【毕业设计】基于SpringBoot的青少年编程学习系统设计与实现基于Java的scratch少儿编程学习网站系统的设计与实现(源码+文档+远程调试,全bao定制等)
  • ThinkPad T480终极改造:用OpenCore实现完美macOS体验的完整指南
  • 2025年AI搜索推广公司推荐,这5家凭硬核实力成行业优选
  • 域控操作十七:一般员工提权直接安装软件
  • 为什么说数据中台是数字化转型的“地基”?底层逻辑拆解
  • Barrier跨平台KVM软件:终极使用指南与配置技巧
  • 2025国内漏水检测服务机构权威测评榜单发布 - 一搜百应
  • 多版本管理终极指南:告别版本切换烦恼的智能解决方案
  • 如何快速掌握Redash数据可视化:从零到专家的完整指南
  • EmotiVoice能否克隆已故亲人声音?法律与伦理边界探讨
  • 2025年防爆熔盐电加热器定制厂家权威推荐榜单:熔盐电加热器/熔盐加热设备/熔盐储槽电加热器制造厂商精选 - 品牌推荐官
  • 企业级语音解决方案:基于EmotiVoice定制专属品牌声音
  • 提升EmotiVoice语音自然度的五个关键参数
  • Tkinter Helper:可视化拖拽快速构建Python GUI界面的终极指南
  • Java开发必看:BigDecimal避坑指南,告别精度丢失烦恼
  • SeedVR2-7B视频修复:从技术原理到实战应用的深度探索
  • LSUN数据集实战指南:从入门到精通的MindSpore解决方案
  • 【Leetcode】1700. Number of Students Unable to Eat Lunch
  • EmotiVoice语音自然度评分达到MOS 4.5以上
  • EmotiVoice语音平滑处理技术提升听感舒适度
  • Diffusers一致性模型快速入门指南:从数据集加载到图像生成
  • 河南扣件租赁优选连升建筑:2万吨库存+中建合作保障 - 朴素的承诺
  • 不止于兼容:金仓数据库的三重革新与超越
  • 视频水印移除工具完整使用指南
  • EmotiVoice与VITS对比分析:两者适用场景有何不同?
  • Animeko跨平台动漫追番神器:从入门到精通的完整指南
  • 域控操作七:让某人/计算机不执行某策略/单独放行