📄 jclpeimage.pas
字号:
S := PeStripFunctionAW(FunctionName);
if scIgnoreCase in Options then
Result := StrSame(S, ComparedName)
else
Result := (S = ComparedName);
end
else
Result := False;
end;
end;
//=== { TJclPeImagesCache } ==================================================
constructor TJclPeImagesCache.Create;
begin
inherited Create;
FList := TStringList.Create;
FList.Sorted := True;
FList.Duplicates := dupIgnore;
end;
destructor TJclPeImagesCache.Destroy;
begin
Clear;
FreeAndNil(FList);
inherited Destroy;
end;
procedure TJclPeImagesCache.Clear;
var
I: Integer;
begin
with FList do
for I := 0 to Count - 1 do
Objects[I].Free;
FList.Clear;
end;
function TJclPeImagesCache.GetCount: Integer;
begin
Result := FList.Count;
end;
function TJclPeImagesCache.GetImages(const FileName: TFileName): TJclPeImage;
var
I: Integer;
begin
I := FList.IndexOf(FileName);
if I = -1 then
begin
Result := GetPeImageClass.Create(True);
Result.FileName := FileName;
FList.AddObject(FileName, Result);
end
else
Result := TJclPeImage(FList.Objects[I]);
end;
function TJclPeImagesCache.GetPeImageClass: TJclPeImageClass;
begin
Result := TJclPeImage;
end;
//=== { TJclPeBorImagesCache } ===============================================
function TJclPeBorImagesCache.GetImages(const FileName: TFileName): TJclPeBorImage;
begin
Result := TJclPeBorImage(inherited Images[FileName]);
end;
function TJclPeBorImagesCache.GetPeImageClass: TJclPeImageClass;
begin
Result := TJclPeBorImage;
end;
//=== { TJclPeImageBaseList } ================================================
constructor TJclPeImageBaseList.Create(AImage: TJclPeImage);
begin
inherited Create(True);
FImage := AImage;
end;
// Import sort functions
function ImportSortByName(Item1, Item2: Pointer): Integer;
begin
Result := StrComp(TJclPeImportFuncItem(Item1).FName, TJclPeImportFuncItem(Item2).FName);
if Result = 0 then
Result := StrComp(TJclPeImportFuncItem(Item1).ImportLib.FName, TJclPeImportFuncItem(Item2).ImportLib.FName);
if Result = 0 then
Result := TJclPeImportFuncItem(Item1).Ordinal - TJclPeImportFuncItem(Item2).Ordinal;
end;
function ImportSortByNameDESC(Item1, Item2: Pointer): Integer;
begin
Result := ImportSortByName(Item2, Item1);
end;
function ImportSortByHint(Item1, Item2: Pointer): Integer;
begin
Result := TJclPeImportFuncItem(Item1).Hint - TJclPeImportFuncItem(Item2).Hint;
end;
function ImportSortByHintDESC(Item1, Item2: Pointer): Integer;
begin
Result := ImportSortByHint(Item2, Item1);
end;
function ImportSortByDll(Item1, Item2: Pointer): Integer;
begin
Result := AnsiCompareStr(TJclPeImportFuncItem(Item1).ImportLib.Name,
TJclPeImportFuncItem(Item2).ImportLib.Name);
if Result = 0 then
Result := ImportSortByName(Item1, Item2);
end;
function ImportSortByDllDESC(Item1, Item2: Pointer): Integer;
begin
Result := ImportSortByDll(Item2, Item1);
end;
function ImportSortByOrdinal(Item1, Item2: Pointer): Integer;
begin
Result := StrComp(TJclPeImportFuncItem(Item1).ImportLib.FName,
TJclPeImportFuncItem(Item2).ImportLib.FName);
if Result = 0 then
Result := TJclPeImportFuncItem(Item1).Ordinal - TJclPeImportFuncItem(Item2).Ordinal;
end;
function ImportSortByOrdinalDESC(Item1, Item2: Pointer): Integer;
begin
Result := ImportSortByOrdinal(Item2, Item1);
end;
function GetImportSortFunction(SortType: TJclPeImportSort; Descending: Boolean): TListSortCompare;
const
SortFunctions: array [TJclPeImportSort, Boolean] of TListSortCompare =
((ImportSortByName, ImportSortByNameDESC),
(ImportSortByOrdinal, ImportSortByOrdinalDESC),
(ImportSortByHint, ImportSortByHintDESC),
(ImportSortByDll, ImportSortByDllDESC)
);
begin
Result := SortFunctions[SortType, Descending];
end;
function ImportLibSortByIndex(Item1, Item2: Pointer): Integer;
begin
Result := TJclPeImportLibItem(Item1).ImportDirectoryIndex -
TJclPeImportLibItem(Item2).ImportDirectoryIndex;
end;
function ImportLibSortByName(Item1, Item2: Pointer): Integer;
begin
Result := AnsiCompareStr(TJclPeImportLibItem(Item1).Name, TJclPeImportLibItem(Item2).Name);
if Result = 0 then
Result := ImportLibSortByIndex(Item1, Item2);
end;
function GetImportLibSortFunction(SortType: TJclPeImportLibSort): TListSortCompare;
const
SortFunctions: array [TJclPeImportLibSort] of TListSortCompare =
(ImportLibSortByName, ImportLibSortByIndex);
begin
Result := SortFunctions[SortType];
end;
//=== { TJclPeImportFuncItem } ===============================================
destructor TJclPeImportFuncItem.Destroy;
begin
SetIndirectImportName(nil);
inherited Destroy;
end;
function TJclPeImportFuncItem.GetIsByOrdinal: Boolean;
begin
Result := FOrdinal <> 0;
end;
function TJclPeImportFuncItem.GetName: string;
begin
Result := FName;
end;
procedure TJclPeImportFuncItem.SetIndirectImportName(P: PChar);
begin
if FIndirectImportName then
begin
StrDispose(FName);
FIndirectImportName := False;
FName := '';
end;
if P <> nil then
begin
FName := StrNew(P);
FIndirectImportName := True;
end;
end;
//=== { TJclPeImportLibItem } ================================================
constructor TJclPeImportLibItem.Create(AImage: TJclPeImage);
begin
inherited Create(AImage);
FTotalResolveCheck := icNotChecked;
end;
procedure TJclPeImportLibItem.CheckImports(ExportImage: TJclPeImage);
var
I: Integer;
ExportList: TJclPeExportFuncList;
begin
if ExportImage.StatusOK then
begin
FTotalResolveCheck := icResolved;
ExportList := ExportImage.ExportList;
for I := 0 to Count - 1 do
begin
with Items[I] do
if IsByOrdinal then
begin
if ExportList.OrdinalValid(Ordinal) then
FResolveCheck := icResolved
else
begin
FResolveCheck := icUnresolved;
Self.FTotalResolveCheck := icUnresolved;
end;
end
else
begin
if ExportList.ItemFromName[Items[I].Name] <> nil then
FResolveCheck := icResolved
else
begin
FResolveCheck := icUnresolved;
Self.FTotalResolveCheck := icUnresolved;
end;
end;
end;
end
else
begin
FTotalResolveCheck := icUnresolved;
for I := 0 to Count - 1 do
Items[I].FResolveCheck := icUnresolved;
end;
end;
procedure TJclPeImportLibItem.CreateList;
var
FuncItem: TJclPeImportFuncItem;
OrdinalName: PImageImportByName;
begin
if FThunk = nil then
Exit;
while FThunk^.Function_ <> 0 do
begin
FuncItem := TJclPeImportFuncItem.Create;
FuncItem.FImportLib := Self;
FuncItem.FResolveCheck := icNotChecked;
if FThunk^.Ordinal and IMAGE_ORDINAL_FLAG <> 0 then
begin
FuncItem.FOrdinal := IMAGE_ORDINAL(FThunk^.Ordinal);
FuncItem.FName := #0;
end
else
begin
case ImportKind of
ikImport, ikBoundImport:
OrdinalName := PImageImportByName(Image.RvaToVa(DWORD(FThunk^.AddressOfData)));
ikDelayImport:
OrdinalName := PImageImportByName(Image.RvaToVaEx(DWORD(FThunk^.AddressOfData)));
else
OrdinalName := nil;
end;
FuncItem.FHint := OrdinalName.Hint;
FuncItem.FName := OrdinalName.Name;
end;
Add(FuncItem);
Inc(FThunk);
end;
FThunk := nil;
end;
function TJclPeImportLibItem.GetCount: Integer;
begin
if FThunk <> nil then
CreateList;
Result := inherited Count;
end;
function TJclPeImportLibItem.GetFileName: TFileName;
begin
Result := FImage.ExpandModuleName(Name);
end;
function TJclPeImportLibItem.GetItems(Index: Integer): TJclPeImportFuncItem;
begin
Result := TJclPeImportFuncItem(Get(Index));
end;
function TJclPeImportLibItem.GetName: string;
begin
Result := AnsiLowerCase(OriginalName);
end;
function TJclPeImportLibItem.GetOriginalName: string;
begin
Result := FName;
end;
procedure TJclPeImportLibItem.SortList(SortType: TJclPeImportSort; Descending: Boolean);
begin
if not FSorted or (SortType <> FLastSortType) or (Descending <> FLastSortDescending) then
begin
GetCount; // create list if it wasn't created
Sort(GetImportSortFunction(SortType, Descending));
FLastSortType := SortType;
FLastSortDescending := Descending;
FSorted := True;
end;
end;
//=== { TJclPeImportList } ===================================================
constructor TJclPeImportList.Create(AImage: TJclPeImage);
begin
inherited Create(AImage);
FAllItemsList := TList.Create;
FAllItemsList.Capacity := 256;
FUniqueNamesList := TStringList.Create;
FUniqueNamesList.Sorted := True;
FUniqueNamesList.Duplicates := dupIgnore;
FLastAllSortType := isName;
FLastAllSortDescending := False;
CreateList;
end;
destructor TJclPeImportList.Destroy;
var
I: Integer;
begin
FreeAndNil(FAllItemsList);
FreeAndNil(FUniqueNamesList);
for I := 0 to Length(FParalelImportTable) - 1 do
FreeMem(FParalelImportTable[I]);
inherited Destroy;
end;
procedure TJclPeImportList.CheckImports(PeImageCache: TJclPeImagesCache);
var
I: Integer;
ExportPeImage: TJclPeImage;
begin
FImage.CheckNotAttached;
if PeImageCache <> nil then
ExportPeImage := nil // to make the compiler happy
else
ExportPeImage := TJclPeImage.Create(True);
try
for I := 0 to Count - 1 do
if Items[I].TotalResolveCheck = icNotChecked then
begin
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -