📄 modulesdump.pas
字号:
unit ModulesDump;
{$I JCL.INC}
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ViewTemplate, Menus, ActnList, ComCtrls, ToolWin;
type
TModulesDumpForm = class(TViewForm)
StatusBar: TStatusBar;
ModulesListView: TListView;
ToolButton1: TToolButton;
ToolButton2: TToolButton;
ToolButton3: TToolButton;
ToolButton4: TToolButton;
ToolButton5: TToolButton;
ToolButton6: TToolButton;
Refresh2: TMenuItem;
N1: TMenuItem;
Copy2: TMenuItem;
Selectall2: TMenuItem;
N2: TMenuItem;
Selectall3: TMenuItem;
FileProp1: TAction;
ToolButton7: TToolButton;
ToolButton8: TToolButton;
Properties1: TMenuItem;
DumpPe1: TAction;
ToolButton9: TToolButton;
DumpPE2: TMenuItem;
ToolButton10: TToolButton;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormShow(Sender: TObject);
procedure Refresh1Execute(Sender: TObject);
procedure ModulesListViewColumnClick(Sender: TObject;
Column: TListColumn);
procedure ModulesListViewCompare(Sender: TObject; Item1,
Item2: TListItem; Data: Integer; var Compare: Integer);
procedure FileProp1Update(Sender: TObject);
procedure FileProp1Execute(Sender: TObject);
procedure ModulesListViewInfoTip(Sender: TObject; Item: TListItem;
var InfoTip: String);
procedure DumpPe1Execute(Sender: TObject);
procedure DumpPe1Update(Sender: TObject);
private
function SelectedFileName: TFileName;
public
procedure BuildContent; override;
procedure BuildModulesList;
end;
var
ModulesDumpForm: TModulesDumpForm;
implementation
{$R *.DFM}
uses
ToolsUtils, TLHelp32, JclShell, Global;
resourcestring
sModulesCount = 'Modules: %d';
procedure TModulesDumpForm.BuildContent;
begin
BuildModulesList;
end;
procedure TModulesDumpForm.BuildModulesList;
type
TProcessData = packed record
UsageCnt: Word;
RelocateCnt: Word;
end;
var
ML: TStringList;
SnapProcHandle, SnapModuleHandle: THandle;
ProcessEntry: TProcessEntry32;
ModuleEntry: TModuleEntry32;
ProcessNext, ModuleNext: Boolean;
I: Integer;
PD: TProcessData;
begin
ML := TStringList.Create;
Screen.Cursor := crHourGlass;
try
ML.Sorted := True;
ML.Duplicates := dupIgnore;
SnapProcHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if SnapProcHandle <> THandle(-1) then
begin
ProcessEntry.dwSize := Sizeof(ProcessEntry);
ProcessNext := Process32First(SnapProcHandle, ProcessEntry);
while ProcessNext do
begin
SnapModuleHandle := CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, ProcessEntry.th32ProcessID);
if SnapModuleHandle <> THandle(-1) then
begin
ModuleEntry.dwSize := Sizeof(ModuleEntry);
ModuleNext := Module32First(SnapModuleHandle, ModuleEntry);
while ModuleNext do
begin
I := ML.Add(ModuleEntry.szExePath);
PD := TProcessData(ML.Objects[I]);
Inc(PD.UsageCnt);
if GetImageBase(ModuleEntry.szExePath) <> DWORD(ModuleEntry.modBaseAddr) then
Inc(PD.RelocateCnt);
ML.Objects[I] := Pointer(PD);
ModuleNext := Module32Next(SnapModuleHandle, ModuleEntry);
end;
CloseHandle(SnapModuleHandle);
end;
ProcessNext := Process32Next(SnapProcHandle, ProcessEntry);
end;
CloseHandle(SnapProcHandle);
end;
with ModulesListView do
begin
Items.BeginUpdate;
Items.Clear;
for I := 0 to ML.Count - 1 do
with Items.Add do
begin
Caption := AnsiLowerCase(ExtractFileName(ML[I]));
PD := TProcessData(ML.Objects[I]);
if PD.RelocateCnt = 0 then
ImageIndex := 20
else
ImageIndex := 19;
with SubItems do
begin
Add(IntToStr(PD.UsageCnt));
if PD.RelocateCnt = 0 then Add('-') else Add(IntToStr(PD.RelocateCnt));
Add(ML[I]);
end;
end;
AlphaSort;
Items.EndUpdate;
end;
with StatusBar do
begin
Panels.BeginUpdate;
Panels[0].Text := Format(sModulesCount, [ML.Count]);
Panels.EndUpdate;
end;
finally
ML.Free;
Screen.Cursor := crDefault;
end;
end;
procedure TModulesDumpForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
inherited;
ModulesDumpForm := nil;
end;
procedure TModulesDumpForm.FormShow(Sender: TObject);
begin
inherited;
PostBuildContentMessage;
end;
function TModulesDumpForm.SelectedFileName: TFileName;
begin
Result := ModulesListView.Selected.SubItems[2];
end;
procedure TModulesDumpForm.Refresh1Execute(Sender: TObject);
begin
BuildModulesList;
end;
procedure TModulesDumpForm.ModulesListViewColumnClick(Sender: TObject;
Column: TListColumn);
begin
LVColumnClick(Column);
end;
procedure TModulesDumpForm.ModulesListViewCompare(Sender: TObject; Item1,
Item2: TListItem; Data: Integer; var Compare: Integer);
begin
LVCompare(ModulesListView, Item1, Item2, Compare);
end;
procedure TModulesDumpForm.FileProp1Update(Sender: TObject);
begin
FileProp1.Enabled := Assigned(ModulesListView.Selected);
end;
procedure TModulesDumpForm.FileProp1Execute(Sender: TObject);
begin
DisplayPropDialog(Application.Handle, SelectedFileName);
end;
procedure TModulesDumpForm.ModulesListViewInfoTip(Sender: TObject;
Item: TListItem; var InfoTip: String);
begin
InfoTip := InfoTipVersionString(Item.SubItems[2]);
end;
procedure TModulesDumpForm.DumpPe1Execute(Sender: TObject);
begin
GlobalModule.ViewPE(ModulesListView.Selected.SubItems[2]);
end;
procedure TModulesDumpForm.DumpPe1Update(Sender: TObject);
begin
DumpPe1.Enabled := GlobalModule.PeViewerRegistred and Assigned(ModulesListView.Selected)
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -