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 第一部分: STDAPI_(LPITEMIDLIST) ILCombine(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2) { // Let me pass in NULL pointers if (!pidl1) { if (!pidl2) { return NULL; …...
es 生产集群的部署架构是什么?每个索引的数据量大概有多少?每个索引大概有多少个分片?
Elasticsearch 生产集群部署架构及面试解析 在后端面试中,Elasticsearch(ES)是一个经常被问到的技术点,尤其是涉及到 生产环境的部署架构。面试官往往希望通过这个问题来验证你是否有真正的生产经验,而不仅仅是玩过一…...
Qt跨线程信号槽调用:为什么信号不能像普通函数那样调用
1. 信号与槽机制的基本原理 在 Qt 中,信号与槽机制是一种事件驱动的通信方式,用于对象之间的解耦交互。其关键特点如下: 信号不能直接调用 信号只是一个声明,并没有实际的函数实现。它们通过 emit 关键字在对象内部被触发&…...
ollama和open-webui部署ds
博客地址: ollama和open-webui部署ds 引言 最近,deepseek是越来越火,我也趁着这个机会做了下私有化部署,我这边使用的ollama和 open-webui实现的web版本 ollama 简介 Ollama 是一个开源的工具,专门用于简化机器学…...
泛微Ecode新增Button调用服务器中的JSP页面里的方法
前言 前端Ecode调用 后端接口编写 JSP文件方法 总结 前言 因为我们是从之前E8版本升级到E9的,所以会有一些接口是通过jsp文件来实现前后端调用的,这里介绍的就是如果你有接口是写在jsp文件里面调用的,但是你又想在Ecode中调用的对应的接…...
LVS+Keepalived高可用群集配置案例
以下是一个 LVSKeepalived 高可用群集配置案例: 1、环境准备 LVS 主调度器(lvs1):IP 地址为 192.168.8.101,心跳 IP 为 192.168.4.101LVS 备调度器(lvs2):IP 地址为 192.168.8.102…...
杰发科技AC7801——滴答定时器获取时间戳
1. 滴答定时器 杰发科技7801内部有一个滴答定时器,该定时器是M0核自带的,因此可以直接用该定时器来获取时间戳。 同样,7803也可以使用该方式获取时间戳。 2. 滴答定时器原理 SysTick是一个24位的递减计数器,它从预设的重装载值…...
Pycharm使用matplotlib出现的问题(1、不能弹出图表 2、图表标题中文不显示)
Pycharm使用matplotlib出现的问题 问题1:Pycharm调试时出现:AttributeError: module backend_interagg has no attribute FigureCanvas. Did you mean: FigureCanvasAgg? 排查原因:可能是由于matplotlib后端设置不正确或与运行环境不兼容引…...
Cursor+pycharm接入Codeuim(免费版),Tab自动补全功能平替
如题,笔者在Cursor中使用pycharm写python程序,试用期到了Tab自动补全功能就不能用了,安装Codeuim插件可以代替这个功能。步骤如下: 1. 在应用商店中搜索扩展Codeuim,下载安装 2. 安装完成后左下角会弹出提示框&#x…...
spring--ApplicationContext和BeanFactory的区别(源码)
ApplicationContext 和 BeanFactory 是 Spring 框架中两个核心的接口,它们都用于管理和访问 Spring 容器中的 Bean,但在功能和使用场景上有显著的区别。以下是它们的详细对比,并结合源码进行讲解。 一、 功能对比 特性BeanFactoryApplicati…...
HTMLS基本结构及标签
HTML5是目前制作网页的核心技术,有叫超文本标记语言。 基本结构 声明部分位于文档的最前面,用于向浏览器说明当前文档使用HTML标准规范。 根部标签位于声明部分后,用于告知浏览器这是一个HTML文档。< html>表示文档开始,&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:是Vue官方提供的脚手架之一,底层采用官方自主研发的vite,快捷,开发方便。 3.准备工作:系统中需要安装nodejs环境,在该环境中提供npm包管理器 4.创建Vue项目的命令:npm init vuela…...
数据结构秘籍(二)图(含图的概念、存储以及图的两大搜索)
1 引言 线性数据结构的元素满足唯一的线性关系,每个元素(初第一个和最后一个外)只有一个直接前趋和一个直接后继。树形数据结构的元素之间有着明显的层次关系。但是图形结构的元素之间的关系是任意的。 什么是图? 简单来说&…...
前端八股——JS+ES6
前端八股:JSES6 说明:个人总结,用于个人复习回顾,将持续改正创作,已在语雀公开,欢迎评论改正。...
Python 课堂点名桌面小程序
一、场景分析 闲来无事,老婆说叫我开发一个课堂点名桌面小程序,给她在课堂随机点名学生问问题。 人生苦短,那就用 Python 给她写一个吧。 二、依赖安装 因为要用到 excel,所以安装两个依赖: pip install openpyxl…...
【Java基础】Java中new一个对象时,JVM到底做了什么?
Java中new一个对象时,JVM到底做了什么? 在Java编程中,new关键字是我们创建对象的最常用方式。但你是否想过,当你写下new MyClass()时,Java虚拟机(JVM)到底在背后做了哪些工作?今天&…...
C#中的字典怎么使用?
在C#中,Dictionary<TKey, TValue> 是一个泛型集合类,用于存储键值对(key-value pairs)。它提供了快速的查找、插入和删除操作,适合需要根据键快速查找值的场景。以下是 Dictionary 的基本用法和常见操作…...
vue框架后遗症∶被遗忘的dom操作
用多了vue、react等前端框架,不得不说用数据驱动视图来开发真的很香,但是也免不了会有不用这些框架的项目,dom操作还是很有必要的,一开始学习网页设计的时候就教过,后面一直开发项目基本上用框架。虽然有些想不起来了&…...
进程 ─── linux第10课
目录 回顾上一节 进程 基本概念 描述进程 - PCB task_struct - PCB的一种 task_ struct内容分类 组织进程 下面来介绍task_struct内部 PID 和PPID 子进程与父进程 getpid()和getppid() 杀进程 exe 和 cwd 回顾上一节 1. 如果我们写的程序要访问硬件,必定通过sy…...
利用 TaoToken 统一管理多个 AI 项目的 API 密钥与用量
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 利用 TaoToken 统一管理多个 AI 项目的 API 密钥与用量 当你手头同时运行着多个 AI 应用或实验项目时,管理分散的 API …...
CFD湍流模型不确定性量化:特征空间扰动框架原理与应用
1. 项目概述与核心挑战在计算流体力学(CFD)的工程实践中,我们常常面临一个核心困境:如何高效且可靠地预测复杂湍流?雷诺平均纳维-斯托克斯(RANS)模型因其在计算成本和工程实用性之间的绝佳平衡&…...
如何快速掌握tsMuxer:视频无损封装的终极指南
如何快速掌握tsMuxer:视频无损封装的终极指南 【免费下载链接】tsMuxer tsMuxer is a transport stream muxer for remuxing/muxing elementary streams, EVO/VOB/MPG, MKV/MKA, MP4/MOV, TS, M2TS to TS to M2TS. Supported video codecs H.264/AVC, H.265/HEVC, V…...
2026年AI写作辅助网站盘点:12款神器助你高效完成初稿生成、排版和降AI率
随着 AI 技术的持续突破,2026 年的论文写作辅助工具市场已进入“智能化、定制化、合规化”的新阶段。从本科生的课程论文到研究生的学位论文,再到科研人员的期刊投稿,AI 工具正在为不同层次的学术需求提供高效、精准的解决方案。本文基于权威…...
机器学习与熵工程协同设计CuCo纳米合金催化剂,实现高效硝酸盐还原制氨
1. 项目概述:当机器学习遇见熵工程,如何“算”出顶级催化剂?在材料研发这个领域里,我待了十几年,最大的感受就是“试错”两个字有多重。尤其是当我们想合成一些在宏观世界里根本“不兼容”的金属合金时,比如…...
从API调用日志看Taotoken在访问控制与审计上的价值
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 从API调用日志看Taotoken在访问控制与审计上的价值 对于将大模型能力集成到业务流程中的团队而言,API调用不仅是功能实…...
NCMDump工具:3步轻松解密网易云音乐NCM加密文件
NCMDump工具:3步轻松解密网易云音乐NCM加密文件 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 你是否曾经在网易云音乐下载了喜欢的歌曲,却发现只能在官方客户端播放?NCM加密格式的限制让你无法在…...
从零到专业:Sunshine虚拟手柄配置的5个关键突破点
从零到专业:Sunshine虚拟手柄配置的5个关键突破点 【免费下载链接】Sunshine Self-hosted game stream host for Moonlight. 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine 你是否曾在深夜准备享受游戏时,发现手柄在Sunshine串流中…...
Flutter Provider状态管理完全指南
Flutter Provider状态管理完全指南 引言 Provider是Flutter生态中最流行的状态管理方案之一,它基于InheritedWidget实现,提供了简单、高效的状态管理方式。本文将深入探讨Provider的核心概念、使用方法和最佳实践。 一、Provider基础 1.1 添加依赖 depen…...
JMeter梯度压测:精准定位系统可扩展性边界
1. 为什么“梯度式压测”不是加个线程组就完事了?很多人第一次打开JMeter,照着教程建个线程组、加个HTTP请求、跑个聚合报告,看到TPS从200涨到800就以为“压测完成了”。结果上线后流量一上来,服务直接503,监控里CPU没…...
