mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-13 06:49:30 +02:00

+ test from bug report - remove $A+ from jedi include header: $A+ makes no sense for api headers, the records should be layouted with $packrecords c, second part to resolve #20525 git-svn-id: trunk@19533 -
81 lines
2.0 KiB
ObjectPascal
81 lines
2.0 KiB
ObjectPascal
program winmoduleinfo_test;
|
|
|
|
{$mode objfpc}{$H+}
|
|
|
|
uses
|
|
SysUtils,
|
|
Classes,
|
|
windows,
|
|
jwapsapi;
|
|
|
|
function GetModuleName(
|
|
const pHandle : HANDLE;
|
|
const mHandle : HMODULE)
|
|
: string;
|
|
var
|
|
name : array [0..1023] of char;
|
|
begin
|
|
result := 'ERROR';
|
|
if GetModuleFileNameEx(pHandle,mHandle,LPTSTR(@name[0]),sizeof(name)) > 0 then begin
|
|
result := name;
|
|
end;
|
|
end;
|
|
|
|
procedure WriteModuleInfo(
|
|
const pHandle : HANDLE;
|
|
const mHandle : HANDLE);
|
|
var
|
|
moduleHandle : HANDLE;
|
|
modInfo: MODULEINFO;
|
|
moduleName : string;
|
|
tmpBeginning : ptruint;
|
|
tmpEnding : ptruint;
|
|
success : boolean;
|
|
lastError : DWORD;
|
|
begin
|
|
moduleHandle := mHandle;
|
|
|
|
success := (GetModuleInformation(pHandle,moduleHandle,modInfo,sizeof(MODULEINFO)) = WINBOOL(true));
|
|
if success then begin
|
|
lastError := 0;
|
|
end else begin
|
|
lastError := GetLastError();
|
|
modInfo.lpBaseOfDll := nil;
|
|
modInfo.SizeOfImage := 0;
|
|
end;
|
|
|
|
tmpBeginning := ptruint(modInfo.lpBaseOfDll);
|
|
tmpEnding := tmpBeginning + modInfo.SizeOfImage;
|
|
moduleName := GetModuleName(pHandle,mHandle);
|
|
writeln(ExtractFileName(moduleName), ' error=', lastError,
|
|
'; from 0x', IntToHex(tmpBeginning, sizeof(tmpBeginning)*2),
|
|
' to 0x', IntToHex(tmpBeginning, sizeof(tmpEnding)*2));
|
|
if lastError<>0 then
|
|
halt(1);
|
|
end;
|
|
|
|
var
|
|
pHandle : HANDLE;
|
|
mHandles : array [0..1023] of HMODULE;
|
|
cbNeeded : DWORD;
|
|
n : integer;
|
|
i : integer;
|
|
begin
|
|
pHandle := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,
|
|
WINBOOL(false),
|
|
GetCurrentProcessID);
|
|
if pHandle <> 0 then begin
|
|
try
|
|
if EnumProcessModules(pHandle,@mHandles[0],sizeof(mHandles),cbNeeded) = WINBOOL(true) then begin
|
|
n := cbNeeded div sizeof(HMODULE);
|
|
for i := 0 to n-1 do begin
|
|
WriteModuleInfo(pHandle, mHandles[i]);
|
|
end;
|
|
end;
|
|
finally
|
|
CloseHandle(pHandle);
|
|
end;
|
|
end;
|
|
writeln('ok');
|
|
end.
|