AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) GetProcAddress liefert kein Ergebnis unter Win64, unter Win32 schon
Thema durchsuchen
Ansicht
Themen-Optionen

GetProcAddress liefert kein Ergebnis unter Win64, unter Win32 schon

Ein Thema von Bbommel · begonnen am 26. Nov 2020 · letzter Beitrag vom 27. Nov 2020
Antwort Antwort
Seite 2 von 2     12   
venice2
(Gast)

n/a Beiträge
 
#11

AW: GetProcAddress liefert kein Ergebnis unter Win64, unter Win32 schon

  Alt 26. Nov 2020, 22:02
Es geht hier um 64Bit und 32Bit.
Nein aber so wie ich gelesen (Recherchiert) habe ist Cardinal 64Bit und THandle 32 oder?
Am besten direkt an die Doku halten, da ist das klar definiert:
http://docwiki.embarcadero.com/Libra...ystem.Cardinal
Zitat:
The size of Cardinal is 32 bits across all 64-bit and 32-bit platforms.
http://docwiki.embarcadero.com/Libra...tem.NativeUInt
Zitat:
The size of NativeUInt is equivalent to the size of the pointer on the current platform.
Auch wenn ich nicht weiß was "Cardinal" damit jetzt zu tun hat. HMODULE = HINST = THandle , egal wieviel Bit.
Nun ja wie dem auch sei.
Ich arbeite unter 64Bit meistens mit LONG_PTR da bin ich auf der sicheren Seite.

Am ende habe ich nur versucht zu ergründen woran das liegen könnte.
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.156 Beiträge
 
Delphi 10 Seattle Enterprise
 
#12

AW: GetProcAddress liefert kein Ergebnis unter Win64, unter Win32 schon

  Alt 26. Nov 2020, 22:22
Ersetze doch auch das raise Exception.Create(..) mal durch RaiseLastOSError(), dann können wir auch sehen was Windows selbst dazu sagt warum es nicht geht.

Auch: Wir sehen dass du dir eine DLL anschaust, was sie denn exportierst. Aber sind wir uns wirklich sicher dass er auch genau diese DLL einlädt? Ich weiß nicht ob das wasserdicht ist, aber im Zweifelsfall führe ich immer where.exe im .exe-Verzeichnis aus und lasse sie nach der DLL suchen. Ich meine der listet die gefundenen Treffer in der gleichen Reihenfolge auf wie LoadLibrary(..) suchen würde...
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.052 Beiträge
 
Delphi 12 Athens
 
#13

AW: GetProcAddress liefert kein Ergebnis unter Win64, unter Win32 schon

  Alt 26. Nov 2020, 23:30
WHERE sollte nur den %PATH% zum Suchen nuzten, inkl. %PATHEXT%.
(WHERE /R sucht ähnlich wie FOR /R)

LoadLibrary macht da bissl was Anderes.
Aber Debugger, SysInternals oder GetModuleFileName (mit dem Handle der DLL) helfen.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (26. Nov 2020 um 23:48 Uhr)
  Mit Zitat antworten Zitat
Bbommel

Registriert seit: 27. Jun 2007
Ort: Köln
655 Beiträge
 
Delphi 12 Athens
 
#14

AW: GetProcAddress liefert kein Ergebnis unter Win64, unter Win32 schon

  Alt 27. Nov 2020, 08:39
Ersetze doch auch das raise Exception.Create(..) mal durch RaiseLastOSError(), dann können wir auch sehen was Windows selbst dazu sagt warum es nicht geht.
Guter Hinweis, probiere ich nachher mal aus.

Auch: Wir sehen dass du dir eine DLL anschaust, was sie denn exportierst. Aber sind wir uns wirklich sicher dass er auch genau diese DLL einlädt? Ich weiß nicht ob das wasserdicht ist, aber im Zweifelsfall führe ich immer where.exe im .exe-Verzeichnis aus und lasse sie nach der DLL suchen. Ich meine der listet die gefundenen Treffer in der gleichen Reihenfolge auf wie LoadLibrary(..) suchen würde...
Ihr seid euch nicht sicher, aber ich. Ich hatte ja schon im Eingangspost geschrieben, dass ich mir mit dem ProcessMonitor angeschaut habe, welche DLL genau geladen wird. Da wird defintiv die richtige geladen und auch nur diese eine.
  Mit Zitat antworten Zitat
venice2
(Gast)

n/a Beiträge
 
#15

AW: GetProcAddress liefert kein Ergebnis unter Win64, unter Win32 schon

  Alt 27. Nov 2020, 08:46
[OT]
Zitat:
Ihr seid euch nicht sicher, aber ich.
[/OT]
Ich glaube dir
  Mit Zitat antworten Zitat
Bbommel

Registriert seit: 27. Jun 2007
Ort: Köln
655 Beiträge
 
Delphi 12 Athens
 
#16

AW: GetProcAddress liefert kein Ergebnis unter Win64, unter Win32 schon

  Alt 27. Nov 2020, 10:56
Hab's gefunden. Danke euch für die Unterstützung. Letztlich liegt der Fehler bei Indy. Kann man das irgendwo melden, in der Hoffnung, dass das gefixt wird? Macht das bei QC Sinn, weil ja Teil von Delphi, oder kann man sowas auch direkt ans Indy-Team melden?

Folgendes Beispielprojekt (für Interessierte auch als Paket im Anhang):

Delphi-Quellcode:
unit main;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, IdSSLOpenSSLHeaders, Vcl.StdCtrls;

type
  TForm2 = class(TForm)
    MemoStatus: TMemo;
    ButtonLoadLib: TButton;
    ButtonLoadLibOwn: TButton;
    procedure ButtonLoadLibClick(Sender: TObject);
    procedure ButtonLoadLibOwnClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    class var _PEM_read_bio_RSA_PUBKEY: function(bp: PBIO; x: PPRSA; cb: ppem_password_cb; u: Pointer): PRSA cdecl;
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.ButtonLoadLibClick(Sender: TObject);
begin
  MemoStatus.Clear;
  if IdSSLOpenSSLHeaders.Load then begin
    MemoStatus.Lines.Add('OpenSSL loaded');
    MemoStatus.Lines.Add('Handle: '+GetCryptLibHandle.ToString);
    if GetCryptLibHandle <> 0 then
    begin
      _PEM_read_bio_RSA_PUBKEY := GetProcAddress(GetCryptLibHandle, 'PEM_read_bio_RSA_PUBKEY');
      if @_PEM_read_bio_RSA_PUBKEY = nil then
        MemoStatus.Lines.Add('Function not found')
      else
        MemoStatus.Lines.Add('Success! Function found!');
    end else
      MemoStatus.Lines.Add('Crypo handle invalid')
  end else
    MemoStatus.Lines.Add('Failed loading OpenSSL');
end;

procedure TForm2.ButtonLoadLibOwnClick(Sender: TObject);

var
  crypHandle: HMODULE;

begin
  MemoStatus.Clear;
  crypHandle:=SafeLoadLibrary('libeay32.dll');
  if crypHandle<>0 then begin
    MemoStatus.Lines.Add('OpenSSL loaded');
    MemoStatus.Lines.Add('Handle: '+crypHandle.ToString);
    _PEM_read_bio_RSA_PUBKEY := GetProcAddress(crypHandle, 'PEM_read_bio_RSA_PUBKEY');
    if @_PEM_read_bio_RSA_PUBKEY = nil then
      MemoStatus.Lines.Add('Function not found')
    else
      MemoStatus.Lines.Add('Success! Function found!');
  end else
    MemoStatus.Lines.Add('Failed loading OpenSSL');
end;

end.

Der erste Aufruf, ButtonLoadLibClick ist angelehnt an das, wie es auch in der von mir genutzten Bibliotheke JOSE.Signing.RSA gemacht werden soll. Hier läuft es auch genauso: unter 32-Bit funktioniert es super, unter 64-Bit findet er die Funktion nicht.

Der zweite Button mit dem Aufruf ButtonLoadLibClick kümmert sich selbst nochmal um das Laden der Bibliothek. Das Suchen der gewünschten Funktion klappt dann problemlos sowohl unter Win32 und Win64.

Und warum behaupte ich nun, das Indy "schuld" ist?

In der Unit IdSSLOpenSSLHeaders wird das Handle auf die libeay32.dll in der globalen Variable hIdCrypto gespeichert und diese ist auch vom Typ HModule. Unter Win32 wird HModule zu "Cardinal", unter Win64 aber zu UInt64. Die Variable ist aber nur im Implementation-Bereich definiert, also können wir nicht von außen auf sie zugreifen. Nach außen verfügbar macht die Unit diese Variable über die oben auch genutzte Funktion GetCryptLibHandle . Diese Funktion liefert aber nicht HModule zurück, sondern ein Integer. Dadurch wird in der Rückgabe also das Handle zerschossen - sieht man ganz gut, wenn man mein Testprogramm ausführt und die beiden Handles vergleicht. Dass das nicht passt, ist offensichtlich, denke ich mal.

Ich sag mal so: Aaaaaargh! Jemand eine Idee für einen Workaround, ohne dass ich die IdSSLOpenSSLHeaders patchen muss?
Angehängte Dateien
Dateityp: zip webkeydecode.zip (5,6 KB, 1x aufgerufen)
  Mit Zitat antworten Zitat
venice2
(Gast)

n/a Beiträge
 
#17

AW: GetProcAddress liefert kein Ergebnis unter Win64, unter Win32 schon

  Alt 27. Nov 2020, 11:01
So wie ich das sehe lag es dann doch an den Datentypen.
So wie ich sagte.
Zitat:
Unter Win32 wird HModule zu "Cardinal", unter Win64 aber zu UInt64.
fein das es jetzt geht.
  Mit Zitat antworten Zitat
Bbommel

Registriert seit: 27. Jun 2007
Ort: Köln
655 Beiträge
 
Delphi 12 Athens
 
#18

AW: GetProcAddress liefert kein Ergebnis unter Win64, unter Win32 schon

  Alt 27. Nov 2020, 11:05
Nachtrag: gerade mal nachgesehen: im Indy, das mit Delphi 10.4 mitgeliefert wird, ist das Problem gefixt. Insofern werde ich mir wohl - bis ich mal auf 10.4 aktualisiere - doch eine lokale Kopie von IdSSLOpenSSLHeaders ins Projekt holen und es dort korrigieren, falls keiner eine bessere Idee hat.

@venice2: Genau, warst da auf der richtigen Spur.
  Mit Zitat antworten Zitat
Daniel
(Co-Admin)

Registriert seit: 30. Mai 2002
Ort: Hamburg
13.920 Beiträge
 
Delphi 10.4 Sydney
 
#19

AW: GetProcAddress liefert kein Ergebnis unter Win64, unter Win32 schon

  Alt 27. Nov 2020, 11:07
Alternativ einfach die aktuellen Version der Indy-Komponenten nutzen - dort ist der Typ des Rückgabewertes definiert als "TIdLibHandle", der seinerseits ein Thandle" ist, was als "NativeUInt" wiederum prächtig unter Win64 funktioniert.

//Edit - da warst Du schneller.
Daniel R. Wolf
mit Grüßen aus Hamburg
  Mit Zitat antworten Zitat
venice2
(Gast)

n/a Beiträge
 
#20

AW: GetProcAddress liefert kein Ergebnis unter Win64, unter Win32 schon

  Alt 27. Nov 2020, 11:10
Nachtrag: gerade mal nachgesehen: im Indy, das mit Delphi 10.4 mitgeliefert wird, ist das Problem gefixt. Insofern werde ich mir wohl - bis ich mal auf 10.4 aktualisiere - doch eine lokale Kopie von IdSSLOpenSSLHeaders ins Projekt holen und es dort korrigieren, falls keiner eine bessere Idee hat.

@venice2: Genau, warst da auf der richtigen Spur.
Korrekt!
Funktioniert mit Indy unter 10.4 gerade getestet.

Geändert von venice2 ( 1. Dez 2020 um 16:05 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:33 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz