nt!MiAllocateWsle函数分析之设置Wsle[WorkingSetIndex]

第一部分:

1: kd> p
nt!MiAddValidPageToWorkingSet+0xa9:
80a83c13 e8da9afcff      call    nt!MiAllocateWsle (80a4d6f2)
1: kd> t
nt!MiAllocateWsle:
80a4d6f2 55              push    ebp
1: kd> dv
         WsInfo = 0x8953a1f8
     PointerPte = 0xc01df8a8
           Pfn1 = 0x81bcd810
       WsleMask = 0x118
           Wsle = 0x00000008
WorkingSetIndex = 0x8953a1f8


第二部分:

1: kd> dx -r1 ((ntkrnlmp!_MMWSL *)0xc0503000)
((ntkrnlmp!_MMWSL *)0xc0503000)                 : 0xc0503000 [Type: _MMWSL *]
    [+0x000] FirstFree        : 0xc3 [Type: unsigned long]


   WorkingSetIndex = WorkingSetList->FirstFree;
    WorkingSetList->FirstFree = (WSLE_NUMBER)(Wsle[WorkingSetIndex].u1.Long >> MM_FREE_WSLE_SHIFT);


1: kd> dd 0xc0503698+c3*4
c05039a4  00000c40 00000c50 00000c60 00000c70

WorkingSetList->FirstFree=c4

    if (WorkingSetIndex > WorkingSetList->LastEntry) {
        WorkingSetList->LastEntry = WorkingSetIndex;
    }

1: kd> dx -r1 ((ntkrnlmp!_MMWSL *)0xc0503000)
((ntkrnlmp!_MMWSL *)0xc0503000)                 : 0xc0503000 [Type: _MMWSL *]
    [+0x000] FirstFree        : 0xc4 [Type: unsigned long]
    [+0x004] FirstDynamic     : 0x4 [Type: unsigned long]
    [+0x008] LastEntry        : 0xc3 [Type: unsigned long]


第三部分:

#define MiGetVirtualAddressMappedByPte(PTE) ((PVOID)((ULONG)(PTE) << 10))

     PointerPte = 0xc01df8a8


1100 0000 0001 1101 1111 1000 1010 1000

01 11  01 11  11 10  00 10  10 10  00 00 0000 0000

77e2a000

参考后总结:得到的确实是虚拟地址,PTE左移10位 得到虚拟地址前20位!!
虚拟地址右移10位+0xC000 0000 得到PTE

1: kd> dv
StoreInstruction = 0
 FaultingAddress = 0x77e2a0c8


1: kd> !pte 0x77e2a0c8
                 VA 77e2a0c8
PDE at C030077C         PTE at C01DF8A8
contains 7B259867       contains 7DE56025
pfn 7b259 ---DA--UWEV   pfn 7de56 ----A--UREV


第四部分:

1: kd> t
nt!MiAllocateWsle+0x14d:
80a4d83f e80aaeffff      call    nt!MiUpdateWsle (80a4864e)
1: kd> t
nt!MiUpdateWsle:
80a4864e 55              push    ebp
1: kd> kc
 #
00 nt!MiUpdateWsle
01 nt!MiAllocateWsle
02 nt!MiAddValidPageToWorkingSet
03 nt!MiCompleteProtoPteFault
04 nt!MiResolveProtoPteFault
05 nt!MiDispatchFault
06 nt!MmAccessFault
07 nt!_KiTrap0E
08 nt!ObpCaptureObjectName
09 nt!ObpCaptureObjectCreateInformation
0a nt!ObOpenObjectByName
0b nt!NtOpenSection
0c nt!_KiSystemService
0d SharedUserData!SystemCallStub
0e ntdll!NtOpenSection
0f KERNEL32!OpenSection
10 KERNEL32!GetLocaleFileInfo
11 KERNEL32!NlsProcessInitialize
12 KERNEL32!NlsDllInitialize
13 KERNEL32!BaseDllInitialize
14 ntdll!LdrpCallInitRoutine
15 ntdll!LdrpRunInitializeRoutines
16 ntdll!LdrpLoadDll
17 ntdll!LdrLoadDll
18 CSRSRV!CsrLoadServerDll
19 CSRSRV!CsrParseServerCommandLine
1a CSRSRV!CsrServerInitialization
1b csrss!main
1c csrss!NtProcessStartup

1: kd> dv
   DesiredIndex = 0xf704b9f0
 VirtualAddress = 0x77e2a000
         WsInfo = 0x8953a1f8
            Pfn = 0x81bcd810
           Wsle = 0x80a4864e


第五部分:

    WsleContents.u1.VirtualAddress = PAGE_ALIGN (VirtualAddress);
    WsleContents.u1.e1.Valid = 1;


1: kd> dt mmwsle -r
nt!MMWSLE
   +0x000 u1               : __unnamed
      +0x000 VirtualAddress   : Ptr32 Void
      +0x000 Long             : Uint4B
      +0x000 e1               : _MMWSLENTRY
         +0x000 Valid            : Pos 0, 1 Bit
         +0x000 LockedInWs       : Pos 1, 1 Bit
         +0x000 LockedInMemory   : Pos 2, 1 Bit
         +0x000 Protection       : Pos 3, 5 Bits
         +0x000 SameProtectAsProto : Pos 8, 1 Bit
         +0x000 Direct           : Pos 9, 1 Bit
         +0x000 Age              : Pos 10, 2 Bits
         +0x000 VirtualPageNumber : Pos 12, 20 Bits

0x77e2a001


第六部分:

WorkingSetIndex = 0xc3

1: kd> dd 0x81bcd810
81bcd810  00000000 e13a9c10 00000001 00011608
81bcd820  f926946a 000007ec


   +0x00c u3               : __unnamed
      +0x000 e1               : _MMPFNENTRY
         +0x000 Modified         : Pos 0, 1 Bit
         +0x000 ReadInProgress   : Pos 1, 1 Bit
         +0x000 WriteInProgress  : Pos 2, 1 Bit
         +0x000 PrototypePte     : Pos 3, 1 Bit    1

        if (Pfn->u3.e1.PrototypePte == 0) {

        }
        else {

            OldValue = InterlockedCompareExchange ((PLONG)&Pfn->u1.Event,
                                                   WorkingSetIndex,
                                                   0);


1: kd> dd 0x81bcd810
81bcd810  000000c3 e13a9c10 00000001 00011608        //000000c3
81bcd820  f926946a 000007ec

第七部分:

        if (OldValue == 0) {

            WsleContents.u1.e1.Direct = 1;        -->0x77e2a201

            MI_LOG_WSLE_CHANGE (WorkingSetList, WorkingSetIndex, WsleContents);

            Wsle[WorkingSetIndex] = WsleContents;

            return;


1: kd> dt mmwsle -r
nt!MMWSLE
   +0x000 u1               : __unnamed
      +0x000 VirtualAddress   : Ptr32 Void
      +0x000 Long             : Uint4B
      +0x000 e1               : _MMWSLENTRY
         +0x000 Valid            : Pos 0, 1 Bit
         +0x000 LockedInWs       : Pos 1, 1 Bit
         +0x000 LockedInMemory   : Pos 2, 1 Bit
         +0x000 Protection       : Pos 3, 5 Bits
         +0x000 SameProtectAsProto : Pos 8, 1 Bit
         +0x000 Direct           : Pos 9, 1 Bit

0x77e2a001
0000 0000 0001
0010 0000 0001
0x77e2a201


1: kd> p
nt!MiUpdateWsle+0x178:
80a487c6 890c90          mov     dword ptr [eax+edx*4],ecx
1: kd> r
eax=c0503698 ebx=77e2a001 ecx=77e2a201 edx=000000c3 esi=c0503000 edi=81bcd810

1: kd> dd c0503698+c3*4
c05039a4  00000c40 00000c50 00000c60 00000c70

Wsle[WorkingSetIndex] = WsleContents;


1: kd> dd c0503698+c3*4
c05039a4  77e2a201 00000c50 00000c60 00000c70

第八部分:返回到nt!MiAllocateWsle

1: kd> p
nt!MiAllocateWsle+0x15c:
80a4d84e 8b45fc          mov     eax,dword ptr [ebp-4]


    if (WsleMask != 0) {
        Wsle[WorkingSetIndex].u1.Long |= WsleMask;        //添加上掩码。
    }


       WsleMask = 0x118

1: kd> dd c0503698+c3*4
c05039a4  77e2a201

0x77e2a201+0x118=0x77e2a319


1: kd> p
nt!MiAllocateWsle+0x15f:
80a4d851 8d04b8          lea     eax,[eax+edi*4]
1: kd> p
nt!MiAllocateWsle+0x162:
80a4d854 0908            or      dword ptr [eax],ecx
1: kd> r
eax=c05039a4 ebx=0fffffff ecx=00000118


        Wsle[WorkingSetIndex].u1.Long |= WsleMask;之后

1: kd> dd c0503698+c3*4
c05039a4  77e2a319

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/81109.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

docker 命令操作大全

1 Docker Hello World 简单命令 docker run ubuntu:15.10 /bin/echo "Hello world" docker run&#xff1a;启动一个新容器。 ubuntu:15.10&#xff1a;使用的 Docker 镜像&#xff08;Ubuntu 15.10 版本&#xff09;。 Docker 首先从本地主机上查找镜像是否存在&a…

【软件工程】基于机器学习的多缺陷定位

基于机器学习的多缺陷定位&#xff08;Multi-Dault Localization, MDL&#xff09;是软件工程和自动化测试领域的重要研究方向&#xff0c;旨在通过机器学习技术高效识别代码中多个潜在缺陷的位置。以下从方法、挑战、应用场景及未来方向展开分析&#xff1a; 一、核心方法 监督…

用MCP往ppt文件里插入系统架构图

文章目录 一、技术架构解析1. Markdown解析模块(markdown_to_hierarchy)2. 动态布局引擎(give_hierarchy_positions)3. PPTX生成模块(generate_pptx)二、核心技术亮点1. 自适应布局算法2. MCP服务集成三、工程实践建议1. 性能优化方向2. 样式扩展方案3. 部署实践四、应用…

CS016-2-unity ecs

目录 【23】射击改进 【24】僵尸生成器 ​编辑【25】随机行走 【27】射击光效 【23】射击改进 a. 当距离目标太远的时候&#xff0c;要继续移动。而当距离目标到达攻击距离之后&#xff0c;则停止移动。 上图中的if&#xff1a;判断自身和目标的距离是否大于攻击距离&#…

新能源汽车制动系统建模全解析——从理论到工程应用

《纯电动轻卡制动系统建模全解析&#xff1a;车速-阻力拟合、刹车力模型与旋转质量转换系数优化》 摘要 本文以纯电动轻卡为研究对象&#xff0c;系统解析制动系统建模核心参数优化方法&#xff0c;涵盖&#xff1a; 车速-阻力曲线拟合&#xff08;MATLAB实现与模型验证&…

函数专题1

函数的定义 函数的基本写法如下所示&#xff1a; def function_name(parameter1, parameter2, ...):"""Docstring: 描述函数的功能、参数和返回值 (可选但强烈推荐)"""# 函数体: 实现功能的代码# ...return value # 可选&#xff0c;用于返回结…

红黑树:数据世界的平衡守护者

在 C 算法的神秘森林里&#xff0c;红黑树是一棵充满智慧的 “魔法树”。它既不像普通二叉搜索树那样容易失衡&#xff0c;也不像 AVL 树对平衡要求那么苛刻。作为 C 算法小白&#xff0c;今天就和大家一起深入探索红黑树的奥秘&#xff0c;看看它是如何成为数据世界的平衡守护…

【hot100-动态规划-139.单词拆分】

力扣139.单词拆分 本题要求判断给定的字符串 s 是否可以被空格拆分为一个或多个在字典 wordDict 中出现的单词,且不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用,这是一个典型的动态规划问题。 动态规划思路 定义状态: 定义一个布尔类型的数组 dp,其中…

ZFile与Cpolar技术结合实现远程数据实时访问与集中管理的可行性分析

文章目录 前言1.关于ZFile2.本地部署ZFile3.ZFile本地访问测试4.ZFile的配置5.cpolar内网穿透工具安装6.创建远程连接公网地址7.固定ZFile公网地址 前言 在信息爆炸的年代&#xff0c;每个现代人都在数字浪潮中扮演着独特的角色。不论是商务精英、影像创作者还是学术达人&…

Vue2在子组件上使用v-model实现数据的双向绑定、.sync修饰符

1、v-model 先看示例&#xff1a; //父组件<template><ChildComponent v-model"parentData" /> </template><script> import ChildComponent from ./ChildComponent.vue;export default {components: {ChildComponent},data() {return {pa…

自学嵌入式 day 18 - 数据结构 1

数据结构 相互之间存在一种或多种特定关系的数据元素的集合 1.特定关系&#xff1a; &#xff08;1&#xff09;逻辑结构&#xff1a; ①集合&#xff1a;所有在同一个集合中&#xff0c;关系平等。 ②线性关系&#xff1a;数据和数据之间是一对一的关系。&#xff08;数组…

《Java 大视界——Java 大数据在智能电网分布式能源协同调度中的应用与挑战》

随着风电、光伏等分布式能源大规模接入电网&#xff0c;传统调度系统面临数据规模激增、响应延迟显著、多源异构数据融合困难等核心问题。本文聚焦Java生态下的大数据技术体系&#xff0c;深入探讨其在智能电网实时监测、负荷预测、资源优化配置等场景中的落地实践。通过分析Sp…

解密企业级大模型智能体Agentic AI 关键技术:MCP、A2A、Reasoning LLMs-MCP大模型上下文解析

解密企业级大模型智能体Agentic AI 关键技术&#xff1a;MCP、A2A、Reasoning LLMs-MCP大模型上下文解析 我们首先来看一下 整个MCP的一个基本的一个流程&#xff0c;他解决的一个问题。我们回到这里&#xff0c;他解决的一个问题是什么呢&#xff1f;他解决这个问题就是你的大…

25.5.15

没有比水题更令人开心的事情了 典型的并查集题目&#xff0c;并查集分为并和查&#xff0c;并就是把有关系的父亲根结点设为同一个&#xff0c;查就是在成功构造后对其进行查询 查通过递归实现 if (x f[x])return x; return f[x] find(f[x]); 由于并查集的特点&#xff0…

低损耗高效能100G O Band DWDM 10km光模块 | 支持密集波分复用

目录 前言 一、产品概述 100G QSFP28 O Band DWDM 10km光模块核心特点包括&#xff1a; 二、为何选择O Band DWDM方案&#xff1f; 1.低色散损耗&#xff0c;传输更稳定 2.兼容性强 三、典型应用场景 1.数据中心互联&#xff08;DCI&#xff09; 2.企业园区/智慧城市组网 3.电信…

CentOS 7 内核升级指南:解决兼容性问题并提升性能

点击上方“程序猿技术大咖”&#xff0c;关注并选择“设为星标” 回复“加群”获取入群讨论资格&#xff01; CentOS 7 默认搭载的 3.10.x 版本内核虽然稳定&#xff0c;但随着硬件和软件技术的快速发展&#xff0c;可能面临以下问题&#xff1a; 硬件兼容性不足&#xff1a;新…

计算机视觉----基础概念、卷积

一、概述 1.计算机视觉的定义 计算机视觉(Computer Vision)是一个跨学科的研究领域,主要涉及如何使计算机能够通过处理和理解数字图像或视频来自动进行有意义的分析和决策。其目标是使计算机能够从视觉数据中获取高层次的理解,类似于人类的视觉处理能力。 具体来说,计算机…

2025认证杯数学建模第二阶段C题:化工厂生产流程的预测和控制,思路+模型+代码

2025认证杯数学建模第二阶段思路模型代码&#xff0c;详细内容见文末名片 一、探秘化工世界&#xff1a;问题背景大揭秘 在 2025 年 “认证杯”数学中国数学建模网络挑战赛第二阶段 C 题中&#xff0c;我们一头扎进了神秘又复杂的化工厂生产流程预测与控制领域。想象一下&…

关于AI人工智能的知识图谱简介

人工智能是计算机科学的一个重要领域&#xff0c;旨在理解和构建智能行为。人工智能可以被划分为多个子领域或分支&#xff0c;包括机器学习、深度学习、自然语言处理&#xff08;Natural Language Processing&#xff0c;NLP&#xff09;、计算机视觉&#xff08;Computer Vis…

巧妙利用redis防爆破

爆破&#xff0c;也就是通过海量的尝试&#xff0c;最终确定密码&#xff0c;人们设置密码具有习惯性&#xff0c;好记、简单、有象征等&#xff0c;也就有密码字典一说&#xff0c;但是该字典也是巨量的&#xff0c;但是相对于各种字母符号等组合就显得轻量非常多 在Java Spr…