Lagi test2 xe2 delphi yang mana sudah mendukung compile 64bit.. btw sekalian share nih alternative getprocaddress, support 32 and 64bit pe.
(method walking the export directory table for function address)
type
PUInt32 = ^UInt32;
UInt32 = LongWord;
PUInt64 = ^UInt64;
UInt64 = System.UInt64;
PSizeT = ^TSizeT;
TSizeT = {$IFDEF CPUX64} UInt64 {$ELSE} UInt32 {$ENDIF};
const
// PE header constants
IMAGE_NT_OPTIONAL_HDR32_MAGIC = $10b; // 32bit PE file
IMAGE_NT_OPTIONAL_HDR64_MAGIC = $20b; // 64bit PE file
Function xGetProcAddress(Module: TSizeT; ProcName: String):Pointer;
var
pIDH: PImageDosHeader absolute Module;
pINH : PImageNtHeaders32;
pIDD: PImageDataDirectory;
pIED: PImageExportDirectory;
pdwFuncs1,
pdwFuncs,
pdwNames: PULONG;
pdwOrdinals: PWORD;
dwOrd1, i, k: cardinal;
apiname:PAnsiChar;
begin
result := nil;
if (Module=0) then exit;
if (pIDH^.e_magic <> IMAGE_DOS_SIGNATURE) then exit;
pINH := Pointer(Pbyte(pIDH) + pIDH^._lfanew);
if (pINH^.Signature <> IMAGE_NT_SIGNATURE) then exit;
if pINH^.OptionalHeader.Magic = IMAGE_NT_OPTIONAL_HDR64_MAGIC then
pIDD := @PImageOptionalHeader64(@pINH^.OptionalHeader).DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT]
else
pIDD := @pINH^.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT];
pIED := Pointer(Pbyte(pIDH) + pIDD^.VirtualAddress);
if (pIED=nil) then exit;
pdwFuncs := PULONG(Pbyte(pIDH) + Cardinal(pIED^.AddressOfFunctions));
pdwNames := PULONG(Pbyte(pIDH) + Cardinal(pIED^.AddressOfNames));
pdwOrdinals := PWORD(Pbyte(pIDH) + Cardinal(pIED^.AddressOfNameOrdinals));
pdwFuncs1 := pdwFuncs;
for I := 0 to pIED^.NumberOfFunctions do begin
dwOrd1 := pdwOrdinals^;
k := 0;
pdwFuncs := pdwFuncs1;
while (k < dwOrd1) do begin
inc(pdwFuncs);
inc(k);
end;
if (pdwFuncs^ < pIDD^.VirtualAddress) or (pdwFuncs^ >= pIDD^.VirtualAddress + pIDD^.Size) then begin
apiname := PAnsiChar(Pbyte(pIDH) + pdwNames^);
if (AnsiStrComp(apiname, Pansichar(AnsiString(ProcName))) = 0) then begin
result := Pointer(Pbyte(pIDH) + pdwFuncs^);
exit;
end;
end;
inc(pdwOrdinals);
inc(pdwNames);
end;
end;
