资源释放

selph
selph
发布于 2021-09-07 / 525 阅读
0
0

资源释放

通过资源释放相关 API,可以把一些必要的 dll、图片、音乐等文件以资源的形式存放到 exe 中,当 exe 运行的时候进行释放;在文件传输方面会比较方便,因为可以一个 exe 装一堆东西。

API 介绍

API:FindResource

获取指定模块的资源,返回资源句柄

HRSRC
WINAPI
FindResourceW(
    _In_opt_ HMODULE hModule,//资源所在模块句柄,如果是当前模块,则NULL就行
    _In_ LPCWSTR lpName,//资源名称:MAKEINTRESOURCE(ID)
    _In_ LPCWSTR lpType//资源类型
    );

API:SizeofResource

获取资源的大小

DWORD
WINAPI
SizeofResource(
    _In_opt_ HMODULE hModule,//模块句柄,当前模块就NULL
    _In_ HRSRC hResInfo//资源句柄
    );

API:LoadResource

加载资源到全局存储器,返回指向资源文件首地址的指针(资源数据句柄)

HGLOBAL
WINAPI
LoadResource(
    _In_opt_ HMODULE hModule,	//模块句柄
    _In_ HRSRC hResInfo		//资源句柄
    );

API:LockResource

锁定内存中的资源,返回指向资源文件首地址的指针

LPVOID
WINAPI
LockResource(
    _In_ HGLOBAL hResData	//资源数据句柄
    );


这里以释放 DLL 文件并调用 DLL 内的函数为例,演示资源释放的过程

示例代码

这里的环境是 VS2019,记得先右键项目,添加,资源,导入

// 功能:释放指定的资源到指定路径
// 参数:资源名称,资源类型,保存路径
BOOL FreeMyResoure(UINT uiResourceName, wchar_t* lpszResourceType, char* lpszSaveFileName) {
	//获取指定模块里的资源
	HRSRC hRsrc = ::FindResource(NULL, MAKEINTRESOURCE(uiResourceName), lpszResourceType);
	//获取资源大学
	DWORD dwSize = ::SizeofResource(NULL, hRsrc);
	//加载资源到内存
	HGLOBAL hGlobal = ::LoadResource(NULL, hRsrc);
	//锁定资源
	LPVOID lpVoid = ::LockResource(hGlobal);
	//保存资源为文件
	FILE* fp = NULL;
	fopen_s(&fp,lpszSaveFileName,"wb+");
	fwrite(lpVoid, sizeof(char), dwSize, fp);
	fclose(fp);

	// 也可以使用Windows API的方式来写出文件

	// 创建文件,获得文件句柄,进行写出
	//HANDLE hFile = CreateFileA(lpFilePath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
	// 写文件
	//DWORD dwWriteSize = 0;
	//WriteFile(hFile, lpRes, dwSize, &dwWriteSize, NULL);

	//CloseHandle(hFile);
	CloseHandle(hGlobal);
	return TRUE;
}

参考资料

  • 《Windows 黑客编程技术详解》

评论