1program winmoduleinfo_test; 2 3{$mode objfpc}{$H+} 4 5uses 6 SysUtils, 7 Classes, 8 windows, 9 jwapsapi; 10 11 function GetModuleName( 12 const pHandle : HANDLE; 13 const mHandle : HMODULE) 14 : string; 15 var 16 name : array [0..1023] of char; 17 begin 18 result := 'ERROR'; 19 if GetModuleFileNameEx(pHandle,mHandle,LPTSTR(@name[0]),sizeof(name)) > 0 then begin 20 result := name; 21 end; 22 end; 23 24 procedure WriteModuleInfo( 25 const pHandle : HANDLE; 26 const mHandle : HANDLE); 27 var 28 moduleHandle : HANDLE; 29 modInfo: MODULEINFO; 30 moduleName : string; 31 tmpBeginning : ptruint; 32 tmpEnding : ptruint; 33 success : boolean; 34 lastError : DWORD; 35 begin 36 moduleHandle := mHandle; 37 38 success := (GetModuleInformation(pHandle,moduleHandle,modInfo,sizeof(MODULEINFO)) = WINBOOL(true)); 39 if success then begin 40 lastError := 0; 41 end else begin 42 lastError := GetLastError(); 43 modInfo.lpBaseOfDll := nil; 44 modInfo.SizeOfImage := 0; 45 end; 46 47 tmpBeginning := ptruint(modInfo.lpBaseOfDll); 48 tmpEnding := tmpBeginning + modInfo.SizeOfImage; 49 moduleName := GetModuleName(pHandle,mHandle); 50 writeln(ExtractFileName(moduleName), ' error=', lastError, 51 '; from 0x', IntToHex(tmpBeginning, sizeof(tmpBeginning)*2), 52 ' to 0x', IntToHex(tmpBeginning, sizeof(tmpEnding)*2)); 53 if lastError<>0 then 54 halt(1); 55 end; 56 57var 58 pHandle : HANDLE; 59 mHandles : array [0..1023] of HMODULE; 60 cbNeeded : DWORD; 61 n : integer; 62 i : integer; 63begin 64 pHandle := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, 65 WINBOOL(false), 66 GetCurrentProcessID); 67 if pHandle <> 0 then begin 68 try 69 if EnumProcessModules(pHandle,@mHandles[0],sizeof(mHandles),cbNeeded) = WINBOOL(true) then begin 70 n := cbNeeded div sizeof(HMODULE); 71 for i := 0 to n-1 do begin 72 WriteModuleInfo(pHandle, mHandles[i]); 73 end; 74 end; 75 finally 76 CloseHandle(pHandle); 77 end; 78 end; 79 writeln('ok'); 80end. 81