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

SHELL32!ILCombine函数分析之连接两个idl

SHELL32!ILCombine函数分析之连接两个idl

第一部分:

STDAPI_(LPITEMIDLIST) ILCombine(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
{
    // Let me pass in NULL pointers
    if (!pidl1)
    {
        if (!pidl2)
        {
            return NULL;
        }
        return ILClone(pidl2);
    }
    else if (!pidl2)
    {
        return ILClone(pidl1);
    }

    UINT cb1 = ILGetSize(pidl1) - sizeof(pidl1->mkid.cb);
    UINT cb2 = ILGetSize(pidl2);

    VALIDATE_PIDL(pidl1);
    VALIDATE_PIDL(pidl2);
    LPITEMIDLIST pidlNew = _ILCreate(cb1 + cb2);
    if (pidlNew)
    {
        CopyMemory(pidlNew, pidl1, cb1);
        CopyMemory((LPTSTR)(((LPBYTE)pidlNew) + cb1), pidl2, cb2);
        ASSERT(ILGetSize(pidlNew) == cb1+cb2);
    }

    return pidlNew;
}


第二部分:

0: kd> dv
          pidl1 = 0x00111198
          pidl2 = 0x0010f8a0
 
0: kd> dx -id 0,0,89589d88 -r1 ((SHELL32!_ITEMIDLIST *)0x118770)
((SHELL32!_ITEMIDLIST *)0x118770)                 : 0x118770 [Type: _ITEMIDLIST *]
    [+0x000] mkid             [Type: _SHITEMID]
0: kd> dx -id 0,0,89589d88 -r1 (*((SHELL32!_SHITEMID *)0x118770))
(*((SHELL32!_SHITEMID *)0x118770))                 [Type: _SHITEMID]
    [+0x000] cb               : 0x14 [Type: unsigned short]
    [+0x002] abID             [Type: unsigned char [1]]
0: kd> db 0x118770
00118770  14 00 1f 50 e0 4f d0 20-ea 3a 69 10 a2 d8 08 00  ...P.O. .:i.....
00118780  2b 30 30 9d 19 00 2f 43-3a 5c 00 00 00 00 00 00  +00.../C:\......
00118790  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................

第三部分:
0: kd> dv
          pidl1 = 0x00111198
          pidl2 = 0x0010f8a0

0: kd> dx -id 0,0,89589d88 -r1 ((SHELL32!_ITEMIDLIST *)0x10f8a0)
((SHELL32!_ITEMIDLIST *)0x10f8a0)                 : 0x10f8a0 [Type: _ITEMIDLIST *]
    [+0x000] mkid             [Type: _SHITEMID]
0: kd> dx -id 0,0,89589d88 -r1 (*((SHELL32!_SHITEMID *)0x10f8a0))
(*((SHELL32!_SHITEMID *)0x10f8a0))                 [Type: _SHITEMID]
    [+0x000] cb               : 0x5e [Type: unsigned short]
    [+0x002] abID             [Type: unsigned char [1]]
0: kd> db 0x10f8a0
0010f8a0  5e 00 32 00 00 00 00 00-54 5a b6 3c 20 00 4e 45  ^.2.....TZ.< .NE
0010f8b0  57 54 45 58 7e 31 2e 54-58 54 00 00 42 00 03 00  WTEX~1.TXT..B...
0010f8c0  04 00 ef be 54 5a a4 3c-54 5a b6 3c 14 00 00 00  ....TZ.<TZ.<....
0010f8d0  4e 00 65 00 77 00 20 00-54 00 65 00 78 00 74 00  N.e.w. .T.e.x.t.
0010f8e0  20 00 44 00 6f 00 63 00-75 00 6d 00 65 00 6e 00   .D.o.c.u.m.e.n.
0010f8f0  74 00 2e 00 74 00 78 00-74 00 00 00 1c 00 00 00  t...t.x.t.......
0010f900  04 00 0d 00 db 01 08 00-4d 00 79 00 20 00 43 00  ........M.y. .C.

第四部分:    UINT cb1 = ILGetSize(pidl1) - sizeof(pidl1->mkid.cb);


0: kd> dv
          pidl1 = 0x00111198
          pidl2 = 0x0010f8a0

            cb1 = 0x2d                //cb1 = 0x2d= 0x2f-0x2        UINT cb1 = ILGetSize(pidl1) - sizeof(pidl1->mkid.cb);

第五部分:    UINT cb2 = ILGetSize(pidl2);


0: kd> dv
          pidl1 = 0x00111198
          pidl2 = 0x0010f8a0
            cb2 = 0x60
            cb1 = 0x2d


第六部分:
    VALIDATE_PIDL(pidl1);
    VALIDATE_PIDL(pidl2);
    LPITEMIDLIST pidlNew = _ILCreate(cb1 + cb2);

0: kd> dv
          pidl1 = 0x00111198
          pidl2 = 0x0010f8a0
            cb2 = 0x60
            cb1 = 0x2d
        pidlNew = 0x00118770

  0: kd> dx -id 0,0,89589d88 -r1 ((SHELL32!_ITEMIDLIST *)0x118770)
((SHELL32!_ITEMIDLIST *)0x118770)                 : 0x118770 [Type: _ITEMIDLIST *]
    [+0x000] mkid             [Type: _SHITEMID]
0: kd> dx -id 0,0,89589d88 -r1 (*((SHELL32!_SHITEMID *)0x118770))
(*((SHELL32!_SHITEMID *)0x118770))                 [Type: _SHITEMID]
    [+0x000] cb               : 0x0 [Type: unsigned short]
    [+0x002] abID             [Type: unsigned char [1]]


第七部分:        CopyMemory(pidlNew, pidl1, cb1);


0: kd> dv
          pidl1 = 0x00111198
          pidl2 = 0x0010f8a0
            cb2 = 0x60
            cb1 = 0x2d
        pidlNew = 0x00118770

0: kd> dx -id 0,0,89589d88 -r1 ((SHELL32!_ITEMIDLIST *)0x118770)
((SHELL32!_ITEMIDLIST *)0x118770)                 : 0x118770 [Type: _ITEMIDLIST *]
    [+0x000] mkid             [Type: _SHITEMID]
0: kd> dx -id 0,0,89589d88 -r1 (*((SHELL32!_SHITEMID *)0x118770))
(*((SHELL32!_SHITEMID *)0x118770))                 [Type: _SHITEMID]
    [+0x000] cb               : 0x14 [Type: unsigned short]
    [+0x002] abID             [Type: unsigned char [1]]
0: kd> db 0x118770
00118770  14 00 1f 50 e0 4f d0 20-ea 3a 69 10 a2 d8 08 00  ...P.O. .:i.....
00118780  2b 30 30 9d 19 00 2f 43-3a 5c 00 00 00 00 00 00  +00.../C:\......
00118790  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
001187a0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
001187b0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
001187c0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
001187d0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
001187e0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................


第八部分:                CopyMemory((LPTSTR)(((LPBYTE)pidlNew) + cb1), pidl2, cb2);

0: kd> p
SHELL32!ILCombine+0x162:
001b:77325c3c 50              push    eax
0: kd> db 0x118770
00118770  14 00 1f 50 e0 4f d0 20-ea 3a 69 10 a2 d8 08 00  ...P.O. .:i.....
00118780  2b 30 30 9d 19 00 2f 43-3a 5c 00 00 00 00 00 00  +00.../C:\......
00118790  00 00 00 00 00 00 00 00-00 00 00 00 00 5e 00 32  .............^.2
001187a0  00 00 00 00 00 54 5a b6-3c 20 00 4e 45 57 54 45  .....TZ.< .NEWTE
001187b0  58 7e 31 2e 54 58 54 00-00 42 00 03 00 04 00 ef  X~1.TXT..B......
001187c0  be 54 5a a4 3c 54 5a b6-3c 14 00 00 00 4e 00 65  .TZ.<TZ.<....N.e
001187d0  00 77 00 20 00 54 00 65-00 78 00 74 00 20 00 44  .w. .T.e.x.t. .D
001187e0  00 6f 00 63 00 75 00 6d-00 65 00 6e 00 74 00 2e  .o.c.u.m.e.n.t..
0: kd> db 0x1187f0
001187f0  00 74 00 78 00 74 00 00-00 1c 00 00 00 01 08 00  .t.x.t..........

相关文章:

SHELL32!ILCombine函数分析之连接两个idl

SHELL32!ILCombine函数分析之连接两个idl 第一部分&#xff1a; STDAPI_(LPITEMIDLIST) ILCombine(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2) { // Let me pass in NULL pointers if (!pidl1) { if (!pidl2) { return NULL; …...

es 生产集群的部署架构是什么?每个索引的数据量大概有多少?每个索引大概有多少个分片?

Elasticsearch 生产集群部署架构及面试解析 在后端面试中&#xff0c;Elasticsearch&#xff08;ES&#xff09;是一个经常被问到的技术点&#xff0c;尤其是涉及到 生产环境的部署架构。面试官往往希望通过这个问题来验证你是否有真正的生产经验&#xff0c;而不仅仅是玩过一…...

Qt跨线程信号槽调用:为什么信号不能像普通函数那样调用

1. 信号与槽机制的基本原理 在 Qt 中&#xff0c;信号与槽机制是一种事件驱动的通信方式&#xff0c;用于对象之间的解耦交互。其关键特点如下&#xff1a; 信号不能直接调用 信号只是一个声明&#xff0c;并没有实际的函数实现。它们通过 emit 关键字在对象内部被触发&…...

ollama和open-webui部署ds

博客地址&#xff1a; ollama和open-webui部署ds 引言 最近&#xff0c;deepseek是越来越火&#xff0c;我也趁着这个机会做了下私有化部署&#xff0c;我这边使用的ollama和 open-webui实现的web版本 ollama 简介 Ollama 是一个开源的工具&#xff0c;专门用于简化机器学…...

泛微Ecode新增Button调用服务器中的JSP页面里的方法

前言 前端Ecode调用 后端接口编写 JSP文件方法 总结 前言 因为我们是从之前E8版本升级到E9的&#xff0c;所以会有一些接口是通过jsp文件来实现前后端调用的&#xff0c;这里介绍的就是如果你有接口是写在jsp文件里面调用的&#xff0c;但是你又想在Ecode中调用的对应的接…...

LVS+Keepalived高可用群集配置案例

以下是一个 LVSKeepalived 高可用群集配置案例&#xff1a; 1、环境准备 LVS 主调度器&#xff08;lvs1&#xff09;&#xff1a;IP 地址为 192.168.8.101&#xff0c;心跳 IP 为 192.168.4.101LVS 备调度器&#xff08;lvs2&#xff09;&#xff1a;IP 地址为 192.168.8.102…...

杰发科技AC7801——滴答定时器获取时间戳

1. 滴答定时器 杰发科技7801内部有一个滴答定时器&#xff0c;该定时器是M0核自带的&#xff0c;因此可以直接用该定时器来获取时间戳。 同样&#xff0c;7803也可以使用该方式获取时间戳。 2. 滴答定时器原理 SysTick是一个24位的递减计数器&#xff0c;它从预设的重装载值…...

Pycharm使用matplotlib出现的问题(1、不能弹出图表 2、图表标题中文不显示)

Pycharm使用matplotlib出现的问题 问题1&#xff1a;Pycharm调试时出现&#xff1a;AttributeError: module backend_interagg has no attribute FigureCanvas. Did you mean: FigureCanvasAgg? 排查原因&#xff1a;可能是由于matplotlib后端设置不正确或与运行环境不兼容引…...

Cursor+pycharm接入Codeuim(免费版),Tab自动补全功能平替

如题&#xff0c;笔者在Cursor中使用pycharm写python程序&#xff0c;试用期到了Tab自动补全功能就不能用了&#xff0c;安装Codeuim插件可以代替这个功能。步骤如下&#xff1a; 1. 在应用商店中搜索扩展Codeuim&#xff0c;下载安装 2. 安装完成后左下角会弹出提示框&#x…...

spring--ApplicationContext和BeanFactory的区别(源码)

ApplicationContext 和 BeanFactory 是 Spring 框架中两个核心的接口&#xff0c;它们都用于管理和访问 Spring 容器中的 Bean&#xff0c;但在功能和使用场景上有显著的区别。以下是它们的详细对比&#xff0c;并结合源码进行讲解。 一、 功能对比 特性BeanFactoryApplicati…...

HTMLS基本结构及标签

HTML5是目前制作网页的核心技术&#xff0c;有叫超文本标记语言。 基本结构 声明部分位于文档的最前面&#xff0c;用于向浏览器说明当前文档使用HTML标准规范。 根部标签位于声明部分后&#xff0c;用于告知浏览器这是一个HTML文档。< html>表示文档开始&#xff0c;&l…...

【蓝桥杯嵌入式】各模块学习总结

系列文章目录 留空 文章目录 系列文章目录前言一、LED模块1.1 赛题要求1.2 模块原理图1.3 编写代码1.4 赛题实战 二、LCD模块2.1 赛题要求2.2 模块原理图2.3 编写代码2.4 赛题实战 三、按键模块3.1 赛题要求3.2 模块原理图3.3 编写代码3.4 赛题实战 四、串口模块4.1 赛题要求4…...

Vue的项目创建以及项目目录与组合式API

一.创建Vue 1.Vue-CLI:创建Vue的脚手架工具 2.Create-vue&#xff1a;是Vue官方提供的脚手架之一,底层采用官方自主研发的vite,快捷&#xff0c;开发方便。 3.准备工作:系统中需要安装nodejs环境&#xff0c;在该环境中提供npm包管理器 4.创建Vue项目的命令:npm init vuela…...

数据结构秘籍(二)图(含图的概念、存储以及图的两大搜索)

1 引言 线性数据结构的元素满足唯一的线性关系&#xff0c;每个元素&#xff08;初第一个和最后一个外&#xff09;只有一个直接前趋和一个直接后继。树形数据结构的元素之间有着明显的层次关系。但是图形结构的元素之间的关系是任意的。 什么是图&#xff1f; 简单来说&…...

前端八股——JS+ES6

前端八股&#xff1a;JSES6 说明&#xff1a;个人总结&#xff0c;用于个人复习回顾&#xff0c;将持续改正创作&#xff0c;已在语雀公开&#xff0c;欢迎评论改正。...

Python 课堂点名桌面小程序

一、场景分析 闲来无事&#xff0c;老婆说叫我开发一个课堂点名桌面小程序&#xff0c;给她在课堂随机点名学生问问题。 人生苦短&#xff0c;那就用 Python 给她写一个吧。 二、依赖安装 因为要用到 excel&#xff0c;所以安装两个依赖&#xff1a; pip install openpyxl…...

【Java基础】Java中new一个对象时,JVM到底做了什么?

Java中new一个对象时&#xff0c;JVM到底做了什么&#xff1f; 在Java编程中&#xff0c;new关键字是我们创建对象的最常用方式。但你是否想过&#xff0c;当你写下new MyClass()时&#xff0c;Java虚拟机&#xff08;JVM&#xff09;到底在背后做了哪些工作&#xff1f;今天&…...

C#中的字典怎么使用?

在C#中&#xff0c;Dictionary<TKey, TValue> 是一个泛型集合类&#xff0c;用于存储键值对&#xff08;key-value pairs&#xff09;。它提供了快速的查找、插入和删除操作&#xff0c;适合需要根据键快速查找值的场景。以下是 Dictionary 的基本用法和常见操作&#xf…...

vue框架后遗症∶被遗忘的dom操作

用多了vue、react等前端框架&#xff0c;不得不说用数据驱动视图来开发真的很香&#xff0c;但是也免不了会有不用这些框架的项目&#xff0c;dom操作还是很有必要的&#xff0c;一开始学习网页设计的时候就教过&#xff0c;后面一直开发项目基本上用框架。虽然有些想不起来了&…...

进程 ─── linux第10课

目录 回顾上一节 进程 基本概念 描述进程 - PCB task_struct - PCB的一种 task_ struct内容分类 组织进程 下面来介绍task_struct内部 PID 和PPID 子进程与父进程 getpid()和getppid() 杀进程 exe 和 cwd 回顾上一节 1. 如果我们写的程序要访问硬件,必定通过sy…...

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

【网络】每天掌握一个Linux命令 - iftop

在Linux系统中&#xff0c;iftop是网络管理的得力助手&#xff0c;能实时监控网络流量、连接情况等&#xff0c;帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

苍穹外卖--缓存菜品

1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得&#xff0c;如果用户端访问量比较大&#xff0c;数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据&#xff0c;减少数据库查询操作。 缓存逻辑分析&#xff1a; ①每个分类下的菜品保持一份缓存数据…...

【Java_EE】Spring MVC

目录 Spring Web MVC ​编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 ​编辑参数重命名 RequestParam ​编辑​编辑传递集合 RequestParam 传递JSON数据 ​编辑RequestBody ​…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)

目录 一、&#x1f44b;&#x1f3fb;前言 二、&#x1f608;sinx波动的基本原理 三、&#x1f608;波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、&#x1f30a;波动优化…...

华硕a豆14 Air香氛版,美学与科技的馨香融合

在快节奏的现代生活中&#xff0c;我们渴望一个能激发创想、愉悦感官的工作与生活伙伴&#xff0c;它不仅是冰冷的科技工具&#xff0c;更能触动我们内心深处的细腻情感。正是在这样的期许下&#xff0c;华硕a豆14 Air香氛版翩然而至&#xff0c;它以一种前所未有的方式&#x…...

Java毕业设计:WML信息查询与后端信息发布系统开发

JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发&#xff0c;实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构&#xff0c;服务器端使用Java Servlet处理请求&#xff0c;数据库采用MySQL存储信息&#xff0…...

MFC 抛体运动模拟:常见问题解决与界面美化

在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...

在 Spring Boot 项目里,MYSQL中json类型字段使用

前言&#xff1a; 因为程序特殊需求导致&#xff0c;需要mysql数据库存储json类型数据&#xff0c;因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…...

前端中slice和splic的区别

1. slice slice 用于从数组中提取一部分元素&#xff0c;返回一个新的数组。 特点&#xff1a; 不修改原数组&#xff1a;slice 不会改变原数组&#xff0c;而是返回一个新的数组。提取数组的部分&#xff1a;slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...