190 Warner 4 RasApi32(W2K)

Fragen, Tipps & Tricks zu Freeware-Programmen 0190 Warner, Alle meine Passworte, SuperSpamKiller Standard usw.

Moderatoren: Ralf, mirko

Benutzeravatar
mirko
Beiträge: 22897
Registriert: 25.11.2001, 15:14
Wohnort: Leipzig
Kontaktdaten:

Beitrag von mirko »

Hallo,

habe deinen C++ mal schnell in Delphi umgesetzt, läuft unter 2000 SP 3 einwandfrei.?(


Hier der Code:

function RasEnumEntriesA(
reserved: PAnsiChar;
lpszPhoneBook: PAnsiChar;
entrynamesArray: LPRasEntryName;
var lpcb: DWORD;
var lpcEntries: DWORD
): DWORD; stdcall; external \'rasapi32.dll\';

procedure TForm1.Button1Click(Sender: TObject);
Var
cb: DWORD; // size in bytes of buffer
cEntries: DWORD; // Anzahl der Einträge
nRet: DWORD;
pszPhonebook : PCHAR;
RasEntryName : LPRasEntryName;

begin
pszPhonebook := NIL;
cb := sizeof(TRasEntryNameA);
RasEntryName := LPRasEntryName(GlobalAlloc(GPTR, cb));
RasEntryName.dwSize := sizeof(TRasEntryNameA);

Repeat
nRet := RasEnumEntriesA(NIL, pszPhonebook, RasEntryName, cb, cEntries);
if nRet = ERROR_BUFFER_TOO_SMALL Then
begin
GlobalFree(DWORD(RasEntryName));
RasEntryName := LPRasEntryName(GlobalAlloc(GPTR, cb));;
RasEntryName.dwSize := sizeof(TRasEntryNameA);
end;
Until nRet = ERROR_SUCCESS;

ShowMessage ( IntToStr(cEntries) + \' \' + RasEntryName.szEntryName); // nur 1. Eintrag zeigen

GlobalFree(DWORD(RasEntryName));
end;


--
mirko
BauerSd
Beiträge: 22
Registriert: 20.10.2003, 12:45
Kontaktdaten:

Beitrag von BauerSd »

Die originale DLL in D:WINNTsystem32 heist bei mir XDDCASPX.DLL

Debug Fenster (VS 6.0)
\"D:WINNTsystem32rasapi32.dll\" wurde geladen.
...
\"D:WINNTsystem32XDDCASPX.DLL\" wurde geladen.
...
\"H:Programme190 Warnerwhelper.dll\" wurde geladen.

Es werden also die sowohl die \"Wrapper-DLL\" als auch die Original-DLL geladen

Klicken auf \"DFÃœ-Netzwerk\" im 0190 Warner Hauptfenster funktioniert korrekt und zeigt alle Ras-Einträge.

--
Siggi
Benutzeravatar
mirko
Beiträge: 22897
Registriert: 25.11.2001, 15:14
Wohnort: Leipzig
Kontaktdaten:

Beitrag von mirko »

Check das bitte nochmal. Die Wrapper DLL \"jumpt\" natürlich zur Funktion der originalen DLL. Existiert die originale DLL nicht bzw. du hast die Wrapper DLL in einen falschen Ordner von Hand kopiert, dann ist der Wert NULL = Funktion nicht importiert. Den Namen der originalen rasapi32.dll siehst du auch im Debugger über die geladenen Module (so heisst das in Delphi), der Dateiname besteht aus sinnlosen Buchstaben z.B. QWZGFG.dll und heisst auf jedem PC anders.

Im 0190 Warner Hauptfenster kannst du auf \"DFÜ-Netzwerk\" klicken, dann wird auch RasEnumEntriesA aufgerufen, geht das?


--
mirko
BauerSd
Beiträge: 22
Registriert: 20.10.2003, 12:45
Kontaktdaten:

Beitrag von BauerSd »

2.Nachtrag

Sorry, unter XP funktioniert es doch, beim fehlgeschlagenen Versuch unter XP befand sich eine Kopie der RasApi32-Wrapper-DLL für XP im Verzeichnis des getesteten Programms. Nach entfernen der Kopie und Reboot klappte es wieder

Debuggen im Disassmbly Mode (unter W2k und VS 6.0) bringt folgendes zutage:
Bis zur Wrapper-DLL
----------
5701BE58 jmp dword ptr ds:[57021990h]
5701BE5E ret
----------
--> Sprung jmp dword ptr ds:[57021990h] führt auf Adresse 00000000h

Ansonsten alles wie beim 1.Nachtrag.
D.H. der Inhalt von 57021990h und weiterer Stellen in der Umgebung ist 00000000h

Die RasApi32-Wrapper-DLL für XP im Prog.-Verzeichnis natürlich vorher entfernt ;-)
BauerSd
Beiträge: 22
Registriert: 20.10.2003, 12:45
Kontaktdaten:

Beitrag von BauerSd »

Nachtrag:
Prog. funktioniert nach Neustart des XP Rechners mit 190 Warner auch dort nicht mehr. Wieso es beim ersten Versuch funktioniert hat? Weis der Geier ;-)

Debuggen im Disassmbly Mode (unter XP und VS .NET 7.1) brachte folgendes zutage:
Bis zur Wrapper-DLL
----------
5701BE60 jmp dword ptr ds:[57021994h]
5701BE66 ret
----------
geht der Aufruf von RasEnumEntries gut.

Der Sprung jmp dword ptr ds:[57021994h]
führt auf Adresse 00000000h

Was kein Wunder ist, denn der Inhalt von 57021994h und weiterer Stellen in der Umgebung ist 00000000h.
BauerSd
Beiträge: 22
Registriert: 20.10.2003, 12:45
Kontaktdaten:

Beitrag von BauerSd »

Original von Mirko:
Wenn es ein eigenes ist, dann hast du was falsch gemacht beim Import der Funktion ...
Na dann schreib mal wie du die Funktion importierst ...
Beim Import der Funktion kann man eigentlich nichts falsch machen,
die Funktionen der RasApi32.dll werden statisch über RasApi32.lib (Visual Studio 6.0) gelinkt.

Auserdem:
Das Programm läuft fehlerfrei auf etlichen Kundenrechnern. Windows NT 4/2000/XP/2003 Server.
Auch auf dem XP Rechnern auf dem der 190 Warner installiert ist.

Nur auf Win2000 Rechnern auf denen der 190 Warner installiert ist führt der Aufruf von RasEnumEntries ins Nirwana.
Original von Mirko:
... und wie du diese aufrufst.
--------------------------------------------------
DWORD cb; // size in bytes of buffer
DWORD cEntries; // Anzahl der Einträge
DWORD nRet;
TCHAR* pszPhonebook = NULL;
...
cb = sizeof(RASENTRYNAME);
lpRasEntryName = (LPRASENTRYNAME)GlobalAlloc(GPTR, cb);
lpRasEntryName->dwSize = sizeof(RASENTRYNAME);

/**/ if ((nRet = RasEnumEntries(NULL, pszPhonebook, lpRasEntryName, &cb, &cEntries))
== ERROR_BUFFER_TOO_SMALL)
{
GlobalFree(lpRasEntryName);
lpRasEntryName = (LPRASENTRYNAME)GlobalAlloc(GPTR, cb);
lpRasEntryName->dwSize = sizeof(RASENTRYNAME);
}
--------------------------------------------------
Der Aufruf ist nahezu identisch mit dem Beispiel in der Online Hilfe von VS 6.0.

Der obige Aufruf von RasEnumEntries dient der Ermittlung der benötigten Buffergröße für lpRasEntryName (ist versionsabhängig).
Zum eigentlichen Aufruf mit der passenden Buffergröße kommt es nicht mehr, der Absturz erfolgt bei /**/
Benutzeravatar
mirko
Beiträge: 22897
Registriert: 25.11.2001, 15:14
Wohnort: Leipzig
Kontaktdaten:

Beitrag von mirko »

Wenn es ein eigenes ist, dann hast du was falsch gemacht beim Import der Funktion, denn jedes Programm funktioniert, auch der 0190 Warner selbst verwendet diese Funktion, nur dein eigenes nicht.:D Na dann schreib mal wie du die Funktion importierst und wie du diese aufrufst. Ist zwar hier kein Programmierforum aber kann man mal Ausnahmsweise machen.


--
mirko
BauerSd
Beiträge: 22
Registriert: 20.10.2003, 12:45
Kontaktdaten:

Beitrag von BauerSd »

Original von Mirko:
Welches ServicePack??
Sp2
Original von Mirko:
Und welche Anwendung verursacht das Problem?
Ein eigenes, sonst wäre die Sache mit dem Debuggen etwas schwierig geworden ;-)

Da ich exakt die fehlerhafte Funktion \'RasEnumEntriesA\' identifizieren konnte dürften obige Angaben irrelevant sein
Original von Mirko:
Steht in der Versionsinfo der Wrapper DLL auch für Win2000 drin?
Ja. Habe extra im Windows-Systemverzeichnis nachgesehen.
Benutzeravatar
mirko
Beiträge: 22897
Registriert: 25.11.2001, 15:14
Wohnort: Leipzig
Kontaktdaten:

Beitrag von mirko »

Welches ServicePack?? Und welche Anwendung verursacht das Problem? Steht in der Versionsinfo der Wrapper DLL auch für Win2000 drin?


--
mirko
Zuletzt geändert von mirko am 20.10.2003, 22:14, insgesamt 1-mal geändert.
BauerSd
Beiträge: 22
Registriert: 20.10.2003, 12:45
Kontaktdaten:

Beitrag von BauerSd »

Hallo,

Seit Installation funktionieren einige Programme die die RasApi32.dll benitzen nicht mehr und stürzen ab.

Untersuchungen mit dem Debugger identifizierten die Funktion \"RasEnumEntriesA\" als Absturzursache. Offenbar arbeitet hier die RasApi32-Wrapper-DLL für W2k nicht korrekt.

Unter Windows XP tritt das Problem nicht auf. D.h. die RasApi32-Wrapper-DLL für XP arbeitet korrekt.

Kennt jemand eine Lösung für das Problem ?
Antworten