Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Win11 AV in ntdll.dll (https://www.delphipraxis.net/215114-win11-av-ntdll-dll.html)

cramer 11. Mai 2024 20:28

Win11 AV in ntdll.dll
 
Hi,

auf allen meinen Windows 11 PC bekomme ich in meinen BDS2006 Anwendungen einen AV Fehler, der von XP über W7 bis W10 nicht auftritt.
Code:

var GwObj, GwRAobj, GwMail : variant;

   function gwInit( aUser, aPass, aHost, aPort : string ) : integer;
   begin
      OleInitialize(nil);
      GWobj := CreateOleObject( 'NovellGroupWareSession' );
      // Okay
      GwRAobj := GWobj.Login( User, '/ipa-' + Host + ' /ipp-' + Port, Pass, 1 );
      // Access violation at address 777F0131 in module 'ntdll.dll'. Read of address 000E0029
    end;
Keep it simple, habe ich eine Lazarus-3.2 und eine BDS2006-Console Anwendung gebaut und die function dort getestet.
Bei einem Aufruf mit den gleichen Parameter-Werten gibt es in beiden Anwendungen keine AV und auch das weitere Senden einer Mail klappt.

Eine Idee woran das liegen könnte?

jaenicke 11. Mai 2024 21:14

AW: Win11 AV in ntdll.dll
 
Das ist leider die Tücke, wenn man so alte Entwicklungsumgebungen nutzt. Die können keine Programme für aktuelle Windowsversionen erstellen. Im Ergebnis schickt Windows dann jede Menge Emulationen und Kompatibilitätseinstellungen ins Rennen, damit solche Software möglichst fehlerfrei läuft.

Du kannst versuchen ein aktuelles Manifest zu verwenden, so dass Windows 11 keine Kompatibilitätseinstellungen mehr aktiviert. Allerdings kann es sein, dass dann andere Sachen nicht mehr funktionieren.

Am sinnvollsten wäre, eine neuere Delphiversion zu nutzen. Du könntest es ja zumindest mal mit der aktuellen Trial versuchen, um zu sehen, ob es daran liegt.

cramer 12. Mai 2024 13:55

AW: Win11 AV in ntdll.dll
 
Danke für die Antwort, ich habe mich ja von TurboPascal über D1 und D2 bis hin zur Berlin jedes Jahr aktualisiert, ohne die IDE auch umzustellen.

Trial wäre schön aber da ich befinde mich leider in der Komponentenhölle, weil man ja früher jedes Feature (DevExpress und Co) total toll fand und unbedingt nutzen wollte.

Das letzte Update auf 2006 hat damals schon viel zu viel Zeit gekostet.

Für die alten Anwendungen möchte ich das nicht noch einmal machen, da wäre ein komplettes Redesign die bessere Lösung aber auch das kostet Zeit, die ich im Moment überhaupt nicht habe.

Neuere kleinere Projekte laufen seit einiger Zeit über CodeTyphon oder Lazarus pur.

Wenn alle Stricke reißen, lagere ich das Mail senden über Groupwise in die seltsamerweise funktionierende BDS2006 oder Lazarus Console Version aus.

TomyN 12. Mai 2024 17:25

AW: Win11 AV in ntdll.dll
 
Teste, ob dein GWObj wirklich assigned wurde, bevor Du den Login aufrufst. Falls nicht, schau was windows für einen Fehlercode meldet.

cramer 13. Mai 2024 10:36

AW: Win11 AV in ntdll.dll
 
Habe ich geprüft, das Object ist wohl zugeordnet, beide varIs.. functions liefern false zurück, hier mal der komplette Code.
Code:
   OleInitialize(nil); // 2024.05.11.uc // CoInitialize( nil );
   try
      GWobj := CreateOleObject( 'NovellGroupWareSession' );
   except
      on E : exception do begin
         FehlerOK( 'CreateOleObject( "NovellGroupWareSession" ) fehlgeschlagen.' + crlf + E.Message );
         result := -1;
      end;
   end;
   if VarIsNull(GWobj) then FehlerOK( 'GWobj Null');
   if VarIsEmpty(GWobj) then FehlerOK( 'GWobj Empty');
   try
      GwRAobj := GWobj.Login( User, '/ipa-' + Host + ' /ipp-' + Port, Pass, 1 );
      gwInitOK := true;
   except
      on E : exception do begin
         FehlerOK( 'GWobj.Login() fehlgeschlagen.' + crlf + E.Message );
         result := -2;
      end;
   end;

ULIK 13. Mai 2024 12:09

AW: Win11 AV in ntdll.dll
 
Eventuell nicht relevant, aber Du rufst die Parameter als "User", "Host", "Port", "Pass" auf während die Deklaration von gwInit von "aUser", "aHost", "aPort", "aPass" spricht. Gibt es da eventuell undeklarierte Variablen?

cramer 14. Mai 2024 16:44

AW: Win11 AV in ntdll.dll
 
Sorry, weil mir nichts anderes mehr eingefallen ist, hatte ich die Parameter versuchsweise nochmal in lokale Variablen gespeichert.
Code:
function gwInit( aUser, aPass, aHost, aPort : string ) : integer;
var User, Pass, Host, Port : string;
begin
   User := aUser + '';
   Pass := aPass + '';
   Host := aHost + '';
   Port := aPort + '';

himitsu 14. Mai 2024 17:41

AW: Win11 AV in ntdll.dll
 
Da es kein CONST gibt, waren es bereits kopienen, allergings mehr als (mit Referenzzählung)
Delphi-Quellcode:
   User := aUser;
   Pass := aPass;
   Host := aHost;
   Port := aPort;
Dein
Delphi-Quellcode:
+ ''
entspricht quasi Folgendem (Delphi-Referenz durchsuchenUniqueString)
Delphi-Quellcode:
function gwInit( aUser, aPass, aHost, aPort : string ) : integer;
begin
  UniqueString(aUser);
  UniqueString(aPass);
  UniqueString(aHost);
  UniqueString(aPort);

Wirklich Variant?
Warum nicht OleVariant?
Ich weiß aber nicht, wie es bei den Parametern des gwInit aussieht, also welcher Typ es genau ist.

Im Variant können delphi-eigene Typen enthalten sein, welche fremde Sprachen nicht verstehen, wie z.B. AnsiString und UnicodeString.
Im OleVariant gibt es nur OLE-kompatible Typen, wie z.B. WideString.

vieleicht mal so probieren
Delphi-Quellcode:
var vUser, vHost, vPass: OleVariant; // oder WideString
vUser := User;
vHost := '/ipa-' + Host + ' /ipp-' + Port;
vPass := Pass;
GwRAobj := GWobj.Login(vUser, vHost, vPass, 1);

// oder
GwRAobj := GWobj.Login(OleVariant(User), OleVariant('/ipa-' + Host + ' /ipp-' + Port), OleVariant(Pass), 1);
// oder
GwRAobj := GWobj.Login(WideString(User), WideString('/ipa-' + Host + ' /ipp-' + Port), WideString(Pass), 1);

cramer 15. Mai 2024 17:58

AW: Win11 AV in ntdll.dll
 
Danke, ich habe es getestet, alle drei "oder" Versionen schlagen fehl.
Code:
GWobj.Login(1) fehlgeschlagen.
Access violation at address 77500F48 in module 'ntdll.dll'. Read of address FFFF0013
GWobj.Login(2) fehlgeschlagen.
Access violation at address 77500F48 in module 'ntdll.dll'. Read of address 00000014
GWobj.Login(3) fehlgeschlagen.
Access violation at address 77500F48 in module 'ntdll.dll'. Read of address 00000014
Seltsam ist ja auch, daß die function in einer mini console version mit bds2006 unter W-XP bis W11 funktioniert.
Die tForm Version aber nur bis W10 und ab W11 nicht mehr, zwei Systeme mit W11 getestet.

Ich baue jetzt mal eine kleine tForm mit einem Button der die function aufruft.
Wenn das klappt, kann es ja nur an irgendwelchen genutzten Komponenten liegen.

himitsu 15. Mai 2024 18:55

AW: Win11 AV in ntdll.dll
 
Muß vor dem Login die Lib vielleicht noch irgendwie ordentlich initialisiert werden?
Fehlt vielleicht noch irgendwo eine DLL?
...

Die Adressen klingen nach NIL
00000014 = nil + offset $14
FFFF0013 = nil - offset $FFED bzw. = nil - $10000 + $13

Blup 16. Mai 2024 06:17

AW: Win11 AV in ntdll.dll
 
Sind GwObj, GwRAobj, GwMail als OleVariant deklariert?

cramer 16. Mai 2024 11:50

AW: Win11 AV in ntdll.dll
 
Zitat:

Die Adressen klingen nach NIL
00000014 = nil + offset $14
FFFF0013 = nil - offset $FFED bzw. = nil - $10000 + $13"
Liegt vielleicht daran, daß die zweiten beiden "oder" jeweils im except Block des vorherigen Aufrufs erfolgt sind, da war ich zu faul, jedes "oder" einzeln zu compilieren und zu testen :oops:

cramer 16. Mai 2024 11:53

AW: Win11 AV in ntdll.dll
 
Zitat:

Zitat von Blup (Beitrag 1536729)
Sind GwObj, GwRAobj, GwMail als OleVariant deklariert?

nein
Code:
var GwObj, GwRAobj, GwMail : variant;
:thumb: Danke für die Info, ändere ich und teste nochmal.

cramer 16. Mai 2024 16:15

AW: Win11 AV in ntdll.dll
 
Code:
var GwObj, GwRAobj, GwMail : olevariant;
Code:
GWobj.Login(1) fehlgeschlagen.
Access violation at address 77500F48 in module 'ntdll.dll'. Read of address C0EC4D84
GWobj.Login(2) fehlgeschlagen.
Access violation at address 77500F48 in module 'ntdll.dll'. Read of address 4D79E641
GWobj.Login(3) fehlgeschlagen.
Access violation at address 77500F48 in module 'ntdll.dll'. Read of address C0EDCD85
Kann man herausfinden was in der ntdll.dll an der Adresse 77500F48 passiert?

cramer 16. Mai 2024 16:31

AW: Win11 AV in ntdll.dll
 
FYI, meine simple BDS2006 TForm Anwendung mit Button funktioniert auch mit W11.
Liegt also nicht an W11 und den OleVarianten sondern an irgendwelchen Komponenten.

himitsu 16. Mai 2024 17:15

AW: Win11 AV in ntdll.dll
 
Deine 2006-EXE gibt sich aber auch nicht als kompatibel mit Win11 aus, eine D11-EXE aber schon (Manifest),
womit deine Anwendgung im Windows 11 bestimmt/eventuell virtualisiert wird und es intern eigentlich mehr wie WinXP gehandhabt wird.

cramer 17. Mai 2024 10:12

AW: Win11 AV in ntdll.dll
 
Hmmm, was soll mir das sagen, daß eine der sonst genutzten Komponenten die ntdll.dll unter W11 abschießt, wenn das falsche oder kein Manifest compiliert wird?

cramer 20. Mai 2024 14:19

AW: Win11 AV in ntdll.dll
 
1.)
Ich habe einmal mit meiner kleinsten Awendung mit dem himitsu Manifest-Creator 2.0b versucht ein manifest einzubinden.
Nach etlichen Fehlermeldungen und Korrekturen, wurde das manifest zwar akzeptiert.
Windows liefert dann aber einen Dialog "Eine Referenzauswertung wurde vom Server zurückgesendet."
Und im CMD Fenster (mit und ohne AsAdmin") wird Zugriff verweigert ausgegeben.

2.)
Dann wieder ohne Manifest, habe ich die Exception Behandlung im gwinit rausgenommen und madExcept eingebunden.
Siehe da, unter "modules" war zu sehen, daß etwas unterschiedliche dlls geladen werden.
Erst die etwas älteren von Groupwise 1.0.2.14 und nochmal die etwas neueren 1.0.2.20 aus dem Programmordner:
Code:
11000000 libeay32.dll  1.0.2.20   H:\BDS2006\Projekte\ixs_copy
12000000 ssleay32.dll  1.0.2.20   H:\BDS2006\Projekte\ixs_copy
59af0000 SSLEAY32.dll  1.0.2.14   C:\Program Files (x86)\Novell\GroupWise
5b1e0000 LIBEAY32.dll  1.0.2.14   C:\Program Files (x86)\Novell\GroupWise
Wenn die dll im Programm Ordner gelöscht werden oder die aus dem Groupwise Ordner in den Programm Ordner übernommen werden, funktioniert auch unter W11 das Mail senden ohne Absturz.

Der Grund, warum die dll im Programmordner liegen, war der Umstand, daß auf manchen Systemen neuere dll im Windows Ordner liegen und es damit auch zu Abstürzen kam.

Ältere Versionen 10.0.2.10 funktionieren auch, es sieht so aus, daß es nur keine unterschiedlichen dll sein dürfen.

Optimal wäre es, wenn man keine dll im Programmordner unterbringen würde und im gwinit festlegen könnte, daß nur die dll aus dem groupwise ordner geladen werden dürfen.

Geht das, nutzen tut Delphi diese dll ja nicht direkt, sondern über den Umweg der OleObjecte?


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:02 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz