; 在拥有进程的上下文中获取模块的基地址和大小,以自身脚本进程为例
OwnPID   := DllCall("GetCurrentProcessId")
ModuleBase := GetModuleBaseAddr("user32.dll", OwnPID)

MsgBox % "modBaseAddr:`t" ModuleBase.Addr "`nmodBaseSize:`t" ModuleBase.Size " bytes"
; modBaseAddr:	0x007ffa841e0000
; modBaseSize:	0x00000000165000 bytes

GetModuleBaseAddr(ModuleName, ProcessID) {
  if !(hSnapshot := DllCall("CreateToolhelp32Snapshot", "uint", 0x18, "uint", ProcessID))
    throw Exception("CreateToolhelp32Snapshot", -1)

  NumPut(VarSetCapacity(MODULEENTRY32, (A_PtrSize = 8 ? 568 : 548), 0), MODULEENTRY32, "uint")
  if !(DllCall("Module32First", "ptr", hSnapshot, "ptr", &MODULEENTRY32))
    throw Exception("Module32First", -1), DllCall("CloseHandle", "ptr", hSnapshot)

  ME32 := {}
  while (DllCall("Module32Next", "ptr", hSnapshot, "ptr", &MODULEENTRY32)) {
    if (ModuleName = StrGet(&MODULEENTRY32+ (A_PtrSize = 8 ? 48 : 32), 256, "cp0")) {
      ME32.Addr := Format("{:#016x}", NumGet(MODULEENTRY32, (A_PtrSize = 8 ? 24 : 20), "uptr"))
      ME32.Size := Format("{:#016x}", NumGet(MODULEENTRY32, (A_PtrSize = 8 ? 32 : 24), "uint"))
    }
  }

  return ME32, DllCall("CloseHandle", "ptr", hSnapshot)
}

 

声明:站内资源为整理优化好的代码上传分享与学习研究,如果是开源代码基本都会标明出处,方便大家扩展学习路径。请不要恶意搬运,破坏站长辛苦整理维护的劳动成果。本站为爱好者分享站点,所有内容不作为商业行为。如若本站上传内容侵犯了原著者的合法权益,请联系我们进行删除下架。