| /* | |
| Copyright (c) 2018 mingw-w64 project | |
| Contributing authors: Martin Storsjo | |
| Permission is hereby granted, free of charge, to any person obtaining a | |
| copy of this software and associated documentation files (the "Software"), | |
| to deal in the Software without restriction, including without limitation | |
| the rights to use, copy, modify, merge, publish, distribute, sublicense, | |
| and/or sell copies of the Software, and to permit persons to whom the | |
| Software is furnished to do so, subject to the following conditions: | |
| The above copyright notice and this permission notice shall be included in | |
| all copies or substantial portions of the Software. | |
| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
| IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |
| FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |
| AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |
| LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | |
| FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER | |
| DEALINGS IN THE SOFTWARE. | |
| */ | |
| #define EnumProcessModules __EnumProcessModules | |
| #define PSAPI_VERSION 1 | |
| #include <windows.h> | |
| #include <psapi.h> | |
| #include <winternl.h> | |
| #include <stddef.h> | |
| #undef EnumProcessModules | |
| WINBOOL WINAPI EnumProcessModules(HANDLE hProcess, HMODULE *lphModule, DWORD cb, LPDWORD lpcbNeeded) | |
| { | |
| if (hProcess != GetCurrentProcess()) { | |
| SetLastError(ERROR_ACCESS_DENIED); | |
| return FALSE; | |
| } | |
| // According to documentation, the layout of these structs could change in | |
| // new windows versions. | |
| PTEB teb = NtCurrentTeb(); | |
| PPEB peb = teb->ProcessEnvironmentBlock; | |
| PPEB_LDR_DATA ldr = peb->Ldr; | |
| PLIST_ENTRY listHead = &ldr->InMemoryOrderModuleList; | |
| PLIST_ENTRY entry = listHead->Flink; | |
| int n = 0; | |
| while (entry != listHead) { | |
| PLDR_DATA_TABLE_ENTRY dataEntry = | |
| (PLDR_DATA_TABLE_ENTRY)((BYTE*)entry - | |
| offsetof(LDR_DATA_TABLE_ENTRY, InMemoryOrderLinks)); | |
| if (cb >= sizeof(HMODULE)) { | |
| lphModule[n] = dataEntry->DllBase; | |
| cb -= sizeof(HMODULE); | |
| } | |
| n++; | |
| entry = entry->Flink; | |
| } | |
| *lpcbNeeded = sizeof(HMODULE) * n; | |
| return TRUE; | |
| } | |
| WINBOOL WINAPI K32EnumProcessModules(HANDLE hProcess, HMODULE *lphModule, DWORD cb, LPDWORD lpcbNeeded) | |
| { | |
| return EnumProcessModules(hProcess, lphModule, cb, lpcbNeeded); | |
| } | |
| #ifdef _X86_ | |
| WINBOOL (WINAPI *__MINGW_IMP_SYMBOL(EnumProcessModules))(HANDLE hProcess, HMODULE *lphModule, DWORD cb, LPDWORD lpcbNeeded) __asm__("__imp__EnumProcessModules@16") = EnumProcessModules; | |
| WINBOOL (WINAPI *__MINGW_IMP_SYMBOL(K32EnumProcessModules))(HANDLE hProcess, HMODULE *lphModule, DWORD cb, LPDWORD lpcbNeeded) __asm__("__imp__K32EnumProcessModules@16") = K32EnumProcessModules; | |
| #else | |
| WINBOOL (WINAPI *__MINGW_IMP_SYMBOL(EnumProcessModules))(HANDLE hProcess, HMODULE *lphModule, DWORD cb, LPDWORD lpcbNeeded) __asm__("__imp_EnumProcessModules") = EnumProcessModules; | |
| WINBOOL (WINAPI *__MINGW_IMP_SYMBOL(K32EnumProcessModules))(HANDLE hProcess, HMODULE *lphModule, DWORD cb, LPDWORD lpcbNeeded) __asm__("__imp_K32EnumProcessModules") = K32EnumProcessModules; | |
| #endif |