【发布时间】:2013-02-20 11:13:43
【问题描述】:
我正在编写一个自定义模块来检查 EXE 文件的一致性(这不是这个问题的一部分。)为此,我需要知道 EXE 文件中某个资源的偏移量来计算 EXE 的大小我需要检查的文件正文。
我想出了以下代码来获取IDR_HTML_DLG 资源在strExeFilePath 文件中的偏移量:
int ncbOffsetInBytes = 0;
HMODULE hModule = LoadLibrary(strExeFilePath);
if(hModule)
{
HRSRC hRes = ::FindResource(hModule, MAKEINTRESOURCE(IDR_HTML_DLG), RT_HTML);
if(hRes)
{
long szLength = ::SizeofResource(hModule, hRes);
HGLOBAL hGlobal = ::LoadResource(hModule, hRes);
if(szLength && hGlobal)
{
BYTE* pData = (BYTE*)LockResource(hGlobal);
DWORD dwLast = (DWORD)(pData + szLength);
DWORD dwFirst = (DWORD)hModule;
ncbOffsetInBytes = dwLast - dwFirst;
}
}
::FreeLibrary(hModule);
hModule = NULL;
}
但ncbOffsetInBytes 中的结果却比 EXE 文件本身大。知道如何纠正吗?
【问题讨论】:
-
我认为问题在于模块不是在单个块中映射到内存中,而是在几个单独的部分中:
.text在这里,.data那里,.rsrc在上面那里......而且EXE的某些部分可能根本没有加载! -
如果您可以发布一段代码,它只是在 DLL 中定义了一个资源,我可以看看我是否可以帮助解决它?
-
谢谢。我看到@rodrigo 点。您可能是对的,而我在这里的方向不正确...
-
你为什么不简单地深入研究标题