10 RtlEnterCriticalSection(&
section);
15 RtlLeaveCriticalSection(&
section);
24 typedef struct _LDR_MODULE {
25 LIST_ENTRY InLoadOrderModuleList;
26 LIST_ENTRY InMemoryOrderModuleList;
27 LIST_ENTRY InInitializationOrderModuleList;
31 UNICODE_STRING FullDllName;
32 UNICODE_STRING BaseDllName;
39 } LDR_MODULE, *PLDR_MODULE;
44 return (PPEB)__readgsqword(0x60);
45#elif defined(_M_ARM64)
46 const PPEB peb = (PPEB)(*(__getReg(18) + 0x60));
49 return (PPEB)__readfsdword(0x30);
65 inline LPCWSTR find_string_end(LPCWSTR str)
67 if (!str)
return nullptr;
69 LPCWSTR curr_end_ptr = str;
70 while (*curr_end_ptr != L
'\0') {
79 if (wanted_name == NULL || curr_name == NULL)
return false;
81 LPCWSTR curr_end_ptr = find_string_end(curr_name);
82 if (curr_end_ptr == curr_name)
return false;
84 LPCWSTR wanted_end_ptr = find_string_end(wanted_name);
85 if (wanted_end_ptr == wanted_name)
return false;
93 if (wanted_end_ptr == wanted_name || curr_end_ptr == curr_name) {
100 if (wanted_end_ptr == wanted_name) {
101 if (curr_end_ptr == curr_name)
return true;
103 if ((*curr_end_ptr) == L
'\\' || (*curr_end_ptr) == L
'/')
return true;
110 const PPEB peb = get_peb();
111 if (!peb || !peb->Ldr || !peb->LoaderLock) {
116 const PLIST_ENTRY list_head = &peb->Ldr->InLoadOrderModuleList;
117 PLDR_MODULE curr_module = (PLDR_MODULE)list_head->Flink;
119 return (HMODULE)(curr_module->BaseAddress);
125 if (curr_module == NULL || curr_module->BaseAddress == NULL) {
129 return (HMODULE)(curr_module->BaseAddress);
131 curr_module = (PLDR_MODULE)curr_module->InLoadOrderModuleList.Flink;
133 }
while ((PLIST_ENTRY)curr_module != list_head);
140 const PPEB peb = get_peb();
141 if (!peb || !peb->Ldr || !peb->LoaderLock) {
145 const PLIST_ENTRY list_head = &peb->Ldr->InLoadOrderModuleList;
146 PLDR_MODULE curr_module = (PLDR_MODULE)list_head->Flink;
148 return (
size_t)(curr_module->SizeOfImage);
154 if (curr_module == NULL || curr_module->BaseAddress == NULL) {
157 if (hModule == (HMODULE)(curr_module->BaseAddress)) {
158 return (
size_t)(curr_module->SizeOfImage);
160 curr_module = (PLDR_MODULE)curr_module->InLoadOrderModuleList.Flink;
162 }
while ((PLIST_ENTRY)curr_module != list_head);
169 PPEB peb = get_peb();
174 peb->ImageBaseAddress = module_ptr;
180 PPEB peb = get_peb();
185 return (HMODULE) peb->ImageBaseAddress;
SectionLocker(RTL_CRITICAL_SECTION &_section)
RTL_CRITICAL_SECTION & section
HMODULE get_main_module_via_peb()
HMODULE get_module_via_peb(IN OPTIONAL LPCWSTR module_name=nullptr)
bool set_main_module_in_peb(HMODULE hModule)
CHAR_T to_lowercase(CHAR_T c1)
size_t get_module_size_via_peb(IN OPTIONAL HMODULE hModule=nullptr)
bool is_wanted_module(LPCWSTR curr_name, LPCWSTR wanted_name)
Functions for retrieving process information from PEB.
Miscellaneous utility functions.