pedump.pas
来自「全世界知名的Open Source Delphi开发组织JCL的作品。JCL包含」· PAS 代码 · 共 924 行 · 第 1/3 页
PAS
924 行
vcLoadConfig:
if FPeImage.DirectoryExists[IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG] then
AddCategoryNode(icoLoadConfig);
vcImport:
if FPeImage.DirectoryExists[IMAGE_DIRECTORY_ENTRY_IMPORT] then
begin
TempNode := AddCategoryNode(icoImports);
TempNode.HasChildren := True;
end;
vcExport:
if FPeImage.DirectoryExists[IMAGE_DIRECTORY_ENTRY_EXPORT] then
AddCategoryNode(icoExports);
vcRelocation:
if FPeImage.DirectoryExists[IMAGE_DIRECTORY_ENTRY_BASERELOC] then
begin
TempNode := AddCategoryNode(icoRelocation);
TempNode.HasChildren := True;
end;
vcResource:
if FPeImage.DirectoryExists[IMAGE_DIRECTORY_ENTRY_RESOURCE] then
begin
TempNode := AddCategoryNode(icoResources);
TempNode.HasChildren := True;
end;
vcDebug:
if FPeImage.DirectoryExists[IMAGE_DIRECTORY_ENTRY_DEBUG] then
AddCategoryNode(icoDebug);
end;
Selected := Items.GetFirstNode;
finally
Items.EndUpdate;
end;
end;
end;
begin
BuildImageTree;
with DirectoryListView do
begin
Items.Count := IMAGE_NUMBEROF_DIRECTORY_ENTRIES;
ItemFocused := Items[0];
end;
with SectionListView do
begin
Items.Count := FPeImage.ImageSectionCount;
if Items.Count > 0 then ItemFocused := Items[0];
end;
ExportListView.Items.Count := FPeImage.ExportList.Count;
UpdateResourceDir;
with ExportStatusBar, FPeImage.ExportList do
begin
Panels[0].Text := Format(RsNumberOfNames, [Count]);
Panels[1].Text := Format(RsNumberOfFunctions, [FunctionCount]);
Panels[2].Text := Format(RsOrdinalBase, [Base]);
end;
end;
procedure TPeDumpChild.ItemsListViewData(Sender: TObject; Item: TListItem);
begin
with Item, FPeImage do
case TListView(Sender).Tag of
0: begin
Caption := HeaderNames(TJclPeHeader(Index));
SubItems.Add(HeaderValues[TJclPeHeader(Index)]);
end;
1: begin
Caption := LoadConfigNames(TJclLoadConfig(Index));
SubItems.Add(LoadConfigValues[TJclLoadConfig(Index)]);
end;
end;
end;
procedure TPeDumpChild.SectionTreeViewExpanding(Sender: TObject;
Node: TTreeNode; var AllowExpansion: Boolean);
var
I: Integer;
TempNode: TTreeNode;
ResItem: TJclPeResourceItem;
begin
if Node.GetFirstChild = nil then with SectionTreeView do
begin
Items.BeginUpdate;
case GetNodeCategory(Node) of
vcImport:
if GroupImports then
begin
for I := 0 to FPeImage.ImportList.UniqueLibItemCount - 1 do
with Items.AddChild(Node, FPeImage.ImportList.UniqueLibNames[I]) do
begin
Data := Pointer(-1);
ImageIndex := ImageIndexFromImportKind(FPeImage.ImportList.UniqueLibItems[I].ImportKind);
SelectedIndex := ImageIndex;
end;
end else
begin
// FPeImage.ImportList.SortList(ilName);
for I := 0 to FPeImage.ImportList.Count - 1 do
with Items.AddChild(Node, FPeImage.ImportList[I].Name) do
begin
Data := Pointer(FPeImage.ImportList[I].ImportDirectoryIndex);
ImageIndex := ImageIndexFromImportKind(FPeImage.ImportList[I].ImportKind);
SelectedIndex := ImageIndex;
end;
end;
vcResource:
if Node.Level = 0 then
for I := 0 to FPeImage.ResourceList.Count - 1 do
begin
ResItem := FPeImage.ResourceList[I];
TempNode := Items.AddChildObject(Node, ResItem.ResourceTypeStr, ResItem);
TempNode.ImageIndex := icoResources;
TempNode.SelectedIndex := TempNode.ImageIndex;
TempNode.HasChildren := True;
end
else
begin
ResItem := TJclPeResourceItem(Node.Data);
for I := 0 to ResItem.List.Count - 1 do
with Items.AddChildObject(Node, ResItem.List[I].Name, ResItem.List[I]) do
begin
ImageIndex := icoResources;
SelectedIndex := ImageIndex;
end;
end;
vcRelocation:
for I := 0 to FPeImage.RelocationList.Count - 1 do
with Items.AddChildObject(Node,
Format('%.8x', [FPeImage.RelocationList[I].VirtualAddress]), Pointer(I)) do
begin
ImageIndex := icoRelocation;
SelectedIndex := ImageIndex;
end;
end;
Items.EndUpdate;
end;
end;
procedure TPeDumpChild.SectionTreeViewChange(Sender: TObject; Node: TTreeNode);
begin
if FUpdatingView then Exit;
case GetNodeCategory(Node) of
vcHeader:
begin
ItemsListView.Items.Count := Integer(High(TJclPeHeader)) + 1;
ItemsListView.Tag := 0; // Header items
ItemsListView.Invalidate;
PageControl1.ActivePage := ItemsTab;
end;
vcDirectory: PageControl1.ActivePage := DirectoryTab;
vcSection: PageControl1.ActivePage := SectionTab;
vcLoadConfig:
begin
ItemsListView.Items.Count := Integer(High(TJclLoadConfig)) + 1;
ItemsListView.Tag := 1; // Load config items
ItemsListView.Invalidate;
PageControl1.ActivePage := ItemsTab;
end;
vcImport:
begin
if Node.Level = 0 then UpdateImportView(nil) else UpdateImportView(Node);
PageControl1.ActivePage := ImportTab;
end;
vcExport:
PageControl1.ActivePage := ExportTab;
vcRelocation:
begin
UpdateRelocationView(Node);
PageControl1.ActivePage := RelocTab;
end;
vcResource:
if Node.Level = 0 then
begin
UpdateResourceDir;
PageControl1.ActivePage := ResourceDirTab;
end else
begin
UpdateResourceView(TJclPeResourceItem(Node.Data));
PageControl1.ActivePage := ResourceTab;
end;
vcDebug:
begin
DebugListView.Items.Count := FPeImage.DebugList.Count;
PageControl1.ActivePage := DebugTab;
end;
end;
end;
procedure TPeDumpChild.DirectoryListViewData(Sender: TObject; Item: TListItem);
const
DirectoryIcons: array[0..15] of Integer =
(icoExports, icoImports, icoResources, -1, -1, icoRelocation, icoDebug,
-1, -1, -1, icoLoadConfig, icoBoundImport, -1, icoDelayImport, -1, -1);
var
Percent: Single;
begin
with Item, FPeImage.OptionalHeader do
begin
Percent := DataDirectory[Index].Size * 100 / SizeOfImage;
Caption := FPeImage.DirectoryNames(Index);
Data := Pointer(DataDirectory[Index].Size);
if Integer(Data) <> 0 then ImageIndex := DirectoryIcons[Index];
SubItems.Add(Format('%.8x', [DataDirectory[Index].VirtualAddress]));
SubItems.Add(Format('%.8x', [DataDirectory[Index].Size]));
SubItems.Add(Format('%3.1f%%', [Percent]));
SubItems.Add(FPeImage.ImageSectionNameFromRva[DataDirectory[Index].VirtualAddress]);
end;
end;
class procedure TPeDumpChild.UpdateSortData(Column: TListColumn);
var
ListView: TListView;
I: Integer;
begin
ListView := TListView(TListColumns(Column.Collection).Owner);
ListView.Columns.BeginUpdate;
with ListView.Columns do
for I := 0 to Count - 1 do
Items[I].ImageIndex := -1;
if ListView.Tag and $FF = Column.Index then
ListView.Tag := ListView.Tag xor $100
else
ListView.Tag := Column.Index;
if ListView.Tag and $100 = 0 then
Column.ImageIndex := icoSortDesc
else
Column.ImageIndex := icoSortAsc;
ListView.Columns.EndUpdate;
end;
procedure TPeDumpChild.ImportListViewColumnClick(Sender: TObject; Column: TListColumn);
begin
UpdateSortData(Column);
ImportListViewSort;
end;
procedure TPeDumpChild.UpdateImportView(Node: TTreeNode);
const
LinkerProducers: array[TJclPeLinkerProducer] of string =
('Borland', 'Microsoft');
begin
FCurrentImportIndex := -1;
if Node = nil then
begin
FPeImage.ImportList.FilterModuleName := '';
ImportListView.Items.Count := FPeImage.ImportList.AllItemCount;
end else
if Integer(Node.Data) = -1 then
begin
FPeImage.ImportList.FilterModuleName := Node.Text;
ImportListView.Items.Count := FPeImage.ImportList.AllItemCount;
end else
begin
FCurrentImportIndex := Integer(Node.Data);
ImportListView.Items.Count := FPeImage.ImportList[FCurrentImportIndex].Count;
end;
ImportListViewSort;
ImportListView.Invalidate;
with ImportStatusBar, FPeImage.ImportList do
begin
Panels[0].Text := Format(RsNumberOfFunctions, [ImportListView.Items.Count]);
Panels[1].Text := Format(RsLinkerProducer, [LinkerProducers[LinkerProducer]]);
end;
end;
procedure TPeDumpChild.ImportListViewData(Sender: TObject; Item: TListItem);
var
ViewItem: TJclPeImportFuncItem;
begin
if FCurrentImportIndex = -1 then
ViewItem := FPeImage.ImportList.AllItems[Item.Index]
else
ViewItem := FPeImage.ImportList[FCurrentImportIndex][Item.Index];
with Item, ViewItem do
begin
if IndirectImportName then
Caption := Format('[%s]', [Name])
else
Caption := FunctionName(Name);
if IsByOrdinal then
begin
SubItems.Add(Format('%d', [Ordinal]));
SubItems.Add('');
end else
begin
SubItems.Add('');
SubItems.Add(Format('%d', [Hint]));
end;
SubItems.Add(ImportLib.Name);
ImageIndex := ImageIndexFromImportKind(ImportLib.ImportKind);
end;
end;
procedure TPeDumpChild.FormDestroy(Sender: TObject);
begin
FPeImage.Free;
end;
procedure TPeDumpChild.ExportListViewData(Sender: TObject; Item: TListItem);
begin
with Item, FPeImage.ExportList[Item.Index] do
begin
Caption := FunctionName(Name);
SubItems.Add(Format('%d', [Ordinal]));
SubItems.Add(Format('%d', [Hint]));
SubItems.Add(Format('%.8x', [Address]));
SubItems.Add(ForwardedName);
SubItems.Add(SectionName);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?