ULONG64 get_module_base_x64(PEPROCESS proc, UNICODE_STRING module_name)
{
PPEB pPeb = PsGetProcessPeb(proc);
if (!pPeb)
return NULL;
KAPC_STATE state;
KeStackAttachProcess(proc, &state);
PPEB_LDR_DATA pLdr = (PPEB_LDR_DATA)pPeb->Ldr;
if (!pLdr)
{
KeUnstackDetachProcess(&state);
return NULL;
}
for (PLIST_ENTRY list = (PLIST_ENTRY)pLdr->ModuleListLoadOrder.Flink; list != &pLdr->ModuleListLoadOrder; list = (PLIST_ENTRY)list->Flink)
{
PLDR_DATA_TABLE_ENTRY pEntry = CONTAINING_RECORD(list, LDR_DATA_TABLE_ENTRY, InLoadOrderModuleList);
if (RtlCompareUnicodeString(&pEntry->BaseDllName, &module_name, TRUE) == NULL)
{
ULONG64 baseAddr = (ULONG64)pEntry->DllBase;
KeUnstackDetachProcess(&state);
return baseAddr;
}
}
KeUnstackDetachProcess(&state);
return NULL;
}