tjwapsapi1.pp 2.0 KB

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