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