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

NdrpGetAllocateAllNodesContext函数分析之三个内存区域的联系


第一部分:
NDR_ALLOC_ALL_NODES_CONTEXT *
NdrpGetAllocateAllNodesContext(
    PMIDL_STUB_MESSAGE pStubMsg,
    PFORMAT_STRING     pFormat )
{

    uchar *pAllocMemory =
        (uchar*)NdrAllocate( pStubMsg, AllocSize + sizeof(NDR_ALLOC_ALL_NODES_CONTEXT) );    //返回到这里

    NDR_ALLOC_ALL_NODES_CONTEXT *pAllocContext =
        (NDR_ALLOC_ALL_NODES_CONTEXT*)(pAllocMemory + AllocSize);
    pAllocContext->AllocAllNodesMemory      = pAllocMemory;
    pAllocContext->AllocAllNodesMemoryBegin = pAllocMemory;
    pAllocContext->AllocAllNodesMemoryEnd   = (uchar*)pAllocContext;
    
    return pAllocContext;
}

第二部分:

0: kd> p
RPCRT4!NdrAllocate+0x97:
001b:77c3f91a c20800          ret     8
0: kd> r
eax=00096488

    ulong AllocSize = pStubMsg->MemorySize;        =0x74
    pStubMsg->MemorySize = 0;
    LENGTH_ALIGN( AllocSize, __alignof(NDR_ALLOC_ALL_NODES_CONTEXT) - 1);

    uchar *pAllocMemory =
        (uchar*)NdrAllocate( pStubMsg, AllocSize + sizeof(NDR_ALLOC_ALL_NODES_CONTEXT) );

    NDR_ALLOC_ALL_NODES_CONTEXT *pAllocContext =
        (NDR_ALLOC_ALL_NODES_CONTEXT*)(pAllocMemory + AllocSize);
    pAllocContext->AllocAllNodesMemory      = pAllocMemory;
    pAllocContext->AllocAllNodesMemoryBegin = pAllocMemory;
    pAllocContext->AllocAllNodesMemoryEnd   = (uchar*)pAllocContext;
    
    return pAllocContext;
}


0: kd> p
RPCRT4!NdrpGetAllocateAllNodesContext+0x67:
001b:77c44682 8bc8            mov     ecx,eax
0: kd> r
eax=00096488 ebx=77d75382 ecx=00096508 edx=0006fb90 esi=0006fae0 edi=00000074
eip=77c44682 esp=0006f9a8 ebp=0006f9d4 iopl=0         nv up ei pl nz na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000206
RPCRT4!NdrpGetAllocateAllNodesContext+0x67:
001b:77c44682 8bc8            mov     ecx,eax


0: kd> p
RPCRT4!NdrpGetAllocateAllNodesContext+0x6c:
001b:77c44687 8908            mov     dword ptr [eax],ecx
0: kd> r
eax=000964fc ebx=77d75382 ecx=00096488


pAllocContext= eax=000964fc


0: kd> r
eax=00096488 ebx=77d75382 ecx=00096508 edx=0006fb90 esi=0006fae0 edi=00000074
eip=77c44682 esp=0006f9a8 ebp=0006f9d4 iopl=0         nv up ei pl nz na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000206
RPCRT4!NdrpGetAllocateAllNodesContext+0x67:
001b:77c44682 8bc8            mov     ecx,eax
0: kd> dv
       pStubMsg = 0x0006fae0
        pFormat = 0x77d75386 "+.&"
        pBuffer = 0x007b0a54 "???"
      pOldQueue = 0x0006fab4
0: kd> p
RPCRT4!NdrpGetAllocateAllNodesContext+0x69:
001b:77c44684 8d0439          lea     eax,[ecx+edi]


第四部分:


0: kd> p
RPCRT4!NdrpGetAllocateAllNodesContext+0x6c:
001b:77c44687 8908            mov     dword ptr [eax],ecx
0: kd> r
eax=000964fc ebx=77d75382 ecx=00096488 edx=0006fb90 esi=0006fae0 edi=00000074
eip=77c44687 esp=0006f9a8 ebp=0006f9d4 iopl=0         nv up ei pl nz na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000206
RPCRT4!NdrpGetAllocateAllNodesContext+0x6c:
001b:77c44687 8908            mov     dword ptr [eax],ecx ds:0023:000964fc=00000000
0: kd> p
RPCRT4!NdrpGetAllocateAllNodesContext+0x6e:
001b:77c44689 894804          mov     dword ptr [eax+4],ecx
0: kd> p
RPCRT4!NdrpGetAllocateAllNodesContext+0x71:
001b:77c4468c 894008          mov     dword ptr [eax+8],eax


0: kd> dt NDR_ALLOC_ALL_NODES_CONTEXT 000964fc
RPCRT4!NDR_ALLOC_ALL_NODES_CONTEXT
   +0x000 AllocAllNodesMemory : 0x00096488  ""
   +0x004 AllocAllNodesMemoryBegin : 0x00096488  ""
   +0x008 AllocAllNodesMemoryEnd : 0x000964fc  "???"


第五部分:

0: kd> dd 0x00096488
00096488  00000000 00000000 00000000 00000000    待分配内存区域1
00096498  00000000 00000000 00000000 00000000
000964a8  00000000 00000000 00000000 00000000
000964b8  00000000 00000000 00000000 00000000
000964c8  00000000 00000000 00000000 00000000
000964d8  00000000 00000000 00000000 00000000
000964e8  00000000 00000000 00000000 00000000
000964f8  00000000 00096488 00096488 000964fc    NDR_ALLOC_ALL_NODES_CONTEXT结构信息-区域2
0: kd> dd 0x00096508
00096508  4d454d4c 00096488 00000000 00000000    _NDR_MEMORY_LIST_TAIL_NODE结构信息-区域3

http://www.xdnf.cn/news/202717.html

相关文章:

  • 每日一题(12)TSP问题的贪心法求解
  • params query传参差异解析及openinstall跨平台应用
  • EMC isilon/PowerScale 如何收集日志
  • 【SAP ABAP 获取采购申请首次审批时间】
  • 【LLM开发】Unigram算法
  • 可编程控制器应用
  • 瞄定「舱驾融合」,黑芝麻智能的智驾平权「芯」路径
  • 大数据应用开发与实战(1)
  • Git技巧:Git Hook,自动触发,含实战分享
  • 【C到Java的深度跃迁:从指针到对象,从过程到生态】第四模块·Java特性专精 —— 第十六章 多线程:从pthread到JMM的升维
  • Atcoder Help 有关Atcoder 的介绍-1 涨分规则
  • 嵌入式开发学习日志Day11
  • GESP2024年9月认证C++八级( 第二部分判断题(6-10))
  • 在Linux系统中安装Anaconda的完整指南
  • (001)Excel 快捷键
  • 【RabbitMQ消息队列】(二)交换机模式详解
  • MTKAndroid12-13-开机应用自启功能实现
  • 【差分隐私】目标扰动机制(Objective Perturbation)
  • Android平台Unity引擎的Mono JIT机制分析
  • 前端如何使用Mock模拟数据实现前后端并行开发,提升项目整体效率
  • 计算机视觉进化论:YOLOv12、YOLOv11与Darknet系YOLOv7的微调实战对比
  • 单片机-89C51部分:7、中断
  • ZYNQ-自定义呼吸灯IP核以及PS-PL数据发送接收
  • 【Java学习笔记】传参机制
  • Vue 2 中 Vue 实例对象(vm)的所有核心方法,包含完整示例、使用说明及对比表格
  • 【Java】 使用 HTTP 响应状态码定义web系统返回码
  • 继承(c++版 非常详细版)
  • linux 环境下 c++ 程序打印 core dump 信息
  • 滑动窗口模板
  • 【基础知识】常见的计算公式(一)