WEB开发网
开发学院软件开发VC 合并 DLL 阅读

合并 DLL

 2006-07-20 11:39:58 来源:WEB开发网   
核心提示: DWORD UnloadPbDllFromMemory(PIMAGE_DOS_HEADER dosHeader){PIMAGE_NT_HEADERS pNTHeader;pNTHeader = (PIMAGE_NT_HEADERS)((DWORD)dosHeader + (DWORD)do
DWORD UnloadPbDllFromMemory(PIMAGE_DOS_HEADER dosHeader)
{
  PIMAGE_NT_HEADERS pNTHeader;
  pNTHeader = (PIMAGE_NT_HEADERS)((DWORD)dosHeader + (DWORD)dosHeader->e_lfanew);
  EntryPoint = (LPENTRYPOINT)(pNTHeader->OptionalHeader.AddressOfEntryPoint +
           (DWORD)dosHeader);
  EntryPoint((HINSTANCE)dosHeader, DLL_PROCESS_DETACH, 0);
  return VirtualFree(dosHeader, 0, MEM_RELEASE);
}

关于示例代码的说明

在本文附带的示例代码中,合并了一个名为 hardware.dll 的动态连接库,该动态连接库是一个获取系统硬件信息的库文件,其中包括了以下函数:

getmac     取得网卡 MAC
  VolumeNumber   取得硬盘卷标
  changeres      改变屏幕分辩率
  IsDiskInDrive    检查软驱中是否插有盘 
  DPGetDefaultPrinter 取得默认的打印机名
  DPSetDefaultPrinter 设置默认的打印机
  getserial      取得硬盘的出厂序列号
  getmetric      取得显示分辩率
  PrintStringDirect  直接向打印机发送一个串
  vfpbeep       让 PC 喇叭发声
  getcpuid       取得 CPU ID
  getbios       取得主板 BIOS ID

在示例代码中,只调用了其中一个函数 getbios 来获取主板 BIOS ID, 这里说明一下,该函数实际上好象只能检测 AWARD 主板的 BIOS, 也就是说它是读取的是系统内存 0x000fex71 处的值。因为其它牌子的主板 BIOS 的位置稍有不同,但在程序中没有进行这方面的处理,所以在读其它牌子的主板 BIOS 时可能会有些问题(读出的内容可能不正确)。关于此 DLL 的内容和实现,也许我会在另一篇文章中论及。

局限

在我进行测试时,发现对于有些含有资源的 DLL,在 9x 平台下可能会有问题。

题外话

另外,其它一些本文未提及的非主要的函数,请自行参见源代码中的注释。

再,本文涉及 PE 文件格式方面的知识,它们已经超出了本文的范围,具体信息可参见 MSDM 中的:

  • Peering Inside the PE: A Tour of the Win32 Portable Executable File Format 一文和
  • Microsoft Portable Executable and Common Object File Format Specification 一文
  • 特别感谢卢春明(Aming)在我编写本文时所作的一些技术方面的建议和指导

    上一页  1 2 3 4 

    Tags:合并 DLL

    编辑录入:爽爽 [复制链接] [打 印]
    赞助商链接