Вот накидал IC получения всех модулей необходимого процесса и их базового адреса:
Add(MainForm,536979,259,123)
{
Width=407
Height=296
link(onCreate,10869016:doFindName,[])
}
Add(EnumProcess,10869016,319,116)
{
Name="HiAsm.exe"
Point(Name)
Point(doFindName)
Point(onFind)
Point(onNotFind)
link(onFind,14371488:doGetModules,[(363,129)(363,161)(307,161)(307,192)])
}
Add(InlineCode,14371488,319,186)
{
WorkPoints=#12:doGetModules|
EventPoints=#12:onModuleName|
VarPoints=#11:BaseAddress|
DataPoints=#9:ProcessID|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|42:uses Windows, kol, Share, Debug, TlHelp32;|0:|4:type|28: THiAsmUnit = class(TDebug)|9: private|27: m_baseAddress: integer;|0:|8: public|25: ProcessID: THI_Event;|28: onModuleName: THI_Event;|0:|58: procedure doGetModules(var _Data: TData; Index: word);|57: procedure BaseAddress(var _Data: TData; Index: word);|6: end;|0:|14:implementation|0:|34:procedure THiAsmUnit.doGetModules;|3:var|21: hSnapshot: THandle;|32: ModuleEntry32: TModuleEntry32;|5:begin|21: m_baseAddress := 0;|86: hSnapshot := CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, ToIntegerEvent(ProcessID));|26: if (hSnapshot <> 0) then|7: begin|51: ModuleEntry32.dwSize := SizeOf(TModuleEntry32);|0:|53: if (Module32First(hSnapshot, ModuleEntry32)) then|12: repeat|6: |13: begin|62: m_baseAddress := integer(ModuleEntry32.modBaseAddr);|60: _hi_OnEvent(onModuleName, ModuleEntry32.szModule);|12: end;|55: until not Module32Next(hSnapshot, ModuleEntry32);|0:|27: CloseHandle(hSnapshot);|6: end;|4:end;|0:|33:procedure THiAsmUnit.BaseAddress;|5:begin|34: dtInteger(_Data, m_baseAddress);|4:end;|0:|4:end.|
link(onModuleName,12595525:doMessage,[])
link(ProcessID,10869016:CurrentID,[])
}
Add(Message,12595525,368,186)
{
link(Caption,14371488:baseAddress,[(381,174)(353,174)(353,230)(325,230)])
}
Проблемы могут быть только в преобразовании указателей в целое число (Integer).
Ну и остановка перебора модулей отсутствует, тут уж сам как нибудь сделаешь, если потребуется.