当前位置: 首页 > 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.jsqmd.com/news/105558/

相关文章:

  • 智能检索系统进阶指南:解锁代理规划与深度推理双引擎实战
  • ComfyUI-SeedVR2视频超分插件完整安装与配置指南
  • Hslcommunication
  • SQL SERVER对每张表新增字段
  • Ditto剪贴板管理器完整使用指南:从新手到高手的快速上手教程
  • Emby美化插件终极指南:打造专属影音中心
  • EmotiVoice在脱口秀AI主持人开发中的潜力
  • Bruno技术深度解析:API测试工具的架构革新与实践
  • EmotiVoice语音个性档案系统设计构想
  • PubMedBERT嵌入模型:生物医学语义搜索的终极指南
  • 【毕业设计】基于SpringBoot的青少年编程学习系统设计与实现基于Java的scratch少儿编程学习网站系统的设计与实现(源码+文档+远程调试,全bao定制等)
  • veScale分布式训练终极指南:解锁大规模AI模型高效训练
  • 如何用EmotiVoice打造个性化语音助手?开发者实战指南
  • EmotiVoice能否生成动物叫声拟人化语音?趣味实验展示
  • EmotiVoice语音合成情感传染效应研究:听众情绪共鸣测试
  • 2025年AI搜索推广公司推荐,这5家凭硬核实力成行业优选
  • ThinkPad T480终极改造:用OpenCore实现完美macOS体验的完整指南
  • SharedArrayBuffer is not defined
  • Obsidian与Zotero的无缝集成:学术工作流的革命性突破
  • Taiga开源敏捷项目管理工具:从零到精通的终极实践指南
  • OpenProject版本决策指南:如何从开源社区版升级到企业级解决方案
  • 域控操作十七:一般员工提权直接安装软件
  • 40、邮件规则集定义与垃圾邮件过滤指南
  • 为什么说数据中台是数字化转型的“地基”?底层逻辑拆解
  • Barrier跨平台KVM软件:终极使用指南与配置技巧
  • 2025年上海疲劳试验机品牌商排行榜,新测评精选疲劳试验机生 - myqiye
  • 重磅发布!2025年广东视觉检测设备权威测评榜单 - 一搜百应
  • 多模态视频理解技术架构与应用实践深度解析
  • 2025国内漏水检测服务机构权威测评榜单发布 - 一搜百应
  • 多版本管理终极指南:告别版本切换烦恼的智能解决方案