uses
ImageHlp;
procedure
ListDLLImportsExports(
const
FileName:
string
; List: TStrings);
type
TDWordArray =
array
[
0
..
$FFFFF
]
of
DWORD;
var
imageinfo: LoadedImage;
pExportDirectory: PImageExportDirectory;
dirsize:
Cardinal
;
pDummy: PImageSectionHeader;
i:
Cardinal
;
pNameRVAs: ^TDWordArray;
Name:
AnsiString
;
IAddr: DWord;
PImport: PIMAGE_IMPORT_BY_NAME;
PModName:
PChar
;
pImportDirectory: PIMAGE_IMPORT_DESCRIPTOR;
begin
List
.
Clear;
if
MapAndLoad(
PAnsiChar
(
AnsiString
(FileName)),
nil
, @imageinfo,
True
,
True
)
then
begin
try
pExportDirectory := ImageDirectoryEntryToData(imageinfo
.
MappedAddress,
False
, IMAGE_DIRECTORY_ENTRY_EXPORT, dirsize);
if
(pExportDirectory <>
nil
)
then
begin
pNameRVAs := ImageRvaToVa(imageinfo
.
FileHeader, imageinfo
.
MappedAddress,
DWORD(pExportDirectory^.AddressOfNames), pDummy);
for
i :=
0
to
pExportDirectory^.NumberOfNames -
1
do
begin
Name :=
PAnsiChar
(ImageRvaToVa(imageinfo
.
FileHeader, imageinfo
.
MappedAddress,
pNameRVAs^[i], pDummy));
List
.
Add(Name);
end
;
end
;
pImportDirectory := ImageDirectoryEntryToData(imageinfo
.
MappedAddress,
False
, IMAGE_DIRECTORY_ENTRY_IMPORT, dirsize);
if
(pImportDirectory <>
nil
)
then
begin
pNameRVAs := ImageRvaToVa(imageinfo
.
FileHeader, imageinfo
.
MappedAddress,
DWORD(
), pDummy);
end
;
finally
UnMapAndLoad(@imageinfo);
end
;
end
;
end
;
procedure
TForm1
.
Button1Click(Sender: TObject);
var
List: TStrings;
i:
Integer
;
s:
string
;
begin
List := TStringList
.
Create;
try
ListDLLImportsExports(
'C:\WINDOWS\SYSTEM32\browseui.dll'
, List);
ShowMessage(IntToStr(list
.
Count) +
' functions in dll'
);
s :=
'List of functions:'
;
for
i :=
0
to
List
.
Count -
1
do
s := s + #
13
#
10
+ List[i];
ShowMessage(S);
finally
List
.
Free
end
;
end
;