基地址 HINSTANCE

基地址是内存映射EXE和DLL文件的首址,在Win32中这是一个很重要的概念。为了方便起见,WindowsNT 和 Windows9x用模块的基地址作为这个模块的实例句柄(HINSTANCE)。在Win32中,把模块的基地址叫做HINSTANCE可能导致混淆,因为术语"实例句柄"来自16位Windows。一个程序在16位Windows中的每个拷贝得到它自己分开的数据段(和一个联系起来的全局句柄)来把它和这个程序其它的拷贝分别开来,就形成了术语"实例句柄"。在Win32中,每个程序不必和其它程序区别开来,因为他们不共享相同的地址空间。术语INSTANCE仍然保持16位windows和32位Windows之间的连续性。在Win32中重要的是你可以对任何DLL调用GetModuleHandle()得到一个指针去访问它的组件(译注)。

 

如果 dllname 为 NULL,则得到执行体自己的模块句柄。这是非常有用的,如通常编译器产生的启动代码将取得这个句柄并将它作为一个参数hInstance传给WinMain !

(虚拟地址 0x10464)-(基地址 0x10000)=RVA 0x00464           (RVA 相对虚拟地址)

-------------------------------------------------------------------------------------------------------------------------

和微软的其它可执行格式一样,你可以通过查找它的起始偏移来得到真实首部,这个偏移放在DOS残留首部中。

WINNT.H头文件包含了DOS残留程序的数据结构定义,使得很容易找到PE首部的起始位置。

e_lfanew 域是PE真实首部的偏移。为了得到PE首部在内存中的指针,只需要把这个值加到映像的基址上即可。

---------------------------------------------------------------------------------------------------------------------

在Win32中Hinstance和hmoudle是同一个概念.保留Hinstance是因为要在16位系统中task区别.

posted on 2011-12-19 09:58  wanghj_dz  阅读(461)  评论(0编辑  收藏  举报

导航