PE文件资源解析(四)光标资源的解析

2023-11-16

光标资源,在这里指的是资源类型为RT_CURSOR的资源信息。通过ResHacker看到的效果图如下:

 解析代码如下:

HRSRC hResrc = ::FindResourceEx((HMODULE)hModule, lpType, lpName, wLanguage);
DWORD dwSize = ::SizeofResource((HMODULE)hModule, hResrc);
HGLOBAL hGlobal = ::LoadResource((HMODULE)hModule, hResrc);
if (hGlobal == NULL)
	return;

BYTE* lpResrc = (BYTE*)LockResource(hGlobal);
if (lpResrc == NULL)
	return;

HCURSOR hCursor = (HCURSOR)CreateIconFromResource((PBYTE)lpResrc, dwSize, FALSE, 0x00030000);
if (hCursor)
{
	m_imagelist.Add(hCursor);
	Gdiplus::Bitmap* pBitmap = HCursor2GdiplusBitmap(hCursor);
	if (pBitmap && pBitmap->GetLastStatus() == Gdiplus::Ok)
	{
		//解析成功
	}
}

光标文件图像层分为2层,第一层为掩码层(遮罩层,白色为透明像素点),第二层为图像层,2个图层进行叠加达到光标不规则透明效果。这里用到了一个转换函数HCursor2GdiplusBitmap,实现代码如下:

Gdiplus::Bitmap* HCursor2GdiplusBitmap(HCURSOR hCursor)
{
	ICONINFO iconinfo;
	if (GetIconInfo(hCursor, &iconinfo))
	{
		Gdiplus::Bitmap* pImage = (Gdiplus::Bitmap*)Bitmap::FromHBITMAP(iconinfo.hbmMask, NULL);
		Gdiplus::Status result = pImage->GetLastStatus();
		if (result == Gdiplus::Ok)
		{
			CSize sz(pImage->GetWidth(), pImage->GetHeight());
			sz.cy /= 2;
			Gdiplus::Bitmap* pResult = new Gdiplus::Bitmap(sz.cx, sz.cy);
			Gdiplus::Graphics graphics(pResult);
			graphics.DrawImage(pImage, Rect(0, 0, sz.cx, sz.cy), 0, sz.cy, sz.cx, sz.cy, UnitPixel);
						
			// 下面将遮挡层白色透明处理
			Gdiplus::Bitmap* pSrcImage = new Gdiplus::Bitmap(sz.cx, sz.cy);
			Gdiplus::Graphics g(pSrcImage);
			g.DrawImage(pImage, Rect(0, 0, sz.cx, sz.cy), 0, 0, sz.cx, sz.cy, UnitPixel);
			PixelFormat pixfmt = pSrcImage->GetPixelFormat();
			if (!Gdiplus::IsAlphaPixelFormat(pixfmt))
			{
				delete pResult;
				delete pSrcImage;
				delete pImage;
				return NULL;
			}

			for (int i = 0; i < sz.cy; i++)
			{
				for (int j = 0; j < sz.cx; j++)
				{
					Color clrSrc, clrDst;
					pSrcImage->GetPixel(j, i, &clrSrc);

					const unsigned red = clrSrc.GetRed();
					const unsigned green = clrSrc.GetGreen();
					const unsigned blue = clrSrc.GetBlue();
					const unsigned alpha = clrSrc.GetAlpha();

					pResult->GetPixel(j, i, &clrDst);
					if (red == 255 && green == 255 && blue == 255)// 颜色值白色
					{
						clrDst.SetValue(Color::MakeARGB(0, clrDst.GetRed(), clrDst.GetGreen(), clrDst.GetBlue()));
						pResult->SetPixel(j, i, clrDst);
					}
				}
			}
			delete pSrcImage;
			delete pImage;

			return pResult;
		}
	}

	return NULL;
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PE文件资源解析(四)光标资源的解析 的相关文章

  • 传感器尺寸与像素密度对相片分辨率的影响

    在人们日常生活摄影中 相机的传感器尺寸以及像素素往往决定了一幅图像的清晰度 当然 不同的镜头 不同的CMOS质量等等都会对相片的质量产生影响 今天就简单讨论讨论传感器尺寸和像素密度对图像分辨率的影响 当传感器尺寸一定时 像素越多 也就是像素
  • Python-集合

    探索Python集合的奇妙世界 在Python编程中 集合 Set 是一种强大且有用的数据结构 它用于存储多个不重复的元素 集合的独特之处在于它的元素是无序的 并且每个元素都是唯一的 这使得集合在处理去重和进行快速成员检查时非常有效 创建集
  • 手把手带你打造自己的UI样式库(第五章)之常用页面切图的设计与开发

    常用页面切图的设计与开发 在一些大的前端团队中 前端工程师这个职位会出现一个分支 叫做重构工程师 重构工程师主要负责 HTML 和 CSS 的制作 也就是把设计稿转换成 HTML 和 CSS 代码 重构工作完成以后 把制作好的 HTML 和
  • 【第十四届蓝桥杯单片机组底层驱动测试】

    第十四届蓝桥杯单片机组底层驱动测试 下面分享的是第十四届蓝桥杯单片机组底层驱动代码的测试和相关说明 今年官方提供的资料包中底层驱动代码和以往有了变化 主要代码还是提供给了我们 只是此次没有了相关头文件iic h ds1302 onewire
  • win10剪贴板快捷键win+v

    win v可以出现最近10多次粘贴的数据
  • Ioc容器refresh总结(3)--- Spring源码从入门到精通(三十三)

    上篇文章介绍了 调用bean工厂的后置处理器 主要分为两步 他是在beanFactory预准备标准初始化之后执行invokBeanFactoryPostProcessor 先调用beanDefinitionRegistryPostProce
  • [paper] MTCNN

    MTCNN 论文全称 Joint Face Detection and Alignment using Multi task Cascaded Convolutional Networks 论文下载链接 https arxiv org ab
  • vue.js基础学习(模板语法)

    基础入门 vue js模板语法 1 模板语法 methods 给vue定义方法 this 指向当前vue实例 v html 让内容以HTML形式编译 v bind 绑定动态数据 v noce 当数据发生改变时 插值处内容不发生改变 动态属性
  • maven相关

    1 webxml attribute is required or pre existing WEB INF web xml if executing in update 原因 web项目下缺少 WEB INF web xml 在servl
  • 【AWS】API Gateway创建Rest API--从S3下载文件

    一 背景 在不给AK SK的前提下 用户查看s3上文件 从s3下载文件 二 创建API 1 打开API Gateway 点击创建API 选择REST API REST API和HTTP API区别 来自AWS官网 REST API 和 HT
  • 算法——查找

    文章目录 一 基本概念和评价 1 相关概念 2 查找表 2 1 常见操作 2 2 分类 3 查找算法的评价指标 二 线性结构查找 1 顺序查找算法 1 1 定义 1 2 算法思想 1 3 特点 1 4 分类 1 无哨兵的无序线性表的顺序查找
  • Unity 安卓报错 failed to extract resources needed by IL2cpp

    Unity打出来的包在自己的PC放置好文件后 运行能够正常运行 但是git提交之后 别的机器拉代码下来报错 failed to extract resources needed by IL2cpp 这里推测原因是 安卓包打出来的Asset
  • TikTok逆向,全球的小姐姐们,我来啦!

    作者 AYJk 链接 https juejin im post 5c19a38ae51d453e0a209256 开源地址 首先抛出GitHub地址吧 多多支持指点 谢谢 AYTikTokPod https github com AYJk
  • 知识索引目录

    author skate time 2012 11 22 存储 io系统的压力测试工具 fio http blog csdn net wyzxg article details 7454072 iozone使用 http blog csdn
  • 从零开发一套完整的react项目开发环境

    不管是工作需要还是面试加分 除了Vue相关技术以外 React技术栈也已经成为了前端开发工程师必备的技术点 接下来 我将从零开发一套完整的React全家桶项目开发环境 提供给需要的同行小伙伴观看也方便自己以后复习 篇幅很长 请需要的小伙伴耐

随机推荐